- Android系统级深入开发
- 韩超 梁泉
- 741字
- 2020-08-26 21:43:41
3.1.4 平台数据和平台驱动
平台数据(platform_device)和平台驱动(platform_driver)是Linux 2.6增加的一种新的驱动管理和注册机制。平台设备用platform_device表示和注册,平台驱动用Platform_driver表示和注册,二者在一定场合中匹配。这种机制完成设备及其资源的统一定义,然后在具体的驱动程序中可以得到设备的资源。
这种机制的一个最大的优势在于,各个驱动可以和具体资源信息,例如IO地址、内存地址、中断、DMA等相脱离,提高了驱动程序提高可移植性和安全性。
include/linux/目录的头文件platform_device.h中,定义了相关内容。
平台设备platform_device的内容如下所示:
struct platform_device { const char * name; /* 平台设备的名称 */ int id; struct devicedev; u32 num_resources; struct resource * resource; }; extern int platform_device_register(struct platform_device *); extern void platform_device_unregister(struct platform_device *);
平台驱动使用结构体platform_driver来表示,其内容如下所示:
struct platform_driver { int (*probe)(struct platform_device *); int (*remove)(struct platform_device *); void (*shutdown)(struct platform_device *); int (*suspend)(struct platform_device *, pm_message_t state); int (*suspend_late)(struct platform_device *, pm_message_t state); int (*resume_early)(struct platform_device *); int (*resume)(struct platform_device *); struct device_driver driver; /* 包含设备驱动成员 */ }; extern int platform_driver_register(struct platform_driver *); extern void platform_driver_unregister(struct platform_driver *);
include/linux目录中的头文件device.h中定义了结构体device_driver,它也是platform_driver的一个成员,其内容如下所示。
struct device_driver { const char *name; /* 设备驱动的名称 */ struct bus_type *bus; struct module *owner; const char *mod_name; /* used for built-in modules */ int (*probe) (struct device *dev); int (*remove) (struct device *dev); void (*shutdown) (struct device *dev); int (*suspend) (struct device *dev, pm_message_t state); int (*resume) (struct device *dev); struct attribute_group **groups; struct dev_pm_ops *pm; struct driver_private *p; };
platform_device中的name成员和platform_driver中的driver成员(device_driver)的name成员表示的是设备和驱动的名称,这是可以进行匹配的内容。
struct resource在include/linux目录中的ioport.h文件中定义,如下所示:
struct resource { resource_size_t start; resource_size_t end; const char *name; unsigned long flags; struct resource *parent, *sibling, *child; }; #define IORESOURCE_BITS 0x000000ff /* 基本的位 */ #define IORESOURCE_TYPE_BITS 0x00000f00 /* 资源类型 type */ #define IORESOURCE_IO 0x00000100 /* IO资源 */ #define IORESOURCE_MEM 0x00000200 /* 内存资源 */ #define IORESOURCE_IRQ 0x00000400 /* 中断资源 */ #define IORESOURCE_DMA 0x00000800 /* DMA资源 */
平台设备和平台驱动根据名称(name)进行匹配,通常情况下在板级移植的内容上定义平台设备,在具体的驱动程序中定义平台驱动。平台驱动将使用平台设备中给出的相关资源,如IO地址、内存地址、中断、DMA等。