燒寫 eMMC
啟動模式
eMMC 一般都是直接焊在主板上,有些雖然是可插拔的,但沒有專用的讀卡器,因此需要使用板載燒寫的方式來更新固件,即板上跑一個小系統,負責從主機或其它存儲介質讀取固件,再燒寫到 eMMC 上。
取決于 eMMC 現存的內容,開發板有兩種特殊的啟動模式: Rockusb 模式 和 Maskrom 模式。
通常只需要進入 Rockusb 模式 即可升級現有的 Android 或 Ubuntu 系統。這種方式升級方式一般適用于 RK 固件或分區映像。
Maskrom 模式 則是系統未能識別到合法的啟動設備而進入的模式。燒寫原始固件到 eMMC 必須要進入該模式。
Rockusb 模式
開發板啟動后,CPU 如果在 eMMC 中找到有效的 IDB (IDentity Block),它將從 eMMC 讀取并加載 bootloader,并將執行控制權交給它。
如果 bootloader 檢測到 Recovery 按鈕按下并且 USB 已連接,它就會進入 Rockusb 模式,等待來自主機的命令。
進入 Rockusb 模式 的準備工作:
5V2A 電源適配器。
連接電源適配器和開發板的 Micro USB 線。
用來連接電腦 PC 以及開發板的公對公 USB 線。
eMMC 。
操作步驟:
將所有 USB 線(包括 Micro USB 線和公對公 USB 線)拔出開發板,以保持開發板斷電。
安裝好 eMMC,拔出 SD 卡。
使用公對公 USB 線將主機的 USB 端口與開發板的雙層 USB 端口中靠近電路板的 OTG 端口相連:
按住開發板上的 RECOVERY 按鍵。
將 Micro USB 線插入到開發板中,讓開發板上電。
等待大概 3 秒左右松開 RECOVERY 按鍵。
Maskrom 模式
如果開發板上電后遇到以下情況之一:
eMMC 內容為空。
eMMC 上的 bootloader 損壞。
將 eMMC 數據/時鐘引腳接地,eMMC讀取數據失敗。
CPU 在 eMMC 中就會找不到有效的 IDB (IDentity Block),轉而執行一段小型的 ROM 代碼,等待主機通過 USB 上傳 bootloader 來初始化 DDR 內存并進入升級狀態。這種模式稱為 Maskrom 模式 。
強制進入 MaskRom 模式 涉及到硬件操作,具有一定的風險,因此操作上需要非常謹慎。
進入 Maskrom 模式 的準備工作:
5V2A 電源適配器。
用來連接電源適配器和開發板的 Micro USB 線。
連接電腦 PC 和開發板的公對公 USB 線。
用于將 eMMC 時鐘引腳短接到地的金屬鑷子。
eMMC 。
操作步驟:
將所有 USB 線(包括 Micro USB 線和公對公 USB 線)拔出開發板,以保持開發板斷電。
安裝好 eMMC,拔出 SD 卡。
使用公對公 USB 線將主機的 USB 端口與開發板的雙層 USB 端口中靠近電路板的 OTG 端口相連:
找到開發板上預留的 eMMC 的 CLK 引腳和 GND 腳,見下圖:
用金屬鑷子短接 eMMC 的 CLK 和 GND 焊盤,并保持短接良好。
將 Micro USB 線插入到開發板中,讓開發板上電。
保持住一秒后松開鑷子。
下載固件
固件下載頁面
固件說明:固件分為 原始固件 與 RK 固件 ,已經分類到不同的文件夾中,固件命名的日期最新則為最新的固件,其穩定性更好,請根據你所需要的固件類型選擇正確的燒寫工具。
Linux(GPT)固件:官方云盤提供的 Linux 固件中,其中包括 Ubuntu,Buildroot,Debian 等 Linux 系統,帶 GPT 字樣為 GPT 分區格式固件,統稱為 Linux(GPT) 固件,按照 編譯 Linux固件(GPT) 編譯出來的固件也為 Linux(GPT) 固件。
燒寫工具
請根據所用主機的操作系統選擇相應的燒寫 eMMC 工具:
燒寫 eMMC
圖形界面燒寫工具:
AndroidTool (Windows)
命令行燒寫工具:
upgrade_tool (Linux)
rkdeveloptool (Linux)
提示:AndroidTool 和 upgrade_tool 均支持燒寫 原始固件 與 RK 固件,而 rkdeveloptool 僅支持燒寫 原始固件。
燒寫須知
不同固件之間使用的燒寫工具和燒寫方法不一樣的,請按照下面的表格進行燒寫。
AndroidTool
AndroidTool 是 Windows 下用來燒寫原始固件、RK 固件和分區映像到 eMMC 的工具。
使用 AndroidTool 之前, 應先安裝 Rockusb 驅動,然后再安裝運行 AndroidTool。
安裝 Rockusb 驅動
下載 DriverAssistanthttps://pan.baidu.com/s/1migPY1U#list/path=%2FPublic%2FDevBoard%2FROC-RK3328-CC%2FTools%2FRKTools%2Fwindows&parentPath=%2FPublic%2FDevBoard%2FROC-RK3328-CC, 解壓后運行里面的 DriverInstall.exe:
點擊 “驅動安裝” 按鈕安裝驅動;如果想卸載驅動,則點擊 “驅動卸載” 按鈕。
若設備處于 Rockusb 模式 或 Maskrom 模式,在設備管理器中會出現 “Rockusb Device”:
這表示驅動安裝成功。
安裝 AndroidTool
燒寫工具選擇與下載:
燒寫原始固件:AndroidTool_v2.39
燒寫 RK Android7.1 固件:AndroidTool_v2.38
燒寫 RK Android8.1 固件:AndroidTool_v2.58
燒寫 RK Linux(GPT) 固件:AndroidTool_v2.58
下載并解壓后運行里面的 AndroidTool.exe:
若設備處于 Rockusb 模式,狀態行將顯示 “發現一個LOADER設備”。
若設備處于 Maskrom 模式,狀態行將顯示 “發現一個MASKROM設備”。
燒寫原始固件
原始固件需要從 eMMC 的偏移地址為 0 的位置開始燒寫。但在 Rockusb 模式 下無法做到這點,因為所有 LBA 寫入操作會偏移 0x2000 個扇區(即 LBA0 對應于存儲設備上第 0x2000 個扇區)。因此,開發板必須強制進入 Maskrom 模式 才能燒寫原始固件。
使用 AndroidTool_v2.39 燒寫原始固件到 eMMC 的步驟如下:
強制設備進入 Maskrom 模式。
運行 AndroidTool。
打開 “下載鏡像” 制表頁。
保持表格的第一行不變, 使用默認的 “Loader” 文件。
點擊第二行右側的空白單元格,在彈出的文件對話框里打開原始固件文件。
點擊 “執行” 按鈕開始燒寫。
燒寫 RK 固件
使用 AndroidTool 燒寫 RK 固件 到 eMMC 的步驟如下:
強制設備進入 Rockusb 模式 或 Maskrom 模式。
運行 AndroidTool。
打開 “升級固件” 制表頁。
點擊 “固件” 按鈕, 在彈出的文件對話框里打開RK 固件文件。
固件版本號、loader 版本號和芯片信息會從固件中讀取并顯示。
點擊 “升級” 按鈕燒錄。
然后燒寫不同的固件或者出現燒寫失敗,請按照 燒寫須知 先擦除后升級。
燒寫分區映像
取決開發板原有的固件,燒寫 分區映像 到 eMMC 會有所不同。
原始固件
使用 AndroidTool_v2.39 燒寫 分區映像 到 eMMC 的步驟如下:
強制設備進入 Rockusb 模式 或 Maskrom 模式。
運行 AndroidTool。
打開 “下載鏡像” 制表頁。
保持表格第一行不變。
鼠標右鍵點擊其它行,在彈出菜單中選擇 “刪除項” ,重復直至刪除第一行除外的所有行。
鼠標右鍵點擊表格,在彈出菜單中選擇 “添加項” 以便添加分區映像:
選中第一個單元格上的復選框。
填入 parameter.txt 中該分區的起始扇區作為燒寫地址(如果是 Maskrom 模式 則須再加上 0x2000)。
單擊右側空白單元格,在彈出的文件對話框里打開對應的分區映像文件。
點擊 “執行” 按鈕燒錄。
注意:
您可以通過重復步驟 6 將多個分區映像燒寫到閃存。
通過取消選中地址單元格前面的復選框,可以跳過此分區的燒寫。
在 Maskrom 模式 中, parameter.txt 中分區的起始扇區必須再加上 0x2000 作為燒寫地址。參見《分區偏移量》一章以便使用腳本獲取該地址。
RK 固件
使用 Androidtool_2.38 燒寫 Android7.1 RK 固件時使用默認配置即可;
使用 Androidtool_2.58 燒寫 Android8.1 RK 固件使用 rk3328-Android81.cfg 配置,右擊空白部分,點擊導入配置,選擇對應的配置文件。
使用 Androidtool_2.58 燒寫 Linux(GPT)分區 RK 固件使用默認配置即可。
使用 AndroidTool 燒寫 分區映像 到 eMMC 的步驟如下:
切換至”下載鏡像”頁。
勾選需要燒錄的分區,可以多選。
確保映像文件的路徑正確,需要的話,點路徑右邊的空白表格單元格來重新選擇。
點擊”執行”按鈕開始升級,升級結束后設備會自動重啟。
upgrade_tool
upgrade_tool 是 Linux 下用來燒寫原始固件、RK 固件和分區映像到 eMMC 的工具,是 Rockchip 提供的閉源命令行工具。
安裝 upgrade_tool
工具選擇與下載:
燒寫原始固件或者 Android7.1 :upgrade_tool_v1.24
燒寫 Linux(GPT) RK 固件或者 Android8.1 :upgrade_tool_v1.34
下載 upgrade_tool,并安裝到 Linux 系統上:
unzip Linux_Upgrade_Tool_v1.24.zip cd Linux_UpgradeTool_v1.24 sudo mv upgrade_tool /usr/local/bin sudo chown root:root /usr/local/bin/upgrade_tool sudo chmod 0755 /usr/local/bin/upgrade_tool
然后根據此處的說明去添加 udev 規則。這是為了讓普通用戶有權限燒寫 Rockchip 設備。如果跳過這步,那么所有的燒寫命令均需在前面加 sudo 才能成功執行。
燒寫原始固件
原始固件需要從 eMMC 的偏移地址為 0 的位置開始燒寫。但在 Rockusb 模式 下所有 LBA 寫入操作會偏移 0x2000 個扇區(即 LBA0 對應于存儲設備上的第 0x2000 個扇區)。因此,開發板必須強制進入 Maskrom 模式 才能燒寫原始固件。
使用 upgrade_tool 燒寫原始固件到 eMMC 的步驟如下:
強制設備進入 Maskrom 模式。
運行以下命令:
upgrade_tool db out/u-boot/rk3328_loader_ddr786_v1.06.243.bin upgrade_tool wl 0x0 out/system.img upgrade_tool rd # 重置并啟動設備
其中:
rk3328_loader_ddr786_v1.06.243.bin 是編譯 U-Boot 時復制進去的 loader 文件,也直接到此處下載 rk3328_loader_xxx.bin 文件。
system.img 是打包后的原始固件,也可以是官網上下載并解壓后的原始固件文件。
燒寫 RK 固件
使用 upgrade_tool 燒寫 RK 固件到 eMMC 的步驟如下:
原固件與需要燒寫的固件為同一固件只需進入Rockusb 模式,不同固件燒寫需要進入 Maskrom 模式。
使用 upgrade_tool 燒寫 RK 固件:
upgrade_tool uf path/update.img
然后燒寫不同的固件或者出現燒寫失敗,請按照 燒寫須知 先擦除后升級。
upgrade_tool ef path/update.img # 擦除閃存
燒寫分區映像
取決開發板原有的固件,燒寫分區映像到 eMMC 的指令會有所不同。
原始固件
如果開發板原有系統是原始固件,那么很可能使用了 GPT 分區方案。每個分區的預定義偏移量和大小可以在 SDK 里的 build/partitions.sh 中找到,可以參考《分區偏移量》一章。
使用 upgrade_tool 燒寫 分區映像的步驟如下:
強制設備進入 Maskrom 模式
使用 upgrade_tool 燒寫分區映像:
upgrade_tool db out/u-boot/rk3328_loader_ddr786_v1.06.243.bin upgrade_tool wl 0x40 out/u-boot/idbloader.img upgrade_tool wl 0x4000 out/u-boot/uboot.img upgrade_tool wl 0x6000 out/u-boot/trust.img upgrade_tool wl 0x8000 out/boot.img upgrade_tool wl 0x40000 out/linaro-rootfs.img upgrade_tool rd # 重置并啟動設備
RK 固件
如果開發板原有系統是 RK 固件,那么它使用 parameter 文件作為分區方案,這樣就可直接使用分區名稱來燒寫分區映像:
強制設備進入 Rockusb 模式。
使用 upgrade_tool 燒寫分區映像:
Android7.1 使用以下方式:
upgrade_tool di -b boot.img upgrade_tool di -k kernel.img upgrade_tool di -s system.img upgrade_tool di -r recovery.img upgrade_tool di -m misc.img upgrade_tool di resource resource.img upgrade_tool di -p parameter # 燒寫 parameter upgrade_tool ul bootloader.bin # 燒寫 bootloader
Android8.1 使用以下方式:
sudo upgrade_tool ul bootloader.bin # 燒寫 bootloader sudo upgrade_tool di -p paramater # 燒寫 parameter sudo upgrade_tool di -uboot uboot.img sudo upgrade_tool di -trust trust.img sudo upgrade_tool di -m misc.img sudo upgrade_tool di -baseparameter baseparameter.img sudo upgrade_tool di -b boot.img sudo upgrade_tool di -k kernel.img sudo upgrade_tool di -resource resource.img sudo upgrade_tool di -r recovery.img sudo upgrade_tool di -s system.img sudo upgrade_tool di -vendor vendor.img sudo upgrade_tool di -oem oem.img
Linux(GPT) 使用以下方式:
upgrade_tool ul $LOADER upgrade_tool di -p $PARAMETER upgrade_tool di -uboot $UBOOT upgrade_tool di -trust $TRUST upgrade_tool di -b $BOOT upgrade_tool di -r $RECOVERY upgrade_tool di -m $MISC upgrade_tool di -oem $OEM upgrade_tool di -userdata $USERDATA upgrade_tool di -rootfs $ROOTFS
注意:
-b 是 boot 分區的預定義縮寫。如果沒有縮寫可用,請改為分區名稱,例如上述例子中的 resource。
可根據 《參數文件格式》 這份文檔的說明自定義內核參數和分區布局。分區布局更改后,必須先重新燒寫該 parameter 文件,方可重新燒寫受影響的相應分區。
常見問題
如果由于閃存問題而出現錯誤,可以嘗試使用低格或擦除閃存:
upgrade_tool lf # 低格閃存 upgrade_tool ef # 擦除閃存
rkdeveloptool
rkdeveloptool 是 Linux 下用來燒寫原始固件和分區映像到 eMMC 的工具。它不支持燒寫 RK 固件。
rkdeveloptool 是由 Rockchip 開發的命令行燒寫工具,是閉源工具 upgrade_tool 的開源替代品。在日常使用中,一般都能取代 upgrade_tool。
安裝 rkdeveloptool
首先是下載、編譯和安裝 rkdeveloptool:
#install libusb and libudev sudo apt-get install pkg-config libusb-1.0 libudev-dev libusb-1.0-0-dev dh-autoreconf # clone source and make git clone https://github.com/rockchip-linux/rkdeveloptool cd rkdeveloptool autoreconf -i ./configure make sudo make install
然后根據此處的說明去添加 udev 規則。這是為了讓普通用戶有權限燒寫 Rockchip 設備。如果跳過這步,則所有的燒寫命令均需在前面加 sudo 才能成功執行。
燒寫原始固件
原始固件需要從 eMMC 的偏移地址為 0 的位置開始燒寫。但在 Rockusb 模式 下所有 LBA 寫入操作會偏移 0x2000 個扇區(即 LBA0 對應于存儲設備上的第 0x2000 個扇區)。因此,開發板必須強制進入 Maskrom 模式 才能燒寫原始固件。
使用 rkdeveloptool 燒寫原始固件到 eMMC 的步驟如下:
強制設備進入 Maskrom 模式。
運行以下命令:
rkdeveloptool db out/u-boot/rk3328_loader_ddr786_v1.06.243.bin rkdeveloptool wl 0x0 out/system.img rkdeveloptool rd # 重置并啟動設備
其中:
rk3328_loader_ddr786_v1.06.243.bin 是編譯 U-boot 時復制進去的 loader 文件,也直接到此處下載 rk3328_loader_xxx.bin 文件。
system.img 是打包后的原始固件,也可以是官網上下載并解壓后的原始固件文件。
燒寫分區映像
以下的說明僅適用于開發板原有系統是原始固件時的分區映像燒寫。每個分區的預定義偏移量和大小可以在 SDK 里的 build/partitions.sh 中找到,可以參考《分區偏移量》一章。
使用 rkdeveloptool 燒寫分區映像的步驟如下:
強制設備進入 Maskrom 模式。
運行以下命令:
rkdeveloptool db out/u-boot/rk3328_loader_ddr786_v1.06.243.bin rkdeveloptool wl 0x40 out/u-boot/idbloader.img rkdeveloptool wl 0x4000 out/u-boot/uboot.img rkdeveloptool wl 0x6000 out/u-boot/trust.img rkdeveloptool wl 0x8000 out/boot.img rkdeveloptool wl 0x40000 out/linaro-rootfs.img rkdeveloptool rd # 重置并啟動設備
udev
創建 /etc/udev/rules.d/99-rk-rockusb.rules,并插入以下內容1。 如有必要,用實際 Linux 組替換 users 組:
SUBSYSTEM!="usb", GOTO="end_rules" # RK3036 ATTRS{idVendor}=="2207", ATTRS{idProduct}=="301a", MODE="0666", GROUP="users" # RK3229 ATTRS{idVendor}=="2207", ATTRS{idProduct}=="320b", MODE="0666", GROUP="users" # RK3288 ATTRS{idVendor}=="2207", ATTRS{idProduct}=="320a", MODE="0666", GROUP="users" # RK3328 ATTRS{idVendor}=="2207", ATTRS{idProduct}=="320c", MODE="0666", GROUP="users" # RK3368 ATTRS{idVendor}=="2207", ATTRS{idProduct}=="330a", MODE="0666", GROUP="users" # RK3399 ATTRS{idVendor}=="2207", ATTRS{idProduct}=="330c", MODE="0666", GROUP="users" LABEL="end_rules"
重新加載 udev 規則:
sudo udevadm control --reload-rules sudo udevadm trigger
分區偏移量
GPT 分區
如果使用原始固件,那么系統很可能使用了 GPT 分區方案。每個分區的預定義偏移量和大小可以在 SDK 里的 build/partitions.sh 中找到。
分區映像的偏移量可以通過以下命令獲得(假設位于 Firefly Linux SDK 的目錄中):
(. build/partitions.sh ; set | grep _START | while read line; do start=${line%=*}; printf "%-10s 0x%08x " ${start%_START*} ${!start}; done )
會得到:
ATF 0x00006000 BOOT 0x00008000 LOADER1 0x00000040 LOADER2 0x00004000 RESERVED1 0x00001f80 RESERVED2 0x00002000 ROOTFS 0x00040000 SYSTEM 0x00000000
parameter
如果使用 RK 固件,那么系統是使用 parameter.txt 文件來定義分區方案,該文件的格式參見文檔《參數文件格式》 。
這里有一個 Linux 下的 Bash 腳本能列出 parameter.txt 中的分區偏移量:
#!/bin/sh PARAMETER_FILE="$1" [ -f "$PARAMETER_FILE" ] || { echo "Usage: $0 "; exit 1; } show_table() { echo "$1" echo "--------" printf "%-20s %-10s %s " "NAME" "OFFSET" "LENGTH" for PARTITION in `cat ${PARAMETER_FILE} | grep '^CMDLINE' | sed 's/ //g' | sed 's/.*:(0x.*[^)])).*/1/' | sed 's/,/ /g'`; do NAME=`echo ${PARTITION} | sed 's/(.*)((.*))/2/'` START=`echo ${PARTITION} | sed 's/.*@(.*)(.*)/1/'` LENGTH=`echo ${PARTITION} | sed 's/(.*)@.*/1/'` START=$((START + $2)) printf "%-20s 0x%08x %s " $NAME $START $LENGTH done } show_table "Rockusb Mode" 0 echo show_table "Maskrom Mode" 0x2000
將這個腳本保存為 /usr/local/bin/show_rk_parameter.sh ,然后添加腳本的執行權限。
下面是一個顯示 RK3328 Android SDK 中定義的分區偏移量的例子:
$ show_rk_parameter.sh device/rockchip/rk3328/parameter.txt Rockusb Mode -------- NAME OFFSET LENGTH uboot 0x00002000 0x00002000 trust 0x00004000 0x00004000 misc 0x00008000 0x00002000 baseparamer 0x0000a000 0x00000800 resource 0x0000a800 0x00007800 kernel 0x00012000 0x00010000 boot 0x00022000 0x00010000 recovery 0x00032000 0x00010000 backup 0x00042000 0x00020000 cache 0x00062000 0x00040000 metadata 0x000a2000 0x00008000 kpanic 0x000aa000 0x00002000 system 0x000ac000 0x00300000 userdata 0x003ac000 - Maskrom Mode -------- NAME OFFSET LENGTH uboot 0x00004000 0x00002000 trust 0x00006000 0x00004000 misc 0x0000a000 0x00002000 baseparamer 0x0000c000 0x00000800 resource 0x0000c800 0x00007800 kernel 0x00014000 0x00010000 boot 0x00024000 0x00010000 recovery 0x00034000 0x00010000 backup 0x00044000 0x00020000 cache 0x00064000 0x00040000 metadata 0x000a4000 0x00008000 kpanic 0x000ac000 0x00002000 system 0x000ae000 0x00300000 userdata 0x003ae000 -
-
嵌入式主板
+關注
關注
7文章
6086瀏覽量
35651 -
安卓
+關注
關注
5文章
2138瀏覽量
57670 -
可制造性設計
+關注
關注
10文章
2065瀏覽量
15726 -
Firefly
+關注
關注
2文章
538瀏覽量
7142 -
華秋DFM
+關注
關注
20文章
3494瀏覽量
4774 -
RK3328
+關注
關注
1文章
56瀏覽量
3064
發布評論請先 登錄
相關推薦
評論