2014年10月2日 星期四

在 ubuntu 14.04 上開發 Mediatek LinkIt ONE 應用 (純文字無 Arduino)

最近搞新玩具搞到焦頭爛額, 換個輕鬆的(?)玩一下
這是今年 Computex 時就展出的聯發科 LinkIt ONE  穿戴銷魂方案XD

裡面裝了 MCU + GSM + GPRS + WIFI + BT + GPS + MicroSD + Audio
一堆, 只收 79 鎂含運, 十分給力, 所以就買來研究研究

全部的樣子:

板子, 三支天線, 一顆鋰電池

背後的樣子:

原本有加殼不過很容易拆下, 沒有焊死
主要零件細拍:


有些網站新聞說這是 open source 的開發平台
但實際上是 Arduino 部份的介面函數 open source, 他們家官方則是完全沒提 "open source"
仔細攤開看就可發現裡面的源碼只是個殼, 實作全部轉接到 libmtk.a 這包 binary
且 libmtk.a 也只是內部 RTOS 的界面, 驅動和硬體操作實作則是在 RTOS 韌體上
這是標準保護公司資產的策略, 想了解其細部原理的用戶可以放棄了XD
而我搞系統的只要能用就好, 我是不介意這樣

在這篇文章寫的當下只有 Windows 平台支援, OSX, Linux 則是 "計畫中"
但這不會阻止我們嘗試去裝到 Linux 上XD
雖然這篇文是要在 Linux 上開發, 但我先說清楚, 我只用純文字模式, 沒有 Arduino IDE
我雖然做了許多和 Arduino 相同 MCU 的板子, 但從來不用 Arduino IDE 開發
因為那軟體的定位是給入門者使用的, 它有許多優點, 像是簡單明瞭的 API
用戶不用知道這隻 GPIO 是對到 MCU 上哪個 port, 只要知道編號就好了
然而代價就是加入許多冗餘的程式就為了做編號轉換, 這我不能接受
我選的8-bit MCU 程式空間就已經在少了還浪費到那種地方
初學者使用我沒意見, 但是到本實驗室這裡就是不准!XD
如果你期望在 ubuntu 上用 Arduino 開發 LinkIt
請到聯發科論壇去吵要一包 Linux SDK, 這我幫不上忙XD

這裡記下改造過程, 先下載軟體, 需下載 SDK 以及 Arduino
SDK 當前我下載的是 Linkit_SDK_for_Arduino_1_0_38.zip
Arduino 下載 Linux 版, 以我目前用的是 arduino-1.5.7-linux64.tgz
下載 Linux 版 Arduino 只是為了裡面的 toolchain

接著到 Windows 上安裝 SDK 安裝程式, 安裝程式會要求 Arduino 安裝路徑
他們的 SDK 安裝檔沒法被 wine 識別為可執行檔, 所以只能在 Windows 上完成安裝
這不需要另外安裝 Windows 版 Arduino, 只要開個目錄然後丟個空白檔
檔名取名為 arduino.exe 然後 SDK 安裝時把目錄指到此即可騙它安裝
我當時是有連目錄一起創建, 創了一堆空目錄在假的 arduino.exe 的同一目錄中
像是 drivers, examples, hardware, java, lib, libraries, reference, tools 等
讓這目錄看起來更像有裝過 Arduino, 不過我想應該不用, 若 SDK 不給裝再把這些目錄補上唄
SDK 安裝完成後刪除假的 arduino.exe 然後剩下檔案複製到 ubuntu

然後先不要離開 Windows, 還有一件事情要做
如果是新買來的 LinkIt 一定要更新韌體不然沒法開發, 先插上 LinkIt
執行 SDK/drivers/mtk/InstallDriver.exe 這隻程式安裝驅動
安裝後執行 SDK/hardware/tools/mtk/FirmwareUpdater.exe 然後依指示操作
等它完成就可以切到 ubuntu 了
到 ubuntu 後先安裝 wine

sudo apt-get install wine

用這 Windows 轉換器的目的是為了執行裡面的打包以及上傳工具
那個只有 Windows 版, 只能這樣搞
LinkIt 插到 PC 上後 ubuntu 會看到兩個 ttyUSB 節點
可以到 udev 下增加 rule 讓它每次接上都自動改權限省的每次都要 root
創建這個檔:
sudo gedit /etc/udev/rules.d/50-ttyusb.rules

然後填入:
KERNEL=="ttyUSB[0-9]*",NAME="tts/USB%n",SYMLINK+="%k",GROUP="uucp",MODE="0666"

完成後重新啟動 udev 再接上 LinkIt 就可以看到兩個權限為 666 的 ttyUSB
接著到自己家目錄下創建 wine 需要的 COM 節點

ln -s /dev/ttyUSB0 ~/.wine/dosdevices/com0
ln -s /dev/ttyUSB1 ~/.wine/dosdevices/com1
...

如果 PC 上有接其他的 usb serial 就多創幾個
這檔案的用意是讓 wine 啟動的 Windows 程式可以看到 COM port
創建時檔案為小寫 (com0, com1), 但 Windows 程式選擇時要用大寫 (COM0, COM1)
完成後可以先找別家的 usb serial 接上去, 然後下載 putty 這隻 Windows 程式
丟到 ~/.wine/drive_c 下然後執行:

wine C:\putty.exe

先用它去看看 com port 是否能用, 如果不能, 就先想辦法解決, 這我幫不上忙XD
這一定要確定能用才可繼續, 不然 build 出來的 LinkIt 應用就沒法燒錄
當然, 你也可以透過網路丟到另一台 Windows 主機去燒 (那不如用 Windows 吧XD)

最後是 toolchain, 把 arduino-1.5.7-linux64.tgz 裡面的 gcc-arm-none-eabi-4.8.3-2014q1 目錄解出
只要這目錄就夠了, 剩下都不需要, 然後把路徑加到 PATH 中

export PATH=$PATH:/path/to/your/gcc-arm-none-eabi-4.8.3-2014q1/bin

若懶得每次都打就把上面那行複製到 ~/.bashrc
接著創一個目錄開發 LinkIt 用, 假設是在 /opt/LinkItProj
把在 Windows 上安裝完複製出來的那包丟進去
例:/opt/LinkItProj/Linkit_SDK_for_Arduino_1_0_38
然後下載我自製的 makefile

linkit-led-test.zip


一樣丟到 /opt/LinkItProj/ 下, 此時 /opt/LinkItProj 裡應該要有兩目錄:
led-test 和 Linkit_SDK_for_Arduino_1_0_38
Linkit_SDK_for_Arduino_1_0_38 目錄下有 drivers 和 hardware 兩目錄
這是 Arduino 相關 SDK 的安裝目錄, 若目錄名稱有變更請自行修改 makefile
同時記得設定 makefile 裡的 Windows COM port, 只要確定 COM 是通的
設 COM0 不行就換設 COM1, 試一試就知了XD 就我測試結果通常是數字較大的那個 (COM1)
然後到 /opt/LinkItProj/led-test 下 make

make # 編譯並建立韌體
make program # 寫入 LinkIt

寫入時可以預期會印出一堆 wine 來的訊息, 不用理它, 反正最後寫得上去
寫入後 LinkIt 會 reboot, 由於 LinkIt 對 PC 的 USB 連接也是 SoC 上的一部分
所以它 reboot 時連線會斷開, 也就是 ttyUSB 兩節點會消失, 然後開機後再出現
如果有透過它的 usb serial 通信的話連線會中斷, 這是需要注意的地方

MTK 提供的 libmtk 其實已經是一個高度包裝過的 API
它已經把許多功能簡化, 同時包含大量的註解在裡面
如果對於相關技術有一定程度的熟悉, 其實看一看就知道它怎麼用
就算看不太懂, 可以參考 Arduino API 那裡的連接層, 那裡透露了許多訊息
可以說是另一種形式的範例碼, 一樣可以直接照做
直接用和透過 Arduino 差就差在冗餘的轉接碼
光 GPIO 就多一個 table 來對應 Arduino 的 pin 和 SoC 自己的 pin
官版 Arduino GPIO 開關範例編出來是 36K, 而我的是 26K
目前實驗加上 usb uart 也才 31K, 多 10K 在 PC 上沒什麼, 但在 MCU 上
10K 夠我寫個鏡頭控制器了!XD 8-bit MCU 大多就配 8K 的程式空間
要我把這 10K 拿去只用在轉換當然很不能接受

這平台是 RTOS 為基礎的, RTOS 在教科書上是高速反應
但是這平台的用戶程式並不能高速反應, 官方設計文件有提
因為那些高速反應的程式碼區被拿去處理系統服務, 相信是各種無線通訊
所以用戶程式只能撿剩下, 也就是排程過的
如果你看它掛在 Arduino IDE 下就真的把它拿去用作純 GPIO 應用
我只能說 You're doing it wrong ! (翻譯:手機不能這樣握XD)
從源碼註解可以看到這是 2005 年的手機方案
拿以前手機方案就只拿去拉 GPIO 很明顯是暴殄天物XD
所以千萬別這樣做, 一定要用上通訊才有價值, 不然去用 AVR, 8051 就是了

沒有留言:

張貼留言