基于單片機的USB主控器驅動設計

4.2 硬件初始化過程
當ISP1161x上電時,主控驅動程序(HCD)必須經過下列的順序對硬件進行初始化,以便主控制器進入可操作狀態。
檢測主控制器,軟件復位主控制器,配置HcHardwareConfiguration寄存器,配置中斷;配置HcControl寄存器,配置HcFmInterval寄存器,配置根集線寄存器,設置ITL和ATL緩沖區長度,安裝INT1中斷服務程序。
4.2.1 檢測主控制器
檢測的工作由HCD完成的,HCD通過向寄存器HcScratch寫一個值,接著從該寄存器讀出,與剛才寫入的值進行比較。如果寫入的和讀出的值相等,HCD得出結論:主控制器存在,對HcCHipID寄存器的讀也被用來作為額外的條件來檢測該寄存器。
4.2.2 主控制器的軟件復位
軟件復位主控制器通常包括2個步驟:復位主控制器;設置主控制器為RESET狀態。
HCD通過設置在HcCommandStatus寄存器的HCR位來復位主控制器:

一旦主控制器復位了,HCD必須通過設置HcControl寄存器的HCFS字段為00B,以便使主控制器為RESET狀態。
4.2.3 配置HcHardwareConfiguration寄存器
WRITE_REG16(hci,InterruptPinEnable|InterruptPin Trigger InterruptOutputPolarity |DataBusWidth16|AnalogOCEnable,HcHardwareConfiguration);
上述這段代碼表示將主控制器初始化為INT1允許,中斷是邊沿觸發,中斷的輸出極性為高電平,數據線的寬度為16b,使用片上過流檢測,模擬輸入。
4.2.4 配置中斷
主控制器ISP1161x有2組中斷源,第一組包含USB事件產生的中斷,比如Startof Frame,調度溢出和根集線器狀態改變,這些中斷的發生由HcInterruptEnable和HcInterruptDisable寄存器聯合控制,而每個中斷的狀態由HcInterruptStatus寄存器標識。
第二組是主控制器中狀態變化所引起的中斷,比如,主控制器延遲所產生的中斷,同樣,在第一組中斷中的任何組合是第二組中斷的中斷源。
4.2.5 配置HcFmInterval寄存器
HcFmInterval寄存器的14位值[FrameInteral,FI]用于表示一幀之內所占用的比特時間(在2個連續的SOFs,15位的值[FSLargestDataPacket,PSMPS)用于表示在沒有引發調度溢出下可發送或接收全速最大包大小,FI,PSMPS的推薦值為0x2EDF和0x2778,所以將調用下列語句對該寄存器進行初始化:
WRITE_REG32(hci,0x2EDF|(0x2778<<16),HcFmInterval);
4.2.6 配置Root Hub(根集線器)寄存器
隨著初始化的深入,下面的專門針對根集線器3個寄存器也必須初始化:HcRhDescriptorA,HcRhDescriptorB 和 HcRhStatus,前2個寄存器是根據電路板的制作自動由ISP1161x配置的,這2個寄存器均用來描述根集線器的特性。
HcRhStatus被劃分為2個部分,低字部分表示集線器狀態,而高字部分表示集線器狀態的改變,還有保留部分必須被初始化為邏輯0。
4.2.7 設置ITL和ATL緩沖區的長度
主控制器ISP1161x內部的FIFO緩沖區有4kb/s,而這4k將被ATL和ITL劃分為2部分,分由HcATLBufferLength和HcITLBufferLength寄存器表示,ITL緩沖區又進一步被分為2個相同的ITO0和ITD01緩沖區,ATL緩沖區必須存在,因為ATL緩沖區用于控制,中斷和大批量傳輸,而ITL的存在與否是可選的。
4.2.8 設置INT1中斷的服務程序
如果在主控制器中發生一個或多個中斷,ISP1161x的INT1引腳將會通知微處理器,在本項目中,INT1的引腳直接接在ARM的INT0引腳上,驅動程序通過Linux提供的函數request_irq向操作系統申請中斷號,并在此函數中向操作系統提供中斷處理函數。
request_irq(irq,hc_interrupt,0,"ISP116x",hci)
irq為中斷號;hc_interrupt為中斷處理函數,0為中斷標記,"ISP116x"表示中斷設備名稱;hci在此表示中斷設備號。
5 在μClinux中編譯USB主控驅動
接下來就如何將驅動文件編譯到嵌入式操作系統做一個簡要說明。
(1)將上述文件拷貝到drivers/USB/
(2)編輯Drivers/USB/Makefile文件,添加以下內容:
obj-$(CONFIG_USB_ISP1161)+=hc_isp1161.o
(3)編輯driver/USB/config.in文件,添加如下內容:
Dep_tristat iisp1161(Philips)support iCONFIG_USB_ISP1161 $ CONFIG_USB
(4)編譯μClinux內核
編譯成功后把生成的映象文件用JTAG燒寫器燒寫到開發板的ROM中,啟動后進行驗證實現了對ISP1161A1的控制。
6 結語
ISP1161A1使得在嵌入式系統中實現USB HOST變得十分簡單方便,便于嵌入式系統中USB的普及。
一個USB HOST要完成的功能因為需求不同,所使用的協議也不盡相同,有的采用中斷傳輸,有的采用同步傳輸,USB主機技術在嵌入式系統的應用主要是針對某一種USB設備或集中設備,因而嵌入式系統上可以只固化某幾種協議,該技術的應用可以使得在嵌入式系統上輕松接入USB外設、擴展系統的功能、提高儀器的使用靈活性。USB主機技術在嵌入式系統上的應用會有更廣泛更美好的前景。


評論