- Android系統級深入開發
- 韓超 梁泉
- 741字
- 2018-12-29 13:39:29
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等。
推薦閱讀
- INSTANT Mock Testing with PowerMock
- Instant Testing with CasperJS
- UML和模式應用(原書第3版)
- PHP+MySQL網站開發技術項目式教程(第2版)
- INSTANT Sencha Touch
- Mastering Scientific Computing with R
- C/C++程序員面試指南
- INSTANT Yii 1.1 Application Development Starter
- Arduino Wearable Projects
- Scala編程實戰
- Magento 2 Beginners Guide
- JavaScript悟道
- 30天學通C#項目案例開發
- Greenplum構建實時數據倉庫實踐
- 例解Python:Python編程快速入門踐行指南