修改mdev配置支持SD卡自动挂载

来源:互联网 发布:如何添加wifi网络连接 编辑:程序博客网 时间:2024/06/05 19:50
我们启动开发板之后,将SD卡插上会打印如下信息:
# s3c2440-sdi s3c2440-sdi: running at 0kHz (requested: 0kHz).
s3c2440-sdi s3c2440-sdi: running at 196kHz (requested: 195kHz).
s3c2440-sdi s3c2440-sdi: running at 196kHz (requested: 195kHz).
s3c2440-sdi s3c2440-sdi: running at 196kHz (requested: 195kHz).
s3c2440-sdi s3c2440-sdi: running at 196kHz (requested: 195kHz).
s3c2440-sdi s3c2440-sdi: running at 196kHz (requested: 195kHz).
s3c2440-sdi s3c2440-sdi: running at 196kHz (requested: 195kHz).
s3c2440-sdi s3c2440-sdi: running at 196kHz (requested: 195kHz).
s3c2440-sdi s3c2440-sdi: running at 25000kHz (requested: 25000kHz).
s3c2440-sdi s3c2440-sdi: running at 25000kHz (requested: 25000kHz).
100ask:uevent_helper=/sbin/mdev
envp[0]=HOME=/
envp[1]=PATH=/sbin:/bin:/usr/sbin:/usr/bin
envp[2]=ACTION=add
envp[3]=DEVPATH=/class/mmc_host/mmc0/mmc0:0002
envp[4]=SUBSYSTEM=mmc
envp[5]=SEQNUM=716
envp[6]=PHYSDEVBUS=mmc
mmcblk0: mmc0:0002 00000 976896KiB 
mmcblk0:<7>mmc0: starting CMD18 arg 00000000 flags 00000035
 p1
100ask:uevent_helper=/sbin/mdev
envp[0]=HOME=/
envp[1]=PATH=/sbin:/bin:/usr/sbin:/usr/bin
envp[2]=ACTION=add
envp[3]=DEVPATH=/block/mmcblk0
envp[4]=SUBSYSTEM=block
envp[5]=SEQNUM=717
envp[6]=MINOR=0
envp[7]=MAJOR=179
envp[8]=PHYSDEVPATH=/class/mmc_host/mmc0/mmc0:0002
envp[9]=PHYSDEVBUS=mmc
envp[10]=PHYSDEVDRIVER=mmcblk
100ask:uevent_helper=/sbin/mdev
envp[0]=HOME=/
envp[1]=PATH=/sbin:/bin:/usr/sbin:/usr/bin
envp[2]=ACTION=add
envp[3]=DEVPATH=/block/mmcblk0/mmcblk0p1
envp[4]=SUBSYSTEM=block
envp[5]=SEQNUM=718
envp[6]=MINOR=1
envp[7]=MAJOR=179
envp[8]=PHYSDEVPATH=/class/mmc_host/mmc0/mmc0:0002
envp[9]=PHYSDEVBUS=mmc
envp[10]=PHYSDEVDRIVER=mmcblk

这说明当接上U盘之后自动创建了设备节点,它属于块设备,主次设备号分别是179、0和179、1

我们使用命令:
ls -l /dev/mmcblk*
打印出如下信息:
brw-rw----    1 0        0        179,   0 Feb  3 01:28 dev/mmcblk0
brw-rw----    1 0        0        179,   1 Feb  3 01:28 dev/mmcblk0p1
这就是我们自动创建的设备节点,主次设备号都符合。
其中mmcblk0代表整个SD卡,mmcblk0p1代表SD卡的第一个分区

但是这里只是自动创建了设备节点,并没有自动将SD卡挂载,我们要访问SD卡的话,还需要自己动手去挂载:
mount dev/mmcblk0p1 /mnt
这样我们就可以在/mnt
目录下来访问SD卡了

那么我们如果想要SD卡自动挂载应该怎么办呢?我们还得来分析mdev:
make_device
         open("/etc/mdev.conf", O_RDONLY)
通过分析我们可以知道,如果存在 "/etc/mdev.conf"这个文件的话,就会根据这个文件来配置,否则就仅仅创建设备节点。
显然,我们想要让SD卡自动挂载的话,就需要写一个"文件!关于这个文件的规则我们可以参考:
busybox-1.7.0\docs\mdev.txt
我们先来总结一下它的规则:
其一般规则是
<device regex> <uid>:<gid> <octal permissions>
device regex:正则表达式,表示哪一个设备。
uid:owner
gid:组ID
octal permissions:以八进制表示的属性

比如:hd[a-z][0-9]* 0:3 660

当发现第一个匹配项时,就会根据这个匹配项进行配置。如果没有匹配项的话就会采用默认配置,默认的默认配置是:
0:0 660,当然我们我也可以自己定义,比如:.* 1:1 777

那么如果我们想要执行我们自己的命令应该怎么办呢?那就需要用下面的格式了:
<device regex> <uid>:<gid> <octal permissions> [<@|$|*> <command>]
@ 创建了设备之后运行
$   删除设备之前运行
*    在创建设备之后和删除设备之前运行

测试: 
测试1:led驱动测试
之前我们在led4.c驱动里面自动创建4个设备节点:leds,led1,led2,led3
insmod led4.ko
ls -l /dev/led*
打印如下信息:
crw-rw----    1 0        0        231,   1 Feb  3 03:06 /dev/led1
crw-rw----    1 0        0        231,   2 Feb  3 03:06 /dev/led2
crw-rw----    1 0        0        231,   3 Feb  3 03:06 /dev/led3
crw-rw----    1 0        0        231,   0 Feb  3 03:06 /dev/leds

现在我们可以通过:/etc/mdev.conf这个文件来修改其属性:
vi /etc/mdev.conf
添加如下信息:
led[1-3] 0:0 777 
leds 0:0 777
rmmod led4
insmod led4.ko
ls -l /dev/led*
打印如下信息:
crwxrwxrwx    1 0        0        231,   1 Feb  3 03:15 /dev/led1
crwxrwxrwx    1 0        0        231,   2 Feb  3 03:15 /dev/led2
crwxrwxrwx    1 0        0        231,   3 Feb  3 03:15 /dev/led3
crwxrwxrwx    1 0        0        231,   0 Feb  3 03:15 /dev/leds
确实是改变了!

我们还可以添加自己的命令,比如:
led[1-3] 0:0 777 @ echo creat /dev/$MDEV > /dev/console
leds 0:0 777      @ echo creat /dev/$MDEV > /dev/console
上面的命令表示在创建设备节点之后将设备名显示到控制终端。其中MDEV这个环境变量就是表示变量名!
rmmod led4
insmod led4.ko
打印如下信息:
creat /dev/leds
creat /dev/led2
creat /dev/led1
creat /dev/led3

我们也可以将命令,写成脚本的形式,然后直接添加脚本:
vi /bin/add_remove_led.sh
添加如下信息:
#/bin/sh
if [ $ACTION = "add" ]
then
        echo create /dev/$MDEV > /dev/console
else
        echo remove /dev/$MDEV > /dev/console
fi
保存退出

chmod 777 /bin/add_remove_led.sh //添加执行权限

vi /etc/mdev.conf
添加如下信息:
led[1-3] 0:0 777 * /bin/add_remove_led.sh               
leds 0:0 777 * /bin/add_remove_led.sh 

insmod led4.ko
打印如下信息:
create /dev/leds
create /dev/led1
create /dev/led2
create /dev/led3

rmmod led4.ko
打印如下信息:
remove  /dev/leds
remove /dev/led1
remove /dev/led2
remove /dev/led3

测试2:SD卡测试
首先写个脚本文件:
vi bin/add_remove_udisk.sh
#!/bin/sh
if [ $ACTION = "add" ]; 
then 
mount /dev/$MDEV /mnt; 
else 
umount /mnt; 
fi

在mdev.conf文件里面添加如下信息:
mmcblk0p1 0:0 777 * /bin/ add_remove_udisk .sh
插上SD卡之后
ls /mnt
发现SD卡已经挂载上!
0 0