基於OHCI的USB主機 —— 寄存器(復位)

USB端口復位

USB 設備鏈接到某個端口上之後,根據規範,須要對相應 USB 端口進行復位 ,對於 AT91RM9200 來講,其實只有一個端口,該端口號固定爲 0
/**
 * USB 端口復位
 * @param port 須要復位的端口
 * @return 0 成功
 */
short ohciPortReset( unsigned char port)
{
    unsigned int reg;
   
    // SetPortReset
    pUhp-> UHP_HcRhPortStatus [port] = (1 << 4);
    pUhp-> UHP_HcRhPortStatus [port] = (1 << 20 | 1 << 4);
    return 0;
}
 
按照規範,執行完上述復位操做之後,須要延時若干時間,通過在網上查詢資料和實際調試,發現延時時間在 100-150ms 之間爲好。對於嵌入式系統來講,不可能讓系統爲了等待復位完成而什麼事情都不作,所以端口復位和判斷復位是否結束須要分別放到兩個函數中,在上層代碼中進行延時處理。

USB端口復位結束

USB 端口進行復位後,使用下述代碼判斷復位是否完成:
/**
 * USB 端口復位是否結束
 * @return 0 – 沒有結束, >0 – 結束
 */
short udpIsBusResetOver( void )
{
    return pUdp-> UDP_ISR & AT91C_UDP_ENDBUSRES;
}

這個地方的代碼有點奇怪, 明明是對pUhp指針操做進行的復位,結果使用pUdp指針判斷復位是否成功,時間過久,我也忘了這是怎麼回事,估計是當年從例程裏面抄過來的。不過個人上層代碼中,調用復位函數後有延時,已經可以確保復位操做是成功的了,所以這個函數就這樣無論了。
相關文章
相關標籤/搜索