嵌入Linux下的usb storage的支持

目标: 在mipsel架构的嵌入式linux系统上支持USB盘的读写。
思路: 使用可加载模块的形式增加 scsimod.ko, sdmod.ko, usbstorage.ko, fat.ko, vfat.ko.

##具体实现:
###步骤I 准备必须的驱动(可加载模块)

  1. scsimod.ko 源代码目录下的 driver/scsi目录下的文件编译
  2. sdmod.ko, 源代码目录下的 driver/scsi目录下的文件编译
  3. usbstorage.ko 源代码目录下的 driver/usb/storage 目录下的文件编译
  4. fat.ko 源代码目录下的 fs/fat目录下的文件编译
  5. 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. 图形操作界面及相应应用程序的自动挂载。