第1章platform驱动管理机制
Linux2.6内核引入了一套新的驱动管理机制:Platform_device和Platform_driver。设备用Platform_device表示,驱动用Platform_driver表示,另外设备描述了使用的资源,驱动则负责电源管理和使用资源。由于驱动和资源之间的独立,使得程序的可移植性和可扩展性大大增强。
1.1platform_device
1.1.1数据结构
plarform设备用platform_device来表示,如程序清单1.1所示。
程序清单1.1platform_device
/* include/linux/platform_device.h */
struct platform_device {
constchar*name;①
intid;②
structdevicedev;③
u32num_resources;④
structresource* resource;⑤
};
各个成员的解释如下:
①name指向设备的名字字符串,这个名字用来和同名的platform_driver进行匹配。
②id是设备编号(如果有多个同类设备的话),如果只有一个则需设为-1。
③设备模型用到的成员。
④使用到的资源的数量。
⑤资源数组头地址。
最后一个成员resource指向此设备用到的资源的数组,struct resource的定义如程序清单1.2所示。
程序清单1.2struct resource
/* include/linux/ioport.h */
struct resource {
resource_size_tstart;①
resource_size_tend;②
constchar*name;③
unsignedlongflags;④
structresource*parent, *sibling,*child;⑤
};
#define IORESOURCE_BITS0x000000ff/*Bus-specific bits */
#define IORESOURCE_IO0x00000100/* Resource type */
#define IORESOURCE_MEM0x00000200
#define IORESOURCE_IRQ0x00000400
#define IORESOURCE_DMA0x00000800
#define IORESOURCE_PREFETCH0x00001000/* No side effects */
#define IORESOURCE_READONLY0x00002000
#define IORESOURCE_CACHEABLE0x00004000
#define IORESOURCE_RANGELENGTH0x00008000
#define IORESOURCE_SHADOWABLE0x00010000
#define IORESOURCE_SIZEALIGN0x00020000/* size indicates alignment */
#define IORESOURCE_STARTALIGN0x00040000/* start field is alignment */
#define IORESOURCE_DISABLED0x10000000
#define IORESOURCE_UNSET0x20000000
#define IORESOURCE_AUTO0x40000000
#define IORESOURCE_BUSY0x80000000/* Driver has marked this resource busy*/
各个成员的解释如下:
①start记录资源范围的起始值,比如一段内存空间的首地址。
②end记录资源范围的结束位置。
③name资源的名字。
④flags用来记录资源类型以及是否可写、忙碌等信息,各位的定义如程序清单1.2所示。
⑤分别记录资源树的父节点、兄弟节点和子节点。
1.1.2注册流程
注册platform_device有两个接口platform_add_devices和platform_device_register,它们的代码如所示。
程序清单1.3platform_device注册接口
/* drivers/base/platform.c */
int platform_add_devices(struct platform_device**devs, int num)
{