Linux驱动开发学习归纳-3

时间:2022-07-31 23:38:26

设备驱动模型由三大块组成:总线、设备、驱动。

其中总线是虚拟总线,从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下的

Linux/drivers/watchdog/s3c2410_wdt.c文件