2022年2月19日 星期六

USB_DIY :Cypress USB MCU (二) 驅動程式

上回寫完第一篇之後,好像隔很久都沒更新了。但心裡還是想把這件事給交代清楚。

要不然總覺得既然要把 USB DIY 的相關技術講得完整,總是缺乏點甚麼的。

之前一直講  Custom HID 或是 MSDC 這兩種,作業系統都會提供自動安裝驅動程式,

但有時候在USB 系統應用時,你也可能碰到都不屬於這一類非標準Class 的裝置時,

那該怎麼辦?譬如我們常會碰到的像 STM32 系統開發平台所使用的 st-link2 這個

開發工具:他就不是使用 Custom HID 這一類的驅動程式介面:

他就是一般 USB 裝置而已啊。像這一種定義的USB 裝置,你就得幫它安裝屬於它的

驅動程式,那到底用哪一種裝置定義比較好?見仁見智,就看你們自己的應用決定吧。

有人會覺得提供一個認證過的裝置驅動程式,看起來會比較專業,感覺比較穩定一點。

那你就得想辦法幫你的USB 裝置搞個屬於自己的驅動程式。但以前要寫驅動程式,

真的需要在作業系統端要有一定專業程度才行,至少也是要有一定的鑽研功夫才行。

也就是因為如此,所以像我們這一種搞系統韌體的人,大部分就比較沒興趣了。

太辛苦了啦。而我呢?還是老話一句:年紀大了,反正也搞了那麼多年,就沒差了。

所以就自己來試試吧。一開始下了許多工夫研究關於Windows 驅動程式相關技術與

開發平台的架設,但真的太複雜了,我們又不是領薪水搞這個的,這樣子值得嗎?

所以我們就還是請教一下專業人士吧:


你看:不用多久,人家就給你一個明確的方向:怎麼不用 WinUSB 呢?

但這種師父領進門,修行在自己的方式,你就得自己接下來自求多福了啦。

實際上要把 WinUSB 架起來也沒你想的那麼簡單容易啊。(這樣子你就知道原來那一種

自行開發驅動程式的方法,就有多複雜了,真的也沒多少人可以好好鑽研的...)

接下來就簡單地把這些相關作業流程給大家示範一下,當然或許我的方法不一定是全然

正確的做法,如果你有相關經驗或意見的,也不妨底下留言賜教,感謝你。

而在於USB 裝置端要準備的東西,就是在我第一篇文章中所準備的 Cypress 的平台,

而之所以可以建議大家用 Cypress 的USB 平台的好處,就是他的文件資料在搭配USB 

規格與韌體系統開發之間,都有很好的教材說明內容,像我最早一開始介紹USB DIY 的

USB 相關技術解說都是引用他們家的技術文件內容的。然後你看一下他們在MCU 的使用

參考手冊上也都會做這樣子圖文說明,真的既清楚又明白,很多MCU 在USB 韌體控制

方法與開發觀念都是如此的。



甚麼時候硬體是NAK ,MCU 的USB 中斷發生時間點?甚麼時候MCU 該控制USB 傳輸/接送

,都交代得一清二楚的。或許大家可以參考看看。32 bits MCU 像STM32 也是如此。
---
我們就回頭看WinUSB 驅動程式的安裝與使用問題,依照微軟官方的做法來看

好像真的很簡單似的,可以免用 INF 檔案就可以安裝,是這樣子沒錯的:

Step 1:


Step 2:

Step 3:
Step 4:

Step 5:


Step 6:會出現警告提示,不要理它,直接安裝:


Step 7 :看起來沒問題,安裝成功。



但問題來了:利用Regedit (按下Win+R執行) 查看一下裝置內容:


這個東西底下的Device Parameters 項目裡面沒有提供任何 DeviceInterfaceGUID ?


沒有 DeviceInterfaceGUID ?

對我們APP 軟體開發就沒有唯一的裝置存取入口了,搞屁喔?裝置安裝完沒用啊。

而這個 WinUSB 函數庫裡又沒有像 USB HID 中有提供一個標準函數:HidD_GetHidGuid

可以透過函數取得裝置的 DeviceInterfaceGUID 。那怎麼辦呢?在那微軟官方網頁教你說

你可以自行定義 INF ,然後就可以利用 GUID Generation 方法產生一組自己的

DeviceInterfaceGUID 啊。而且還可以製作裝置驅動程式的安裝程式包啊。

結果呢?在 Windows 10 之後,沒有數位簽章的驅動程式安裝包是沒辦法順利安裝的。

注意喔,你可以自行用 inf2cat 程式產生一組.cat 檔,但那是沒有官方認證的數位簽章。

沒用的,怎麼做?人家網路有教你流程。但簡單結論就是告訴你要花一筆錢來搞定。

我們自己DIY 的就不可能這樣子玩,如果是人家公司找我做:這筆費用肯定要算在裡面的。

但大家也不用擔心,網路世界裡甚麼也嘛都有解決方案的:就是使用 zadig 這個安裝應用

軟體。它可以幫你順利安裝 WinUSB 驅動程式,也可以幫你打包出一組含有數位簽章的

驅動程式安裝包的:


以下是一個簡單的操作流程說明:


我用的是最新版本:zadig 2.7 版,會自動幫你抓到你的USB 裝置。


它的安裝時間會久一點,這也沒辦法。(網路有人詬病這一點)


安裝成功,我們可以查一下裝置登錄裡有沒有 DeviceInterfaceGUID 了:


OK 。很好,有一個屬於我們USB 裝置的GUID 碼了。

我們在來比較前兩者安裝驅動程式版本:微軟提供的驅動程式:


而 zadig 安裝包所內涵的WinUSB 版本:


看來好像比較舊一點,那又怎樣?可以用就好,那怎麼知道可以用呢?

那就實際找一個應用軟體來試試看吧。在 Keil 的安裝程式庫裡有一個 Middleware 稱為 

WinUSB_Test 範例程式,你就可以拿來修改使用了。


我們把 WinUSB_Test 範例程式裡的 GUID 換成我們自己的 GUID 就可以抓到我們的USB 

裝置了。然後我們也簡單的送出一個 USB Chapter 9 的標準命令:Get Device Descriptor String

來試試看:我們也發現我們的裝置也順利回覆 04 03 09 04 (字串文字語言編碼)。

OK 成功。

所以這樣子就完全打通USB 非標準Class (Vendor defined Class) 裝置的驅動程式安裝與

Host 端上層 APP 軟體的應用介面了。

不過。最後還是要交代一下:WinUSB 其實還有許多使用上的限制,這些限制大家有興趣

的話,可以自行研讀了解。

而且如果是正常標準流程的話,還是要以公司資源來取得微軟公司標準的驅動程式安裝包

的數位簽章作法。

還是呼應我長久以來一直鼓吹的基本觀念:關起門來搞技術,都嘛很簡單,世上神人多

怎麼玩,總是有人可以用旁門走道的方法克服這些問題,但真正能拿上台面的東西或產品,

你還是得透過標準公司、組織資源來完善所有的產品上市的標準包裝流程的

如果你還年輕,除了在小團隊、公司裡學學扎實的技術底子,但有機會的話,還是得去

外面的世界或大公司裡看看人家怎麼用標準流程好好的完善搞定產品開發生產與銷售

服務流程的。這樣子,看事情或討論許多利弊缺失才有更客觀、更全面的方法與思維

模式。

PS :還是非常感謝仍在園區工作朋友提供關於 WinUSB  驅動程式的資訊,不過,

在後續的閒聊之間,也發現:他這幾年也慢慢轉向行動裝置平台的相關驅動程式或軟體

開發工作了。沒辦法,時勢所趨啊...幸好的是:我剛好夠老了,現在的工作,就算是需要

行動裝置平台的相關技術開發,我只要動動嘴巴就行,老闆也不會要求我得自己懂很多了。

套一句香港電影台詞:作莊有作莊的好處...

(拜託你就不要再加一句對手的回話:作莊未必的好事... 哈~哈)

下回見。


補註解: 我們在 stm32 系統開發平台上所使用的 st-link2 原廠驅動程式所使用的就是

WinUSB 。



沒有留言:

張貼留言