音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

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

出處:聶金華 發(fā)布于:2007-11-24 08:39:30

隨著簡單易用的USB接口日益流行,在嵌入式系統(tǒng)中添加對USB接口的支持已成為大勢所趨。本文通過介紹Linux中支持USB的各種模塊和庫,分析了在Linux上利用USB實現(xiàn)高速串口和以太網(wǎng)連接等通信方式的具體方法。

  通用串行總線(USB,Universal Serial Bus)是一種非常實用的通信接口,其應用日益廣泛。有三種方法可以使運行Linux操作系統(tǒng)的嵌入式系統(tǒng)支持USB接口,本文將對這三種方法逐一進行介紹。

  基于Linux的USB設備與USB主機一般有以下三種通信方式:1.一些功能完備結(jié)構(gòu)也復雜的設備采用用戶定制內(nèi)核模塊來實現(xiàn)在標準USB總線上運行復雜的協(xié)議,而由USB主機上相應的用戶驅(qū)動程序和應用來完成連接。2.另一些基于Linux的USB設備則利用USB總線來實現(xiàn)與主機上所運行的某個應用的簡單的點對點串行連接。主機上的應用雖然利用了主操作系統(tǒng)所提供的USB編程接口,但表面看來卻似乎是在通過一個典型的串口進行通信。3.,還有些設備以主計算機作為網(wǎng)關(guān),將USB設備連接到辦公局域網(wǎng)或互聯(lián)網(wǎng)上,從而使USB設備看起仿佛構(gòu)成了一個以太網(wǎng)。這種方法性較強,但通??尚?,是主機驅(qū)動程序使該方法成為可能。

  在這三種方法中,您可以根據(jù)預留給開發(fā)的時間長短和期望USB接口在嵌入式應用中所扮演的角色來決定選用那一種方法比較恰當。為了幫助您做出正確的選擇,下一節(jié)將向您介紹這三種方法分別應用于基于Linux的USB設備時的情況,但首先讓我們對USB接口做一個大致介紹。

USB概述

  USB是一種方便快捷的接口,可用于為計算機工作站連接一些小配件。根據(jù)USB規(guī)范的定義,鼠標、鍵盤、音頻播放和錄音設備、照相機、大容量存儲設備以及許多其他設備均可以通過USB接口,以高達480Mbps的速度連接到一臺主計算機。協(xié)議定制者對USB上運行的這種復雜的主從式協(xié)議做出了仔細的說明,這就幫助保證了所有這些設備之間具備互操作性和兼容性。例如,該協(xié)議規(guī)定,USB設備只有在被詢問時才可以回答,并且USB主機會根據(jù)所連接的USB設備類型的不同,采用某些特定的格式,在某些特定的時間段從不同的設備獲取數(shù)據(jù)。

  USB 設備和主機之間通常通過專用的總線控制芯片建立連接。在USB主機上,名為UHCI或OHCI等的控制芯片通過插卡形式加入主機或直接集成到工作站的主板上。在主機一端的總線控制驅(qū)動程序管理著主機控制芯片,它同時還跟蹤監(jiān)視著主機目前連接的是哪些USB設備,從而決定應如何與它們通信。

  可用于連接照相機和鼠標之類USB設備的總線控制器有很多種。其中的一種就在一塊芯片上同時集成了USB接口以及另一端的串口、I2C接口或并口。USB控制器(包括主機上的和USB設備上的控制器)也可能集成到英特爾StrongARM或 Hitachi H8之類的微控制器中去。這些芯片及其外圍部件有點類似以太網(wǎng)和CAN控制器,不同的是他們用于連接USB設備,并運行USB協(xié)議。

  很多人都知道Linux操作系統(tǒng)中包含了USB主機控制器的驅(qū)動程序,因而USB鍵盤、數(shù)碼相機以及其他一些USB設備都可以在一個運行Linux操作系統(tǒng)的桌面工作站上使用。但很少有人知道Linux中還包含了一組USB設備控制器的驅(qū)動程序,尤其是集成到StrongARM SA1110處理器中的控制器。有了這些控制器驅(qū)動程序,基于Linux的嵌入式系統(tǒng)就能利用USB接口來與主計算機(運行Linux或其他操作系統(tǒng))通信。大多數(shù)USB通信的實現(xiàn)過程都是雙端的。主機利用一個內(nèi)核模塊或驅(qū)動程序來與USB設備通信,而USB設備則通過其自身的驅(qū)動程序來與主機通信。根據(jù)主機和USB設備所采用的通信風格的不同,驅(qū)動程序可以很簡單明白,也可以很復雜,很具挑戰(zhàn)性。本文主要關(guān)注USB設備端的通信過程,但也在適當?shù)牡胤桨岁P(guān)于主機端通信過程實現(xiàn)的信息。

  以下討論的技術(shù)應當引起讀者的注意。本文的目的是介紹如何在數(shù)碼相機和PDA等基于Linux的 USB設備上使用Linux。此處所指的USB設備是嚴格意義上的USB設備,即帶正方形連接器的完整的設備,而不是哪些連接器形狀為扁平矩形的設備。此外,USB連接的另一端(通常是一臺PC工作站),應該是一臺USB主機。

  關(guān)于USB信息包的格式和通信參數(shù)的詳細信息,見本文的參考文獻。

通過編寫內(nèi)核模塊添加USB接口

1. USB設備端通信過程

  向一個基于Linux的設備中添加USB接口的種方法是編寫一個用戶定制的Linux內(nèi)核模塊,這也是可實現(xiàn)完備功能的一種做法。采用這種方法時通常需要針對主機的操作系統(tǒng)(Windows, Linux等)開發(fā)相應的驅(qū)動程序。

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

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

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

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

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

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

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

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

2. USB主機端通信過程

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

利用USB實現(xiàn)高速串行通信

1. USB設備端通信過程

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

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

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

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

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

  在USB主機發(fā)送一個數(shù)據(jù)包時,設備的內(nèi)核模塊會通過回調(diào)方式調(diào)用rx_done_callback_packet_buffer()函數(shù),將數(shù)據(jù)包的內(nèi)容送入一個FIFO隊列,以便能通過read()函數(shù)將該數(shù)據(jù)包返回給usb-char設備節(jié)點。

2. USB主機端通信過程

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

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

  這種連接一旦建立,USB 主機上的應用就可以通過向特定的節(jié)點讀或?qū)懙姆绞脚c某USB設備通信。

 

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

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

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

利用USB實現(xiàn)以太網(wǎng)連接

1. USB 設備端通信過程

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

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

2. USB 主機端通信過程

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

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

USB通信的調(diào)試

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

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

Linux已成為通用型操作系統(tǒng)

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


  

參考文獻:

[1]. major  datasheet http://m.58mhw.cn/datasheet/major+_2533383.html.


關(guān)鍵詞:基于Linux的USB主/從設備之間的三種通信方式SA1100SA1110RS-232

版權(quán)與免責聲明

凡本網(wǎng)注明“出處:維庫電子市場網(wǎng)”的所有作品,版權(quán)均屬于維庫電子市場網(wǎng),轉(zhuǎn)載請必須注明維庫電子市場網(wǎng),http://m.58mhw.cn,違反者本網(wǎng)將追究相關(guān)法律責任。

本網(wǎng)轉(zhuǎn)載并注明自其它出處的作品,目的在于傳遞更多信息,并不代表本網(wǎng)贊同其觀點或證實其內(nèi)容的真實性,不承擔此類作品侵權(quán)行為的直接責任及連帶責任。其他媒體、網(wǎng)站或個人從本網(wǎng)轉(zhuǎn)載時,必須保留本網(wǎng)注明的作品出處,并自負版權(quán)等法律責任。

如涉及作品內(nèi)容、版權(quán)等問題,請在作品發(fā)表之日起一周內(nèi)與本網(wǎng)聯(lián)系,否則視為放棄相關(guān)權(quán)利。

OEM清單文件: OEM清單文件
*公司名:
*聯(lián)系人:
*手機號碼:
QQ:
有效期:

掃碼下載APP,
一鍵連接廣大的電子世界。

在線人工客服

買家服務:
賣家服務:
技術(shù)客服:

0571-85317607

網(wǎng)站技術(shù)支持

13606545031

客服在線時間周一至周五
9:00-17:30

關(guān)注官方微信號,
第一時間獲取資訊。

建議反饋

聯(lián)系人:

聯(lián)系方式:

按住滑塊,拖拽到最右邊
>>
感謝您向阿庫提出的寶貴意見,您的參與是維庫提升服務的動力!意見一經(jīng)采納,將有感恩紅包奉上哦!