在进行正式的大型驱动之前,有必要先看一点基础的结构,而这些结构在前面的较为简单的驱动程序中已经出现,所以这里有必要单独抽时间来看看,加强学习。至于后面所讲到的大型驱动,除USB外有单独的框架,其它驱动也不外乎是总线、设备这些基本方法的应用,实现更为复杂的功能。
一、 Platform_device 和 Platform_driver

platform总线是Linux内核中的一个虚拟总线,它使得设备的管理更加简单化。目前大部分的驱动都是用platform总线来写的。 platform总线模型的各个部分都是继承自Device模型(姑且这么说吧),它在系统内实现了个虚拟的总线,即platform_bus,如果你的 设备需要platform总线管理,那么就需要向系统中注册platform设备及其驱动程序。就像前面所介绍的那样,platform总线分为 platform_bus, platform_device 和platform_driver几个部分,他们的接口定义在<linux/platform.h>头文件中。

Platform_device和Platform_driver是从Linux 2.6起引入了一套新的驱动管理和注册机制,在现在的Linux中大部分的设备驱动,都可以使用这套机制, 设备用Platform_device表示,驱动用Platform_driver进行注册。而我们在现在的内核中(我下载的是2.6.35的内核中已经用这种方式实现),而我们常见的module_init()却不是那么常见,不说远了,回到主题。

platform driver机制和传统的device driver 机制(通过driver_register函数进行注册)相比,一个十分明显的优势在于platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platform device提供的标准接口进行申请并使用。这样提高了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性(这些标准接口是安全的)。

内核中platform设备用结构体platform_device定义在kernel\include\linux\platform_device.h中,

struct platform_device {

const char * name;//设备名,虽然是一个名,但很重要,device和driver是通过这个name进行匹配。

u32 id;

struct device dev;//由这里可以看出来,platform是dev的拓展

u32 num_resources;//可用资源数

struct resource * resource;//platform所需要的资源

};

该结构一个重要的元素是resource,存入了最为重要的设备资源信息,定义在kernel\include\linux\ioport.h中,

struct resource {

const char *name;

unsigned long start, end;

unsigned long flags;

struct resource *parent, *sibling, *child;

};