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等。