基於OHCI的USB主機 中斷處理程式

2021-09-22 00:23:22 字數 1419 閱讀 6918

ohci

的體系下,判斷資料是否傳輸完畢是需要通過中斷程式來判斷的,當

usb主機設定了

hccontrol

和hccommandstatus

暫存器開始傳輸資料後,

am9200 

自動開始資料傳輸,並且定期的檢查

hcdonehead

暫存器的內容,並且將其轉移到

hcca.donehead

。然後產生中斷,觸發中斷處理程式。

在中斷處理程式中,需要檢查

hcinterruptstatus

暫存器的內容,判斷

wdh位是否為

1,以便確定是否有

td被處理完畢。一般來說,其餘的中斷狀態位不用理會。當發現有

td被處理完畢,則還需要判斷已經完成的

td是否是當前傳輸命令的最後乙個

td,如果是則標誌命令執行結束,上層程式可以進行後續處理。

/*** ohci

中斷處理程式

*/voidat91f_uhp_handler(void)

//取得當前完成的td的

complete code值

cc = gettdcc(ohcigethccadonehead());

//判斷當前完成的

td是否是命令的最後乙個td

if(ohcigethccadonehead() == usbgetlasttdaddr(idx))

else

else

//當前td

不是最後乙個

td,等待繼續處理

usbcmdstate.

state

++; }}

//清除hcinterruptstatus

暫存器的內容,以便能夠產生新的中斷

ohciclearintrstatus();

}

在最初的**中,不是通過中斷來判斷

td資料是否處理完畢的,而是直接呼叫

ohcigetintrstatus()

函式並判斷返回值的,但是實際除錯時發現這樣不能正確得到

td資料處理完畢的資訊。通過對中斷程式的實際除錯發現,因為

ed會帶有多個td,

am9200

在處理的時候可能是處理速度的原因,會產生

1個或多個中斷,因此在中斷處理程式中需要判斷當前結束的

td是否是當前命令的最後乙個

td,這樣才能確保整個

ed處理完畢。

說實話,我不認為上面的判斷

ed佇列執行完畢的方法是好的方法,本來我一直以為會有乙個暫存器,在

ed佇列處理完畢的時候會跳出來告訴我說佇列執行完畢了,可是找了半天也沒有找到,只好採用這個笨方法了。

基於OHCI的USB主機 中斷處理程式

在 ohci 的體系下,判斷資料是否傳輸完畢是需要通過中斷程式來判斷的,當 usb主機設定了 hccontrol 和hccommandstatus 暫存器開始傳輸資料後,am9200 自動開始資料傳輸,並且定期的檢查 hcdonehead 暫存器的內容,並且將其轉移到 hcca.donehead 然...

基於OHCI的USB主機 OHCI(端點)

ohci open host controller inte ce 是康柏 微軟 國家半導體等公司共同制定的乙個usb主機介面規範,它提供乙個更抽象的介面來完成usb資料傳輸工作。在ohci規範中,最重要的幾個概念是端點 endpoint ed 傳輸描述符 transport descriptor ...

基於OHCI的USB主機 前言

很久以前,大概是前年年底吧,因為公司專案的要求,我做了基於ohci的usb主機訪問u盤的程式,用來把系統中產生的一些資料儲存到u盤中。本來做的時候就想把其中的一些經驗體會發表的,可是工作實在是太忙,而且也的確有點懶,就一直拖到了現在。做訪問u盤的usb主機,網上有很多現成的例子,從硬體到軟體。可是絕...