真相:中國版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
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM