支持驱动最好的linux软件,Linux平台设备和驱动

一 platform总线

一个现实的linux设备驱动通常需要挂接在一种总线上,对于本身依附于PCI,USB,IIC,SPI等的设备而言,这自然不是问题,但是在嵌入式系统里面,SOC系统中集成的独立的外设控制器,挂接在SOC内存空间的外设等确不依附于此类总线。基于这一背景,linux发明了一种虚拟的总线,称为platform总线,相应的设备称为platform_device,而驱动成为platform_driver.Platform总线是linux2.6内核加的一种虚拟总线。

Linux platform driver机制和传统的device driver 机制(通过driver_register函数进行注册)相比,一个十分明显的优势在于platform机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过platform device提供的标准接口进行申请并使用。这样提高了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性(这些标准接口是安全的)。

二 平台设备的驱动软件设计流程

四 平台驱动

4.1platform_driver

platform_driver 是 device_driver 的封装,提供了驱动的 probe 和 remove 方法,也提供了

与电源管理相关的 shutdown 和 suspend 等方法

struct platform_driver {

int (*probe)(struct platform_device *);     /* probe 方法 */

int (*remove)(struct platform_device *);    /* remove 方法 */

void (*shutdown)(struct platform_device *); /* shutdown 方法 */

int (*suspend)(struct platform_device *, pm_message_t state); /* suspend 方法 */

int (*resume)(struct platform_device *);    /* resume 方法 */

struct device_driver driver;                 /* 设备驱动 */

const struct platform_device_id *id_table;  /* 设备的 ID 表 */

};

Platform_driver 有 5 个方法:

robe成员指向驱动的探测代码,在 probe方法中获取设备的资源信息并进行处理,

如进行物理地址到虚拟地址的 remap,或者申请中断等操作,与模块的初始化代码

不同;

emove 成员指向驱动的移除代码,进行一些资源释放和清理工作,如取消物理地

址与虚拟地址的映射关系,或者释放中断 等,与模块的退出代码不同;

hutdown 成员指向设备被关闭时的实现代码;

uspend 成员执行设备挂起时候的处理代码;

esume 成员执行设备从挂起中恢复的处理代码

4.2注册和注销平台设备

注册和注销 platform_driver 的函数分别是 platform_driver_register()和 platform_driver

_unregister(), 函数原型分别如下:

int platform_driver_register(struct platform_driver *drv);

void platform_driver_unregister(struct platform_driver *drv);

另外, platform_driver_probe()函数也能完成设备注册, 原型如下:

int platform_driver_probe(struct platform_driver *driver, int (*probe)(struct platform_device *));

如果已经明确知道一个设备不支持热插拔,可以在__init 断代码中调用 platform_driver

_probe()函数,以减少运行时对内存的消耗。如下程序清单所示代码是

int __init init_module(void)

{

int retval;

ne_add_devices();

retval = platform_driver_probe(&ne_driver, ne_drv_probe);

if (retval) {

if (io[0] == 0)

printk(KERN_NOTICE “ne.c: You must supply “io=0xNNN””””

“” value(s) for ISA cards.n””);

ne_loop_rm_unreg(1);

return retval;

}

/* Unregister unused platform_devices. */

ne_loop_rm_unreg(0);

return retval;

}

注意:在设备驱动模型中已经提到,bus 根据驱动和设备的名称寻找匹配的设备和驱动,

因此注册驱动必须保证 platform_driver 的 driver.name 字段必须和 platform_device 的 name 相

同, 否则无法将驱动和设备进行绑定而注册失败。

阅读(1871) | 评论(0) | 转发(0) |

相关资源:使用NISignalExpress交互式测量软件衔接产品设计与测试过程.pdf… ”

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年4月4日
下一篇 2021年4月4日

相关推荐