笔记性质的文章。
其实,我是想在ARM开发板上实现我的FW150US-USB无线网卡功能,所以测试下USB接口。
1、配置内核
Device Drivers ---> SCSI device support ---> <*> SCSI device support [*] legacy /proc/scsi/ support <*> SCSI disk support <*> SCSI tap support <*> SCSI CDROM support [*] USB support ---> <*> Support for Host-side USB [*] USB device filesystem <*> OHCI HCD support <*> USB Mass Storage support File Systems ---> DOS/FAT/NT Filesystems ---> <*>VFAT (Windows-95) fs support (936) Default codepage for FAT (iso8859-1)Default iocharater for FAT
2、烧写内核并加载
[[email protected] /]# ls /dev/
插入U盘后会发现该目录下多了sda1(对于有的U盘,并不是这个名字,所以在自动加载脚本里要注意区别对待)节点,这个就是我们系统识别到U盘后分配的。
3、手动挂载U盘到指定目录/udisk
[[email protected] /]# mount /dev/sda1 /udisk/ [[email protected] /]# [[email protected] /]# ls /udisk/ images images____ 完了之后,卸载之: [[email protected] /]# umount /udisk/
4、自动挂在U盘实现及脚本分析
在/etc/mdev.conf 文件中添加如下语句:
sda1 0:0 0600 =udisk */bin/hotplug_usb.sh
如果无法确认是否是[sda1(默认是这个)],让系统自动判断:
sd[a-z]*[0-9] 0:0 0600 =udisk */bin/hotplug_usb.sh
至于为何这么写,参见结尾处关于配置文件mdev.comn
hotplug_usb.sh脚本内容及解释:
#!/bin/sh # 为了方便,shell 的环境变量 $MDEV 会被设置成设备名。 例如 the device 'hdc' was matched, MDEV would be set to "hdc" case $MDEV in udisk | sda1) DEVNAME=udisk MOUNTPOINT=/udisk ;; sdcard | mmcblk0p1) DEVNAME=sdcard MOUNTPOINT=/sdcard ;; *) exit 0 ;; esac # 若不存在/dev/null节点,创建之 test ! -c /dev/null && mknod -m 0666 /dev/null c 1 3 # 热插拔实现原理及过程: # 在/etc/init.d/rcS文件中有句:echo /sbin/mdev > /proc/sys/kernel/hotplug # 那么当有热插拔事件产生时,内核就会调用位于/sbin目录的mdev # 这时mdev通过环境变量中的 ACTION 和DEVPATH(这两个变量是系统自带的)来确定此次热插拔事件的动作以及影响了/sys中的那个目录 # 接着会看看这个目录中是否有“dev”的属性文件,如果有就利用这些信息为这个设备在/dev 下创建设备节点文件。 case $ACTION in remove) /bin/umount $MOUNTPOINT || true rmdir $MOUNTPOINT >/dev/null 2>&1 || true ;; *) /bin/mkdir $MOUNTPOINT > /dev/null 2>&1 || true /bin/mount -t vfat -o codepage=936 -o iocharset=utf8 -o sync -o noatime -o nodiratime /dev/$DEVNAME $MOUNTPOINT > /dev/null 2>&1 || true ;; esac exit 0
PS:关于mdev.conf文件
/etc/mdev.conf是mdev的配置文件,用来控制设备节点的ownership/permissions。如果不使用该文件,系统默认root/root 660权限。
该文件的格式为:
[-]<device regex> <uid>:<gid> <permissions>
或者
@<maj[,min1[-min2]]> <uid>:<gid> <permissions>
或者
$envvar=<regex> <uid>:<gid> <permissions>
比如:
hd[a-z][0-9]* 0:3 660
如果我们想把节点移动到另一个目录或者重命名该节点,则配置格式:
<device regex> <uid>:<gid> <permissions> [=path/new_name]
比如:
hda 0:3 660 =drives/
这样“ hda ”就被移动到drives/子目录里面
而:
hdb 0:3 660 =cdrom
就把“ hdb ”重命名成“ cdrom”
如果你想 mdev 在找到匹配行时可以执行自定义的命令,那么文件格式如下:
<device regex> <uid>:<gid> <octal permissions> [<@|$|*> <command>]
特殊字符的意义如下:
@ 在创建设备节点后运行命令。
$ 在删除设备节点前运行命令。
* 在创建设备节点后和删除设备节点前都运行命令。
比如:
sd[a-z]*[0-9] 0:0 0660 @(mount /dev/$MDEV /udisk) sd[a-z]*[0-9] 0:0 0660 *(umount /udisk)
PPS:
Device or resource busy表示设备忙,可能设备已经被用了,比如已经完成了挂载。