2013/08/24

再探 網樂通 uboot code (UBOOTWPDA)

[2014/02/09 更新]
當時想開發 UBOOTWPDA 的原因是原本網樂通的 UBOOT 開機程序讓開發麻煩,RESET 開機每次要等很久,所以乾脆重新改掉網樂通客製化的開機參數,而採用讀取設定檔的方式取得開機參數. 而且希望只要使用一個 partition 也能開機...

安裝UBOOTWPDA方式(新版)

若只想單純安裝 ubootwpda, 請參考sh4twbox安裝方式

安裝 TWPDA UBOOT 方式

  1. 將 uboot.sh 放入內建 USB 第一個分割區, 並依情況編寫, 必須使用 Linux 換行格式, 長度最長988 bytes (檔案太長或寫錯 將導致無法開機, 建議使用 console 線觀看執行過程畫面)
  2. usb 碟第一個分割區設定為 FAT/FAT32
  3. 將 iptvubootupdate.bin 及 uboot.sh 放入 USB
  4. 拔網樂通電源
  5. 按住 reset 鍵不放
  6. 連上網樂通電源
  7. 等燈閃3下後
  8. 放開 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, 重新列一下它的重要啟動順序
  1. start_sh4boot(lib_sh/board.c)
  2. update_process(board/st/pdk7105/swUpdate.c) 依是否按RESET及外接USB情況運作
  3. setenv_start(board/st/pdk7105/swUpdate.c) 設定環境變數bootargs,bootcmd
  4. main_loop(common/main.c) # 執行 getenv("bootcmd")
  5. getenv("bootargs") (common/cmd_bootm.c)
uboot 檔案檔頭格式:ImageFileHeader_T

終於稍微有把握可以改網樂通 Uboot 的運作邏輯, 希望能達到
  1. 只插外部 USB, 不插 DOM 也能開機
  2. 依據第一個 partition 設定的 /uboot.env 參數載入 kernel 參數
  3. 減少寫入內部 flash rom 的需求
  4. 只操作一次 USB 升級片即可同時改 uboot + 運作 sh4twbox
  5. 減少不必要的程式碼(不顯示logo)uboot.bin size  379992->205376
減少 reset判斷時間(原 3 秒->0秒):
if ResetPressed { // 以外部 USB 優先運作, 設成紅燈
  update_from_usb()
} else { // 以內部 USB 優先運作, 設成紫燈
  update_from_usb()
}
uboot更新軟體放在內外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方式

  1. 下載原網樂通UBOOT程式碼,將 iptvubootupdate.bin copy 到 USB(FAT32分割區)
  2. 拔網樂通電源
  3. 按住 reset 鍵不放
  4. 連上網樂通電源
  5. 放開 reset 鍵

已知問題

  1. fatls 無法完整列出檔案, 有些檔名會失敗
  2. kernel 名稱似乎只能取名為 vmlinux.ub
  3. uboot.sh 最長只能編寫 988 bytes
  4. 無法正確讀取 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 的方法

參考文件

沒有留言: