真相:中国版BBB用USB连电脑没有盘符的根本原因分析
很多網(wǎng)友在問:為什么中國版的裝完驅(qū)動(dòng)插上板子沒有顯示端口號(hào)和69M的盤符??樓主發(fā)現(xiàn),在開機(jī)啟動(dòng)的時(shí)候,加載g_multi模塊時(shí)出現(xiàn)錯(cuò)誤提示invalid argument。
Embest的員工表示:裝的是BBB-eMMC-flasher-2013.04.13-DDR3 -400MHz.img.xz版本確認(rèn)有此盤符!而我們?nèi)ス倬W(wǎng)上下載這個(gè)版本發(fā)現(xiàn)真的跟我們板子上的是一樣的。甚至裝上最新的版本也還是同樣的問題。此事必有蹊蹺!!!
有大牛提出了解決辦法:輸入命令
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;
完成后重啟即可,驅(qū)動(dòng)自動(dòng)加載;如果需要手工安裝驅(qū)動(dòng),運(yùn)行命令modprobe g_multi file=/dev/mmcblk0p1 cdrom=0 stall=0removable=1 nofua=1 系統(tǒng)自動(dòng)安裝USB驅(qū)動(dòng),這時(shí)就能在電腦上看到69.4MB的盤符。問題跟EEPROM里的ID號(hào)有關(guān)。
但是大牛并沒有解釋為什么這么做。他只告訴我們跟EEPROM里的ID號(hào)有關(guān)。先百度了一下sed這個(gè)命令的意思,sed -e 's/SERIAL_NUMBER=/x=/g',就是把文件中所有”SERIAL_NUMBER=”的字符串替換成了“x=”。
先把/usr/bin/g-ether-load.sh這個(gè)文件找出來。找到跟SERIAL_NUMBER有關(guān)的命令。
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=CircuitcoiProduct=BeagleBone${BLACK} host_addr=${DEV_ADDR}
這樣按照大牛的改法,意思就是傳給內(nèi)核的iSerialNumber參數(shù)變?yōu)榭樟?。很明顯EEPROM里的SERIAL_NUMBER是有問題的,既然文件系統(tǒng)肯定是沒錯(cuò)的,那么肯定是Embest的EEPROM出廠數(shù)據(jù)寫錯(cuò)了??梢园焉厦娴拿罘植綀?zhí)行一下:
先echo $(hexdump -e '8/1 "%c"'/sys/bus/i2c/devices/0-0050/eeprom -s 14 -n 2)
運(yùn)行結(jié)果為:ue 這一句沒有問題
再執(zhí)行下面半句的時(shí)候
echo $(hexdump -e '8/1 "%c"'/sys/bus/i2c/devices/0-0050/eeprom -s 16 -n 12)
運(yùn)行結(jié)果是這么個(gè)鬼樣子:??D503785
顯然是出現(xiàn)了非法的字符。
echo $(hexdump -e '8/1 "%c"'/sys/bus/i2c/devices/0-0050/eeprom -s 16 -n 12) > sn1
把它存到文件里面,發(fā)現(xiàn)這個(gè)文件都不能用gedit打開,只能用vi打開,
說明embest在EEPROM里面寫序列號(hào)的時(shí)候后面忘了填幾個(gè)零,直接又在后面開始寫正常編碼以外的數(shù)據(jù)。所以讀的時(shí)候出現(xiàn)了致命的錯(cuò)誤,整個(gè)參數(shù)都是不對(duì)的。
另外提一句,大牛的方法雖然能解決問題,但樓主發(fā)現(xiàn)可操作性很差,而且沒有把原來的文件做備份就rm掉了,要打那么多個(gè)字符,一個(gè)字符出錯(cuò)了可能把這個(gè)文件搞沒掉。樓主就是在輸完這個(gè)命令的時(shí)候,發(fā)現(xiàn)我的/usr/bin/g-ether-load.sh這個(gè)文件變成空白的了,所以建議像樓主一樣菜的菜鳥們可以用我的辦法:
先把/usr/bin/g-ether-load.sh備份為/usr/bin/g-ether-load.bak.sh,用任意一個(gè)編輯器(gedit,或者vi)打開/usr/bin/g-ether-load.sh腳本文件,把下面這一段中的iSerialNumber=的參數(shù)填為空或者你板子上標(biāo)簽的序列號(hào)。
modprobe g_multi file=/dev/mmcblk0p1 cdrom=0 stall=0removable=1 nofua=1 iSerialNumber=${SERIAL_NUMBER} iManufacturer=CircuitcoiProduct=BeagleBone${BLACK} host_addr=${DEV_ADDR}
比如我的改成這個(gè)樣子:
modprobeg_multi file=/dev/mmcblk0p1 cdrom=0 stall=0 removable=1 nofua=1iSerialNumber=ue-EMD503785 iManufacturer=CircuitcoiProduct=BeagleBone${BLACK}host_addr=${DEV_ADDR}
下次開機(jī)的時(shí)候電腦就會(huì)自動(dòng)識(shí)別BBB的盤符和USB網(wǎng)卡啦啦啦啦。
另外這次想手動(dòng)啟動(dòng)相關(guān)模塊的話可以直接運(yùn)行/usr/bin/g-ether-load.sh腳本,事實(shí)上開機(jī)的時(shí)候系統(tǒng)也是通過這個(gè)腳本啟動(dòng)USB從設(shè)備驅(qū)動(dòng)的。
就是這個(gè)EEPROM里面的數(shù)據(jù)沒寫對(duì)。
<ignore_js_op>
終極解決辦法:
把eeprom里面的數(shù)據(jù)讀到文件中來:
cp /sys/bus/i2c/devices/0-0050/eeprom /eeprom.dump
打開這個(gè)文件:
cd /
vim –b eeprom.dump
以16進(jìn)制方式編輯:
:%!xxd
將第三行到最后一行全部刪掉(刪除2199行)
將第二行0d后面的兩個(gè)個(gè)ff改成00,如圖所示:
返回普通編輯模式:
:%!xxd–r
然后保存退出
:wq
最后將數(shù)據(jù)寫入eeprom,寫之前要用鑷子將板子上的TP4和TP8短接,解除硬件寫保護(hù)。
dd if=/eeprom.dump of=/sys/devices/ocp.2/44e0b000.i2c/i2c-0/0-0050/eeprom
總結(jié)
以上是生活随笔為你收集整理的真相:中国版BBB用USB连电脑没有盘符的根本原因分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息奥赛一本通1486: CH 6202
- 下一篇: Variance Inflation F