全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1994
推到 Plurk!
推到 Facebook!

嵌入式Linux開發平臺的USB主機介面設計

 
conundrum
尊榮會員


發表:893
回覆:1272
積分:643
註冊:2004-01-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2004-01-31 11:12:16 IP:61.221.xxx.xxx 未訂閱
http://www.cc-ol.net/Web/JISHU/JISHU74.htm 嵌入式Linux開發平臺的USB主機介面設計 2003-09-03 9:52:04 摘 要: 本文討論了怎樣在嵌入式Linux開發平臺下設計USB 主機周邊設備,以及在遵循GPL協定下開發該設備的驅動程式。 關鍵字: USB介面;嵌入式Linux;驅動程式;主機控制器 前 言: USB(通用串列匯流排),是最近幾年逐步在PC領域廣d應用的新型介面技術。USB介面通用性好、即時性強、傳輸方式多樣、成本低、易於擴展且便於使用,這些優點使它受到許多硬體廠商的青睞,各種類型的USB設備{品大量湧入市場,應用如火如荼。 USB設備是通過USB匯流排連接到USB主機上。主機通過與設備相連的邏輯通道與設備進行通信,在通信過程中,USB主機充當資料流程的源端或者目的端。在USB系統設計中,USB主機介面的設計一直是其難點所在。 嵌入式Linux開發平臺是嵌入式系統的一個新成員,近兩年以來成d研究熱點,其最大的特點是作業系統源代碼公開並且遵循GPL協定。Linux是一種能運行於多種平臺的類Unix作業系統,將Linux應用於嵌入式系統在國外也是近兩年的事,但發展非常快。目前在世界範圍內有許多科研機構和商業公司展開了對嵌入式Linux軟、硬體開發平臺的開發研究和應用研究。 USB Host介面的硬體設計 USB匯流排與電腦系統的介面部分就是主機控制器,它可以被看作一個硬體、固件和軟體的綜合體。USB主機與設備之間的通信最終都將通過USB主機控制器和USB設備的匯流排界面之間相連的電纜進行,任何一個輸出請求都是由主機控制器組織成包的形式發往匯流排的。USB匯流排中只有一個主機,它是USB樹形結構的根,通過一個根Hub來提供一個或多個連接點,從它分發連接著各個USB設備。 USB主機控制器完成了主機與設備之間的電氣和協定層的匹配,主要包括以下功能:串並轉換、幀起始、資料處理、協定使用、傳輸錯誤處理、遠端喚醒、根Hub、主機系統介面等。 開發環境: 目標系統和開發主機; 開發主機: Redhat7.1 Linux,PIII 700MHz,128M RAM; 目標系統: 萬禾嵌入式Linux系統,包括SOM5307A與WH5307DB兩塊電路板。 SOM5307A與WH5307DB兩塊電路板通過兩個84線的接插件相連在一起,構成一個有兩個非同步串列介面和一個10M乙太網口的微處理器系統,能夠裝載和運行嵌入式Linux作業系統mCLinux-Coldfire和應用軟體。開發主機通過乙太網或串列口與目標系統相連。用戶能夠通過乙太網或串列口登錄到目標系統上對其進行操作和控制。開發主機上還裝有目標系統上運行的mCLinux-Coldfire作業系統和應用軟體的所有源代碼,以及編譯、調試這些源代碼所需的工具軟體。 USB主機控制器硬體介面設計的目的是在萬禾嵌入式Linux系統開發板上增加一個USB Host介面,使其能夠作dUSB主機與各種USB Slave設備進行通訊。 在本文的設計中,USB Host介面晶片選用Scanlogic公司的SL811HS/T,這是市場唯一既能用作Host模式又能用作Slave模式的具有標準微處理器匯流排界面USB控制晶片,它適合於非PC設備。在Host模式下,它支援嵌入式主機與USB週邊設備的通信,在Slave模式下,可以作d主機的一個外設。 圖1給出了使用SL811HS/T擴展萬禾嵌入式Linux系統USB主機介面的框圖。 USB Host介面的軟體設計 在Linux作業系統中,驅動程式的載入方式d: 1、將驅動程式作d可載入的模組(Module),在系統超級用戶(Root)許可權下使用insmod命令動態載入,使之成d系統核心的一部分。對於USB設備而言,由於可熱插拔,一般採用模組化的設備驅動程式。USB主機控制器驅動程式一般也採用這種方法。 2、將設備驅動程式的源代碼加進系統核心,系統妍坅嶆菾奀N載入驅動。USB協定棧程式一般採用這種方法加入內核,進而{生一個叫做“USB核心”的子系統。這個子系統提供了許多資料結構、巨集定義、功能函數和應用程式介面(API)來對硬體或設備進行支援。 目前,並不是所有的嵌入式Linux都支援USB設備,對USB設備是否支援是由Linux核心決定的。因此,嵌入式Linux作業系統採用什l版本的核心就成d是否支援USB設備的關鍵。一般而言,Release版的2.2.XX及以前的版本都不支援USB設備,2.4.XX及以後的版本都加入了對USB設備的支援。萬禾嵌入式Linux開發平臺採用的是uClinux,其內核版本d2.2.38。此版本的內核不支援USB設備,因此,應該首先將其內核升級d2.4.10。 SL811HS/T驅動程式 開發過程主要針對SL811HS/T主機控制器晶片編寫USB主機控制器驅動程式。這個驅動程式是萬禾嵌入式Linux開發平臺下USB協定棧和SL811HS/T主機控制器晶片的一個介面,其作用類似於Linux中由Intel制定的UHCI標準。其硬體設計比較簡單,但軟體較d複雜。該驅動程式主要有3個原始檔案組成:sl811h-usb.c 、sl811h.h、 sl811h-usb.h。在兩個頭文件中主要定義了一些關於SL811HS/T寄存器的宏,由於Linux是一個開源系統,與“USB核心”相關的代碼將不再討論。這裏只介紹幾個sl811h-usb.c中的主要的函數,這幾個函數都是針對於SL811HS/T晶片的特定函數。 /* 四個I/O操作函數,其中adSL811HS/T的寄存器或記憶體位址,dd資料,cd位元組數,sd字元緩衝區。函數中採用了“自動位址增加模式”,降低了SL811HS/T讀/寫設備時佔用的存儲數量。*/ __u8 SL811Read(__u8 a) { /* 從SL811HS/T讀位元組 */ outb(a, SL811_ADDR); return (inb(SL811_ADDR 1)); return(0); } _static void SL811Write(__u16 a, __u8 d){ /* 向 SL811HS/T寫位元組 */ outb(a, SL811_ADDR); outb(d, SL811_ADDR 1); } _static void SL811BufRead(__u16 addr, __u8 *s, __u16 c){ /* 從SL811HS/T讀緩衝區 */ if(c<=0) return; outb(addr, SL811_ADDR); while (c--) *s = (__u8)inb(SL811_ADDR 1); } _static void SL811BufWrite(__u16 addr, __u8 *s, __u16 c){ /* 向SL811HS/T寫緩衝區 */ if(c<=0) return; outb(addr, SL811_ADDR); while (c--) outb(*s , SL811_ADDR 1); } /* 下面兩個函數和記憶體檢測函數 _static int SL811HMemTest()保證了系統妍坋伄鼢馱貜漲言\自動檢測,是作業系統調用驅動程式首先要完成的任務。*/ __u8 SLDetect(void) { /* 檢測SL811HS/T晶片,返回 1d檢測成功 */ __u8 res; res = SL811Read(DATASet) >> 4; if(res != 1) return(SL_HW_NOT_DETECTED); / * 檢測失敗 */ else return(res); } _static void SL811IntStop(void) { /* 終止晶片運行 */ SL811Write(IntEna, 0x0); /* 寫中斷使能寄存器 */ SL811Write(IntStatus, 0xff); /* 寫中斷狀態寄存器 */ } 另外比較重要的函數還有: _static int rh_submit_urb (urb_t *urb)/* 完成根集線器控制管道 */ _static void detect_set(unsigned long data)/* 如果設備存在就重妍妎蚻y排將其連接到根集線器上 */ _static void uhci_interrupt (int irq, void *__uhci, struct pt_regs *regs)/* 作d中斷處理器處理SOF(Start of Frame)、送出包和插入/移出中斷的函數 */ _static int __devinit alloc_uhci (int set_irq, unsigned int io_addr, unsigned int io_size)/* 分配各種硬體和軟體資源,在驅動程式初始化函數_static int init_module(void)中調用 */ _static void uhci_free_all(uhci_t *s) /* 釋放所有的由驅動程式分配的虛擬和物理資源:斷開與根集線器的連接、釋放I/O地址和中斷。在驅動程式模組卸載函數void cleanup_module(void) 中調用 */ 系統配置 1.編寫Makefile文件。在/home/uCLinux-coldfire/drivers/usb下建立sl811h的子目錄,將源代碼文件sl811h-usb.c 、sl811h.h、 sl811h-usb.h存入該目錄,並編寫Makefile文件: #SL811HS/T----- USB Host Controller driver INCLUDEDIR = /usr/src/linux/include CFLAGS = -D__KERNEL__ -DMODULE -O -Wall - static -I$(INCLUDEDIR) VER = $(shell awk -F" '/REL/ {print $$2}' $(INCLUDEDIR)/linux/version.h) all : sl811h-usb.o sl811h-usb.o: sl811h-usb.c sl811h-usb.h sl811h.h gcc sl811h-usb.c -c $(CFLAGS) # End this file 2.增加設備文件。在/home/uCLinux-coldfire/romfs/dev中增加一個設備文件。因dUSB設備主要都是通過快速串列通訊來讀寫資料,故一般作d字元設備:@sl811husb,c,180,0。其中sl811husb是設備名(device name),c代表字元設備(char device),180是主設備號(major),0是次設備號(minor)。 3.在目標系統上插入驅動程式模組到內核。編譯完成後,驅動程式可以作d一個模組動態加入到uClinux內核中,使用如下命令: # insmod sl811h-usb.o 例如: # insmod sl811h-usb.o io=0x540 irq=15 packet_len=192 至此, USB主機控制器的軟體設計完成,可以在萬禾嵌入式Linux平臺上運行USB主機,作d嵌入式設備與USB Slave設備進行通信。 結語 本文對在萬禾嵌入式Linux平臺上進行USB主機控制器的軟、硬體設計做了較d詳細的介紹。設計的重點和難點主要在於主機控制器晶片的驅動程式開發,但作d開源系統,在Linux上開發設備驅動程式有著其他嵌入式系統不可比擬的優勢,大量的開放源碼無疑可以加速開發的進程並使得其應用更加的廣泛。因此,USB作d一種新型的高速外設匯流排,在嵌入式Linux領域必定有著廣闊的應用前景
系統時間:2024-05-15 10:56:52
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!