目标: 在mipsel架构的嵌入式linux系统上支持USB盘的读写。
思路: 使用可加载模块的形式增加 scsimod.ko, sdmod.ko, usbstorage.ko, fat.ko, vfat.ko.
##具体实现:
###步骤I 准备必须的驱动(可加载模块)
- scsimod.ko 源代码目录下的 driver/scsi目录下的文件编译
- sdmod.ko, 源代码目录下的 driver/scsi目录下的文件编译
- usbstorage.ko 源代码目录下的 driver/usb/storage 目录下的文件编译
- fat.ko 源代码目录下的 fs/fat目录下的文件编译
- vfat.ko 源代码目录下的 fs/vfat目录下的文件编译
上述五个可加载模块的编译过程可以具体参考各自目录下的Makefile。
####我在编译过程中所犯的错误和经验:
a. 没有真正明白 obj-m :=fat.o 和 fat-objs := 的关系, 直接将源文件*.o
增加到了obj-m 的后面,造成没有编译成功。
b. 在编译fat.ko的时候,inode。c文件里面的有个变量定义使用的配置文件(config)里面缺省值。
static int fat_default_codepage = CONFIG_FAT_DEFAULT_CODEPAGE;
我误以为是页面大小设置为4k, 导致在mount的时候死活mount文件系统失败。
需要正确配置该变量的初始化值。
在编译过内核的源代码的目录下有个隐含文件.config
, 该文件里面有宏CONFIG_FAT_DEFAULT_CODEPAGE
的定义。
(CONFIG_FAT_DEFAULT_CODEPAGE=437)
c. 善于使用proc调试信息和dmesg查看最近的错误信息。 几个有帮助的proc文件。
cat /proc/bus/usb/devices 所有识别的usb设备信息。如厂商号,设备名称。
本机设备的分区情况。可以看到U盘的分区。
dmesg 最近的系统提示信息。
fdisk -l /dev/sda 显示sda设备的分区情况其分区类型。
###步骤II 加载模块,然后插入设备并手工创建设备节点并mount到特定目录。
a. 依次加载上述5个模块。
b. 插入usb设备
c. cat /proc/partitions得到设备的主次设备号。
d. mknod /dev/sda b major 0
mknod /dev/sda1 b major 1
有可能根据具体设备配置情况,sd? 可能为sda ,或sdb 等。如果分区有多个要为每个分区都创建一个设备节点。
e. 手动mount
mount /dev/sda1 /usr/local/mnt
至此 U盘可以正常读写了。在拔除U盘之前需要 umount /dev/sda1
##TODO
a. hotplug的支持,实现自动mount、umount及设备节点的管理
b. 对NTFS分区的支持
c. 图形操作界面及相应应用程序的自动挂载。