红联Linux门户
Linux帮助

dd命令刷u-boot.bin到sd卡失败解决方法

发布时间:2016-11-16 10:53:51来源:linux网站作者:KrisFei
Platform: IMX6DL
OS: Android 4.4
Kernel branch: 3.0.35
 
现象:
使用飞思卡尔自带烧写fsl-sdcard-partition.sh以及ubuntu自带dd命令烧写u-boot.bin到sd卡,放到板子上会无法开机。
之前使用1GB内存的时候偶尔会出现此问题,但是换成2GB就成了100%。
 
调试过程:
具体原因没找到,但是dd之后,有去抓sd的从1k开始的1M数据(u-boot.bin从1k开始
的位置存放,大小大概500k),发现boot.img会覆盖掉u-boot.bin存放区域:
烧写脚本的流程是先格式化,然后顺序执行如下命令:
sudo dd if=u-boot.bin of=/dev/sdb bs=1024 skip=1 seek=1; sync
sudo dd if=boot.img of=/dev/sdb1; sync
也就是说boot.img被写到/dev/sdb开始的位置,不知道是ubuntu的分区,还是文件系统或者是
dd命令的bug,没这么多时间去追,所以只能通过其他方法来解决。
本来想通过dd整张卡来实现,也就是:
dd正常sd的image到PC上,然后再用dd将整个文件dd到新的sd卡上,但是项目使用的
sd卡大小不一致,由于分区表信息不一致,导致此方法不可行。
另外,在调试的时候有发现,在分区之后,重新将sd卡热插拔一下之后再dd就不会有问题。
也许是ubuntu重新读取分区之后就正确了吧,谁知道呢!那么就想办法模拟u盘热插拔,中间人工插拔一次多尴尬。
事实上我在/sys/bus/usb下没找到热插拔u盘的实现方法,只有有remove和reset,
有谁找到麻烦请告知下。
 
解决方法:
可喜的是上一级的hub可以控制电源的开关,关了hub,那么其下面对应的u盘也将无效!
因此我们只要找到u盘对应的hub就可以了!可以通过lsusb -t完成。
[kris@ecovacs:~/Downloads/v1.0.10-20160715]$ lsusb -t
/: Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/2p, 5000M
/: Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/10p, 480M
  |__ Port 3: Dev 2, If 0, Class=Vendor Specific Class, Driver=r8188eu, 480M
  |__ Port 4: Dev 3, If 0, Class=Vendor Specific Class, Driver=ftdi_sio, 12M
  |__ Port 5: Dev 4, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
  |__ Port 6: Dev 5, If 0, Class=Human Interface Device, Driver=usbhid, 1.5M
  |__ Port 9: Dev 48, If 0, Class=Mass Storage, Driver=usb-storage, 480M
/: Bus 02.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
  |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/6p, 480M
/: Bus 01.Port 1: Dev 1, Class=root_hub, Driver=ehci-pci/2p, 480M
  |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M
Port 9: Dev 48, If 0, Class=Mass Storage, Driver=usb-storage, 480M
这个是我们的u盘,很明显,它挂在hub 3上。
然后就是我们要的热插拔方法了:
unplug:
echo "${hub_num}-0:1.0" > /sys/bus/usb/drivers/hub/unbind
plug:
echo "${hub_num}-0:1.0" > /sys/bus/usb/drivers/hub/bind
注意:此命令需要root用户才可执行。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/26031.html