Chinaunix首页 | 论坛 | 博客
  • 博客访问: 19822
  • 博文数量: 3
  • 博客积分: 219
  • 博客等级: 入伍新兵
  • 技术积分: 40
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-05 14:04
文章分类
文章存档

2011年(3)

我的朋友
最近访客

分类: 嵌入式

2011-08-20 10:43:18

前一段时间在做一个嵌入式linux系统的U盘自动挂载,以及有两个USB接口,需要识别从那个接口插入U盘的功能.所以想整理所做的过程,以下的绝大数内容都来自internet,发挥下人人为我,我为人人的精神.
 
热插拔:从用户角度来看,热插拔是内核和用户空间之间,通过调用用户空间程序(如:hotplug,mdev)的交互,当需要通知用户,内核发生了某种热插拔事件时,内核才调用这个用户空间程序.
 
mdev:一个简化版的udev,是busybox所带的程序,十分适合嵌入式系统,执行mdev -s ;以 -s 为参数调用位于/sbin目录下的mdev去扫描/sys/class和/sys/block中所有的类设备目录,如果在目录中含有名为“dev“的文件,且文件中包含是设备号,则mdev就利用这些信息为这个设备在/dev下创建设备节点文件,一般只在启动时执行一次“mdev -s"
 
执插拔事件:由于启动时运行了命令:echo /sbin/mdev > /proc/sys/kernel/hotplug,那么当有热插拔事件产生时,内核就会调用位于/sbin目录的mdev,这时mdev通过环境变量中的ACTION和DEVPAHT,来确定此次热插拔事件的动作以及影响了/sys中的那个目录。接着会看看这个目录中是否有“dev“的属性文件,如果有就利用这些信息在/dev下创建设备节点文件。
 
下面介绍下mdev的使用:
1、配置内核:make menuconfig
General setup ----->
  configure standard kernel features(for small systems)---->
  [*]support for hot-pluggable devices
2、配置busybox: make menuconfig
Linux system utilities ---->
  [*]mdev
  [*]support /etc/mdev.conf
  [*]support command execution at device addition/removal
3、在启动时加上使用mdev的命令
在创建的根文件系统/etc/init.d/rcs中,
#挂载/sys为sysfs文件系统
echo " mount /sys as sysfs"
/bin/mount -t tmpfs mdev /dev
/bin/mount -t sysfs sysfs /sys
echo "----starting mdev -----"
/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
4、添加对热插拔事件的相应动作,支持U盘自动挂载
修改根文件系统中的/etc/mdev.conf文件
sd[a-z][0-9] 0:0 666 @(sh /etc/mdev/usb_inert)
sd[a-z] 0:0 666 $(sh /etc/mdev/usb_remove)
@ :表示是在插入(创建设备结点)后执行后面的脚本
$ :表示在拔出(删除设备节点)前执行后面的脚本
整个格式::[<@ $ *>]
5、添加对应的脚本文件:
根文件系统中的/etc/mdev/usb_insert文件内容
  1. #! /bin/sh
  2. if [ -d /sys/block/*/$MDEV ];then
  3.  mkdir -p /mnt/$MDEV
  4.  mount /dev/$MDEV /mnt/$MDEV -t vfat
  5. fi
拔出后执行的脚本/etc/mdev/usb_remove文件内容
  1. #! /bin/sh
  2. umount -l /mnt/$MDEV
  3. rm -rf /mnt/$MDEV
关于变量$MDEV是怎么传递到这里,我至今也没有弄懂,还有当插入U盘时,$MDEV的值可能是sda1,但当拔掉时值变成sda,这样的话就造成/mnt/$MDEV没有umount且目录没删除,目前我只是用一个很笨的方法直接在后面加‘1’,我猜应该是热插拔事件先发生,脚本之后才执行,$MDEV的值当然很可能发生了变化。
 
区别物理接口的两个USB端口(即知道由那个端口插入U盘):
 
原理应该是:在usb总线在扫描usb端口相连的hub时,分配一个地址,这个地址至少在系统重启之前是恒值,(不知道是不是每个重启之后是不是相同,但这不影响后面判断两个USB端口),这样两个端口的hub就有不同的地址。
 
首先操作系统要支持USBFS文件系统,并把它挂载到/proc/bus/usb目录下面,这样当插入U盘时就会把相关设备和端口对应的hub信息写devices这个文件中(/proc/bus/usb/devices).两个U盘插入时,文件里面的port的值是不一样的,这样我们就可以对信息cat 出来进行分析,判断那个端口插入U盘。当拔掉时devices又会自动把相关的信息删除。
 
另一个方法查看插入USB端口后相关的信息,可以用dmesg
 
 
阅读(1642) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:学习Iphone应用开发

给主人留下些什么吧!~~