设备驱动模型由三大块组成:总线、设备、驱动。
其中总线是虚拟总线,从Linux2.6开始引入了platform虚拟总线:即平台设备模型。
在Linux设备驱动中,平台设备是指处理器集成的额外功能的附加设备:如Watch Dog、IIC、RTC、ADC等。需要注意的是:平台设备并不是和字符设备、块设备和网络设备并列的概念,而是种平行的概念。它是从另一个角度来对设备进行概括。
平台设备的使用方法:
定义平台设备platform_device ------>注册平台设备platform_add_devices()------->定义平台设备驱动platform_driver-------->注册平台设备驱动platform_driver_register() --------->匹配设备和驱动platform_match()------->探测函数platform_driver->probe()。
平台设备用platform_device结构体来描述:
17 struct platform_device { 18 const char * name; 19 int id; 20 struct device dev; 21 u32 num_resources; 22 struct resource * resource; 23 24 struct platform_device_id *id_entry; 25 26 /* arch specific additions */ 27 struct pdev_archdata archdata; 28 };为了便于统一管理平台设备的资源,在platform_device结构体中定义了平台设备所使用的资源。这些资源与特定的处理器相关,需要驱动编写者根据相关处理器的数据手册来编写。
平台设备资源:
18 struct resource { 19 resource_size_t start; 20 resource_size_t end; 21 const char *name; 22 unsigned long flags; 23 struct resource *parent, *sibling, *child; 24 };其中,start表示资源的开始地址,end表示资源的结束地址,name表示资源名,flags表示资源的类型(有I/O端口IORESOURCE_IO、内存资源IORESOURCE_MEM、中断号IORESOURCE_IRQ、DMA资源IORESOURCE_DMA等)。
每一个平台设备都对应一个平台设备驱动,这个驱动用来对平台设备进行探测、移除、关闭等操作。
平台设备驱动用platform_driver结构体表示:
58 struct platform_driver { 59 int (*probe)(struct platform_device *); 60 int (*remove)(struct platform_device *); 61 void (*shutdown)(struct platform_device *); 62 int (*suspend)(struct platform_device *, pm_message_t state); 63 int (*resume)(struct platform_device *); 64 struct device_driver driver; 65 struct platform_device_id *id_table; 66 };平台设备的具体使用可参考Linux内核http://lxr.free-electrons.com/source/drivers/watchdog/s3c2410_wdt.c?v=2.6.32下的