[ZLG-ARM] Linux设备模型(热插拔、mdev 与 firmware)

[复制链接]
3034|1
 楼主| reeper 发表于 2009-4-9 14:30 | 显示全部楼层 |阅读模式
热插拔<br />有&nbsp;2&nbsp;个不同角度来看待热插拔:<br />&nbsp;&nbsp;&nbsp;从内核角度看,热插拔是在硬件、内核和内核驱动之间的交互。<br />&nbsp;&nbsp;&nbsp;从用户角度看,热插拔是内核和用户空间之间,通过调用用户空间程序(如hotplug、udev&nbsp;和&nbsp;mdev)的交互。&nbsp;当需要通知用户内核发生了某种热插拔事件时,内核才调用这个用户空间程序。<br />现在的计算机系统,要求&nbsp;Linux&nbsp;内核能够在硬件从系统中增删时,可靠稳定地运行。这就对设备驱动作者增加了压力,因为在他们必须处理一个毫无征兆地突然出现或消失的设备。<br />插拔工具<br />当用户向系统添加或删除设备时,内核会产生一个热插拔事件,并在&nbsp;/proc/sys/kernel/hotplug&nbsp;文件里查找处理设备连接的用户空间程序。这个用户空间程序主要有<br /><br />hotplug:这个程序是一个典型的&nbsp;bash&nbsp;脚本,只传递执行权给一系列位于&nbsp;/etc/hot-plug.d/&nbsp;目录树的程序。hotplug&nbsp;脚本搜索所有的有&nbsp;.hotplug&nbsp;后缀的可能对这个事件进行处理的程序并调用它们,&nbsp;并传递给它们许多不同的已经被内核设置的环境变量。(基本已被淘汰,具体内容请参阅《LDD3》)<br /><br />udev&nbsp;:用于linux2.6.13或更高版本的内核上,为用户空间提供使用固定设备名的动态/dev目录的解决方案。它通过在&nbsp;sysfs&nbsp;的&nbsp;/class/&nbsp;和/block/&nbsp;目录树中查找一个称为&nbsp;dev&nbsp;的文件,以确定所创建的设备节点文件的主次设备号。所以要使用udev,驱动必须为设备在sysfs中创建类接口及其dev属性文件,方法和sculld模块中创建dev属性相同。&nbsp;udev的资料网上十分丰富,我就不在这废话了,给出以下链接有兴趣的自己研究:<br />《UDEV&nbsp;Primer》(英文),地址:http://webpages.charter.net/decibelshelp/LinuxHelp_UDEVPrimer.html<br /><br />《udev规则编写》(luofuchong翻译),地址:http://www.cnitblog.com/luofuchong/archive/2007/12/18/37831.html<br /><br />《什么是udev》地址:http://blog.csdn.net/steganography/archive/2006/04/10/657620.aspx<br /><br />《udev-FAQ&nbsp;中文翻译》地址:http://gnawux.bokee.com/3225765.html<br /><br />《udev轻松上路》地址:http://www.blog.edu.cn/user1/3313/archives/2007/1635169.shtml<br /><br />《Udev&nbsp;(简体中文)》地址:http://wiki.archlinux.org/index.php/Udev_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)<br /><br />Udev官方主页:http://www.kernel.org/pub/linux/utils/kernel/hotplug/udev.html<br />下载地址:http://www.kernel.org/pub/linux/utils/kernel/hotplug/<br /><br />在《LFS》中也有介绍udev的使用,很值得参考!下载地址:http://lfs.osuosl.org/lfs/downloads/stable/&nbsp;<br /><br /><br /><br />mdev:一个简化版的udev,是busybox所带的程序,十分适合嵌入式系统。<br /><br />因为hotplug现在也在被慢慢地淘汰,udev不再依赖hotplug了,所以这里不再介绍;<br /><br />udev较mdev复杂,不太适合嵌入式使用。(本人也有做udev的实验,交叉编译是通过了,但是使用上有问题,没有实现其功能。也许是我的文件系统没做好,以后有时间再研究和写记录。有成功高人的通知一声,交流一下经验。^_^谢谢!);<br /><br />mdev简单易用,比较适合嵌入式系统,实验成功。以下详细介绍mdev的使用。&nbsp;<br /><br /><br />--------------------------------------------------------------------------------<br /><br />mdev<br /><br />在一开始建立根文件系统时,我根据&nbsp;WeiBing&nbsp;的博客上《UDEV&nbsp;on&nbsp;embeded&nbsp;Linux-2.6.19.2》(地址:http://weibing.blogbus.com/logs/4485453.html)这篇**的提示,开始使用mdev,但是当时只是启动时mdev&nbsp;-s&nbsp;一下,并没有深究。现在在学习了Linux设备模型之后,对于Linux中/dev目录的动态管理有了更深的认识,并认真的看了一下busybox中的mdev.txt文档并翻译了一下,做成了PDF(下载地址:http://blogimg.chinaunix.net/blog/upfile2/080111091002.pdf),在看下面的内容时请先看看这篇文档。<br /><br />先声明一个要点:要实现设备节点文件的自动、动态的增删,必须在你自己的驱动源码中实现&nbsp;类&nbsp;接口,并在类设备的目录中添加包含设备号的名为“dev”的属性文件。<br /><br />mdev原理及bug<br /><br />要使用mdev,适当知道一下原理是必不可少的(能完整地研究mdev源码是最好的)。说实话起初我并没有想看mdev的源码,是在使用时发现了问题后才去研究了一下mdev的源码。现在简单介绍一下mdev的原理:<br /><br />执行mdev&nbsp;-s&nbsp;:以‘-s’为参数调用位于&nbsp;/sbin目录写的mdev(其实是个链接,作用是传递参数给/bin目录下的busybox程序并调用它),mdev扫描&nbsp;/sys/class&nbsp;和&nbsp;/sys/block&nbsp;中所有的类设备目录,如果在目录中含有名为“dev”的文件,且文件中包含的是设备号,则mdev就利用这些信息为这个设备在/dev&nbsp;下创建设备节点文件。一般只在启动时才执行一次&nbsp;“mdev&nbsp;-s”。<br /><br />热插拔事件:由于启动时运行了命令:echo&nbsp;/sbin/mdev&nbsp;&gt&nbsp;/proc/sys/kernel/hotplug&nbsp;,那么当有热插拔事件产生时,内核就会调用位于&nbsp;/sbin目录的mdev。这时mdev通过环境变量中的&nbsp;ACTION&nbsp;和&nbsp;DEVPATH,来确定此次热插拔事件的动作以及影响了/sys中的那个目录。接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为这个设备在/dev&nbsp;下创建设备节点文件。<br /><br />源码的bug(个人意见):由于mdev是通过判断“dev”属性文件的路径字符串中的第6个字符是否为‘c’,来决定设备是字符设备还是块设备【type&nbsp;=&nbsp;(path[5]&nbsp;==&nbsp;'c'&nbsp;?&nbsp;S_IFCHR&nbsp;:&nbsp;S_IFBLK);例如path&nbsp;=&nbsp;'/sys/class/ldd/sculld*/'为字符设备,而/sys/devices/ldd0/sculld*/&nbsp;就会被误判为块设备】,那么如果你在非&nbsp;/sys/class&nbsp;和&nbsp;/sys/block&nbsp;目录下建立了“dev”属性文件且内容是设备号(像sculld中就这样做了),那么mdev也会在/dev&nbsp;下创建设备节点文件。这样可能所创建的设备节点文件是错的。<br /><br />以我实验为例,我以上一篇的**中的sculld为基础,加上了类接口(这样在/sys/devices/ldd0/sculld*/和&nbsp;/sys/class/ldd/sculld*&nbsp;中都有内容为设备号的“dev”属性文件)。在运行时发现一直会将有的sculld*创建为块设备节点文件。郁闷死了,难道我的驱动有错???最后研究了mdev源码之后发现,只要在&nbsp;/sys中建立了“dev”属性文件且内容是设备号,mdev就会以所在的目录为名在/dev&nbsp;下创建设备节点文件。像sculld模块,mdev会为一个设备创建两次设备文件,由于文件名一样,第二次的文件会覆盖第一次的。如果第二次是因为/sys/devices/ldd0/sculld*/dev&nbsp;产生的设备节点文件,那么设备节点文件就会被错误地创建为块设备。<br /><br />我认为这个bug的解决办法有如下两种:<br /><br />(1)在你写驱动的时候,只在/sys/class&nbsp;和&nbsp;/sys/block&nbsp;中的类设备目录中存在包含设备号的“dev”属性文件。(你无法保证被人的驱动会这么做)<br /><br />(2)修正mdev源码:<br /><br />修改/busybox-1.9.0/util-linux/mdev.c文件的第328行:<br /><br /><br />if&nbsp;(!strcmp(action,&nbsp;'remove'))<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;make_device(temp,&nbsp;1);<br /><br />else&nbsp;if&nbsp;(!strcmp(action,&nbsp;'add'))&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(env_path[2]=='l')&nbsp;make_device(temp,0);&nbsp;&nbsp;//tekkamanninja<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(ENABLE_FEATURE_MDEV_LOAD_FIRMWARE)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;load_firmware(getenv('FIRMWARE'),&nbsp;temp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br /><br />也就是在增加设备节点文件之前检查/sys/目录下的路径是否为/class和/block(通过检查路径字符串的第3个字符是否为‘l’)。<br /><br /><br />本人推荐第二种做法!<br /><br /><br /><br />mdev使用<br />mdev的使用在busybox中的mdev.txt文档已经将得很详细了。但作为例子,我简单讲讲我的使用过程:<br /><br />(1)在编译时加上对mdev的支持(我是使用的是busybox1.9.0):<br />&nbsp;&nbsp;&nbsp;&nbsp;Linux&nbsp;System&nbsp;Utilities&nbsp;&nbsp;---&gt&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br />mdev&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;Support&nbsp;/etc/mdev.conf&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Support&nbsp;command&nbsp;execution&nbsp;at&nbsp;device&nbsp;addition/removal&nbsp;<br /><br /><br />(2)在启动时加上使用mdev的命令:<br /><br />我在自己创建的根文件系统(nfs)中的/linuxrc文件中添加了如下指令:<br />#挂载/sys为sysfs文件系统<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;'----------mount&nbsp;/sys&nbsp;as&nbsp;sysfs'<br />&nbsp;&nbsp;&nbsp;&nbsp;/bin/mount&nbsp;-t&nbsp;tmpfs&nbsp;mdev&nbsp;/dev&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;/bin/mount&nbsp;-t&nbsp;sysfs&nbsp;sysfs&nbsp;/sys<br />&nbsp;&nbsp;&nbsp;&nbsp;echo&nbsp;'----------Starting&nbsp;mdev......'<br />&nbsp;&nbsp;&nbsp;&nbsp;/bin/echo&nbsp;/sbin/mdev&nbsp;&gt&nbsp;/proc/sys/kernel/hotplug<br />&nbsp;&nbsp;&nbsp;&nbsp;mdev&nbsp;-s&nbsp;<br /><br />注意:是/bin/echo&nbsp;/sbin/mdev&nbsp;&gt&nbsp;/proc/sys/kernel/hotplug,并非/bin/echo&nbsp;/bin/mdev&nbsp;&gt&nbsp;/proc/sys/kernel/hotplug。busybox的文档有错!!<br /><br /><br />&nbsp;&nbsp;<br />(3)在你的驱动中加上对类设备接口的支持,并在类设备目录下添加包含设备号的名为“dev”的属性文件。<br /><br />(4)至于/etc/mdev.conf文件,可有可无,不影响使用,只是添加了些功能。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;为了实验我在/etc创建了mdev.conf文件并输入了:<br />&nbsp;&nbsp;&nbsp;&nbsp;sculld[0-1]&nbsp;0:0&nbsp;666&nbsp;*&nbsp;echo&nbsp;tekkaman&nbsp;&gt&nbsp;/tmp/mdev<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;这样,在挂载和卸载sculld.ko时,在/tmp/下会出现mdev文件,里面字符为tekkaman<br /><br /><br />具体的实验源码和现象在**后面有。<br /><br /><br />--------------------------------------------------------------------------------<br /><br />firmware<br /><br />硬件市场的激烈竞争,&nbsp;使得制造商连一点用于设备控制固件的&nbsp;EEPROM&nbsp;的成本都不愿意花费。因此固件一般发布在和硬件配套的驱动包中,由操作系统(其实是驱动程序)负责传送固件到设备。<br /><br />内核固件接口<br /><br /><br /><br />获取固件的正确方法是当需要时从用户空间获取它。一定不要试图从内核空间直接打开包含固件的文件,那是一个易出错的操作,&nbsp;因为它把策略(以文件名的形式)包含进了内核。正确的方法是使用固件接口:&nbsp;#include&nbsp;<br />int&nbsp;request_firmware(const&nbsp;struct&nbsp;firmware&nbsp;**fw,&nbsp;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;char&nbsp;*name,&nbsp;/*&nbsp;name&nbsp;为固件文件名*/<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;device&nbsp;*device);<br />/*要求用户空间定位并提供一个固件映象给内核;若成功加载,&nbsp;返回值是&nbsp;0(否则返回错误码)*/<br /><br />/*因为&nbsp;request_firmware&nbsp;需要用户空间的操作,&nbsp;所以返回前将保持休眠。若驱动必须使用固件而不能进入休眠时,可使用以下异步函数:*/<br />int&nbsp;request_firmware_nowait(<br />&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;module&nbsp;*module,&nbsp;/*&nbsp;=&nbsp;THIS_MODULE*/<br />&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;uevent,<br />&nbsp;&nbsp;&nbsp;&nbsp;const&nbsp;char&nbsp;*name,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;struct&nbsp;device&nbsp;*device,&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;*context,/*不由固件子系统使用的私有数据指针*/<br />&nbsp;&nbsp;&nbsp;&nbsp;void&nbsp;(*cont)(const&nbsp;struct&nbsp;firmware&nbsp;*fw,&nbsp;void&nbsp;*context));<br />/*如果一切正常,request_firmware_nowait&nbsp;开始固件加载过程并返回&nbsp;0.&nbsp;过了一段时间后(默认10秒),将用加载的结果(若加载失败,&nbsp;fw&nbsp;为&nbsp;NULL)作为参数调用&nbsp;cont。*/<br /><br />/*&nbsp;fw&nbsp;参数指向以下结构体:*/<br />struct&nbsp;firmware&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;size_t&nbsp;size;<br />&nbsp;&nbsp;&nbsp;&nbsp;u8&nbsp;*data;<br />};<br />/*那个结构包含实际的固件,&nbsp;它现在可被下载到设备中.但是请注意:在发送它到硬件之前,必须检查这个文件以确保它是正确的固件映象(设备固件常常包含标识字符串、&nbsp;校验和等等)*/<br /><br />/*当固件已经发送到设备后,应当释放&nbsp;firmware&nbsp;结构体,&nbsp;使用:*/<br />void&nbsp;release_firmware(struct&nbsp;firmware&nbsp;*fw);&nbsp;<br /><br /><br /><br />注意:要使用firmware,必须要在配置内核时选上:<br /><br />&nbsp;&nbsp;&nbsp;Device&nbsp;Drivers&nbsp;&nbsp;---&gt&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Generic&nbsp;Driver&nbsp;Options&nbsp;&nbsp;---&gt&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt*&gt&nbsp;Userspace&nbsp;firmware&nbsp;loading&nbsp;support&nbsp;<br /><br /><br />否则会出现:&nbsp;Unknown&nbsp;symbol&nbsp;release_firmware&nbsp;和:&nbsp;Unknown&nbsp;symbol&nbsp;request_firmware&nbsp;的错误。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br />固件接口工作原理<br /><br />固件子系统使用&nbsp;sysfs&nbsp;和热插拔机制工作。当调用&nbsp;request_firmware时,&nbsp;函数将在&nbsp;/sys/class/firmware&nbsp;下创建一个以设备名为目录名的新目录,其中包含&nbsp;3&nbsp;个属性:<br /><br />loading&nbsp;:这个属性应当被加载固件的用户空间进程设置为&nbsp;1。当加载完毕,&nbsp;它将被设为&nbsp;0。被设为&nbsp;-1&nbsp;时,将中止固件加载。<br />data&nbsp;:一个用来接收固件数据的二进制属性。在设置&nbsp;loading&nbsp;为1后,&nbsp;用户空间进程将固件写入这个属性。<br />device&nbsp;:一个链接到&nbsp;/sys/devices&nbsp;下相关入口项的符号链接。<br />一旦创建了&nbsp;sysfs&nbsp;入口项,&nbsp;内核将为设备产生一个热插拔事件,并传递包括变量&nbsp;FIRMWARE&nbsp;的环境变量给处理热插拔的用户空间程序。FIRMWARE&nbsp;被设置为提供给&nbsp;request_firmware&nbsp;的固件文件名。<br /><br />用户空间程序定位固件文件,&nbsp;并将其拷贝到内核提供的二进制属性;若无法定位文件,&nbsp;用户空间程序设置&nbsp;loading&nbsp;属性为&nbsp;-1。<br /><br />若固件请求在&nbsp;10&nbsp;秒内没有被服务,&nbsp;内核就放弃并返回一个失败状态给驱动。超时周期可通过&nbsp;sysfs&nbsp;属性&nbsp;/sys/class/firmware/timeout&nbsp;属性改变。<br /><br />request_firmware&nbsp;接口允许使用驱动发布设备固件。当正确地集成进热插拔机制后,&nbsp;固件加载子系统允许设备不受干扰地工作。显然这是处理问题的最好方法,但固件受版权保护,小心违反版权法。<br /><br /><br />--------------------------------------------------------------------------------<br /><br />ARM9开发板实验<br /><br />实验源码:http://blogimg.chinaunix.net/blog/upfile2/080114113255.gz<br /><br />实验现象:&nbsp;[Tekkaman2440@SBC2440V4]#ls&nbsp;-l&nbsp;/dev/sculld*<br />ls:&nbsp;/dev/sculld*:&nbsp;No&nbsp;such&nbsp;file&nbsp;or&nbsp;directory<br />[Tekkaman2440@SBC2440V4]#cat&nbsp;/tmp/mdev<br />cat:&nbsp;can't&nbsp;open&nbsp;'/tmp/mdev':&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;,&nbsp;sys/class/&nbsp;and&nbsp;sys/bus/&nbsp;!<br />[Tekkaman2440@SBC2440V4]#insmod&nbsp;/lib/modules/sculld.ko<br />[Tekkaman2440@SBC2440V4]#ls&nbsp;-l&nbsp;/dev/sculld*<br />crw-rw-rw-&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,&nbsp;&nbsp;&nbsp;0&nbsp;Jan&nbsp;&nbsp;1&nbsp;00:00&nbsp;/dev/sculld0<br />crw-rw-rw-&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,&nbsp;&nbsp;&nbsp;1&nbsp;Jan&nbsp;&nbsp;1&nbsp;00:00&nbsp;/dev/sculld1<br />crw-rw----&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,&nbsp;&nbsp;&nbsp;2&nbsp;Jan&nbsp;&nbsp;1&nbsp;00:00&nbsp;/dev/sculld2<br />crw-rw----&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;root&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;252,&nbsp;&nbsp;&nbsp;3&nbsp;Jan&nbsp;&nbsp;1&nbsp;00:00&nbsp;/dev/sculld3<br />[Tekkaman2440@SBC2440V4]#rmmod&nbsp;sculld<br />The&nbsp;LDD&nbsp;class<br />ldd_classdev_release&nbsp;:&nbsp;sculld0&nbsp;release!<br />The&nbsp;LDD&nbsp;class<br />ldd_classdev_release&nbsp;:&nbsp;sculld1&nbsp;release!<br />The&nbsp;LDD&nbsp;class<br />ldd_classdev_release&nbsp;:&nbsp;sculld2&nbsp;release!<br />The&nbsp;LDD&nbsp;class<br />ldd_classdev_release&nbsp;:&nbsp;sculld3&nbsp;release!<br />[Tekkaman2440@SBC2440V4]#ls&nbsp;-l&nbsp;/dev/sculld*<br />ls:&nbsp;/dev/sculld*:&nbsp;No&nbsp;such&nbsp;file&nbsp;or&nbsp;directory<br />[Tekkaman2440@SBC2440V4]#cat&nbsp;/tmp/mdev<br />tekkaman<br /><br />
zcying 发表于 2009-4-9 15:02 | 显示全部楼层

要支持热插拔,好像还需要专门的工具做文件系统

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

本版积分规则

139

主题

185

帖子

0

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