概述
前言:
本文所说的嵌入式Linux存储设备包含:U盘、SD卡、NandFlash分区。
本文主要实现嵌入式Linux在开机后,可自动检测存储外设(U盘/SD卡)是否插入,对存储设备(U盘/SD卡/NandFlash分区)进行自动挂载。也实现模拟嵌入式Linux设备当成U盘设备插入电脑,即通过USB数据线连接电脑,可指定存储设备(SD卡/NandFlash分区)其中一种映射到电脑上,即“计算机”下的“可移动存储设备”下有XX盘。
笔者的开发板存储设备对应的设备如下:
存储设备 | 设备路径 | 挂载路径 |
---|---|---|
U盘 | /dev/sda1 | /dev/udisk |
SD卡 | /dev/mmcblk0p1 | /mnt/sdcard |
NandFlash分区 | /dev/mtdblock5 | /home |
1. 热插拔的实现:
1.1 修改Linux内核配置,使内核支持Hotplug功能和Net功能:
# 在Linux Kernel下,通过vim修改.config:
$ vim .config
# 匹配“CONFIG_HOTPLUG”和“CONFIG_NET”,并将这两个参数修改为:
CONFIG_HOTPLUG=y
CONFIG_NET=y
# 确保这两项都有选上,不然/proc/sys/kernel/目录不会出现hotplug文件。
# 编译内核并烧写……
1.2 修改BusyBox的配置,使根文件系统支持mdev:
# 在BusyBox下进入使用命令:
$ make ARCH=arm menuconfig
# 在 Linux System Utilities 下,将 mdev 设置为加载,并将 mdev 下的配置设置为加载:
Support /etc/mdev.conf
Support subdirs/symlinks
Support regular expressions substitutions when renaming device
Support command execution at device addition/removal
Support loading of firmwares
# 编译BusyBox……这里就不展开了
# 由于生成的根文件系统与NandFlash的参数有关系,先查看开发板NandFlash的EraseSize密切相关。
# 笔者在U-Boot界面下,使用命令:
$ nand info
Device 0: nand0, sector size 256 KiB
Page size 4096 b
OOB size 224 b
Erase size 262144 b
# 在/etc/init.d/rcS内插入以下命令:
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock
# 经计算,本块NandFlash的 EraseSize = 262144b(十进制) = 0x40000(十六进制)
# 生成文件系统的命令为:
sudo mkfs.jffs2 -r ./_install/ --pagesize=0x1000 --eraseblock=0x40000 -n --output=./rootfs.jffs2
# 烧写根文件系统,这里就不展开了
1.3 编写热插拔脚本:
# 1.创建mdev.config,使用命令:
$ touch /etc/mdev.conf
$ chmod 666 /etc/mdev.conf
# 2.在mdev.conf加入以下信息。当检测到设备mmcblk[0-9]p[0-9]或者sd[a-p][0-9]节点创建,
# 运行插入脚本;检测到设备mmcblk[0-9]或者sd[a-p]节点删除,运行卸载脚本。
# 符号代表的含义:“@”在创建设备节点后运行命令;“$”在删除设备节点前运行命令;“*”在创建设备
# 节点后和删除设备节点前都运行命令。可实现U盘与SD卡等设备热插拔:
mmcblk[0-9]p[0-9] 0:0 666 @ /etc/HotPlug-Driver/SDCard_Inserting.sh
mmcblk[0-9] 0:0 666 $ /etc/HotPlug-Driver/SDCard_Removing.sh
sd[a-p][0-9] 0:0 666 @ /etc/HotPlug-Driver/Udisk_Inserting.sh
sd[a-p] 0:0 666 $ /etc/HotPlug-Driver/Udisk_Removing.sh
# 3.创建热插拔脚本:
$ mkdir /etc/HotPlug-Driver/
$ touch /etc/HotPlug-Driver/SDCard_Inserting.sh # SD卡的插入脚本
$ touch /etc/HotPlug-Driver/SDCard_Removing.sh # SD卡的卸载脚本
$ touch /etc/HotPlug-Driver/Udisk_Inserting.sh # U盘的插入脚本
$ touch /etc/HotPlug-Driver/Udisk_Removing.sh # U盘的卸载脚本
$ chmod 777 /etc/HotPlug-Driver/*.sh
# 4.创建外设存储的挂载目录:
$ mkdir /mnt/sdcard/
$ mkdir /mnt/udisk/
# 5.1.SD卡的插入脚本:
#!/bin/sh
SDCardType="$(ls /dev/mmcblk?)"
SDCardSymbol="$(ls $SDCardType??)"
SDCardMountPath="/mnt/sdcard/"
mount -t vfat -o iocharset=cp936 "$SDCardSymbol" "$SDCardMountPath"
# 5.2.SD卡的卸载脚本:
#!/bin/sh
SDCardMountPath="/mnt/sdcard/"
sync
umount "$SDCardMountPath"
# 5.3.U盘的插入脚本:
#!/bin/sh
DiskType="$(ls /dev/sd?)"
DiskSymbol="$(ls $DiskType?)"
DiskMountPath="/mnt/udisk/"
mount -o iocharset=cp936 "$DiskSymbol" "$DiskMountPath"
# 5.4.U盘的卸载脚本:
#!/bin/sh
DiskMountPath="/mnt/udisk/"
sync
umount "$DiskMountPath"
2. 模拟U盘(映射SD卡/NandFlash分区)的实现:
笔者的开发板内核默认支持U盘,所以笔者就没有去找内核支持U盘的方法,下面实现的是开发板的存储设备(SD卡/NandFlash分区)模拟成U盘连接电脑的方法。
2.1 进入图形化配置界面:
# 在Linux Kernel下进入使用命令:
$ make ARCH=arm menuconfig
2.2 支持gadget:
# 在 Device Drivers → USB support → USB Gadget Support 下,将 USB Gadget Drivers
# 和 Mass Storage Gadget 设置为模块
2.3 支持loopback:
# 在 Device Drivers → Block devices 下,将 Loopback device support 设置为加载
2.4 编译内核与驱动模块:
# 在Linux Kernel下进入使用命令:
$ make ARCH=arm uImage LOADADDR=0x8000
$ make ARCH=arm modules
# 烧写内核,略
2.5 拷贝编译出来的驱动模块到开发板上:
cp drivers/usb/gadget/g_mass_storage.ko /XXXX/nfs/
cp drivers/usb/gadget/libcomposite.ko /XXXX/nfs/
2.6 模拟U盘的方法一(映射NandFlash的空间,该方法为下策):
# 1.制作一个32M的fat格式镜像
dd if=/dev/zero of=udisk.img bs=1k count=32768
mkfs.vfat udisk.img
# 2.加载内核驱动
insmod libcomposite.ko
insmod g_mass_storage.ko file=/opt/udisk.img stall=0 removable=1
# 3.挂载udisk.img,pc和开发板就可以同时访问
mount -o loop -t vfat /opt/udisk.img /opt/udisk
2.7 模拟U盘的方法二(映射NandFlash的空间,该方法为上策):
# 1.必须有空闲的NandFlash分区,假设/dev/mtdblock4分区为预设的分区
cat /proc/mtd
dev: size erasesize name
mtd4: 2b800000 00040000 "NAND Flash Block_4 Data 696 MB"
# 2./proc/mtd中记录mtd4的信息得知,/dev/mtdblock4的大小为0x2B800000,
# 0x2B800000(转为十进制再去计算,即729808896)/1024 = 712704
mkfs.vfat /dev/mtdblock4 712704
# 3.加载内核驱动
insmod libcomposite.ko
insmod g_mass_storage.ko file=/dev/mtdblock4 stall=0 removable=1
# 4.挂载/dev/mtdblock4,pc和开发板就可以同时访问
mount /dev/mtdblock4 /mnt/block_data/
2.8 模拟U盘的方法三(映射SD卡的空间,该方法为上策):
# 1.加载内核驱动
insmod libcomposite.ko
insmod g_mass_storage.ko file=/dev/mmcblk0p1 stall=0 removable=1
# 2.挂载/dev/mtdblock4,pc和开发板就可以同时访问
mount /dev/mmcblk0p1 /mnt/sdcard/
2.9 模拟U盘第二、三种方法的参考链接如下:
USB Gadget Storage功能调试
3. SD卡的支持:
3.1 进入图形化界面:
# 在Linux Kernel下进入使用命令:
$ make ARCH=arm menuconfig
3.2 支持SD卡设备:
# 在 Device Drivers 下的 MMC/SD/SDIO card support 设置为加载,
将 MMC/SD/SDIO card support 下的 MMC block device driver 和 Use bounce buffer for simple hosts 也设置为加载,设置 Number of minors per block device 为参数 8。
# 编译内核并烧写,略
最后
以上就是畅快篮球为你收集整理的关于嵌入式Linux的存储设备热插拔、挂载与映射至电脑的全部内容,希望文章能够帮你解决关于嵌入式Linux的存储设备热插拔、挂载与映射至电脑所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复