欢迎来到天天文库
浏览记录
ID:57045512
大小:130.50 KB
页数:16页
时间:2020-07-28
《Linux设备驱动 (基于Linux26xx内核).ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Linux设备驱动(基于Linux2.6.xx内核)总线、设备和驱动程序总线是处理器与一个或多个设备之间的通道。在设备模型中,所有的设备都是通过总线相连的。设备将被挂在总线上。在注册此种总线类型的驱动程序后,它将用于管理挂在此类型总线上的设备。以Luxun9项目中所用到的设备及其驱动程序为例。总体框图如下所示:总线以Luxun9项目所用到的总线为例,它所使用的是虚拟平台总线,代码如下所示:structbus_typeplatform_bus_type={.name="platform",.match=platform_match,.
2、suspend=platform_suspend,.resume=platform_resume,};只有非常少的bus_type成员变量需要初始化,其他的大多数都由设备模型核心所控制。对于新的总线,我们要调用bus_register()函数进行注册。以Luxun9项目所用到的总线为例,代码如下所示:ret=bus_register(&platform_bus_type);if(ret){returnret//失败}如果调用成功,新的总线子系统将加入到系统中,可以在/sys/bus目录下看到它所对应的目录是/sys/bus/plat
3、form。然后,我们可以向这个总线添加设备。设备常用的注册和注销函数是:intdevice_register(structdevice*dev);voiddevice_unregister(structdevice*dev);实际上,一个实际的总线是一个设备,也必须被单独注册。当然,我们也可以注册虚拟总线。例如:在luxun9项目中所用到的Linux2.6.14内核中注册了这样的一个虚拟总线,代码如下所示:structdeviceplatform_bus={.bus_id="platform",};device_register(&
4、platform_bus);完成这个调用后,我们可以在/sys/devices目录中看到它(/sys/devices/platform),任何添加到该总线的设备都会在/sys/devices/platform/显示。设备结构的嵌入device结构包含了设备模型核心用来模拟系统的信息。然而,大多数子系统记录了它们所拥有的设备的所有信息,因此,单独的device结构表示的设备是很少见的。在多时情况下,都是将device结构嵌入到另外一个结构体中。通常,驱动程并不和device结构体直接打交道。例如:在luxun9项目中所用到的Linux
5、2.6.14内核中有这样一个结构体,代码如下所示:structplatform_device{constchar*name;u32id;structdevicedev;u32num_resources;structresource*resource;};用它定义了一个USB设备结构体,代码如下所示:staticstructplatform_devices1r72xxx_device={.name="s1r72v17",.id=-1,.dev={.platform_data=(void*)NULL,.dma_mask=&s1r72xx
6、x_dma_mask,.coherent_dma_mask=0xffffffff,},.num_resources=ARRAY_SIZE(s1r72xxx_resources),.resource=s1r72xxx_resources,};然后通过下面的代码注册设备,将设备挂在虚拟总线platform_bus上,总线类型为platform_bus_type。platform_add_devices(luxun_devices,ARRAY_SIZE(luxun_devices));luxun_devices是一个platform_de
7、vice类型的指针数组,定义如下所示:staticstructplatform_device*luxun_devices[]__initdata={&s1r72xxx_device,&keybd_device,&d13733fb_device};platform_add_devices()函数原型是:intplatform_add_devices(structplatform_device**devs,intnum){inti,ret=0;for(i=0;i8、(devs[i]);if(ret){while(--i>=0)platform_device_unregister(devs[i]);break;}}returnret;}设备驱动程序以luxun9USBControllerDrive
8、(devs[i]);if(ret){while(--i>=0)platform_device_unregister(devs[i]);break;}}returnret;}设备驱动程序以luxun9USBControllerDrive
此文档下载收益归作者所有