在
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主機,網上有很多現成的例子,從硬體到軟體。可是絕...