日期:2014-05-16  浏览次数:20830 次

Linux驱动开发学习归纳-3

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

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