2018年12月20日 星期四

USB DIY--自學計畫_USB新平台(五)--- Bootloader

有人常常跟我說: Chamber 你既然懂得這麼多非 3C 產業以外的事,那你應該要好好的

發揮你的專長啊。他們指的"專長"是比較偏技術以外的事,那些LDS (不懂?拉豬屎(台語)啦)

的事往往談到最後還是又扯到看產品、看市場或合作啦,資金啦等等。不是我不談,就看

怎麼談,我比起其他宅男工程師,我已經算是比較好溝通的啦,至少我們也曾經募資搞過

公司,也寫過BP (Business Plan,商業企畫書),提過 Proposal 等,深知那一套公司營運的

材鹽油米醬醋茶的事啊。現在各行各業的產品不好找,也不好做。這一點我們也知道,

但絕對不是完全沒希望,而要看您要用甚麼心態面對。

既然是以技術為基礎的產品開發,那也就不得不從一些技術掌握度的角度來看,說真的:

你說甚麼雲端啊、物聯網、互聯網或是甚麼人工智慧等等。這些大家都知道啊。

不要說這些這麼遙遠複雜的東西啦,就說一個簡單的USB Tooling 的事就好了啦。

你覺得這東西一開始要找多少人搞啊?一個搞硬體、一個搞韌體外加一個寫軟體或APP

的人。好,就算這三個人好了,就算都是有一點經驗或技術底子的,你說一個月不花個

六、七萬元薪水行嗎?外加勞健保(大約再乘個 1.2 倍)。光這幾個人,一個月要光人事費

就要燒掉約 22 萬元(以六萬元計)。不要多,只要先抓個 一年 12 個月,又以科技業喜歡

談一年十四個月保障薪資(其實就看年終或三節獎金是用甚麼方式處理的啦。)。

不多,剛好約 300 萬元/年。就光你們這三個。那就接下來還要算PC、儀器設備外加

辦公室及管銷費用。(注意喔~萬一你辦公室或是工作所需的軟體授權費等等),不要多啦~

就算你一年 500 萬元好了啦。這還要保證你在產品的軟體、硬體(PCB 、硬體零件採購等)

及韌體程式開發測試驗證工作上都一切順心如意的話。所以我說:經驗與技術底子真的要

夠雄厚才行。就連 Debug 功力真的也要夠強才行。否則,接下來只要超過一年,你不只要

再準備個 500 萬元而已。因為接下來就會再增加業務行銷的管銷費用(包括樣品試產、

文宣廣告與差旅住宿費等等)。此時你又不能把這三個人先晾一邊啊。薪水得再支付啊。

勞健保費用也得繼續繳啊... 所以啦。下回人家再罵無良老闆時,你自己有空也可以坐下來

好好的精算一下的。
----
好的~我們就回到主題:USB DIY--自學計畫_USB新平台(五)--- Bootloader

就這麼一個簡單的小玩意,你說:需要多少人或多少專長的人?首先:

你可能要先花錢或"想辦法"弄到一片開發平台:


然後我要跟你說的是:萬一你很不幸是拿到比較早期有庫存的開發板的話,

這開發板上面的 EMF8UB1 是B 版 IC的話,對不起,此篇文章就與你無關了。

因為在 C 版IC (datecode 1601 板之前) 在 IC 硬體上是不支援  USB Bootloader 的。

又是一家大公司不小心踩到的地雷。想必又是一帆風順的過程中不幸的鳥事。

(因為工程師們會兩手一攤:不是我的事,但你薪水還是得付,你又不能找IC 原廠付啊!)

如果不行的話:那你就得趕快找硬體工程師弄一片新實驗平台:



如果是三個人,你還得多弄幾片呢!

好的,接下來就是韌體工程師了。那拿原廠所提供的範例程式就好了啊!

原廠所提供的程式是: Bootloader 範例程式一個;一般 USB 應用程式一個,兩者的

程式風格與宣告方式迴然不同。就連USB 底層程式架構也不同。這下又要哭出來了。

首先簡單的看一下原廠所提供的 USB Bootloader 範例程式幾處令人頭痛之處:

(他們可能要證明:他們的 USB Bootloader 只要 1.5 KBytes 就可以了,但事實上,他們

精簡太多東西了。)


沒有支援  USB String Descriptor 的宣告,這一來至少就要加三組:iCompany、iProduct 及

iSerial 。而最討厭的就是 iSerial 。 因為這會牽涉到產品的序號問題。每一台USB產品都

必須是獨立的產品序號。所以這一部分韌體就得自行處理。

接下來就是:


原廠的USB 底層程式告訴你:他也不支援超過 Endpoint0  64 Bytes 的宣告處理方式。

"莊孝維喔?" 。不超過 64 Bytes 的宣告方式:那這能幹嘛?我們就看一個簡單的例子

好了: USB DIY--自學計畫_USB新平台(三) 

中的一個範例:


一不小心就是 855 Bytes 的宣告。那你要不要改寫這USB 底層程式? 你要花多少時間?

那另外兩個:軟體工程師或硬體工程師能幫你甚麼忙?哈~哈~?

而且只要一動到 USB 底層程式,就包你陷入韌體工程師最痛苦的深淵了。 Debug 永遠

就是你每天上班的夢靨。

好的"隨著時光飛逝",你很快地到了終於可以走出夢靨之時,就開始要跟軟體工程師進行

系統整合測試了。咦 ?這是甚麼東西啊?


以上這張圖是正確的。因為我們會透過USB 的一個 Vendor Command 請應用程式進入

Bootloader 執行狀態,已準備進行韌體更新程序。所以在USB 的通訊協定上會看到一個

因執行了 軟體 Reset 之後,USB 會出現自動重新插拔過程:所以在USB 的匯流排上會重新

執行 USB Enumeration 過程,所以我們就會看到 USB Address 會重新 Reset 成零值。

而接下來接手回覆 USB Enumeration 過程的就是 Bootloader 的 USB 底層韌體程式了。

 接下來就是令人頭痛之處了。


你有看出哪裡有問題嗎?我跟你說這個問題在PC 端的應用程式是看不到的,所以你不要

以為軟體工程師沒看到,你寫韌體就沒事了。這個韌體程式肯定是出問題了。

因為發生這個問題現象時,PC 應用程式端操作一切正常順利的。這簡直就是可怕的夢靨。

上圖的兩個紅色圈圈之處,以正常USB 命令流程來說:怎麼會突然又出現一個軟體上的

 Reset 狀態呢?我跟你說:你真的不要以為可以騙得了微軟 (Microsoft) 的底層驅動程式的。

肯定是你的USB 裝置回了一個跟你原本宣告不同的資料出來,作業系統一發現不對就出手

處理了。答案就是在作業系統出手軟體 Reset 你的USB 裝置之前。我們不小心回了一個

 意料之外的 Endpoint1 ,而且還是錯誤長度耶。完了~這下又是難抓的 Bug 。

幸好,我們平常待人不薄,而且也常燒香拜拜,很快就找到問題點了。

所以我就很順利地整理出一套結合 USB Bootloader 及USB 標準應用程式的系統出來了。



-----
====
這影片中我有稍微提示一下在不同的應用程式與 Bootloader 程式之間所顯示的LED 燈號

不同,以利我們可以觀察在這兩支應用程式之間的切換,當然也會造成USB Reset 重新

Enumeration 過程的。實際上,最後使用時,會進一步整合成無痛韌體升級方式的。

各位看官看到展示影片時,肯定不會像我一樣的激動,因為這個過程不是三個人搞定的

而是我一個人搞定的。那你說:我一個人該拿多少薪水才合理啊?所以下回你要跟你老闆

要求加薪時,記得就要像我這一篇文章所闡述的故事才行。否則,人家老闆還是無良的。

他平常也不一定待人和善或是也跟我們一樣偶而也會初一十五的到廟裡拜拜的。

(你不要笑,你沒看到人家台灣首富郭大老闆,在新北市也是拜關帝聖君,拜得很勤勞與

虔誠的。你自己哪來的何德何能不用拜拜,就可以一帆風順呢?哈~哈~  ^_^ !)

所以啦~這要告訴各位的是:我也知道雲端啊、物聯網、互聯網或是甚麼人工智慧等等

是未來趨勢啊。但這些產品開發過程中,只要一個小小環節出了問題,而且一不小心的

研發費用不小心的徒增很多的話,你的老闆可能會隨時變心的跟你們說:對不起,

這東西太燒錢了。我們會對不起股東。我們不要玩了。

華碩營運陷低潮 董事長施崇棠鞠躬致歉


---

---
所以呢? 再說一次:LDS 誰不會啊。真正痛苦的是誰啊?但是話又說回來:又有誰能真正的

掌握自己生存與生活之道呢?大家可以想一想的。




7 則留言:

  1. 回覆
    1. 謝謝你的留言。

      但不知道你所謂的好文章,是指哪一部分?

      刪除
  2. 10年前我會覺得很神奇,因為USB程序很複雜,還要弄開機升級,通信+軟體+硬體一個錯就沒了。
    用了ARM,出了DFU,它是USB firmware Upgrade通信類別,只要會操作做好了,完全不用管它是如何運作的。
    可是高興的日子不多,再來是手機時代,iOS沒有USB,只有安卓有,但手機不流行USB連接,它要無線操作。
    所以DFU在安卓上沒有人開發,開始轉成wifi/Bluetooth升級。
    這種升級法變成只有在8 bit MCU上才可以看到。公司要我做,我還是貼一顆low cost ARM with USB去升級吧! 反正老闆不知道升級IC是那一種MCU。
    這種用32位元MCU當成輔助元件去升級8位元MCU已經發生不只一次,見怪不怪。
    因為8位元MCU上的軟體已沒有人可以大改了,也只能用"外部硬體"去解決。

    回覆刪除
    回覆
    1. DFU 在國外的一些Tools 應用程式,我也用過,覺得不是那麼順手。

      或許這一種原因在安卓上面沒人開發(印象中DFU 一跑起來好像是隨身碟裝置,這一點會

      踩到一般OS 的底層,OS 一般都不太歡迎人家碰他們的底層)。反正別人喜歡就好。

      至於甚麼方式來搞系統程式的智能升級,各家有各家的一套,反正目的都是一樣的。

      只不過是,還是我一直強調的:老闆絕對是不會懂的。這些都是我們這些工程師的鳥事。

      那就更不用說:老闆(或主管)也不會懂搞這些事是需要多少人?大家習慣就好了。

      最後呢?就很簡單啊:花錢消災嘛!不是要付薪水,就是找外包啊。不管是DFU 或是甚麼方式。

      刪除
  3. 現在MCU又有新方法= Dual Boot,就是二塊Flash ROM可以互切換為Boot。所以更新時是先用另一半做下載,完成檢查後就可以換成Boot區。
    這種結構就不用boot loader了。就用浪費的二倍空間來做。反正ROM也很便宜。

    回覆刪除
  4. 前陣子設計了幾顆處理器,分別寫了了QPI flash,QPI SDRAM,TFT RGB 控制器,這幾天在寫USB device端的控制器,搜到你的文章滿有意思的,在沒有USB分析儀 和 示波器壞了情況下,已經完成了列舉程序,現在要搞vendor command,對於vendor command的流程只找到host->device資料流的,有沒有device->host的照片可分享?
    謝謝!

    回覆刪除
    回覆
    1. 那恭喜您了。那你打算用甚麼 Class 來搞 USB 韌體呢?

      如果是有 Vendor command 的話,選項就有那幾項而已。不過,這應該只是剛開始而已。

      因為如果要搞有 Vendor Command 的話,PC 端的軟體就很重要了,如果一開始沒有想好

      protocol 的話,可能就得邊寫邊定義與調整雙方的 Handshake 了。

      另外,我不知道你所說的 Device->Host 的照片,是指甚麼?因為PC 端比較簡單,

      不就是 Microsoft 就其他幾家。但 Device 端的晶片供應商一大堆,他們的USB

      控制架構,還是都有一些差異,所以一般來說:要講Host 的東西容易,

      講 Device 端的可能就不一定可以符合諸位大眾的需求了。

      刪除