[Arduino]_使用Bossa (類似Avrdude)來對SAMD系列的Chip直接燒錄

[這篇是hack note流水帳,文內一些路徑跟編號請自行對應自己的狀況,以及省略了一些基本的步驟跟安裝工具]

手邊有個案子,有個需求是想要把已經編譯好的Arduino code直接燒錄Bin到SAMD晶片的Arduino。

所以出現了這一晚的快速研究XD…順手就直接紀錄一下整個從頭到尾的過程。

這邊示範的是自製版的Arduino Zero 如此文封面圖 (Arduino Due也是SAMD系列)

用的是ATSAMD21G18,為一顆32位元的ARM Cortex-M0

有別於以往大家會用的AVR系列,這顆ARM就必須要有不同的編譯器跟燒錄器。

因為先前這塊不是我負責,但這個燒錄的功能我還是要找方法做到,我很熟悉AvrDude,但對於SAMD架構就一竅不通啦…

且已經好一陣子沒碰Arduino…感到略為生疏

先找了一下關鍵字 Arduino Zero avrdude,很快地得知有個燒錄器名為BOSSA,效果等同AvrDude。

https://github.com/shumatech/BOSSA

在Github上有BOSSA的專案,且已經有Pre-Compile好For Windows的版本(撰文此時版本為1.8,但1.9源碼以出)。

不過下載下來發現只要選到Arduino Zero的COMPort就會當掉…

以為是這個Programmer有問題…,轉而研究了一下Arduino command line的用法,但一直沒有試出來燒錄方式…

且都知道BOSSA有能力直接燒錄了,何必還要在現有程式bundle一套Arduino IDE?…

轉往研究了一下Arduino IDE,打開IDE的設定畫面,調整編譯以及燒錄的Verbose提示:

追蹤了一下編譯及燒錄的訊息,發現幾個部分

  1. 被選擇起來的兩行,可以看到在之前的前半段都是透過arm相關compiler去做編譯連結,直到最後兩行才是分別從elf檔內轉換成binary跟hex檔
  2. 燒錄完後,不知道Arduino IDE做了什麼魔法,強制地把Arduino Zero關閉原有的Com3(紅色箭頭),卻在燒錄時換成COM4呼叫bossac燒錄(黃色箭頭)

估計是Arduino的Bootloader有一些隱藏的中斷位置或者API吧?,但大略找了一下網路資料,關於Arduino的Bootloader相關的文件意外的少?…

不管了,起碼我們已經找到透過Arduino編譯好的Bin,且直接拿這這個Bin就包含了Arduino的Bootloader以及其上的程式…

差一個環節就是到底要怎麼單獨透過bossac燒錄製個Bin?

百思不得起解為何總不能讓bossac正確燒錄…(總卡在Set binary mode這個回傳log…)

跟友人懊惱之餘,各種奇怪的嘗試都用上了

思考了一下以前遠古的Arduino記憶,Arduino bootloader肯定是燒進去的,原先SAMD內的ARM bootloader肯定還是存在著。

開機的順序應為SAMD bootloader(in rom)->Arduino bootloader(in flash)

所以最後我還是認為癥結點在於Arduino IDE把COM3轉成COM4這個動作相當不尋常…

靈機一動看了一下裝置管理員:

顯示所有隱藏裝置後,赫然發現…原來COM4就是Arduino Zero bootloader啊!…(但其實真正的名稱應該是SAMD bootloader才對…)

這下有趣了,到底怎麼進去那個bootloader,板子上只有一個reset…,於是憑藉著多年reset數百台裝置的經驗(?),開始各種長按、短按、間隔按的組合…

讓我試出來,短按一下reset隨即再長按住三秒以上後放開,則會跳出SAMD bootloader啦!

(後來有找到一個國外網站提及這件事:http://mdac.com.au/2018/01/14/programming-the-arduino-due-with-bossa/ )

這時bossac便能正確燒錄!,但其實燒錄之後遇到不能自動跳回Arduino bootloader(In flash),且重新上電依然還是在SAMD bootloader(怪的是Arduino bootloader跟上面的程式似乎有執行起來…)

但為避免狀況還是試了一下,讓它燒錄完之後能跳回Arduino bootloader(In flash)。

於是…最終順利操作的參數是:

bossac.exe -i -d --port=COM4 -e -w -v -b "Blink.ino.bin" -R

重點在於-b,這樣才會在燒錄後配著-R重起跳回Arduino bootloader(也就是回去COM3啦…)

比較有趣的是bossac相當聰明,如果不指定COMPort,bossac會自行尋找合適連線的COMPort做燒錄

bossac.exe -e -w -v -b "Blink.ino.bin" -R

這裡附上一下bossac自己的–help做參考~

順便提一下,從github抓下來的bossac在windows 10執行可能會大跑版…

例如這副德性:

但其實他的完全體是這幅德行:

其實這支GUI也只是對應bossac.exe這支compiler,下面的Write Options其實就是上面的的參數,主要燒錄就把Erase all跟Boot to flash勾起來就可以燒Arduino編譯好的Bin並且執行了。

但要怎麼把它恢復這個德行呢…,又亂try了幾分鐘,發現對bossa的gui執行檔右鍵內容透過相容性tab下的”Override high DPI scaling behavior.”調成System即可…

大概是這樣,大概花了3個小時的時間從無到有搞定這個需求,接下來只要在主要的Windows程式中透過Process calling的方式叫bossac.exe起來燒錄就可以~

最後感謝方智顯大大今日蒞臨陋宅加持,在這種Hacking過程,他幫助我順了幾次思路,讓我一直沒有偏離正確的思考道路太遠,最終成功快速地抵達了目的地XDD

Leave a comment

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料