新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 基于Linux的USB主/從設備之間的三種通信方式

        基于Linux的USB主/從設備之間的三種通信方式

        作者: 時間:2013-10-26 來源:網絡 收藏



          一旦在設備中實現了用戶定制的內核模塊,就可以使該設備完成相當復雜的功能,例如仿真一個文件系統,從而允許嵌入式應用將其主機當作一個遠程存儲設備。除此以外,采用這種方法之后,設備還可以具備存儲轉發(store-and-forward)的功能,因而能夠在與主機的連接建立之前對來自嵌入式應用的數據流進行緩沖。

          在基于StrongARM的設備中,內核代碼用于管理芯片所攜帶的設備控制器外設,通過調用函數sa1100_usb_open ()來初始化。在初始化之后,內核模塊還會調用函數sa1100_usb_get_descriptor_ptr() 和sa1100_usb_set_string_descriptor()來設置在設備查詢期間傳送給USB主機的描述符,其中包含設備的數字廠商號和產品標識符,以及可以讓主機用來識別設備的字符串,甚至還有一個序列號域,以便主機可以唯一地識別一個連接在USB接口上的設備,或者在同種型號的多個設備中進行區分。

          設備查詢過程是由USB設備控制器驅動的,并且一旦和USB主機連上之后會自動執行,所以內核模塊必須在USB通信開始之前設置好每個設備的描述符。當準備工作就緒之后,USB設備模塊就會調用函數sa1100_usb_start()來通知內核接收主機發來的USB連接請求。如果設備模塊在連上USB 主機之前調用了函數sa1100_set_configured_callback(),那么接著內核模塊就會在查詢過程結束時調用回調函數?;卣{函數很適合用來在設備上發出警告或給出一些形象的暗示,說明連接已經建立。

          如果不再需要進行USB通信,那么設備的內核模塊就會先調用函數sa1100_usb_stop(),然后調用sa1100_usb_close(),來關閉SA1100上的USB控制器。

          StrongARM 的 USB控制器支持bulk-in和bulk-out兩種數據傳送方式。當接收來自USB主機的數據包時,內核模塊會調用sa1100_usb_recv (),將一個數據緩沖區的地址和一個回調函數送給它。然后內核中的USB設備控制代碼會從主機取回一個bulk-out數據包,將其內容存入制定的緩沖區,接著調用回調函數。

          下一步,回調函數從接收緩沖區中提取出數據,將其存放到其他地方,或者將緩沖區空間添加到一個隊列中,然后分配一個新的緩沖區來接收下一個數據包。然后,如果還有數據需要接收,那么回調函數會重新調用sa1100_usb_recv(),準備接收另一個數據包。

          向USB 主機發送數據的過程與此類似。內核模塊收集了一幀數據之后,將數據的存放地址、數據長度和回調函數的地址送給sa1100_usb_send()函數。接著,在數據傳送結束之后,內核模塊會調用回調函數。

          在www.embedded.com/code.htm (arch/arm/mach-sa1100/usb-char.c)可以找到一個叫做usb-char的模塊,這是一個很好的設備端SA1110 USB模塊的例子。該模塊將USB設備與USB 主機之間的連接變成一種高速串行鏈接。此外, usb-eth( arch/arm/mach-sa1100/usb-eth.c)模塊也是個不錯的例子,該模塊將USB變成了一種虛擬的以太型網絡。后面會深入探討這兩種模塊。

        2. USB主機端通信過程

          有些很好的主機端USB驅動程序的例子是隨主流操作系統的發布而提供的,位于The Linux Kernel Archives (kernel.org)發布的原始內核源代碼中。其中,Handspring Visor 模塊(drivers/usb/serial/visor.c)是一個編寫得更清晰,也更易理解的模塊,它同時也是USB 主機端模塊(drivers/usb/usb-skeleton.c)的模板。

        利用USB實現高速串行通信

        1. USB設備端通信過程

          為了達到最實用的效果,我們可以將USB總線簡單地看作一個高速串口,然后,在一些嵌入式設備和應用中,我們就可以用USB接口來模擬串口。 StrongARM處理器的Linux內核就提供了一個名為usb-char的USB設備驅動程序,它所完成的恰好就是用USB模擬串口的功能。

          當需要與USB 主機通信時,Linux操作系統中的USB設備應用只是簡單地打開一個與其usb-char設備節點的連接(連接類型為字符型,major number 為10, minor 為240),然后就開始讀寫數據。在與USB 主機的連接建立之前,read()和write()操作均返回一個錯誤信息。一旦連接建立好,并且設備查詢完成之后,USB接口就開始象一個點對點的串口一樣與主機進行通信。

          這種進行USB數據傳送的方法非常簡單有效,因而usb-char設備模塊發布之后一直很受歡迎。而且,該模塊還為通過其他方法進行USB通信提供了一個參考。  

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        linux相關文章:linux教程




        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 郯城县| 三明市| 长宁县| 云龙县| 巴塘县| 巴彦县| 布拖县| 翁牛特旗| 景宁| 临海市| 永州市| 峨眉山市| 固阳县| 铜山县| 清流县| 宜兴市| 柳河县| 常州市| 肥乡县| 大埔区| 黄陵县| 枣阳市| 陆川县| 赤峰市| 略阳县| 四会市| 泰州市| 盐津县| 石城县| 维西| 浏阳市| 阜城县| 金川县| 凌海市| 贡觉县| 焉耆| 汾西县| 丰顺县| 静宁县| 成安县| 亳州市|