最開始並沒有注意到這個問題, 因為從設備拿到手, 用USB Burning Tool刷入潛龍版的安卓4.4.2, 再到運行EmuELEC, Armbian, 再到給Kernel 5.3的Armbian編譯RTL8189FTV的驅動, 都還算順利. 因為Kernel 5.3也差不多搞定了, 開始打安卓的主意, 想看看能不能跑7.x版本的安卓. 固件包下了幾個, 要開始刷的時候出了狀況, 發現按着reset鍵再也無法進入USB Burning Mode了.
幾經調查, 試了另外兩台一樣已經刷過的R3300L, 百度上查類似的案例, 發現其他人也存在這種情況. 而且網友們提供的處理方法(4R19接地)完全無效.
於是開始研究UBOOT
這個設備跑過的系統不外乎潛龍的安卓4.4.2, 以及各種版本的EmuELEC, 各種版本的Armbian, 通過查資料, 發現Linux下面的fw_printenv和fw_setenv命令可以查看及修改UBOOT下的配置. EmuELEC下可以直接運行, 但是在高版本的Armbian下, 僅有可執行文件, 缺/etc/fw_env.config, 於是又查資料找到了對應S905L的config.
通過分析UBOOT的配置, 可以確認EmuELEC和Armbian都會對UBOOT配置進行修改, 但是它們的修改只是在bootcmd里加東西, 加上從sdcard和usb啟動的方法, 不應該會影響到組合鍵.
於是將其中一台焊上了TTL線座, 翻出來以前買的PL2303的USB串口線. 連的過程也是各種摸石頭過河. 首先是TX和RX的連線, 嘗試幾次后確定是PL2303的TX和RX分別接盒子的RX, TX. 然后是VCC線, 每次一連接, 盒子就上電啟動了, 根本沒法主動觀察啟動過程, 於是把VCC和GND拔掉, 這下不會自己啟動了, 但是啟動后看到的全是方塊狀亂碼, 最終是VCC不連, 只連GND, 才算又不自己啟動, 又能顯示正常.
觀察UBOOT的啟動日志發現, 按不按reset鍵, 連不連HDMI, 啟動日志基本完全一樣.
其中一行"Hit any key to stop autoboot: 0"給我造成了很大困惑, 因為不管怎么敲Enter鍵, 都不會進入UBOOT命令行, 我懷疑是因為這個0, 導致無法停下來. 查閱資料, 發現有個配置項bootdelay, 於是從0改成了5, 發現根本不起作用, UBOOT還是一路狂飆不停下來, 又查資料, 發現還有用Ctrl+C的, 再試依然無效. 再查資料, 發現還有用空格鍵的, 這個起作用了, 只要拍空格鍵, 就能進入UBOOT
繼續查資料, 發現還有個配置項叫 upgrade_key , 這個值是 "if gpio input GPIOH_6; then echo detect upgrade key; sleep 3; run update;fi;" 在日志中有這么一行"gpio: pin GPIOH_6 (gpio 55) value is 1", 憑借着曾經做過一些電路的經驗感覺這個不對. 如果reset鍵輸入是GPIOH_6, 那么在按下的時候肯定處於接地狀態, 不可能是高電平, 所以這行日志對應的就是upgrade_key當中 gpio input GPIOH_6 這行執行的結果, 並沒有檢測到reset鍵按下的狀態, 所以可以說是GPIOH_6這個寫錯了.
要找正確的gpio pin該怎么辦呢? 又查資料, 發現 gpio status -a 這個命令可以顯示所有的gpio狀態, 這就好辦了, 在reset鍵未按下和按下兩個狀態下, 分別執行一下這個命令, 把輸出的結果對比一下就出來了, 得到的正確pin是GPIOAO_2, 在按下前是GPIOAO_2: input: 1 [ ], 在按下之后變成了 GPIOAO_2: input: 0 [ ]
再通過fw_setenv將正確的值設上
fw_setenv upgrade_key "if gpio input GPIOAO_2; then echo detect upgrade key; sleep 3; run update;fi;"
.按住reset重啟, 就可以觀察到usb burn的狀態了.
解決這個問題斷斷續續花了我大概三天時間, 從周五到周日, 可能對於對於專業選手很簡單, 但對於我很多是新事物, 要慢慢摸索.