久久ER99热精品一区二区-久久精品99国产精品日本-久久精品免费一区二区三区-久久综合九色综合欧美狠狠

新聞中心

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

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

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

  在usb -char中,真正的操作開始于usbc_open()函數,列表1給出了函數的一部分代碼。筆者由于臨時的興趣,對該代碼做了一點修改,取消了錯誤和超時句柄。在此向代碼的原作者Brad Parker、Nicolas Pitre 和Ward Willats致歉。

  twiddle_descriptors()函數用于設置設備的描述符。在描述符設置好之后,我們就可以開始進行設備查詢,并從 主機接收一幀數據。kick_start_rx()函數段的代碼主要用于調用sa1100_usb_recv(),建立回調。

  在主機發送一個數據包時,設備的內核模塊會通過回調方式調用rx_done_callback_packet_buffer()函數,將數據包的內容送入一個FIFO隊列,以便能通過read()函數將該數據包返回給usb-char設備節點。

2. USB主機端通信過程

  對于運行操作系統的USB 主機,與usb-char相應的USB 主機模塊叫做usbserial。大多數版本中都包含了該模塊,但它并不總能自動加載。通常應在主機與USB設備之間的連接建立之前利用 modprobe 或insmod加載該模塊。

  USB設備查詢完成之后,主機上的一項應用就會利用某個usbserial設備節點(字符型, major 為188, minor 大于等于0)與其通信。這些節點通常叫做/dev/ttyUSBn。Usbserial模塊會報告它將哪一個節點分配給了哪一臺USB設備,并將這一信息按如下方式記載在內核消息記錄中: =================================== usbserial.c:檢測到一般轉換器 usbserial.c:將一般轉換器加入ttyUSB0 ==================================

  這種連接一旦建立,USB 主機上的應用就可以通過向特定的節點讀或寫的方式與某USB設備通信。


  此時,筆者并未考慮在運行Win32或其他類型操作系統的主機上已有類似usbserial的模塊。但用于這些主機上的任何USB驅動程序,只要能夠進行bulk-in 和 bulk-out數據傳輸,就很可能是一個近乎完整的驅動程序,只需進行一定的產品調整,并添加與產品綁定的廠商ID。

   主機上還有另一種類似usbserial模塊的庫,叫做libusb (參見libusb.sourceforge.net)。該庫通過低級的內核系統調用而不是通過usbserial模塊來完成USB數據傳輸,因而在 Linux kernel版本上更容易設置和使用。同時,該庫還能提供大量實用的調試功能,十分利于對USB鏈接上運行的復雜的通信協議進行調試。

  為了通過libusb與一個采用了usb-char模塊的USB設備進行通信,Linux主機應用首先通過庫中的usb_open()函數與設備建立連接,然后利用函數usb_bulk_read()和usb_bulk_write()與設備交換數據。Libusb中含有幾個程序范例。

利用USB實現以太網連接

1. USB 設備端通信過程

  如果利用USB連接來實現高速串口并非您所希望,那么您還可以將所有USB連接用作一個以太網。不論在主機端還是在設備端,Linux均有模塊能實現這一功能。iPAQ(掌上電腦)的Linux內核就獨一無二地采用了這種通信策略,因為iPAQ硬件中既沒有可訪問的串口也沒有專門的網絡接口。

  StrongARM Linux內核中,有一個叫做usb-eth的模塊(arch/arm/mach-sa1100/usb-eth.c),它利用USB作為物理媒介,模擬出一個虛構的以太網設備。一旦這種網絡接口創建起來之后,就可以為它分配IP地址,并且外部環境均將其作為一個普通的以太網硬件對待。一旦USB 主機連接建立起來,usb-eth模塊就允許USB設備“瀏覽”因特網,拼其他的IP地址,甚至通過DHCP、HTTP、NFS或者遠程網“交談”,以及收發電子郵件。簡而言之,任何能夠在真正的以太網接口上運行的應用都可以原封不動地在usb-eth 上運行,因為這些應用無法識別它們所使用的其實并非真正的以太網硬件。

2. USB 主機端通信過程

  相應的,在運行 Linux操作系統的主機一端,可用來在USB上實現以太網連接的內核模塊叫做usbnet。安裝了該模塊之后,一旦主機與USB設備的連接建立起來,它就會創建一個虛擬的以太網接口,在主機一端的內核模塊以及用戶應用看來,這個虛擬的接口與真正的以太網接口別無二致。主機端的應用可以通過拼一個USB設備的IP地址來檢查該設備是否已經連上,如果拼操作成功,那么就表示設備已經連接成功。

  最近出現了一種針對Win32主機的usbnet風格的驅動,叫做Bahia網絡驅動,關于該驅動的詳細信息請訪問www.bahia21.com/download.htm。

USB通信的調試

  遺憾的是,在USB 主機與Linux USB設備之間進行通信時,能夠幫助我們跟蹤通信過程中出現的問題的工具實在不多。除了libusb所提供的調試功能以外(該功能十分強大,但對于內核的系統調用接口則無能為力),在一次失敗的設備查詢或數據傳輸的嘗試過程中發生了什么問題?只有內核源代碼和記錄能夠提供一些線索。筆者嘗試在開發過程中向 USB 主機和設備代碼中大量添加printk()函數調用,但這種方法會引入額外開銷,從而改變USB代碼自身的性能,這在有些情況下反而是事與愿違。

  對那些希望對 USB設備接口進行逆向工程處理,或者希望查找其產品缺陷的Linux開發者而言,一個叫做USB Snoopy (home.jps.net/~koma)的程序是個不錯的選擇。只是USB Snoopy僅能在Win32主機上運行。關于USB Snoopy的詳細信息或關于常規的USB調試,請參看本文末給出的參考文獻中Jan Axelson撰寫的 “USB Debug Tips”。

Linux已成為通用型操作系統

  如今Linux已不再是USB 主機專用的操作系統了,USB設備也可以方便地選擇它。而且Linux下的USB通信太靈活易用了,因而筆者采用其他易用型串口(RS-232)的日子很可能就此結束,對我而言,這是件好事。

參考文獻:

[1].major datasheethttp://www.dzsc.com/datasheet/major+_2533383.html.

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

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

linux相關文章:linux教程



上一頁 1 2 3 下一頁

評論


相關推薦

技術專區

關閉