[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提示:
追蹤了一下編譯及燒錄的訊息,發現幾個部分
- 被選擇起來的兩行,可以看到在之前的前半段都是透過arm相關compiler去做編譯連結,直到最後兩行才是分別從elf檔內轉換成binary跟hex檔
- 燒錄完後,不知道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
很抱歉,必須登入網站才能發佈留言。