分类: LINUX
2011-04-15 17:56:55
因为毕业设计的原因接触到linux usb gadget。需要将开发板(QQ2440)模拟成U盘。下载了s3c2410.udc.c并对代码及Kconfig、Makefile做了一些简单的修改。编译生成s3c2410_udc.ko与g_file_storage.ko
1. 建立fat32映像,大小为2M:
#dd if=/dev/zero of=fat32.img bs=1k count=2048
#mkfs.vfat fat32.img
2. 向fat32.img中写入一些文件,以用来测试:
#mkdir fat32
#sudo mount -t vfat -o loop fat32.img fat32
#cd fat32
#touch test.txt
#echo hello,wolrd>test.txt
#sync
3. 把fat32.img copy到根文件系统中,NFS启动系统(我用的是NFS)。
4. 启动系统后:
#insmod s3c2410_udc.ko
#insmod g_file_storage.ko file=fat32.img stall=0 removable=1
插上USB线,可见在PC端有类似U盘插入的现象。挂载设备在/media/disk下(我用的UBUNTU8.04)。
#ls /media/disk
test.txt
#cat /media/disk/test.txt
hello,world
可见,系统可以访问U盘内容。
遇到的问题:
1. 在开发板执行 mount命令挂载fat32.img到/mnt目录时:
# mount -o loop -t vfat fat32.img /mnt/
mount: mounting /dev/loop0 on /mnt/ failed: No such device
问题分析:根据提示这是因为没有/dev/loop0 。于是用mknod /dev/loop0 b 7 0建立loop0设备,但问题还是这样。后来根据网上资料,说是在内核中没有选上Loopback device support这个选项,该选项在Block device下,选上这个选项后,重新编译下载内核后,再执行以上命令,No such device的问题解决,不过又出现一下问题:
Unable to load NLS charset iso8859-1
FAT: IO charset iso8859-1 not found
mount: mounting /dev/loop0 on /mnt/ failed: Invalid argument
我的busybox是1.10.0版本。这条命令在PC上执行是没问题的。对比别人的操作,将挂载命令改为 mount -o loop fat32.img /mnt/后解决。
2. 当我在开发板修改fat32.img的内容后,PC端不能得到更新。同样的,在PC端修改内容后,开发板端也不能更新。
在开发板:
#cd fat32
#echo i love u>>test.txt
#sync
#cat test.txt
hello,wolrd
i love u
修改文件内容后,执行sync。cat fat32.img的内容可发现fat32.img的内容以更新。在PC上执行cat /dev/sdb(板子设备号),可发现/dev/sdb的内容已更新。
但是/media/disk(/dev/sdb挂摘的目录)中,cat /media/disk/test.txt发现内容并没有得到相应改变。
PC:
#cat /media/disk/test.txt
hello,wolrd
可见,PC端看到的与开发板看到的不一致。
再做如下试验:
主机:
#mount -o loop fat32.img /tmp
#mount -o loop fat32.img /mnt
修改/tmp/test.txt内容后/mnt/test.txt没有改变
进一步发现,当修改/tmp/test.txt文件内容后,只要重新umount,mount一次fat32.img到/mnt就可以看到更新后的文件。这是为什么呢??在CU论坛上发帖后,qtdszws的回复,我认为很正确,在此谢谢他: