乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      USB主機控制器的設計

       lchjczw 2012-05-22

      USB具有簡單、標準的連接方式、支持熱插拔等諸多優(yōu)點,因此已成為流行的接口技術。USB是典型的主/從結構的總線標準,即只有USB主機才能與USB設備連接。USB總線與計算機系統(tǒng)的接口部分是主機控制器,它可以被看作一個硬件、固件和軟件的綜合體。主機控制器實現(xiàn)主機與設備之間的電氣和協(xié)議層匹配,主要包括:串并轉換、幀起始、數(shù)據(jù)處理、協(xié)議使用、傳輸錯誤處理、遠程喚醒、根Hub、主機系統(tǒng)接口等功能。USB設備之間通過USB Hub連接,主機控制器和USB設備之間一般通過根Hub相連。通常主機控制器提供與根Hub相關的狀態(tài)查詢和控制單元。當有設備插入時,在枚舉過程中,主機控制器驅動通過查詢和控制單元應答設備偽裝成一個Hub,所以通常稱此Hub為虛擬根Hub。

        這里利用EDK軟件搭建一個基于PowerPC的片上系統(tǒng),實現(xiàn)了SoPC系統(tǒng)上基于Linux的USB接口的擴展,使系統(tǒng)具有USB主機功能,能夠和各種USB設備進行通信。

      1 開發(fā)環(huán)境

        目前Linux 2.6內核中的USB支持3種主控制器接口:通用主控制器接口(UHCI)、開放控制器接口(OHCI)及增強主機控制接口(EHCI)。在嵌入式系統(tǒng)中,如果處理器集成有USB主機控制器,則可直接引出USB主控端口;而未集成USB主機控制器的處理器則需使用USB主控器件,從總線上擴展USB主機接口。

        這里所采用的開發(fā)環(huán)境是Xilinx公司的ML405開發(fā)板。開發(fā)板上核心FPGA采用Xilinx的XC4VFX20-FF672器件,其內置1個PowerPC硬核,2個以太網(wǎng)MAC層控制器。開發(fā)板上還帶有64 MB的DDR SDRAM,10/100/1000以太網(wǎng)端口、帶主機/設備端的USB接口器件(CY7C67300)等。

        EZ-Host(CY7C67300)是Cypress半導體公司的全速低耗多端口主機/外設控制器,該器件可方便接至高性能CPU上完成USB主機控制器端的功能;擁有16位RISC指令處理器,可作為協(xié)處理器使用或單獨使用;同時支持USB的OTG協(xié)議,擁有2個可獨立配置并各帶有2個端口的USB串行接口引擎(SIE);既可用作主機,又可用作外設,并支持多達4個主機端口。另外,該器件擁有一個可編程I/O接口模塊,可供各種接口編程使用,可編程實現(xiàn)HPI、HSS、SPI等接口模式。當EZ-Host控制器作為USB主機控制器時,一般采用HPI主機端接口(Host Port Interface)接口模式。

      2 硬件設計

        Xilinx公司提供一個IP核opb_epc外設控制器(external peripheral controller),為OPB總線與外部同步或異步外圍設備之間的數(shù)據(jù)傳送提供一個通用接口,可方便實現(xiàn)處理器對于外設的控制。一個opb_epe最多可接4個外設,且每個外設可獨立配置成同步或異步模式,其時序參數(shù)(如建立時間、保持時間、訪問時間周期等)都可由用戶設置。opb_epc通過OPB總線接收處理器的讀寫指令,在相應外設接口產(chǎn)生相應的訪問周期,從而實現(xiàn)處理器對外圍設備的控制。這里使用opb_epc模塊作為控制器,實現(xiàn)PowerPC與EZ-Host的主機控制器的接口通信,嵌入式硬件系統(tǒng)架構如圖l所示。

       

        ML405板上的EZ-Host控制器工作在異步模式。因此opb_epc需配置為支持異步外設模式。這里使用PowerPC控制USB接口,因此EZ-Host工作于協(xié)處理器模式。并通過HPI接口與外設控制器opb_epc相連。

      3 驅動程序設計

        3.1 USB主機端的軟件結構

        Linux USB主機驅動協(xié)議棧由3部分組成:USB主機控制器驅動(HCD)、USB驅動(USBD)和各種不同的USB設備類驅動,如圖2所示。


         USB設備類驅動(如插入主機的U盤、鼠標、鍵盤等設備驅動)是最終與應用程序交互的軟件模塊,負責建立虛擬連接、配置,與設備進行通信,將數(shù)據(jù)集成一個USB請求塊(URB),然后通過USB驅動(USBD)提供的編程接口將URB發(fā)送到USBD。USBD部分是整個USB主機驅動的核心。

        USBD完成以下工作:USB設備的枚舉和配置,根據(jù)需要裝載或卸載設備驅動程序,向上為設備驅動程序提供編程接口,向下為主機控制器驅動提供編程接口,實現(xiàn)與設備驅動程序、主機控制驅動程序的通信。

        處于最底層USB主機控制器驅動(HCD)是USB主機直接與硬件交互的軟件模塊。HCD作為底層硬件的驅動程序,一方面控制和管理底層硬件,負責將USB事務發(fā)送給USB主機控制器,并最終將串行數(shù)據(jù)發(fā)送到電纜上;另一方面為上層的USB系統(tǒng)軟件提供統(tǒng)一接口HCI(Host ControllerInterface),將各種不同的HC映射到USB系統(tǒng)。HC一般都集成有Root Hub的功能,HCD也要實現(xiàn)Root Hub Port訪問。

        USBD部分由操作系統(tǒng)實現(xiàn),一般不需要用戶修改。USB設備類驅動,對于常用的設備Linux內核中有較成熟的驅動。針對特定的主機控制器硬件應該實現(xiàn)HCD部分,以解決基本的通信問題。故這里主要介紹EZ-Host主機控制器驅動(HCD)的設計。

        3.2 EZ-Host主機控制器驅動(HCD)設計

        開發(fā)過程主要針對EZ-Host主機控制器編寫USB主機控制器驅動程序。該驅動程序是嵌入式Linux開發(fā)平臺下USB協(xié)議棧和EZ-Host主機控制器的一個接口,其作用類似于Linux中由Intel制定的UHCI標準,其硬件設計比較簡單,但軟件較為復雜。

        USB主機控制器的驅動(HCD)在USB子系統(tǒng)中的功能主要有:硬件初始化,為上層(USBD)提供調用接口,管理根Hub,完成數(shù)據(jù)傳輸以及中斷處理。根據(jù)主機控制器驅動(HCD)在整個USB子系統(tǒng)中的功能,可將EZ-Host HCD分為HCD接口、HCD初始化、數(shù)據(jù)傳輸、中斷處理、讀寫操作、主機協(xié)議等模塊。HCD接口模塊表現(xiàn)為一套API函數(shù),通過這一套API函數(shù)使HCD與USBD進行通信。圖3為EZ-Host主機控制器驅動模塊結構。


        1)初始化。該初到始化涉及到復位EZ-Host控制器,并將其初始化到一個已知的狀態(tài);初始化必要的USB數(shù)據(jù)結構并為其分配空間;注冊USB host driver和USB host bus interface到USB host core;注冊USB host core的中斷服務程序;為每一個主端口建立一個虛擬根Hub,并且注冊根hub到USBhost eore。2)中斷處理。EZ-Host主控制器中斷采用電平觸發(fā),當中斷服務程序注冊到USB子系統(tǒng)后,EZ-Host主控制器開始處理中斷。3)傳輸數(shù)據(jù)。傳輸處理程序在初始化的過程中注冊到USB主端子系統(tǒng),它由USB host core喚醒并配置外圍設備,發(fā)送塊數(shù)據(jù),或確認塊數(shù)據(jù)的接收。4)接收數(shù)據(jù)。接收處理程序處理數(shù)據(jù)包的接收,它由中斷處理程序喚醒。數(shù)據(jù)接收處理程序詢問EZ-Host主控制器是否有接收錯誤,如果沒有錯誤,則接收處理程序從EZ-Host主控制器的緩沖區(qū)中提取數(shù)據(jù)并將數(shù)據(jù)存儲到一個數(shù)據(jù)結構,然后接收程序將數(shù)據(jù)傳送到USB host eore,等待進一步處理。5)主機協(xié)議實現(xiàn)。HCD從Linux USB協(xié)議棧接收并解析USB請求,然后建立基于該請求的USB交互(transactions),該交互被合理調度安排并發(fā)送到USB總線上。

        3.3 HCD的關鍵接口設計

        實際工作過程中,應用程序通過文件系統(tǒng)接口訪問相應的USB設備類驅動程序和USBD;USB設備類驅動程序則通過USBD提供的相關接口(USBDI)將數(shù)據(jù)請求包傳遞給USBD;USBD通過HCD提供的接口(HCI)進一步將數(shù)據(jù)包傳遞給HCD;HCD最終將數(shù)據(jù)發(fā)送到USB總線。

        主機控制器驅動中,最重要的接口是主機控制器驅動HCD與USBD之間的接口。在Linux內核中,用usb_hcd結構體表示USBD接口,用來描述主機控制器(HC)的基本信息、硬件資源、狀態(tài)描述和用于操作主機控制器的hc_driver等。其中usb_hcd中的hc_driver成員非常重要,它包括具體用于操作主機控制器的鉤子函數(shù)。在Linux內核中,使用如下函數(shù)創(chuàng)建HCD:

        struct USB_hcd*USB_create_hcd(const stroct hc_driver*driver,struct device*dev,char*bus_name);

        struct hc_driver可看作USBD模塊定義的需要底層主機控制器驅動實現(xiàn)的接口,通過實現(xiàn)這些接口,USBD可將更上層軟件的請求傳遞給HCD以及HC,HC及HCD完成后,也會通過這些接口通知USBD。

        這里在EZ-Host主控制器驅動中定義一個結構體structusb hcd c67x00_hcd,用于描述EZ-Host的基本信息、硬件資源、狀態(tài)描述,定義struct hc_driver c67x00_hc_driver來描述用于操作主機控制器的鉤子函數(shù),其結構體如圖4所示。


         c67x00_hub_start()啟動HCD主控制器,c67x00_hub_irq()實現(xiàn)其中斷控制處理,c67x00_hub_status_data(),c67x00_hub_control()實現(xiàn)對虛擬根集線器的控制,c67x00_hub_enqueue(),c67x00_hub_dequeue()實現(xiàn)對USB請求(URB)進行排隊,對URB進行調度。根據(jù)hcd和endp-oint的信息,安排URB的schedule到e67x00,該URB的傳輸完成后,會調用urb->complete()通知USBD。

      4 測試結果

        在ML405開發(fā)板上實現(xiàn)了USB主機控制器的開發(fā),使系統(tǒng)具有USB主機功能。在開發(fā)板上分別插入USB鍵盤、USB鼠標、U盤進行測試,內核識別信息輸出如圖5所示。

        從圖5中可看出,系統(tǒng)可以方便與大容量存儲類(MassStorage類)USB接口、人機接口類HID(Human Interfaee Device)USB接口進行通信,進行正常讀寫操作,實現(xiàn)了系統(tǒng)的SB接口擴展。

      5 結束語

        詳細介紹在SoPC平臺上進行USB主機控制器的硬、軟件設計。針對EZ-Host器件,詳細介紹其USB主控制器的Linux驅動開發(fā)過程及主要的接口設計,對于USB的主機控制器的驅動開發(fā)有一定參考價值。設計的重點和難點主要集中在主機控制器器件的驅動程序開發(fā)的環(huán)節(jié)上,但Linux作為開源系統(tǒng),在開發(fā)設備驅動程序時有著其他嵌入式系統(tǒng)不可比擬的優(yōu)勢,大量的開放源碼無疑可以大大加快開發(fā)的進程并使得其應用更加的廣泛。因此,USB作為一種新型的高速外設總線,在嵌入式Linux領域有著廣闊的應用前景。

        本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
        轉藏 分享 獻花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多