官术网_书友最值得收藏!

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

主站蜘蛛池模板: 景谷| 婺源县| 清流县| 新巴尔虎左旗| 古浪县| 宣化县| 辉县市| 双流县| 仁布县| 会宁县| 察隅县| 沙坪坝区| 葵青区| 洛隆县| 三门峡市| 通化县| 秦皇岛市| 双流县| 丰城市| 灵石县| 灌南县| 天峻县| 理塘县| 张家港市| 林周县| 普陀区| 乌兰县| 章丘市| 玛曲县| 区。| 新巴尔虎右旗| 云龙县| 怀仁县| 会昌县| 泾阳县| 邵东县| 尉犁县| 肥西县| 滕州市| 莲花县| 富顺县|