我對usb--IN、OUT事務的軟件角度理解(gliethttp)

文章來源:http://gliethttp.cublog.cn[轉載請聲明出處]

當設置地址的setup包發送完之後

usb host主機會繼續產生一個IN事務,進而進入這裏,將setup包中設置的地址值,配置到usb從設備上--pdiusbd12

對於PDIUSBD12來說,當爲OUT事務數據包時,只有包數據接收完畢之後,纔會觸發PDIUSBD12的中斷,

當爲IN事務時,一旦host發出IN事務的PID令牌值,PDIUSBD12會立即中斷,mcu此時,把需要發送的數據送到USB總線即可.

如果此次操作是OUT事務操作,那麼當數據全部傳輸完畢之後,host主機會再產生一個IN事務操作,

從機必須配合這個IN事務操作發送一個空數據包(實際51測試slave可以不用回發0字節的空數據包;但在at91rm9200下當沒有待發的數據時,當出現IN事務時,at91rm9200固件驅動會發送0字節包來響應該IN事務)

如果此次操作是IN事務操作,那麼當數據全部傳輸完畢之後,host主機會再產生一個OUT事務操作,

從機必須配合這個OUT事務操作返回正確ACK(ACK已經由usb控制器硬件自動完成)

所以從這裏看,IN事務也好,OUT事務也好,他們都是host主機以邏輯爲出發點"亂搞"出來的,[gliethttp]

對於不負責任的從機,可能端點0,1,2之類一旦發生數據中斷,它就發數據,它不管當前發的數據是爲IN事務服務的,還是爲OUT事務服務的,

而對於負責任的從機,它會完全按照host提出來的IN、OUT事務的邏輯,配合IN、OUT事務,發送相應事務下的相應數據.

舉一個例子:host下發一個數據,所以需要產生OUT事務,當host發送完成之後,host自己知道已經發完了,[gliethttp]

但host比較bt,他還想讓slave做一個確認,讓slave報告一個空數據包,他才解恨,slave怎麼報告呢,slave不能主動傳數據給host,

因爲usb主從模式的原因,一切數據的流動都是由host單方面主動提出發送、讀取,slave只是被動的響應,就像前面的OUT事務一樣

host打算OUT數據時,絕不會事先知會一下slave,有了就發,比較粗魯,大手大腳,當OUT事務完成之後,

host又強迫slave上發一個空數據包給host,完全不顧及slave的感受[gliethttp]

因爲slave不能有脾氣,如果slave有了脾氣,不去理會host的IN事務,host以強硬的姿態讓slave上發一個空數據包,

slave就是不發,那沒辦法,slave你是真的不想混了,host會不帶商量的把你踢出去--windows提示:"非法usb設備",

所以slave爲了能餬口,在windows的一畝三分地混口飯喫,那就只能順着該死的host的規則來行事了[gliethttp],

所以IN事務也好和OUT事務,以及setup事務,這些都是給這樣一個過程起的一個代號,畢竟我們要和其他人交流,

總不能說,"就是那個東西,數據發出去等着回答的那個東西,我覺得它有問題",那交流起來多麻煩,要是有個這個定義之後,

大家就可以這麼說,"我對IN事務不理解,我對OUT事務理解了",簡潔明瞭.以上是我對usb--IN、OUT事務的理解.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章