关于嵌入式Linux的存储设备热插拔、挂载与映射至电脑

前言:

本文所说的嵌入式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。

# 编译内核并烧写,略
  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值