zoukankan      html  css  js  c++  java
  • 真相:中国版BBB用USB连电脑没有盘符的根本原因分析

    很多网友在问:为什么中国版的装完驱动插上板子没有显示端口号和69M的盘符??楼主发现,在开机启动的时候,加载g_multi模块时出现错误提示 invalid argument
            Embest的员工表示:装的是BBB-eMMC-flasher-2013.04.13-DDR3 -400MHz.img.xz  版本确认有此盘符!而我们去官网上下载这个版本发现真的跟我们板子上的是一样的。甚至装上最新的版本也还是同样的问题。此事必有蹊跷!!!
            有大牛提出了解决办法:输入命令
            x=/usr/bin/g-ether-load.sh;sed -e 's/SERIAL_NUMBER=/x=/g' $x> x;rm $x;mv x $x;chmod a+x $x;sync;
            完成后重启即可,驱动自动加载;如果需要手工安装驱动,运行命令modprobe g_multi file=/dev/mmcblk0p1 cdrom=0 stall=0removable=1 nofua=1 系统自动安装USB驱动,这时就能在电脑上看到69.4MB的盘符。问题跟EEPROM里的ID号有关。
    但是大牛并没有解释为什么这么做。他只告诉我们跟EEPROM里的ID号有关。先百度了一下sed这个命令的意思,sed -e 's/SERIAL_NUMBER=/x=/g',就是把文件中所有”SERIAL_NUMBER=”的字符串替换成了“x=”。
            先把/usr/bin/g-ether-load.sh这个文件找出来。找到跟SERIAL_NUMBER有关的命令。
    SERIAL_NUMBER=$(hexdump -e '8/1 "%c"'/sys/bus/i2c/devices/0-0050/eeprom -s 14 -n 2)-$(hexdump -e '8/1"%c"' /sys/bus/i2c/devices/0-0050/eeprom -s 16 -n 12)
    modprobe g_multi file=/dev/mmcblk0p1 cdrom=0 stall=0removable=1 nofua=1 iSerialNumber=${SERIAL_NUMBER} iManufacturer=Circuitco  iProduct=BeagleBone${BLACK} host_addr=${DEV_ADDR}
            这样按照大牛的改法,意思就是传给内核的iSerialNumber参数变为空了。很明显EEPROM里的SERIAL_NUMBER是有问题的,既然文件系统肯定是没错的,那么肯定是Embest的EEPROM出厂数据写错了。可以把上面的命令分步执行一下:
            先echo $(hexdump -e '8/1 "%c"'/sys/bus/i2c/devices/0-0050/eeprom -s 14 -n 2)
            运行结果为:ue                    这一句没有问题
            再执行下面半句的时候
           echo $(hexdump -e '8/1 "%c"'/sys/bus/i2c/devices/0-0050/eeprom -s 16 -n 12)
            运行结果是这么个鬼样子:��D503785
            显然是出现了非法的字符。
            echo $(hexdump -e '8/1 "%c"'/sys/bus/i2c/devices/0-0050/eeprom -s 16 -n 12) > sn1
            把它存到文件里面,发现这个文件都不能用gedit打开,只能用vi打开,
            说明embest在EEPROM里面写序列号的时候后面忘了填几个零,直接又在后面开始写正常编码以外的数据。所以读的时候出现了致命的错误,整个参数都是不对的。
            另外提一句,大牛的方法虽然能解决问题,但楼主发现可操作性很差,而且没有把原来的文件做备份就rm掉了,要打那么多个字符,一个字符出错了可能把这个文件搞没掉。楼主就是在输完这个命令的时候,发现我的/usr/bin/g-ether-load.sh这个文件变成空白的了,所以建议像楼主一样菜的菜鸟们可以用我的办法:
            先把/usr/bin/g-ether-load.sh备份为/usr/bin/g-ether-load.bak.sh,用任意一个编辑器(gedit,或者vi)打开/usr/bin/g-ether-load.sh脚本文件,把下面这一段中的iSerialNumber=的参数填为空或者你板子上标签的序列号。
            modprobe g_multi file=/dev/mmcblk0p1 cdrom=0 stall=0removable=1 nofua=1 iSerialNumber=${SERIAL_NUMBER} iManufacturer=Circuitco  iProduct=BeagleBone${BLACK} host_addr=${DEV_ADDR}
            比如我的改成这个样子:
            modprobeg_multi file=/dev/mmcblk0p1 cdrom=0 stall=0 removable=1 nofua=1iSerialNumber=ue-EMD503785 iManufacturer=Circuitco  iProduct=BeagleBone${BLACK}host_addr=${DEV_ADDR}
           下次开机的时候电脑就会自动识别BBB的盘符和USB网卡啦啦啦啦。
            另外这次想手动启动相关模块的话可以直接运行/usr/bin/g-ether-load.sh脚本,事实上开机的时候系统也是通过这个脚本启动USB从设备驱动的。


    就是这个EEPROM里面的数据没写对。
    <ignore_js_op>sn.png 

    终极解决办法:
    把eeprom里面的数据读到文件中来:
    cp /sys/bus/i2c/devices/0-0050/eeprom      /eeprom.dump
    打开这个文件:
    cd /
    vim –b eeprom.dump
    以16进制方式编辑:
    :%!xxd
    将第三行到最后一行全部删掉(删除2199行)
    将第二行0d后面的两个个ff改成00,如图所示:
    返回普通编辑模式:
    :%!xxd  –r
    然后保存退出
    :wq
    最后将数据写入eeprom,写之前要用镊子将板子上的TP4和TP8短接,解除硬件写保护。  
    dd if=/eeprom.dump of=/sys/devices/ocp.2/44e0b000.i2c/i2c-0/0-0050/eeprom
     
     
  • 相关阅读:
    asp.net core 使用 signalR(一)
    实现一个基于码云的Storage
    架构设计原则
    给 asp.net core 写个中间件来记录接口耗时
    [svc]ext4文件删除&访问原理
    [svc]为何linux ext4文件系统目录默认大小是4k?
    [svc]traceroute(udp+icmp)&tracert(icmp)原理
    [jk]服务器远控卡及kvm切换器
    [svc]find+xargs/sed&sed后向引用+awk多匹配符+过滤行绝招总结&&产生随机数
    [svc]linux正则及grep常用手法
  • 原文地址:https://www.cnblogs.com/dolphi/p/3626187.html
Copyright © 2011-2022 走看看