[ZLG-ARM] Linux设备模型(各环节的整合)

[复制链接]
1858|1
 楼主| reeper 发表于 2009-4-9 14:28 | 显示全部楼层 |阅读模式
一、lddbus模块:添加总线、导出总线设备和设备驱动的注册函数。<br />lddbus子系统声明了一个bus_type结构,称为ldd_bus_type&nbsp;。源码是在编译时初始化了这个结构体,源码:<br />/*<br />*&nbsp;And&nbsp;the&nbsp;bus&nbsp;type.<br />*/<br />struct&nbsp;bus_type&nbsp;ldd_bus_type&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;.name&nbsp;=&nbsp;'ldd',<br />&nbsp;&nbsp;&nbsp;&nbsp;.match&nbsp;=&nbsp;ldd_match,<br />&nbsp;&nbsp;&nbsp;&nbsp;.uevent&nbsp;&nbsp;=&nbsp;ldd_uevent,<br />};<br /><br /><br />在将lddbus子系统装载到内核和从内核卸载的源码如下:&nbsp;static&nbsp;int&nbsp;__init&nbsp;ldd_bus_init(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;ret;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;bus_register(&ldd_bus_type);&nbsp;/*注册总线,在调用这个函数之后ldd_bus_type&nbsp;结构体将向内核注册,在/sys/bus中出现ldd文件夹,其中包含两个目录:devices&nbsp;和&nbsp;drivers&nbsp;*/<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(bus_create_file(&ldd_bus_type,&nbsp;&bus_attr_version))&nbsp;/*添加总线属性,将在/sys/bus/ldd目录中出现version属性文件*/<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(KERN_NOTICE&nbsp;'Unable&nbsp;to&nbsp;create&nbsp;version&nbsp;attribute&nbsp;!&nbsp;<br />');<br />&nbsp;&nbsp;&nbsp;&nbsp;ret&nbsp;=&nbsp;device_register(&ldd_bus);/*将总线作为设备注册。因为总线也可以是一个设备,比如在S3C2440中SPI总线控制器相对于ARM920T核心来说,其实就是一个外设。调用此函数后,就会在/sys/devices中出现ldd0目录*/<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ret)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printk(KERN_NOTICE&nbsp;'Unable&nbsp;to&nbsp;register&nbsp;ldd0&nbsp;!&nbsp;<br />');<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;printk(KERN_NOTICE&nbsp;'Mount&nbsp;lddbus&nbsp;ok&nbsp;!<br />Bus&nbsp;device&nbsp;is&nbsp;ldd0&nbsp;!<br />You&nbsp;can&nbsp;see&nbsp;me&nbsp;in&nbsp;sys/module/&nbsp;,&nbsp;sys/devices/&nbsp;and&nbsp;sys/bus/&nbsp;!&nbsp;<br />');<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;ret;<br />}<br /><br />static&nbsp;void&nbsp;ldd_bus_exit(void)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;device_unregister(&ldd_bus);<br />&nbsp;&nbsp;&nbsp;&nbsp;bus_unregister(&ldd_bus_type);<br />}<br /><br />module_init(ldd_bus_init);<br />module_exit(ldd_bus_exit);<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;lddbus模块的主要部分就是这些,很简单。因为这只不过是一个虚拟的总线,没有实际的驱动。模块还导出了加载总线设备和总线驱动时需要用到的注册和注销函数。对于实际的总线,应该还要导出总线的读写例程。<br /><br />&nbsp;&nbsp;&nbsp;将总线设备和驱动注册函数放在lddbus模块,并导出给其他的总线驱动程序使用,是因为注册总线设备和驱动需要总线结构体的信息,而且这些注册函数对于所有总线设备和驱动都一样。只要这个总线驱动一加载,其他的总线驱动程序就可以通过调用这些函数注册总线设备和驱动,方便了总线设备驱动的作者,减少了代码的冗余。<br /><br />&nbsp;&nbsp;这些注册函数内部调用driver_register、device_register&nbsp;和&nbsp;driver_unregister、device_unregister&nbsp;这些函数。&nbsp;<br /><br /><br />--------------------------------------------------------------------------------<br /><br /><br />二、sculld模块:在scull的基础上添加设备和驱动注册和注销函数。<br />&nbsp;&nbsp;&nbsp;sculld模块基本和scull模块实现的功能一致,我参考《LDD3》提供的sculld,将以前实验过的功能较全的scull进行修改。主要的修改如下(其他还有些小改动):<br /><br />//*******在源码的声明阶段添加如下代码,以增加设备和驱动的结构体*****<br />struct&nbsp;sculld_dev&nbsp;*sculld_devices;&nbsp;/*&nbsp;allocated&nbsp;in&nbsp;scull_init_module&nbsp;*/<br /><br /><br />/*&nbsp;Device&nbsp;model&nbsp;stuff&nbsp;*/<br />static&nbsp;struct&nbsp;ldd_driver&nbsp;sculld_driver&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;.version&nbsp;=&nbsp;'$Revision:&nbsp;1.21-tekkamanninja&nbsp;$',<br />&nbsp;&nbsp;&nbsp;&nbsp;.module&nbsp;=&nbsp;THIS_MODULE,<br />&nbsp;&nbsp;&nbsp;&nbsp;.driver&nbsp;=&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.name&nbsp;=&nbsp;'sculld',<br />&nbsp;&nbsp;&nbsp;&nbsp;},<br />};<br />//**************************************************************<br /><br />//******增加设备注册函数和设备号属性********************************<br />static&nbsp;ssize_t&nbsp;sculld_show_dev(struct&nbsp;device&nbsp;*ddev,&nbsp;struct&nbsp;device_attribute&nbsp;*attr&nbsp;,&nbsp;char&nbsp;*buf)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;sculld_dev&nbsp;*dev&nbsp;=&nbsp;ddev-&gtdriver_data;<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;print_dev_t(buf,&nbsp;dev-&gtcdev.dev);<br />}<br /><br />static&nbsp;DEVICE_ATTR(dev,&nbsp;S_IRUGO,&nbsp;sculld_show_dev,&nbsp;NULL);<br /><br />static&nbsp;void&nbsp;sculld_register_dev(struct&nbsp;sculld_dev&nbsp;*dev,&nbsp;int&nbsp;index)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;sprintf(dev-&gtdevname,&nbsp;'sculld%d',&nbsp;index);<br />&nbsp;&nbsp;&nbsp;&nbsp;dev-&gtldev.name&nbsp;=&nbsp;dev-&gtdevname;<br />&nbsp;&nbsp;&nbsp;&nbsp;dev-&gtldev.driver&nbsp;=&nbsp;&sculld_driver;<br />&nbsp;&nbsp;&nbsp;&nbsp;dev-&gtldev.dev.driver_data&nbsp;=&nbsp;dev;<br />&nbsp;&nbsp;&nbsp;&nbsp;register_ldd_device(&dev-&gtldev);<br />&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(device_create_file(&dev-&gtldev.dev,&nbsp;&dev_attr_dev))&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;printk(&nbsp;'Unable&nbsp;to&nbsp;create&nbsp;dev&nbsp;attribute&nbsp;!&nbsp;<br />');<br />}<br />//*****************************************************************<br /><br />/*还要在模块的初始化函数和模块清除函数中添加设备和驱动的注册和注销函数*/<br />&nbsp;&nbsp;&nbsp;&nbsp;sculld_register_dev(sculld_devices&nbsp;+&nbsp;i,&nbsp;i);<br />&nbsp;&nbsp;&nbsp;&nbsp;register_ldd_driver(&sculld_driver);<br />&nbsp;&nbsp;&nbsp;&nbsp;unregister_ldd_device(&sculld_devices.ldev);<br />&nbsp;&nbsp;&nbsp;&nbsp;unregister_ldd_driver(&sculld_driver);<br /><br /><br />修改后好模块就可以实现向sysfs文件系统导出信息。&nbsp;<br /><br /><br />--------------------------------------------------------------------------------<br /><br /><br />三、分析设备和驱动注册和注销核心函数,了解一般的注册、注销过程。<br /><br />以下也参考了《LDD3》中的PCI驱动分析<br /><br />(1)设备的注册<br /><br />在驱动程序中对设备进行注册的核心函数是:&nbsp;int&nbsp;device_register(struct&nbsp;device&nbsp;*dev)<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;device_initialize(dev);<br />&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;device_add(dev);<br />}<br /><br /><br /><br />&nbsp;&nbsp;&nbsp;在&nbsp;device_register&nbsp;函数中,&nbsp;驱动核心初始化&nbsp;device&nbsp;结构体中的许多成员,&nbsp;向&nbsp;kobject&nbsp;核心注册设备的&nbsp;kobject&nbsp;(&nbsp;导致热插拔事件产生),&nbsp;接着添加设备到其&nbsp;parent&nbsp;节点所拥有的设备链表中。此后所有的设备都可通过正确的顺序被访问,&nbsp;并知道其位于设备层次中的哪一点。<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;设备接着被添加到总线相关的设备链表(包含了所有向总线注册的设备)中。接着驱动核心遍历这个链表,&nbsp;为每个驱动程序调用该总线的match函数。<br /><br />&nbsp;&nbsp;&nbsp;match函数主要是将驱动核心传递给它的&nbsp;struct&nbsp;device&nbsp;和&nbsp;struct&nbsp;device_driver转换为特定的设备、驱动结构体&nbsp;,检查设备的特定信息,&nbsp;以确定驱动程序是否支持该设备:<br /><br />若不支持,&nbsp;函数返回&nbsp;0&nbsp;给驱动核心,这样驱动核心移向链表中的下一个驱动;<br /><br />若支持,&nbsp;函数返回&nbsp;1&nbsp;给驱动核心,使驱动核心设置struct&nbsp;device&nbsp;中的&nbsp;driver&nbsp;指针指向这个驱动,&nbsp;并调用在&nbsp;struct&nbsp;device_driver&nbsp;中指定的&nbsp;probe&nbsp;函数.<br /><br />&nbsp;&nbsp;&nbsp;probe&nbsp;函数(又一次)&nbsp;将驱动核心传递给它的&nbsp;struct&nbsp;device&nbsp;和&nbsp;struct&nbsp;device_driver转换为特定的设备、驱动结构体&nbsp;,并再次验证这个驱动是否支持这个设备,&nbsp;递增设备的引用计数,&nbsp;接着调用总线驱动的&nbsp;probe&nbsp;函数:<br /><br />若总线&nbsp;probe&nbsp;函数认为它不能处理这个设备,则返回一个负的错误值给驱动核心,这样驱动核心移向链表中的下一个设备;<br /><br />若这个&nbsp;probe&nbsp;函数能够处理这个设备,&nbsp;则初始化这个设备,&nbsp;并返回&nbsp;0&nbsp;给驱动核心。这会使驱动核心添加设备到与这个特定驱动所绑定的设备链表中,&nbsp;并在&nbsp;/sys/bus的总线目录中的&nbsp;drivers&nbsp;目录中创建一个到这个设备符号链接(指向/sys/devices中的设备),使用户准确知道哪个驱动被绑定到了哪个设备。<br /><br />(2)设备的注销<br />&nbsp;&nbsp;&nbsp;在驱动程序中对设备进行注销的核心函数是:<br />void&nbsp;device_unregister(struct&nbsp;device&nbsp;*&nbsp;dev)<br /><br />在&nbsp;device_unregister&nbsp;函数中,&nbsp;驱动核心将删除这个设备的驱动程序(如果有)指向这个设备的符号链接,&nbsp;并从它的内部设备链表中删除该设备,&nbsp;再以&nbsp;device&nbsp;结构中的&nbsp;struct&nbsp;kobject&nbsp;指针为参数,调用&nbsp;kobject_del。kobject_del&nbsp;函数引起用户空间的&nbsp;hotplug&nbsp;调用,表明&nbsp;kobject&nbsp;现在从系统中删除,&nbsp;接着删除所有该&nbsp;kobject&nbsp;以前创建的、与之相关联的&nbsp;sysfs&nbsp;文件和目录。kobject_del&nbsp;函数也去除设备自身的&nbsp;kobject&nbsp;引用。此后,&nbsp;所有的和这个设备关联的&nbsp;sysfs&nbsp;入口被去除,&nbsp;并且和这个设备关联的内存被释放。&nbsp;<br />(3)驱动程序的注册<br /><br />&nbsp;&nbsp;在驱动程序中对驱动程序进行注册的核心函数是:&nbsp;int&nbsp;driver_register(struct&nbsp;device_driver&nbsp;*&nbsp;drv)<br /><br /><br /><br />driver_register&nbsp;函数初始化&nbsp;struct&nbsp;device_driver&nbsp;结构体(包括&nbsp;一个设备链表及其增删对象函数&nbsp;和&nbsp;一个自旋锁),&nbsp;然后调用&nbsp;bus_add_driver&nbsp;函数。<br /><br />bus_add_driver进行如下操作:<br /><br />(1)查找驱动关联的总线:若未找到,&nbsp;立刻返回负的错误值;<br />(2)根据驱动的名字和关联的总线,创建驱动的&nbsp;sysfs&nbsp;目录;<br />(3)获取总线的内部锁,&nbsp;遍历所有的已经注册到总线的设备,为这些设备调用match函数,&nbsp;若成功,进行剩下的绑定过程。(类似注册设备,不再赘述)<br /><br />(4)驱动程序的注销<br /><br />&nbsp;&nbsp;&nbsp;删除驱动程序是一个简单的过程,在驱动程序中对驱动程序进行注销的核心函数是:&nbsp;void&nbsp;driver_unregister(struct&nbsp;device_driver&nbsp;*&nbsp;drv)<br /><br />deiver_unregister&nbsp;函数通过清理在&nbsp;sysfs&nbsp;树中连接到这个驱动入口的&nbsp;sysfs&nbsp;属性,来完成一些基本的管理工作。然后遍历所有属于该驱动的设备,为其调用&nbsp;release&nbsp;函数(类似设备从系统中删除时调用&nbsp;release&nbsp;函数)。&nbsp;<br />在所有的设备与驱动程序脱离后,通常在驱动程序中会使用下面两个函数:<br /><br />down(&drv-&gtunload_sem);<br />up(&drv-&gtunload_sem);<br /><br />它们在函数返回给调用者之前完成。这样做是因为在安全返回前,代码需要等待所有的对这个驱动的引用计数为&nbsp;0。<br />模块卸载时,通常都要调用&nbsp;driver_unregister&nbsp;函数作为退出的方法。&nbsp;只要驱动程序被设备引用并且等待这个锁时,模块就需要保留在内存中。这使得内核知道何时可以安全从内存删除驱动。<br /><br /><br /><br /><br /><br />--------------------------------------------------------------------------------<br /><br /><br />四、ARM9开发板实验<br /><br />实验源码:http://blogimg.chinaunix.net/blog/upfile2/080109150139.rar<br /><br />实验过程:&nbsp;<br />[Tekkaman2440@SBC2440V4]#insmod&nbsp;/lib/modules/lddbus.ko<br />Mount&nbsp;lddbus&nbsp;ok&nbsp;!<br />Bus&nbsp;device&nbsp;is&nbsp;ldd0&nbsp;!<br />You&nbsp;can&nbsp;see&nbsp;me&nbsp;in&nbsp;sys/module/&nbsp;,&nbsp;sys/devices/&nbsp;and&nbsp;sys/bus/&nbsp;!<br />[Tekkaman2440@SBC2440V4]#tree&nbsp;-AC&nbsp;/sys/module/lddbus/&nbsp;/sys/devices/ldd0/&nbsp;/sys/bus/ldd/<br />/sys/module/lddbus/<br />├──&nbsp;holders<br />├──&nbsp;initstate<br />├──&nbsp;refcnt<br />└──&nbsp;sections<br />&nbsp;&nbsp;&nbsp;&nbsp;├──&nbsp;__ksymtab<br />&nbsp;&nbsp;&nbsp;&nbsp;└──&nbsp;__ksymtab_strings<br />/sys/devices/ldd0/<br />├──&nbsp;power<br />│&nbsp;└──&nbsp;wakeup<br />└──&nbsp;uevent<br />/sys/bus/ldd/<br />├──&nbsp;devices<br />├──&nbsp;drivers<br />├──&nbsp;drivers_autoprobe<br />├──&nbsp;drivers_probe<br />└──&nbsp;version<br /><br />5&nbsp;directories,&nbsp;9&nbsp;files<br />[Tekkaman2440@SBC2440V4]#cat&nbsp;/sys/bus/ldd/version<br />Revision:&nbsp;1.9-tekkamanninja<br />[Tekkaman2440@SBC2440V4]#rmmod&nbsp;lddbus<br />The&nbsp;LDD&nbsp;bus&nbsp;device<br />ldd_bus_release&nbsp;:&nbsp;lddbus&nbsp;<br />[Tekkaman2440@SBC2440V4]#ls&nbsp;/sys/module&nbsp;/sys/devices&nbsp;/sys/bus<br />/sys/bus:<br />i2c&nbsp;ide&nbsp;mmc&nbsp;platform&nbsp;serio&nbsp;spi&nbsp;usb<br /><br />/sys/devices:<br />platform&nbsp;system<br /><br />/sys/module:<br />8250&nbsp;loop&nbsp;rd&nbsp;snd_seq&nbsp;usbnet<br />atkbd&nbsp;mac80211&nbsp;redboot&nbsp;snd_seq_oss&nbsp;v4l1_compat<br />cdrom&nbsp;mousedev&nbsp;rfd_ftl&nbsp;snd_soc_core&nbsp;vt<br />dm9000&nbsp;nfs&nbsp;rtc_ds1307&nbsp;snd_timer&nbsp;yaffs<br />hid&nbsp;ohci_hcd&nbsp;s3c2410_wdt&nbsp;spidev&nbsp;zc0301<br />ide_cd&nbsp;printk&nbsp;snd&nbsp;sunrpc<br />keyboard&nbsp;psmouse&nbsp;snd_pcm&nbsp;tcp_cubic<br />lockd&nbsp;rcupdate&nbsp;snd_pcm_oss&nbsp;usbcore<br />[Tekkaman2440@SBC2440V4]#insmod&nbsp;/lib/modules/sculld.ko<br />sculld:&nbsp;Unknown&nbsp;symbol&nbsp;register_ldd_device<br />sculld:&nbsp;Unknown&nbsp;symbol&nbsp;register_ldd_driver<br />sculld:&nbsp;Unknown&nbsp;symbol&nbsp;unregister_ldd_driver<br />sculld:&nbsp;Unknown&nbsp;symbol&nbsp;unregister_ldd_device<br />insmod:&nbsp;cannot&nbsp;insert&nbsp;'/lib/modules/sculld.ko':&nbsp;Unknown&nbsp;symbol&nbsp;in&nbsp;module&nbsp;(-1):&nbsp;No&nbsp;such&nbsp;file&nbsp;or&nbsp;directory<br />[Tekkaman2440@SBC2440V4]#insmod&nbsp;/lib/modules/lddbus.ko<br />Mount&nbsp;lddbus&nbsp;ok&nbsp;!<br />Bus&nbsp;device&nbsp;is&nbsp;ldd0&nbsp;!<br />You&nbsp;can&nbsp;see&nbsp;me&nbsp;in&nbsp;sys/module/&nbsp;,&nbsp;sys/devices/&nbsp;and&nbsp;sys/bus/&nbsp;!<br />[Tekkaman2440@SBC2440V4]#insmod&nbsp;/lib/modules/sculld.ko<br />[Tekkaman2440@SBC2440V4]#tree&nbsp;-AC&nbsp;/sys/module/lddbus/&nbsp;/sys/devices/ldd0/&nbsp;/sys/bus/ldd/&nbsp;/sys/module/sculld/<br />/sys/module/lddbus/<br />├──&nbsp;holders<br />│&nbsp;└──&nbsp;sculld&nbsp;-&gt&nbsp;../../../module/sculld<br />├──&nbsp;initstate<br />├──&nbsp;refcnt<br />└──&nbsp;sections<br />&nbsp;&nbsp;&nbsp;&nbsp;├──&nbsp;__ksymtab<br />&nbsp;&nbsp;&nbsp;&nbsp;└──&nbsp;__ksymtab_strings<br />/sys/devices/ldd0/<br />├──&nbsp;power<br />│&nbsp;└──&nbsp;wakeup<br />├──&nbsp;sculld0<br />│&nbsp;├──&nbsp;bus&nbsp;-&gt&nbsp;../../../bus/ldd<br />│&nbsp;├──&nbsp;dev<br />│&nbsp;├──&nbsp;driver&nbsp;-&gt&nbsp;../../../bus/ldd/drivers/sculld<br />│&nbsp;├──&nbsp;power<br />│&nbsp;│&nbsp;└──&nbsp;wakeup<br />│&nbsp;├──&nbsp;subsystem&nbsp;-&gt&nbsp;../../../bus/ldd<br />│&nbsp;└──&nbsp;uevent<br />├──&nbsp;sculld1<br />│&nbsp;├──&nbsp;bus&nbsp;-&gt&nbsp;../../../bus/ldd<br />│&nbsp;├──&nbsp;dev<br />│&nbsp;├──&nbsp;driver&nbsp;-&gt&nbsp;../../../bus/ldd/drivers/sculld<br />│&nbsp;├──&nbsp;power<br />│&nbsp;│&nbsp;└──&nbsp;wakeup<br />│&nbsp;├──&nbsp;subsystem&nbsp;-&gt&nbsp;../../../bus/ldd<br />│&nbsp;└──&nbsp;uevent<br />├──&nbsp;sculld2<br />│&nbsp;├──&nbsp;bus&nbsp;-&gt&nbsp;../../../bus/ldd<br />│&nbsp;├──&nbsp;dev<br />│&nbsp;├──&nbsp;driver&nbsp;-&gt&nbsp;../../../bus/ldd/drivers/sculld<br />│&nbsp;├──&nbsp;power<br />│&nbsp;│&nbsp;└──&nbsp;wakeup<br />│&nbsp;├──&nbsp;subsystem&nbsp;-&gt&nbsp;../../../bus/ldd<br />│&nbsp;└──&nbsp;uevent<br />├──&nbsp;sculld3<br />│&nbsp;├──&nbsp;bus&nbsp;-&gt&nbsp;../../../bus/ldd<br />│&nbsp;├──&nbsp;dev<br />│&nbsp;├──&nbsp;driver&nbsp;-&gt&nbsp;../../../bus/ldd/drivers/sculld<br />│&nbsp;├──&nbsp;power<br />│&nbsp;│&nbsp;└──&nbsp;wakeup<br />│&nbsp;├──&nbsp;subsystem&nbsp;-&gt&nbsp;../../../bus/ldd<br />│&nbsp;└──&nbsp;uevent<br />└──&nbsp;uevent<br />/sys/bus/ldd/<br />├──&nbsp;devices<br />│&nbsp;├──&nbsp;sculld0&nbsp;-&gt&nbsp;../../../devices/ldd0/sculld0<br />│&nbsp;├──&nbsp;sculld1&nbsp;-&gt&nbsp;../../../devices/ldd0/sculld1<br />│&nbsp;├──&nbsp;sculld2&nbsp;-&gt&nbsp;../../../devices/ldd0/sculld2<br />│&nbsp;└──&nbsp;sculld3&nbsp;-&gt&nbsp;../../../devices/ldd0/sculld3<br />├──&nbsp;drivers<br />│&nbsp;└──&nbsp;sculld<br />│&nbsp;├──&nbsp;bind<br />│&nbsp;├──&nbsp;sculld0&nbsp;-&gt&nbsp;../../../../devices/ldd0/sculld0<br />│&nbsp;├──&nbsp;sculld1&nbsp;-&gt&nbsp;../../../../devices/ldd0/sculld1<br />│&nbsp;├──&nbsp;sculld2&nbsp;-&gt&nbsp;../../../../devices/ldd0/sculld2<br />│&nbsp;├──&nbsp;sculld3&nbsp;-&gt&nbsp;../../../../devices/ldd0/sculld3<br />│&nbsp;├──&nbsp;unbind<br />│&nbsp;└──&nbsp;version<br />├──&nbsp;drivers_autoprobe<br />├──&nbsp;drivers_probe<br />└──&nbsp;version<br />/sys/module/sculld/<br />├──&nbsp;holders<br />├──&nbsp;initstate<br />├──&nbsp;parameters<br />│&nbsp;├──&nbsp;scull_major<br />│&nbsp;├──&nbsp;scull_minor<br />│&nbsp;├──&nbsp;scull_nr_devs<br />│&nbsp;├──&nbsp;scull_qset<br />│&nbsp;└──&nbsp;scull_quantum<br />├──&nbsp;refcnt<br />└──&nbsp;sections<br />&nbsp;&nbsp;&nbsp;&nbsp;├──&nbsp;__ex_table<br />&nbsp;&nbsp;&nbsp;&nbsp;└──&nbsp;__param<br /><br />38&nbsp;directories,&nbsp;33&nbsp;files<br />[Tekkaman2440@SBC2440V4]#cat&nbsp;/sys/bus/ldd/version&nbsp;/sys/devices/ldd0/sculld*/dev&nbsp;/sys/bus/ldd/drivers/sculld/version<br />Revision:&nbsp;1.9-tekkamanninja<br />252:0<br />252:1<br />252:2<br />252:3<br />$Revision:&nbsp;1.21-tekkamanninja&nbsp;$<br />[Tekkaman2440@SBC2440V4]#rmmod&nbsp;sculld<br />[Tekkaman2440@SBC2440V4]#tree&nbsp;-ACd&nbsp;/sys/module/lddbus/&nbsp;/sys/devices/ldd0/&nbsp;/sys/bus/ldd/&nbsp;/sys/module/<br />/sys/module/lddbus/<br />├──&nbsp;holders<br />└──&nbsp;sections<br />/sys/devices/ldd0/<br />└──&nbsp;power<br />/sys/bus/ldd/<br />├──&nbsp;devices<br />└──&nbsp;drivers<br />/sys/module/<br />├──&nbsp;8250<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;atkbd<br />│&nbsp;└──&nbsp;drivers<br />│&nbsp;└──&nbsp;serio:atkbd&nbsp;-&gt&nbsp;../../../bus/serio/drivers/atkbd<br />├──&nbsp;cdrom<br />├──&nbsp;dm9000<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;hid<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;ide_cd<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;keyboard<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;lddbus<br />│&nbsp;├──&nbsp;holders<br />│&nbsp;└──&nbsp;sections<br />├──&nbsp;lockd<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;loop<br />├──&nbsp;mac80211<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;mousedev<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;nfs<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;ohci_hcd<br />├──&nbsp;printk<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;psmouse<br />│&nbsp;├──&nbsp;drivers<br />│&nbsp;│&nbsp;└──&nbsp;serio:psmouse&nbsp;-&gt&nbsp;../../../bus/serio/drivers/psmouse<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;rcupdate<br />├──&nbsp;rd<br />├──&nbsp;redboot<br />├──&nbsp;rfd_ftl<br />├──&nbsp;rtc_ds1307<br />├──&nbsp;s3c2410_wdt<br />├──&nbsp;snd<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;snd_pcm<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;snd_pcm_oss<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;snd_seq<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;snd_seq_oss<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;snd_soc_core<br />├──&nbsp;snd_timer<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;spidev<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;sunrpc<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;tcp_cubic<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;usbcore<br />│&nbsp;├──&nbsp;drivers<br />│&nbsp;│&nbsp;├──&nbsp;usb:hub&nbsp;-&gt&nbsp;../../../bus/usb/drivers/hub<br />│&nbsp;│&nbsp;└──&nbsp;usb:usbfs&nbsp;-&gt&nbsp;../../../bus/usb/drivers/usbfs<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;usbnet<br />├──&nbsp;v4l1_compat<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;vt<br />│&nbsp;└──&nbsp;parameters<br />├──&nbsp;yaffs<br />│&nbsp;└──&nbsp;parameters<br />└──&nbsp;zc0301<br />&nbsp;&nbsp;&nbsp;&nbsp;├──&nbsp;drivers<br />&nbsp;&nbsp;&nbsp;&nbsp;│&nbsp;└──&nbsp;usb:zc0301&nbsp;-&gt&nbsp;../../../bus/usb/drivers/zc0301<br />&nbsp;&nbsp;&nbsp;&nbsp;└──&nbsp;parameters<br /><br />79&nbsp;directories<br />[Tekkaman2440@SBC2440V4]#insmod&nbsp;/lib/modules/sculld.ko<br />[Tekkaman2440@SBC2440V4]#rmmod&nbsp;lddbus<br />rmmod:&nbsp;lddbus:&nbsp;Resource&nbsp;temporarily&nbsp;unavailable<br />[Tekkaman2440@SBC2440V4]#rmmod&nbsp;sculld<br />[Tekkaman2440@SBC2440V4]#rmmod&nbsp;lddbus<br />The&nbsp;LDD&nbsp;bus&nbsp;device<br />ldd_bus_release&nbsp;:&nbsp;lddbus&nbsp;<br />[Tekkaman2440@SBC2440V4]#<br /><br /><br /><br />--------------------------------------------------------------------------------<br /><br /><br />在系统中添加“tree”命令<br />实验中用到了Linux的常用命令“tree”,若使用busybox可能没有这个命令。如出现这种情况,可以下载此命令的源码,交叉编译一下,再放到根文件系统中的/bin目录中就好。在&nbsp;CalmArrow&nbsp;的博客中可以下载:http://blog.chinaunix.net/u/21948/showart_297101.html<br />(因为源码的下载地址&nbsp;ftp://mama.indstate.edu/linux/tree/我一直进不去,在这里谢谢CalmArrow)
zcying 发表于 2009-4-9 15:05 | 显示全部楼层

这需要对整个系统有深入的了解

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

139

主题

185

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部