當時想開發 UBOOTWPDA 的原因是原本網樂通的 UBOOT 開機程序讓開發麻煩,RESET 開機每次要等很久,所以乾脆重新改掉網樂通客製化的開機參數,而採用讀取設定檔的方式取得開機參數. 而且希望只要使用一個 partition 也能開機...
安裝UBOOTWPDA方式(新版)
若只想單純安裝 ubootwpda, 請參考sh4twbox安裝方式
安裝 TWPDA UBOOT 方式
- 將 uboot.sh 放入內建 USB 第一個分割區, 並依情況編寫, 必須使用 Linux 換行格式, 長度最長988 bytes (檔案太長或寫錯 將導致無法開機, 建議使用 console 線觀看執行過程畫面)
- usb 碟第一個分割區設定為 FAT/FAT32
- 將 iptvubootupdate.bin 及 uboot.sh 放入 USB
- 拔網樂通電源
- 按住 reset 鍵不放
- 連上網樂通電源
- 等燈閃3下後
- 放開 reset 鍵
進階使用方式
- 運用 script 技巧,設定下一次開機時使用的 partition, 就可以實現網樂通版的多重開機
- 如果自己編譯 uboot, 請先了解以下所寫的 TWPDA UBOOT 開機邏輯, 也就是第一個 DOS 分割區沒有裝 uboot.sh 時, 以及 iptvubootupdate.bin 版本有異動才會更新.
- 可運用 saveenv 指令將開機環境參數寫入 flash
- 若不按RESET, 內部USB第一個和第二個分割區沒有 uboot.sh, 就會自動改成外部usb開機
開發過程分享
以網樂通的硬體而言算是很慢的機器,但是大多數人不需要購買就可以取得,拿來學習 linux 是不錯的選擇, 此處運用 STLinux 官網的這兩篇有用資訊:
及使用 cscope + vim 查看 uboot code 技巧(只看相關的 code, 避免查詢其他 cpu/board):
- use cscope on large project
- 使用方式:
- yaourt -S vim-cscope # 安裝 vim cscope 設定到 Arch Linux
- ./cscope.sh # 會將索引檔建在 ./cscope 目錄
- vim ...
- :cs add ./cscope # cscope/ 目錄
- :cs # 看語法說明, 例如 cs find c main_loop
- 使用 hotkey: Ctrl-LeftBotton(或Ctrl+]) 跳到定義, Ctrl-T 跳回來
回到 uboot code, 重新列一下它的重要啟動順序
- start_sh4boot(lib_sh/board.c)
- update_process(board/st/pdk7105/swUpdate.c) 依是否按RESET及外接USB情況運作
- setenv_start(board/st/pdk7105/swUpdate.c) 設定環境變數bootargs,bootcmd
- main_loop(common/main.c) # 執行 getenv("bootcmd")
- getenv("bootargs") (common/cmd_bootm.c)
uboot 檔案檔頭格式:ImageFileHeader_T
終於稍微有把握可以改網樂通 Uboot 的運作邏輯, 希望能達到
- 只插外部 USB, 不插 DOM 也能開機
- 依據第一個 partition 設定的 /uboot.env 參數載入 kernel 參數
- 減少寫入內部 flash rom 的需求
- 只操作一次 USB 升級片即可同時改 uboot + 運作 sh4twbox
- 減少不必要的程式碼(不顯示logo)uboot.bin size 379992->205376
減少 reset判斷時間(原 3 秒->0秒):
if ResetPressed { // 以外部 USB 優先運作, 設成紅燈uboot更新軟體放在內外usb皆可, 新寫的 update_from_usb() 邏輯如下:
update_from_usb()
} else { // 以內部 USB 優先運作, 設成紫燈
update_from_usb()
}
if 執行第1分割區的 uboot.sh 失敗 {
if 第1分割區是 fat 格式 {
嘗試升級 uboot
if 成功 或是 CRC/檔頭/燒錄過程失敗 {
重開機
} // 其他情況繼續跑: 檔案沒找到, 沒有 usb, 版本相同不更新, SHA1不合
}
執行第2分割區的 uboot.sh
}
uboot.sh 內容範例(注意底下 setenv 需要寫成一整長行, 參看下載的 uboot.sh:
# hush script syntax http://www.stlinux.com/u-boot/using
# uncomment following line to get more time to interrupt boot
# setenv bootdelay 10
# case 1: save boot parameters to flash (2.6.23.17 kernel sda2)
# * bootargs: root=8:1 means sda1, sda2 8:2, sdb1 8:17, sdb2 8:18
# * bootcmd: 0:1 first usb parition, 0:2 2nd usb parition
setenv bootargs 'console=ttyAS0,115200 rootdelay=0 root=8:2 rootfstype=ext3 rw rootflags=data=journal nwhwconf=device:eth0,hwaddr:10:08:E2:12:06:BD phyaddr:0,watchdog:5000 mem=120M bigphysarea=2048'
setenv bootcmd 'ext2load usb 0:2 80000000 vmlinux.ub; bootm 80000000'
saveenv
# case 2: force boot external usb partition (2.6.32 kernel sda2)
# * usbcfg: 0:internal usb, 1:external usb
setenv bootargs 'console=ttyAS0,115200 rootdelay=0 root=/dev/sda2 rootfstype=ext3 rw rootflags=data=journal nwhwconf=device:eth0,hwaddr:10:08:E2:12:06:BD phyaddr:0,watchdog:5000 mem=120M bigphysarea=2048'
setenv bootcmd 'usbcfg 1; ext2load usb 0:2 80000000 vmlinux.ub; bootm 80000000'
恢復原版uboot方式
- 下載原網樂通UBOOT程式碼,將 iptvubootupdate.bin copy 到 USB(FAT32分割區)
- 拔網樂通電源
- 按住 reset 鍵不放
- 連上網樂通電源
- 放開 reset 鍵
已知問題
- fatls 無法完整列出檔案, 有些檔名會失敗
- kernel 名稱似乎只能取名為 vmlinux.ub
- uboot.sh 最長只能編寫 988 bytes
- 無法正確讀取 ext4 分割區的檔案,此時錯誤訊息可能為 Bad Magic Number
更新歷史
- 2013/09/01 release v1309 版, 限制 uboot.sh 長度為 988 bytes
- 2013/10/06 release 更名為 UBOOTWPDA release 8365896 版, 加上燈號顯示
- 加上紅燈(外部USB開機),紫燈(內部USB開機)模式
- 更名為 UBOOTWPDA
- 2013/10/13 加上已知問題
- 2013/10/19 加上 988 bytes 問題
- 2013/11/06 修正恢復原網樂通 UBOOT 的方法
沒有留言:
張貼留言