<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

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

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

作者: 時(shí)間:2013-10-26 來(lái)源:網(wǎng)絡(luò ) 收藏

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

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

  在主機發(fā)送一個(gè)數據包時(shí),設備的內核模塊會(huì )通過(guò)回調方式調用rx_done_callback_packet_buffer()函數,將數據包的內容送入一個(gè)FIFO隊列,以便能通過(guò)read()函數將該數據包返回給usb-char設備節點(diǎn)。

2. USB主機端通信過(guò)程

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

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

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


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

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

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

利用USB實(shí)現以太網(wǎng)連接

1. USB 設備端通信過(guò)程

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

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

2. USB 主機端通信過(guò)程

  相應的,在運行 Linux操作系統的主機一端,可用來(lái)在USB上實(shí)現以太網(wǎng)連接的內核模塊叫做usbnet。安裝了該模塊之后,一旦主機與USB設備的連接建立起來(lái),它就會(huì )創(chuàng )建一個(gè)虛擬的以太網(wǎng)接口,在主機一端的內核模塊以及用戶(hù)應用看來(lái),這個(gè)虛擬的接口與真正的以太網(wǎng)接口別無(wú)二致。主機端的應用可以通過(guò)拼一個(gè)USB設備的IP地址來(lái)檢查該設備是否已經(jīng)連上,如果拼操作成功,那么就表示設備已經(jīng)連接成功。

  最近出現了一種針對Win32主機的usbnet風(fēng)格的驅動(dòng),叫做Bahia網(wǎng)絡(luò )驅動(dòng),關(guān)于該驅動(dòng)的詳細信息請訪(fǎng)問(wèn)www.bahia21.com/download.htm。

USB通信的調試

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

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

Linux已成為通用型操作系統

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

參考文獻:

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

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

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

linux相關(guān)文章:linux教程



上一頁(yè) 1 2 3 下一頁(yè)

關(guān)鍵詞: Linux USB 主從設備 通信方式

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>