设备驱动模型由三大块组成:总线、设备、驱动。
其中总线是虚拟总线,从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 {为了便于统一管理平台设备的资源,在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 };
平台设备资源:
18 struct resource {其中,start表示资源的开始地址,end表示资源的结束地址,name表示资源名,flags表示资源的类型(有I/O端口IORESOURCE_IO、内存资源IORESOURCE_MEM、中断号IORESOURCE_IRQ、DMA资源IORESOURCE_DMA等)。
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 };
每一个平台设备都对应一个平台设备驱动,这个驱动用来对平台设备进行探测、移除、关闭等操作。
平台设备驱动用platform_driver结构体表示:
58 struct platform_driver {平台设备的具体使用可参考Linux内核http://lxr.free-electrons.com/source/drivers/watchdog/s3c2410_wdt.c?v=2.6.32下的
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 };