Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1039382
  • 博文数量: 244
  • 博客积分: 6820
  • 博客等级: 准将
  • 技术积分: 3020
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-09 21:33
文章分类

全部博文(244)

文章存档

2013年(1)

2012年(16)

2011年(132)

2010年(3)

2009年(12)

2008年(80)

我的朋友

分类: 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的回复,我认为很正确,在此谢谢他:

img在内存中有一份缓存,当mount -o loop fat32.img  /tmp时,会使用一个环回设备,它也有缓存(例如loop0,设备号7,0),同理mount -o loop fat32.img /mnt也有自己的缓存(例如loop0,设备号7,1),

现在你
#cat /tmp/test.txt
          hello,wolrd
#cat /mnt/text.txt
          hello,wolrd

这时,对于test.txt文件,两个环回设备都创建了自己的缓存。

>>现在,我修改/tmp/test.txt的内容:
        #echo i love u>/tmp/test.txt
        #sync
        #cat /tmp/test.txt
          i love u
loop0的缓冲被更新, sync后img的缓存也被同步,但是loop1的缓冲没有任何改动,所以会导致
>>但是,/mnt/text.txt中的内容却没有更新:
       #cat /mnt/test.txt
        hello,world




阅读(760) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~