<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

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

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

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

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

          本文引用地址:http://www.ex-cimer.com/article/237696.htm

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

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

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

          USB概述

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

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

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

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

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

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

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

          1. USB設(shè)備端通信過程

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

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

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



          上一頁 1 2 3 下一頁

          評(píng)論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();