Dfu-util 安裝與使用說明

什麼是DFU?

MapleBoard範例程式中,使用make dfu上傳編譯後的韌體畫面

前情提要:

Mapleboard RISC-V工具鏈建置與使用

MapleBoard RISC-V 工具鏈範例使用教學

DFU是設備韌體升級(Device Firmware Upgrade )的簡稱,是USB(Unuversal Serial Bus)通訊協定下的其中一個協定,這個協定讓所有USB設備都可以透過與USB規範相容的主機進行設備韌體更新,不管是手機,遊戲機,或者我們的GD32 RISC-V Nano/Pico,只要處理器有支援DFU模式,就能夠透過簡易的Type-C或者Micro USB接口燒錄或更新韌體。

在Linux系統下,常見的DFU燒錄工具有dfu-utilfwupd等,我們使用dfu-util作為GD32 RISC-V Nano/Pico的燒錄工具。

dfu-util官方網站:http://dfu-util.sourceforge.net/

dfu-util 原始碼:https://sourceforge.net/p/dfu-util/dfu-util/ci/master/tree/

下載dfu-util韌體上傳工具

一般來說,Linux系統會內建dfu-util, 但是不一定會是最新版本。在終端機視窗中輸入:

$ dfu-util -v

可以確認dfu-util版本。

最新版本的dfu-util Copyright會是2010-2020 而不是2010-2016。

在dfu-util的原始碼中我們可以看到,最後一次更新時間是在2020年06月30號,開發者將GD32V系列晶片加入到軟體的udev清單中。因此在這個日期之前安裝的dfu-util都是無法上傳程式碼到GD32V的,除非有自己更改過udev檔案,但這部份比較複雜,有興趣了解的朋友可以參考udev Wiki 。

我們把經過測試的dfu-util放在Github備份起來,使用者可以前往下載:

https://github.com/MapleBoard/dfu-util-ver-20200730

安裝dfu-util

dfu-util 建置過程

在終端視窗中輸入:

git clone https://github.com/MapleBoard/dfu-util-ver-20200730

將原始碼下載下來後,將終端視窗工作目錄移動到”dfu-util-ver-20200730″下。
依序輸入:

$ ./autogen.sh
$ ./configure
$ make
$ sudo make install

此時畫面會跑一段時間,完成後輸入

$  dfu-util -v

確認dfu-util的版本是不是如左上圖所示。

 

*若出現如下錯誤:

checking for libusb-1.0 >= 1.0.0… no

configure: error: *** Required libusb-1.0 >= 1.0.0 not installed ***

make: *** [Makefile:329: config.status] Error 1

不一定代表電腦沒有安裝libusb1.0-0,筆者到的狀況是需要安裝開發者版本

輸入以下指令:

$ sudo apt-install libusb-1.0-0-dev

接著重新執行make指令即可。

進入DFU模式

GD32 RISC-V Nano/Pico進入DFU模式的方式很簡單。

首先,先透過USB Type-C連接線將開發板與電腦連接起來。

接下來,先按住開發板上的BOOT按鍵不放,與此同時,按下RST鍵並放開,最後放開BOOT鍵。

這時候GD32VF103CBT6會進入DFU模式等待主機端將欲更新的韌體上傳到晶片中,因此所有開發板的動作都會停止,如LED不再閃爍,LCD也不會動作。

這時候我們就可使以用dfu-util上傳機器碼到開發板上。

使用dfu-util

*雖然dfu-util會顯示”Error during download get_status”但是並不影響我們開發GD32 RISC-V Nano/Pico,詳細的資訊可以參考:https://sourceforge.net/p/dfu-util/tickets/85/

內文中提到GD32V系列MCU使用的記憶體分頁描述與常見的描述不一樣,bug就產生在這裡。

Mapleboard工具鏈範例建置好的.bin韌體程式碼上傳到GD32 RISC-V Nano/Pico只需要一個指令:

$ dfu-util -d 28e9:0189 -a 0 --dfuse-address 0x08000000:leave -D ~/Mpb-toolchain-Example/src/build/gd32vf103.bin 

若出現錯誤,請在dfu-util前加上sudo使用超級使用者執行。

$ sudo dfu-util -d 28e9:0189 -a 0 --dfuse-address 0x08000000:leave -D ~/Mpb-toolchain-Example/src/build/gd32vf103.bin 
 

其中,

-d 參數代表上傳韌體到特定裝置(device) GD32V的裝置代號是28e9:0189

-a 參數代表使用內部記憶體

–dfuse-address 參數代表欲燒錄的記憶體起始位置,可以參考GD32VF103CBT6 Datasheet

-D 參數則代表Download,站在開發板的角度我們要將新韌體”下載”到開發板上,後面接的是要上傳的韌體檔案位置。

因此上面的指令就是把位於Mpb-toolchain-Example/src/build/的gd32vf103.bin程式碼上傳到裝置名稱為28e9:0189裝置上,

且記憶體編號為0,起始位址為0800 0000,燒錄完成後離開dfu模式(:leave參數)

上傳完成後可以看到開發板上的三色LED燈開始閃爍,大功告成!!

完成範例程式的開發與燒錄後,下一步就可以前往更進階的應用: 除錯。

在專案開發過程中,程式常常會做出意想不到的動作,這時就需要有仿真器來模擬MCU動作,並且透過單步執行來檢視程式執行的狀況,詳情請見:

MapleBoard GDB 使用教學