簡介
感謝來自Ameba社群成員Joe Hsieh的貢獻,在他的幫助下, Ameba Arduino家族中的RTL8722DM 和 BW16 開發板現已合併加入了自動燒錄的功能。在原始燒錄程式代碼的基礎上,Joe重新編寫了一套可以支援在三大平臺使用的自動燒錄代碼 “amebad_image_tool”(Windows/Linux/MacOS),避免了之前繁瑣的按鍵上傳的操作。
目前,這套Ameba自動燒錄工具已經在Windows 10 64位元作業系統、Linux作業系統以及macOS(Big Sur)分別使用BW16開發板和RTL8722DM EVB通過了測試並已經成功支援。
背景介紹
這裡先簡單介紹一下Joe是如何根據逆向工程弄清楚自動上傳工具的工作原理。首先,“SerialMon”(一個序列埠嗅探工具)被用來讀出圖像工具在上傳圖像時發生的通信。記錄的日誌可以保存為文本格式,以方便分析。修改圖像工具中的一些設置(如上傳速度、快閃記憶體位址)將導致通信以及日誌的改變。通過測試每個設置,記錄通信日誌,並與以前的日誌進行比較,就有可能弄清每個設置是如何對應於發送資料的變化的。然而,並不是所有的變化都可以通過比較日誌來解釋,因此 "IDA反彙編 “工具被用來把二進位檔案翻譯成”.c "代碼,以提取剩餘的缺失資訊。
問題說明
使用Ameba開發板時,如果想進入UART下載模式,需要在LOG_UART_TX(PA7)保持低電平的狀態下按下RESET(CHIP-EN) 按鈕拉低該腳位元後再鬆開。詳細步驟請參考下面流程圖中的流程:
通常情況下,使用者需要通按下EVB上的按鈕手動實現燒錄過程。然而,上述程式其實可以通過使用USB-UART適配器(如CH340G、CP2102、FT232)上的DTR和RTS引腳、2個BJT電晶體(如S8050)和2個10kOhm電阻所組成的外接電路來實現自動燒錄。
環境配置
步驟1. 設置開發環境
請根據你所使用的EVB/開發板,參考相應的入門文件。
- 對於使用BW16的用戶,請參考 Ameba ARDUINO: BW16/RTL8720DN 入門手冊中 "設置開發環境 "一節的詳細說明。
- 對於使用RTL8722DM的用戶,請參考 Ameba ARDUINO: RTL8722入門手冊中的 "設置開發環境 "一節,瞭解詳細說明。
- 對於使用RTL8722DM-MINI的用戶,目前RTL8722DM-MINI的支援功能還在測試階段,測試結束後的相關資訊會更新在這裡。
步驟2.對環境進行相應的補丁
由於這個工具完全取代了原廠使用的上傳工具 “amebad_image_tool.exe”(Windows/Linux/MacOS),所以需要對開發環境打一個補丁。
從GitHub下載 "ameba_bw16_autoflash "倉庫裡的所有檔。並根據當前你所使用的系統,替換掉下面路徑中的原廠 "amebad_image_tool"可執行檔:
-
Windows 系統
下載並替換下列檔路徑中的“upload_image_tool_windows.exe” 文件: C:\Users\xxxxxx\AppData\Local\Arduino15\packages\realtek\tools\ameba_d_tools\1.0.5 -
Linux 系統
下載並替換下列檔路徑中的“upload_image_tool_linux” 文件:
~/.arduino15/packages/realtek/tools/ameba_d_tools/1.0.5 -
MacOS (Big Sur) 系統
下載並替換下列檔路徑中的“upload_image_tool_macos” 文件:
~/Library/Arduino15/packages/realtek/tools/ameba_d_tools/1.0.5
Step 3. 硬體修改
在軟體環境設置完成後,需要在開發板上添加一些額外的硬體元件以實現自動燒錄的功能。
所需元件
- USB-TTL 串口適配模組(例如,CH340G,CP2102,FT232)
- 10KOhm 電阻 x2
- BJT電晶體x2 (例如,S8050)
- BW16 / RTL8722DM / RTL8722DM-MINI 開發板
電路連接圖 和 邏輯真值表
Figure 1 電路連接圖
Table 1 電路邏輯判斷真值表
運行原理
CH340是一個USB匯流排轉換晶片,它可以用來將USB轉換為UART序列介面。通常它被配備在沒有原生USB串口的微控制器上,用來提供一個串列USB連接。在串口模式下可以使用如下常見的MODEM聯絡信號:RTS(請求發送)、DTR(資料終端就緒)、DCD(資料載波檢測)、DSR(資料集就緒)和CTS(清除發送)[2]。
根據上述代碼,我們可以知道自動燒錄過程如下:
- 當上傳過程開始後,程式寫入DTR=1,RTS=0,根據真值表判斷,此時RST=0,晶片進入重定模式
- 延時500ms後,程式寫入DTR=0,RTS=1,此時LOG_UART_TX(PA7)=0,模組準備進入下載模式
- 延時200ms後,DTR=1,RTS=1,此時RST和LOG_UART_TX引腳均被拉高,此時晶片在下載模式中被重新開機
- 使用USB-UART序列埠傳輸所需的image
- 傳輸完成後DTR=1,RTS=0,此時RST=0,晶片自動進入重定模式
- 延時500ms後,DTR=1,RTS=1,釋放RST引腳,允許晶片在正常模式下重新開機