置頂文章

想學某項MCU 撰寫技術或系統平台開發不難,只要有錢有閒(時間)就可以! 十年二十年給你無後顧之憂的專注研究,包你不成仙,至少也可成精! 要找技術解決方法或相關程式碼,這裡可能沒有,網路上到處都有。 但如果你研究討論系統技術開發與如何結合後續資源、商業模式操作可能性時, 歡迎留言討論!!這才是能改變你工程師人生的契機。

2011年9月25日 星期日

USB HID 技術散記(二)

上回有提到關於USBHID 的應用的一些問題,我想一般人會使用 HID Class 也不一定

是拿來作所謂的真正的Human Interface Device,可能只是想利用這一個標準的介面

來作一些屬於自己系統應用的介面。只是如此可以省去PC 端驅動程式維護的問題。

當然早期由於PC 端的USB驅動程式的確都會有許多不為人知的問題,所以,

大家都容易望而卻步,但USB 發展至今,其實他的相關系統應用都已經算很成熟了,

所以,我相信這些過去令人卻步的東西,應該會越來越少。不過,一般人可能還是

希望簡單一點的用類似HID 這一種標準的驅動程式就好了...

我上回也有稍微說明了關於HID 的PC 端應用軟體問題,其實,在配合這一種HID 的

系統應用,還是會有其他問題。

我上回有提過說:當HID Device 插入PC 端時,因為您是採用作業系統標準的驅動程式,

所以,當完成USB Enumeration 之後,根本不需要等相關的應用程式啟動,作業系統

就會利用HID 標準的介面一直針對您USB Device 端的所提供的 Interrupt In token 訊息,

會一直在固定的時間對您的USB Device 要資料了....這跟任何上層應用程式無關。

好了...一般來說:HID Device 一般來說,可能只有一組Interrupt In Token...譬如:

像一般鍵盤,大概就只有鍵盤上任何按鍵的訊息資料透過這個Interrupt In Token 傳給

PC 端。但如果:在您自己本身的應用中,萬一有可能會提供兩組或兩組以上的訊息資料時,

那又是如何情形?因為HID Class 的規格跟您說:只要有不同的Report ID 您是可以共用

同一組Interrupt In Token 的...所以譬如您在您的系統應用上,基本上您還是只有一組

Interrupt In Token (Endpoint),但有可能他會拿來傳基本的Polling 鍵盤訊息外;

您可能也會拿來傳輸一些需要即時回報的量測數據訊息...那該如何處理呢?!

其實這一個問題的重點就是:會不會掉資料?!因為您是共用一組Endpoint,所以有

可能會造成資料衝突,造成資料遺失。...當然,如果您採用的USB 單晶片微控器在

這一部份的處理能力有好的話,您可能根本沒有發現這個問題,卻又一直找不到資料

遺失的原因?...這樣子就可能會造成您USB 裝置系統應用上的問題了。

我現在就舉一個簡單的例子來看:

上圖就是我利用同一個Interrupt In Token (Endpoint)來傳兩組不同Report ID 的

資料...理論來講,這兩筆資料應該是交錯的一直回報給PC 端的作業系統...

作業系統會固定的來抓取資料,至於您自己本身的應用程式要不要從作業系統的

驅動程式裡讀取資料?!那是您上層應用程式軟體的問題,跟作業系統驅動程式無關。

(這一點我上回也有提過了...反正您要便宜行事,採用人家的驅動程式,

就得遵照人家的規範!)

結果我們發現:還真的會掉資料(傳輸的資料遺失,少了一筆Report ID =0x02)...

而且好像又不是很規律的資料遺失,這一種問題是最討厭的。很難Debug...

我之所以會發現是因為我有USB 分析儀,如果您本身沒有,但因為您又採用作業系統的

驅動程式,所以,您根本無法從哪裡去切入找問題點。(這時就算您跑您的上層

應用程式軟體也沒用...因為這個問題是在USB 匯流排上根本就已經掉資料了!)

我們就很清楚的第一步要釐清問題出在哪?! 因為Interrupt In Token 是PC 端來

USB 裝置要資料而沒有資料,所以,這很清楚問題的是出在我們USB 裝置上的韌體。

----

我之前在一些USB DIY 文章中有提過:據我所知一般USB 單晶片微控器對於處理

USB 傳輸介面的資料處理與USB 匯流排事件幾乎都是採用外部中斷向量方式處理。

至少我用過的USB 單晶片都是如此...所以,一般這些USB 單晶片原廠提供的範例

程式也會有類似的程式範例,但是終究每一個人的使用環境與應用條件不同,這一部份

應用程式一定勢必要改寫的,但如果您對USB 的通訊匯流排事件與您本身系統應用

之間系統處理不清楚,就有可能發生如此類似的現象,很簡單的一個例子:就是

大家都很喜歡直接在USB 的範例程式的副程式裡加入自己的應用副程式,結果:

其實,您已經在不知不覺中,在一個既有的中斷程式裡去發展一個大型副程式,

甚至引發另一個中斷程式...這就犯了寫單晶片韌體程式的大忌,不只攪亂了Stack ,

也有可能引發暫存器的衝突與資料錯亂....結果就沒有一定的規律或錯誤現象了。

所以,只要您對於USB 匯流排上的資料傳輸特性與USB 單晶片微控器本身的功能

掌握清楚的話,其實就很容易的解決這一個問題的!

上圖就是我們稍微調整一下整個韌體程式流程的安排,再作一樣的動作。

我們就發現整個問題就不見了,而整USB 匯流排上的資料排列就非常整齊的

依序傳輸...也就不會發生之前類似的傳輸資料遺失的問題。

------------------

之所以會提到這一篇文章士因為有許多人都誤認為只要我採用標準的USB HID 介面,

因為所有問題都迎刃而解了,好像都很簡單。...其實,不管您是用別人的驅動程式或是

自己本身採用專用的驅動程式,道理都是一樣的:就是本身對於USB 的規格與系統應用

發展之間的系統架構一定要有很清楚的系統觀念。我提過:寫程式不難,而是如何Debug

是更難,因為這就是在考驗您本身對於系統發展的功力...

----

我自己都有發現我自己所建立的技術網頁,每逢每年的九月的人數累積都會有很明顯的

增加現象。我想這有可能是學校開學,或是畢業生進入職場的高峰期...可能是學校研究

功課或您在職場上也碰到必須學習USB 時,就不得不在網路上搜尋相關訊息吧。

當然也很高興大家都可以找到這裡來,我也當然很樂意或很榮幸的可以提供這樣的

技術討論或參考價值內容給各位參考,以縮短大家對於USB 系統的學習認知時間。

也希望大家可以藉由如此的學習與經驗交流,看能不能提高一下我們高科技水準?!

不要老是想殺價競爭,賣肝謀低毛利吧。

也由此可知:江山備有才人出,大家就好好努力一下吧。--- 台灣加油!

沒有留言:

張貼留言