折腾了两天也没有好的进展 
使用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的还涉及文件系统就有难度了。有没有大神能给点意见? 或者有把握搞定能接这活的,有偿服务。
|