新聞中心

EEPW首頁 > 模擬技術(shù) > 設(shè)計應(yīng)用 > 基于S3C4510B的USB主控器驅(qū)動設(shè)計

基于S3C4510B的USB主控器驅(qū)動設(shè)計

——
作者: 時間:2007-01-26 來源:《現(xiàn)代電子技術(shù)》 收藏

1 引言

在現(xiàn)代社會,嵌入式系統(tǒng)逐漸深入到人們生活的方方面面,各類嵌入式系統(tǒng)產(chǎn)品之間往往通過某種接口進行交互或數(shù)據(jù)傳遞。而現(xiàn)在,usb已經(jīng)成為嵌入式數(shù)據(jù)交換的最主要的方式,可是各種usb接口的設(shè)備都是基于pc機系統(tǒng)的,所以,基于嵌入式系統(tǒng)的usb接口的研究具有實用的價值和意義,特別是起master作用的host端接口的研究。

解決這一問題的根本辦法就是在需要使用usb設(shè)備的嵌入式系統(tǒng)中擴展usb host功能模塊,使之具有與usb設(shè)備進行數(shù)據(jù)傳輸?shù)哪芰Α?br>
usb協(xié)議按功能分為2部分,usb host(usb主協(xié)議)和usb slave(usb從協(xié)議)分別應(yīng)用于usb host controller(usb主控制器)和usb device(usb設(shè)備)。一般,usb host要比usb slave復(fù)雜,對于廣大的非pc用戶來說,尤其是嵌入式系統(tǒng)用戶來說,由于usb協(xié)議的不對稱性,使得實現(xiàn)usb host比usb slave要困難地多,philips公司的isp1161a1芯片很好地解決了這種問題,他封裝了復(fù)雜的usb協(xié)議,使得在嵌入式系統(tǒng)中實現(xiàn)usb host和usb slave變得簡單方便。

2 usb host技術(shù)簡介

usb的通信可以用圖1表示,圖1中,左半部分為usb主機端,可以看出,usb主機端由2部分構(gòu)成,即軟件體和硬件體,實際上是3個軟件組件組成了usb host解決方案,即usb客戶驅(qū)動程序,usb驅(qū)動程序和usb主機控制器驅(qū)動程序,應(yīng)用程序的事務(wù)處理是由usb客戶驅(qū)動程序(設(shè)備驅(qū)動程序)啟動的,客戶驅(qū)動程序把usb設(shè)備當(dāng)做一個可以被訪問的端點集合,他可以被控制并與他的功能單元進行通信,usb系統(tǒng)軟件包括usb驅(qū)動程序和usb主控制器驅(qū)動程序,usb驅(qū)動程序負責(zé)配置管理、用戶管理、總線管理和數(shù)據(jù)傳輸,usb主控制器驅(qū)動程序負責(zé)調(diào)度管理,隊列管理和控制器管理,以及數(shù)據(jù)的位編碼、封包、循環(huán)校驗、發(fā)送、錯誤處理等。

本文引用地址:http://m.butianyuan.cn/article/21351.htm

如圖2所示,usb host的軟件結(jié)構(gòu)分為3大部分,即usb總線驅(qū)動(usbd),usb host控制器驅(qū)動(hcd)、客戶軟件、其中客戶軟件處理和設(shè)備有關(guān)的信息,usbd處理和硬件無關(guān)的協(xié)議,而hcd則處理與硬件相關(guān)的協(xié)議,usbd和hcd都包含了一系列管理各種狀態(tài)的寄存器。

3 sp1161體系結(jié)構(gòu)

要實現(xiàn)usb協(xié)議,必須要通過一系列寄存器來完成,這些寄存器要能實現(xiàn)usb軟件結(jié)構(gòu)中的usbd和hcd,即要完成usb協(xié)議狀態(tài)的控制,還要有一定的緩沖區(qū)來存放進出的數(shù)據(jù),isp1161專門針對usb協(xié)議設(shè)計的特殊硬件結(jié)構(gòu)可方便地實現(xiàn)usb host和usb slave。isp1161的硬件結(jié)構(gòu)主要是3類不同的寄存器,用戶通過操作這3種寄存器來達到實現(xiàn)usb傳輸?shù)哪康模@3類寄存器是:

(1)hc control and status registers:usb主控制器控制和狀態(tài)寄存器,主要用于傳輸過程中控制命令的存放和狀態(tài)的讀取,可讀可寫的寄存器有2個地址,只讀或只寫的寄存器只有1個地址。

(2)isochronous transfer list (itl):同步傳輸列表緩沖區(qū)。

(3)acknowledged transfer list(atl):接收傳輸列表緩沖區(qū)。

根據(jù)usb協(xié)議,數(shù)據(jù)傳輸分為4種模式,control(控制),bulk(整批),interrupt(中斷)和isochronous(同步)。其中itl是為了實現(xiàn)同步傳輸,atl則實現(xiàn)其他3種模式的傳輸。

4 isp1161x主控制器編程實現(xiàn)

設(shè)計isp1161x主控制驅(qū)動程序主要涉及以下2個重要內(nèi)容,下面詳細介紹:

4.1 讀/寫atl和itl緩沖區(qū)

atl和itl緩沖區(qū)的位于isp1161x內(nèi)部的fifo緩沖ram之中,每個緩沖區(qū)包含許多ptd(philips transfer descriptor),而ptd用于主控制器硬件發(fā)送或接收usb包從usb設(shè)備,作為調(diào)度usb傳輸?shù)囊徊糠?,hcd在系統(tǒng)內(nèi)存中購建ptd。然后hcd將購建好的ptd移入atl或者itl緩沖區(qū),主控制器硬件允許軟件去訪問每一個緩沖區(qū),就像他們是分離的硬件緩沖區(qū),hcd訪問atl緩沖區(qū)通過硬件寄存器hctransfercounter(22h/a2h)和hcatlbufferport(41h/c1h),而itl緩沖區(qū)則由hctransfercounter和hcitlbufferport(40h/c0h)訪問。下面一段示例代碼取自于本項目,其功能是向atl緩沖區(qū)寫數(shù)據(jù),hci→hp→atl_len表示,atl則在內(nèi)存中還沒有發(fā)送的數(shù)據(jù)的長度,hci→hp→tl表示緩沖區(qū)的地址。

4.2硬件初始化過程

當(dāng)isp1161x上電時,主控驅(qū)動程序(hcd)必須經(jīng)過下列的順序?qū)τ布M行初始化,以便主控制器進入可操作狀態(tài)。

檢測主控制器,軟件復(fù)位主控制器,配置hchardwareconfiguration寄存器,配置中斷;配置hccontrol寄存器,配置hcfminterval寄存器,配置根集線寄存器,設(shè)置itl和atl緩沖區(qū)長度,安裝int1中斷服務(wù)程序。

4.2.1 檢測主控制器

檢測的工作由hcd完成的,hcd通過向寄存器hcscratch寫一個值,接著從該寄存器讀出,與剛才寫入的值進行比較。如果寫入的和讀出的值相等,hcd得出結(jié)論:主控制器存在,對hcchipid寄存器的讀也被用來作為額外的條件來檢測該寄存器。

4.2.2 主控制器的軟件復(fù)位

軟件復(fù)位主控制器通常包括2個步驟:復(fù)位主控制器;設(shè)置主控制器為reset狀態(tài)。

hcd通過設(shè)置在hccommandstatus寄存器的hcr位來復(fù)位主控制器:

一旦主控制器復(fù)位了,hcd必須通過設(shè)置hccontrol寄存器的hcfs字段為00b,以便使主控制器為reset狀態(tài)。

4.2.3 配置hchardwareconfiguration寄存器

write_reg16(hci,interruptpinenable|interruptpin trigger interruptoutputpolarity |databuswidth16|analogocenable,hchardwareconfiguration);

上述這段代碼表示將主控制器初始化為int1允許,中斷是邊沿觸發(fā),中斷的輸出極性為高電平,數(shù)據(jù)線的寬度為16b,使用片上過流檢測,模擬輸入。

4.2.4 配置中斷

主控制器isp1161x有2組中斷源,第一組包含usb事件產(chǎn)生的中斷,比如start of frame,調(diào)度溢出和根集線器狀態(tài)改變,這些中斷的發(fā)生由hcinterruptenable和hcinterruptdisable寄存器聯(lián)合控制,而每個中斷的狀態(tài)由hcinterruptstatus寄存器標(biāo)識。
第二組是主控制器中狀態(tài)變化所引起的中斷,比如,主控制器延遲所產(chǎn)生的中斷,同樣,在第一組中斷中的任何組合是第二組中斷的中斷源。

4.2.5 配置hcfminterval寄存器

hcfminterval寄存器的14位值[frameinteral,fi]用于表示一幀之內(nèi)所占用的比特時間(在2個連續(xù)的sofs,15位的值[fslargestdatapacket,psmps)用于表示在沒有引發(fā)調(diào)度溢出下可發(fā)送或接收全速最大包大小,fi,psmps的推薦值為0x2edf和0x2778,所以將調(diào)用下列語句對該寄存器進行初始化:

write_reg32(hci,0x2edf|(0x2778<<16),hcfminterval);

4.2.6 配置root hub(根集線器)寄存器

隨著初始化的深入,下面的專門針對根集線器3個寄存器也必須初始化:hcrhdescriptora,hcrhdescriptorb和hcrhstatus,前2個寄存器是根據(jù)電路板的制作自動由isp1161x配置的,這2個寄存器均用來描述根集線器的特性。

hcrhstatus被劃分為2個部分,低字部分表示集線器狀態(tài),而高字部分表示集線器狀態(tài)的改變,還有保留部分必須被初始化為邏輯0。

4.2.7 設(shè)置itl和atl緩沖區(qū)的長度

主控制器isp1161x內(nèi)部的fifo緩沖區(qū)有4kb/s,而這4k將被atl和itl劃分為2部分,分由hcatlbufferlength和hcitlbufferlength寄存器表示,itl緩沖區(qū)又進一步被分為2個相同的ito0和itd01緩沖區(qū),atl緩沖區(qū)必須存在,因為atl緩沖區(qū)用于控制,中斷和大批量傳輸,而itl的存在與否是可選的。

4.2.8 設(shè)置int1中斷的服務(wù)程序

如果在主控制器中發(fā)生一個或多個中斷,isp1161x的int1引腳將會通知微處理器,在本項目中,int1的引腳直接接在arm的int0引腳上,驅(qū)動程序通過linux提供的函數(shù)request_irq向操作系統(tǒng)申請中斷號,并在此函數(shù)中向操作系統(tǒng)提供中斷處理函數(shù)。

request_irq(irq,hc_interrupt,0,"isp116x",hci)

irq為中斷號;hc_interrupt為中斷處理函數(shù),0為中斷標(biāo)記,"isp116x"表示中斷設(shè)備名稱;hci在此表示中斷設(shè)備號。

5 在μclinux中編譯usb主控驅(qū)動

接下來就如何將驅(qū)動文件編譯到嵌入式操作系統(tǒng)做一個簡要說明。

(1)將上述文件拷貝到drivers/usb/

(2)編輯drivers/usb/makefile文件,添加以下內(nèi)容:

obj-$(config_usb_isp1161)+=hc_isp1161.o

(3)編輯driver/usb/config.in文件,添加如下內(nèi)容:

dep_tristatisp1161(philips)supportconfig_usb_isp1161 $ config_usb

(4)編譯μclinux內(nèi)核

編譯成功后把生成的映象文件用jtag燒寫器燒寫到開發(fā)板的rom中,啟動后進行驗證實現(xiàn)了對isp1161a1的控制。

6 結(jié)語

isp1161a1使得在嵌入式系統(tǒng)中實現(xiàn)usb host變得十分簡單方便,便于嵌入式系統(tǒng)中usb的普及。

一個usb host要完成的功能因為需求不同,所使用的協(xié)議也不盡相同,有的采用中斷傳輸,有的采用同步傳輸,usb主機技術(shù)在嵌入式系統(tǒng)的應(yīng)用主要是針對某一種usb設(shè)備或集中設(shè)備,因而嵌入式系統(tǒng)上可以只固化某幾種協(xié)議,該技術(shù)的應(yīng)用可以使得在嵌入式系統(tǒng)上輕松接入usb外設(shè)、擴展系統(tǒng)的功能、提高儀器的使用靈活性。usb主機技術(shù)在嵌入式系統(tǒng)上的應(yīng)用會有更廣泛更美好的前景。




關(guān)鍵詞:

評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉