如何建立chromium firmware updater測試環境

最近都在搞chromium的firmware updater
雖然在https://www.chromium.org/chromium-os/developer-guide
算是寫得蠻詳盡的
但是實際上測試環境要搞起來還是花了一番功夫
chromeOS為了不讓人隨便埋一些code進去駭客
還是需要做一番設定才可以把你的source code丟到目標機台上
不像一般linux環境只要可以cross compile就可以把程式丟到目標版上去執行

1.下載depot_tools
(裡面有bootstrap的設定要做,不然後面檢查檔案時會出現permission denied)

2.下載chromium OS(使用repo而非git,相關的套件可以透過apt-get取得)

3.export depot_tools,這樣才可以使用cros_sdk進入chormiumOS的compile環境

4.執行cros_sdk後可以看到~/trunk/src/script$,目的是確保每一份chromiumOS都是在相
   同的環境下被compile出來

5.build image,一定要是test版本的,這樣後續才有SSH功能可以上傳檔案,會產生一個
   chromiumos_test_image.bin
   (做之前做好確定一下空間有4GB以上,而且需要兩三個小時的時間)
   (參考https://www.chromium.org/chromium-os/developer-guide "Building
   ChromiumOS"的順序一步一步來即可)

6.製作USB開機碟,在windows上可用chrome下載Chromebook Recovery Utility
   將image給燒錄進去USB隨身碟

7.使用USB開機碟開機(chromiumOS主機需打開這個功能,須進入developer mode)

    (default帳號是chronos,密碼是test0000)

8.package要cros_workon --board=${BOARD} start ${PACKAGE_NAME}然後再
    cros_workon_make --board=${BOARD} ${PACKAGE_NAME} --install
    這樣才真正有載入chroot(root file system)內,才有辦法透過cros deploy傳送進去

9.以logitech-updater為例,進到~/trunk/src/third_party/logittech-updater
   利用"emerge-${BOARD} logitech-updater"將package給compile起來

10.再透過cros deploy,利用ssh將修改過的package傳進chromiumOS裡面來debug

11.建立自己的檔案夾,例如叫xxx-updater

12.偷懶一點就把logitech-updater的東西通通copy進去吧,再慢慢來改

13.把~/trunk/src/third_party/chromiumos-overlay/sys-apps/logitech-updater裡面的
      ebuild同樣的copy一分到你自己的xxx-updater裡面,請把名稱跟裡面的路徑都改成你自
      己的檔案夾路徑

14. 8~10的步驟再做一次,如果成功就會在自己的機台上的/usr/sbin看到執行檔

補充一下之後的開發過程
因為我們必須上傳兩個ebuild檔案
一個是在sys-apps,另一個是在sys-firmware
sys-firmware裡的ebuild雖然寫了firmware的下載位置
但實際上還是需要透過google的工程師幫你上傳到google的local mirror位置
chromebox才可以下載到firmware
所以一般要自己試試的人到這邊就會卡住了

還有usb device在插進去chromebox時
會遇到device的user跟group無法被認定為cfm-firmware-updaters
因此就無法進行FW更新
這邊我自己的克服方法是自己手動增加
還有udev的rule也要注意執行順序
像我自己遇到hidraw的rule比我們設定的rule更晚執行
因此造成hidraw裝置先被認定為是屬於root的group與user
在這邊卡了非常久才發現這個問題...Orz
基本上要使用root帳號去修改/dev/video0的user/group
下指令"chown cfm-firmware-updateers:cfm-firmware-updaters video0"
改完之後下"su cfm-firmware-updaters"將帳號轉成cfm-firmware-updaters
應該就可以模擬udev trigger起來後使用cfm-firmware-updaters帳號
去呼叫aver-updater的狀況

PS:要手動增加user/group(cfm-firmware-updaters/cfm-firmware-updaters),請用root帳號"sudo su" "useradd username"

PPS:另外補充一下上傳動作,也是搞了一陣子才清楚
       1. git add your_fires
       2. git commit -a(與一般的git commit略為不同,但也是寫些note而已)
       3. git cl upload
           此時會跳出一堆文字
Credentials for the following hosts are required:
  chromium.googlesource.com
These are read from /home/tzaumin/.gitcookies (or legacy /home/tzaumin/.netrc)
You can (re)generate your credentials by visiting https://chromium-review.googlesource.com/new-password

          基本上就是去那個網址
          如果你是linux環境就把下面一整段的文字(非windows user)
          copy後貼在工作站console上去取得認證的
          當然你還要去登入google gerrit的帳號之類的,參考這個網址即可
          https://www.chromium.org/developers/contributing-code

          設定完後再一次git cl upload即可,但我曾經上傳錯位置
          這有時候真的搞不太懂為什麼
          不過還好google reviewer直接幫我設一個新的folder上傳,顆顆

PPS:最近又因為上傳失敗亂搞造成環境需要重建,卻發現要emerge自己已內建在新版本的firmware updater也失敗。後來仔細一看發現不能跳過build image的過程,不然在單獨build自己的firmware updater時會遭遇不預期的相依性問題。這真的是有點討厭,很容易被人忽略。
PPPS:這次重建環境花費很多時間,因為直接下載source code後馬上使用make或是emerge都會出現undefined reference:brillo的問題(還是有稍微修改過的,似乎C++的compiler對int to uint有更嚴格的規則,會需要修改)。目前在amd64-generic底下有編譯成功,似乎是要把第8項給做完才有辦法編譯成功。可是我們是要在ASUS Chromebox上執行,BOARD必須設定為panther。
補充:整理一下我覺得對的流程,其實guide寫得沒錯,但是我一直以為要先emerge-${BOARD}成功再做cros_workon。但事實上應該就是做完cros_workon再emerge-${BOARD},這樣編譯出來才不會因為lib找不到出現一堆error。

1.(outside)sudo apt-get install git-core gitk git-gui curl lvm2 thin-provisioning-tools \
     python-pkg-resources python-virtualenv python-oauth2client

2.(outside)
git config --global user.email "you@example.com"
git config --global user.name "Your Name"

3.(outside) umask 022

4.(outside) mkdir -p ${HOME}/chromiumos

5.(outside)
mkdir -p /usr/local/path/to/source/chromiumos
ln -s /usr/local/path/to/source/chromiumos ${HOME}/chromiumos

6.
(outside)
cd ${HOME}/chromiumos
repo init -u https://chromium.googlesource.com/chromiumos/manifest.git --repo-url https://chromium.googlesource.com/external/repo.git
repo sync -j4

7.(outside) cros_sdk

8.(inside) export BOARD=panther

9.(inside) ./setup_board --board=${BOARD}

10.(inside) ./build_packages --board=${BOARD}

11.(inside) ./build_image --board=${BOARD} --noenable_rootfs_verification test

12.(inside) cros_workon --board=${BOARD} start ${PACKAGE_NAME}

13.(inside) cros_workon_make --board=${BOARD} ${PACKAGE_NAME}

這樣emerge-${BOARD} ${PACKAGE_NAME}就會正確
另外千萬不要進去folder底下做make clean,LD會很莫名其妙地出現一些找不到library的問題

pppps:最近被xxx-firmware搞到生氣,因為他的上傳方式跟xxx-updater不一樣。
https://chromium.googlesource.com/chromiumos/docs/+/master/contributing.md
這邊算是OS的部分,所以要使用"repo upload . -cbr"的方式上傳code
但我完全忘記要回到/m/master這個branch去上傳我的code
一直在用我自己創建出來的branch在上傳,難怪一直打槍我
還好某天午覺睡起來突然發現自己耍笨,就merge回master後再上傳即可


ppppps:
終於發覺為何我一直上firmware都錯誤, 因為repo要看log裡面的Change-ID後才會上傳

Change-Id

It is important to note that repo uses the Change-Id in your git commit message to track code reviews. So if you want to make a change to an existing CL, you'll want to use git commit --amend rather than making an entirely new commit.
This allows you to follow the standard git flow by making multiple changes in a single branch and uploading them together.
For more details, see Gerrit's Change-Id documentation.
真的文件要好好看,但是真的很容易忽略掉.....


pppppppS:
幹,終於發現早就可以上傳,只是遇到Uncomment Upload時我一直沒去追究為什麼
原來只要把要上傳的branch前面的#號拿掉,就可以上傳了
真他媽的搞了太久了


留言

這個網誌中的熱門文章

在嵌入式linux系統中使用android adbd,PC可直接透過USB對console下指令

lighttpd + fcgi + C language to do file upload & download

linux fuse-exfat於嵌入式系統的設定