打印
[嵌入式linux]

linux挂载usb可移动磁盘成功但读取内容失败,是驱动的问题吗

[复制链接]
1836|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
一个类似数码相机的设备,在windows下连接usb能显示为可移动磁盘并能够正常读写里边SD卡的数据文件,但现场需要通过一块跑linux(OpenWrt)的板子通过usb读出机内sd卡的文件。试了一下openwrt的板子和fedora10的pc连接,都有问题。
openwrt下能够挂载磁盘,但ls 磁盘内容时会出现部分文件/目录“No such file or directory”的异常,并且之后再ls 就没有任何内容了,如下图,启动后第一次ls总是除了DCIM其它目录文件和都异常:

vgsm_config,Manual,skin,SetApp,DCIM都是SD卡根目录下的文件和文件夹,

下图是fedora10的情况,fdisk -l能显示出设备“sdb1”,但是挂载失败,显示“can't read superblock”错误。


SD卡是FAT32格式,换一个SD卡的情况也和上边一样,问题肯定与此设备的USB口设计有关,但我们不能更改设备,目前只能从linux这头想办法。是否可以通过修改linux驱动的办法解决这个问题? 这个难度(工作量)多大?  


相关帖子

沙发
光脚板|  楼主 | 2018-1-25 14:36 | 只看该作者

RE: linux挂载usb可移动磁盘成功但读取内容失败

折腾了两天也没有好的进展  
使用dmesg看到很多读分区异常的log:
....
[  156.019910] sd 33:0:0:0: [sdb] CDB:
[  156.019911] Read(10): 28 00 00 00 20 08 00 00 08 00
[  156.019916] end_request: I/O error, dev sdb, sector 8200
[  156.019919] Buffer I/O error on device sdb1, logical block 1
[  156.071497] sd 33:0:0:0: [sdb]
[  156.071501] Result: hostbyte=DID_ERROR driverbyte=DRIVER_OK
[  156.071502] sd 33:0:0:0: [sdb] CDB:
[  156.071503] Read(10): 28 00 00 00 20 08 00 00 08 00
[  156.071508] end_request: I/O error, dev sdb, sector 8200
[  156.071512] Buffer I/O error on device sdb1, logical block 1
....
为了查找问题原因,写了段代码直接open() /dev/sdb1设备然后反复read()不同位置不同大小的数据与windows下winhex的磁盘数据对比,发现:
1.读出的数据基本都是对的;
2.每次读数据量较少(比如不超过10个sector,5120byte)时没有问题,log无异常;读数据长度大时可能出现实际读出的字节数小于read()输入的字节数,log能看到 I/O error之类的异常;
3.在每次read()后加上几十毫秒的等待能较好的改善异常;
如果说是设备usb对sd的读写操作本身就太慢,但在windows复制文件速度与正常u盘也差不了多少。可能某个环节与linux系统的驱动配不好,想从linux驱动上入手,觉得应该可以通过修改linux(openwrt)的驱动让它每次读的secotor数量少一些,间隔时间长一些,去适应设备的方式。  

没搞过linux内核驱动,如果是个串口之类的还有把握,这usb的还涉及文件系统就有难度了。有没有大神能给点意见? 或者有把握搞定能接这活的,有偿服务。

使用特权

评论回复
板凳
kp339| | 2018-1-26 15:12 | 只看该作者
试试用PC端的Linux系统修复下U盘文件的文件系统,fsck.vfat -y /dev/sdb1, 修复完重新挂载试试

使用特权

评论回复
评论
光脚板 2018-1-27 17:50 回复TA
试过,没有效果 
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

42

主题

197

帖子

7

粉丝