2.02.2007

ISP1582 DATA IN. Stage and Interrupt

除了EP0 以外,其他的endpoint 。
TX ( IN ) 中斷發生的時機,是在 endpoint buffer由 1 -> 0 時發生,也就是edge trigger。

USB裝置的通訊是由PC主導的,所以device端所謂的TX 動作,其實是 "將data放到 buffer中,等待 PC 來拿"。

PC 來拿取的時機,依照driver的寫法,和ap 的寫法而有不同。
所以不是 "device一把資料放到buffer中,馬上就送出去了" 。

如果pc 端的AP (driver?)沒有動作(Read),device 端 TX buffer的資料永遠不會送出。

再來,AP (driver) Read 時。buffer裡不一定會有資料,如果沒有資料的時候。寫得不好的driver,就會讓AP hang住...

ISP1582這種 "Edge Trigger" 的TX Interrupt,driver的部份需要特別照顧。
通常這種通訊介面都用FIFO (Ring) 作為 driver 的interface (我是指device端)。
一端由 main loop code 在需要時,將資料丟到FIFO中,driver則負責在 TX interrupt時,將FIFO的資料拿出來,送到 Endpoint buffer中。

當 FIFO一旦空了之後,driver在最後一次中斷後就沒有送資料出去了,所以沒有下一個 TX 中斷,這個model 的自動機制就消失了。

所以一般這類設計,main loop 端的code 把data放入 FIFO後都會檢查 中斷是否運作中,如果沒有,就要手動initial 傳送。

在 usb 有一種好處,就是可以送一個 length 0的資料,還有TX動作實際上要等待PC端的IN Command Stage。

所以.. device的driver只要確實的將FIFO length 內容反應到 buffer中就可以了。
也就是說,FIFO沒資料時,就送一個 length = 0 的資料過去。

猜想是"送 length = 0 的資料"中,會把 endpoint的dsen set,讓他能進入data stage,回應 host的in command。整個usb command的 process才能正確的執行。

沒有留言: