1. 前言
限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。
2. 背景
本文基于 S5P4418, Linux 3.4.y内核,buildroot-2016.08.1 制作的 rootfs。
3. 建立SD卡热插拔自动挂载和卸载支持
3.1 配置编译内核
首先配置 CONFIG_HOTPLUG=y
同时配置CONFIG_MMC_UNSAFE_RESUME=n
配置完成,编译内核。
3.2 修改、配置、编译buildroot
3.2.1 修改 buildroot
(1) 修改mdev配置文件package/busybox/mdev.conf
上面的配置中,第1列是用来匹配的设备文件名,第2列是uid:gid,第3列是文件权限,最后一列带@标识设备加载后执行的动作,带$的标识设备移除前执行的动作。关于更多mdev.conf配置细节可参考链接 :mdev
(2) 在 buildroot 根目录下建立如下文件列表:
board/s5p4418/post-build.sh
board/s5p4418/etc/hotplug/sd/sd_insert
board/s5p4418/etc/hotplug/sd/sd_remove
各脚本文件的内容如下:
#!/bin/sh
# board/s5p4418/post-build.sh
cp -fr board/lanxus/etc ${TARGET_DIR} && \
chmod 755 ${TARGET_DIR}/etc/hotplug/sd/*
构造rootfs
前,执行脚本board/s5p4418/post-build.sh
,目的是将后面的board/s5p4418/etc/hotplug/sd/sd_insert
和board/s5p4418/etc/hotplug/sd/sd_remove
两个脚本放到rootfs
中去。
#!/bin/sh
# board/s5p4418/etc/hotplug/sd/sd_insert
if [ -d /sys/block/*/$MDEV ]; then
mkdir -p /media/$MDEV
mount /dev/$MDEV /media/$MDEV
fi
其中$MDEV
是自动被设置的 shell 变量,标识插入的设备名。
#!/bin/sh
# board/s5p4418/etc/hotplug/sd/sd_remove
umount -l /media/${MDEV}p[0-9]
rm -rf /media/${MDEV}p[0-9]
其中$MDEV
是自动被设置的 shell 变量,但代表是整个设备,和前面的稍有不同。
3.2.2 配置 buildroot
上图中红色框中部分,正是指向我们前面新建的board/s5p4418/post-build.sh
脚本。buildroot配置完成,编译buildroot。在编译buildroot之前,确保将board/s5p4418/etc/hotplug/sd/sd_insert
和board/s5p4418/etc/hotplug/sd/sd_remove
脚本,拷贝到根文件系统相应目录中。
4. 验证sd卡的热插拔和自动挂载功能
将编译好的内核
和rootfs
用fastboot
下载到目标板。
4.1 系统启动SD卡插入测试
在启系统前,已经将sd卡插入,所以应该可以看到sd卡设备被识别并自动挂载了。启动系统后,运行如下几个命令:
df
ls /media/
ls /media/mmcblk1p1
看到如下输出:
好的,我们看到设备/dev/mmcblk1p1
被挂载在/media/mmcblk1p1
,并可以查看其中的内容。
4.2 系统启动后的拔出测试
接上节的上下文,拔出sd卡,并在之后运行命令:
df
ls /media
可看到如下输出结果:
可以看到,sd卡不再挂载在/media
下了。
4.3 系统启动后的插入测试
接上节上下文,插入sd卡,运行命令:
df
ls /media
可看到如下输入结果:
可见,sd再次被挂载到了/media/mmcblk1p1
的路径下。
4.4 SD卡挂在后的读写测试
4.1 SD卡写入测试
依次运行如下命令序列:
cd /media/mmcblk1p1
echo “Test to write mmc device.” > mmc_write_test.txt
ls
cat mmc_write_test.txt
可得如下输出结果:
可见,可以写入sd卡。我们再来看一下,写入的内容是否存储到了SD卡(数据可能驻留在内存)。
移除sd卡后再插入,然后依次运行命令:
cd /media/mmcblk1p1
ls
cat mmc_write_test.txt
可得如下输出结果:
由结果可知,文件存在且内容正常。我们还应该用更多的io工具做进一步验证,在此不做展开。
最后看一下设备加载情况,运行命令:
fdisk –l
从上图中红框部分,可以看出,挂载的是一个FAT32格式,4G的sd卡。
5. 后记
写下这篇笔记时,还是个初接触嵌入式Linux开发、还在试用期内的小白_,对io性能、testbench之类的工具是一无所知,所以整个过程中,存在验证不够充分的地方,欢迎批评指正。