Linkit SDK
, MT7687
, Toolchain
, Internet echo server
, arm
, Cortex-M4
, MCU
為了量測移動、轉動物體的相關數值,如果還要從待測物連接通訊線到外界設備,是件不切實際的事。因此使用無線通訊,將量測數值傳回就是不可或缺的技術。
在尋找合適的晶片/開發板過程中,有找到例如 ESP32/8266 等相關資源。但考量到它是中國晶片,便不選擇它。剛好之前運氣好,抽到一張 Linkit 7697 的開發板,搭載的晶片是臺灣在地公司聯發科 MediaTek 的 MT7697 控制器,是屬 Cortex-M4 MCU。寫個 Echo server 放到 Linkit 7697 上,來做網路通訊 PoC 好像不錯。
工欲善其事,必先利其器!
相較於其他晶片商,MediaTek 的商業模式是較封閉的。不像許多晶片商,可以在公開的網路找到免費且詳細的技術資訊。如果要詳細資訊/支援,就必須要有商業往來(錢)。所以如果要在 Linkit 上開發一些應用,無法從零開始,必須使用 MediaTek 打包好的 Linkit SDK 環境,再往上發展。也可以從官網上看到,Linkit SDK 是採用 FreeRTOS 當作 kernel。
可以從官網下載 https://docs.labs.mediatek.com/resource/mt7687-mt7697/en/downloads
SDK for Public Users -> SDK for GCC/IAR (因為我是在 Archlinux 上用 GCC)
又因為我的電腦作業系統是 Archlinux 64 bits
但 linkit sdk v4.6.1 裡附的編譯器是 32 bits 程式,無法在我的電腦上直接執行。
曾經有人說過:「這年頭有誰的電腦是 32 bits!?」無奈 … 所以我在社群上有反應這問題,希望 MediaTek 可以盡快更新 SDK。而目前暫時的解決方法,就是先額外裝支援 32 bits 的 libc library pacman -S lib32-glibc
。
Linkit SDK 有 MT76x7 FlashTool,用來把編譯好的程式是載入 Linkit 7697。但根據 LinkIt 7697 不用能使用官方的 MT76X7 FLASH TOOL的問題和想用單純指令/不用 GUI 的需求,所以我改用文章中提到的 mt76x7-uploader。mt76x7-uploader 的 README.md 有詳述其運作機制。尷尬的是,它是用 Python 2.7 寫出來的程式(截至2020/05/23,其 master branch 仍是 Python 2.7),但 Python 2.7 已在 2020/1/1 EOL。為了確保之後可以持續有工具可以用,只好自己想辦法改程式,把 mt76x7-uploader 轉到 Python 3。
在 trace code 之後,發現:
從上述的追蹤/分析結果,需要從 Python 2 porting 到 Python 3 的部份只有 upload.py 和說明文件(Windows 不在我的考量範圍)。所以我發了個 pull request (PR),且該 PR 已被 merge 到 mt76x7-uploader 的 python-3 branch。
終於,準備好 toolchain 包含 Linkit SDK 和 flash tool,接下來可以做一些簡單的測試。
為方便說明,我分別將下載的 Linkit SDK 接壓縮放到家目錄下;同樣的,mt76x7-uploader 也放到家目錄下。
在 Linkit SDK v4.6.1 裡,有個 uart_loopback_data_dma 的範例,其實就是個 serial echo application,適合當做 Hello World 起手式。
他的路徑在project/linkit7697_hdk/hal_examples/uart_loopback_data_dma
,進到該資料夾,看一下有什麼。
src
inc
GCC
於是進到 GCC
資料夾,編譯範例程式:
編譯出來的 binary file 是 uart_loopback_data_dma.bin
,在 build
資料夾下。
Linkit 7697 接上電腦後,它在我的系統上會註冊一個 serial port /dev/ttyUSB0
。將 binary file 載入 Linkit 7697:
接下來可以用 serial terminal 透過 /dev/ttyUSB0
,Baud Rate 是 115200 和 Linkit 7697 通訊。因為我習慣使用 picocom
,所以我就用 picocom
:
按下 Linkit 7697 上的 RST 鍵。它會重開機,接著會透過 /dev/ttyUSB0
print 出字串:"Please input data to this UART port and watch it's output:",我輸入 "Hello World!!!",Linkit 7697 也真的 echo print 出 "Hello World!!!" => Serial Echo Application 測試成功!
在 Linkit 7697 上成功測試 Serial Echo Application 後,可以進一步測試 TCP 通訊。
剛好可以修改既有的範例程式 lwip_socket project/linkit7697_hdk/apps/lwip_socket
。
為了簡化、專注在 TCP echo server 的部份,我修改了 lwip_socket 範例,修改內容如:https://gist.github.com/starnight/9cd376bcd8895127ec3ee6217fcc7d3c#file-lwip-socket-diff
所以可以直接 patch
該 diff 快速修改:
src/main.c
設定 WIFI SSID、密碼src/main.c
設定 Server 想要 listen 的 port,範例程式是 port 6500編譯出來的 binary file 是 lwip_socket.bin
,在 build
資料夾下。
一樣使用 picocom
透過 serial console 看 Linkit 7697 執行時的資訊。按下 Linkit 7697 上的 RST 鍵。它會重開機:
可以看到:
開啟另一個 terminal,使用 telnet
當作 client,連到 TCP echo server,並傳送一些字串:
從 TCP echo server 也可以看到和上述相同的紀錄。=> Internet Echo Server Application 測試成功!