在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 模擬技術(shù) > 設計應用 > 基于Linux的USB設備

            基于Linux的USB設備

            作者:Bill 時間:2003-07-16 來源:電子設計應用 收藏

            引言
            通用串行總線()是一種快速而靈活地連接配件與計算機工作站的接口,其應用非常廣泛。Linux中除了包含對主機控制器的驅(qū)動,還含有設備控制器,尤其是集成在StrongARM SA1110處理器上的控制器的驅(qū)動。這些控制器驅(qū)動通過使用USB可使基于Linux的嵌入式系統(tǒng)與主機 (運行的可以是Linux,或不是)進行通信。這里提供三種方法給運行Linux操作系統(tǒng)的嵌入式系統(tǒng)增加USB支持,可采用其中一種與USB主機展開通信。
            第一種,最復雜的設備采用專門編寫的內(nèi)核模塊解析標準USB總線上通行的錯綜復雜的高層協(xié)議;相應的USB主機定制驅(qū)動和應用程序來完成連接。第二種,有些基于Linux的設備把總線當作一種簡單的運行在主機上的點對點串行連接使用;主機應用程序采用主機操作系統(tǒng)提供的USB編程界面,而其外在表現(xiàn)則仿佛是在通過一種典型的串行端口進行通信。第三種,另有一些設備把USB看作一種以太網(wǎng)絡,它們用主機作網(wǎng)關(guān),把USB設備與辦公LAN或Internet相連接。通常的做法是使用專門的主機驅(qū)動實現(xiàn)它。
            最佳方案的選擇取決于研發(fā)所需時間,以及針對具體嵌入式應用,要把USB接口作成什么樣。以下對這三種方法如何在基于Linux的USB設備上的應用逐一進行描述。本文是關(guān)于如何在基于Linux的照相機和PDA之類的USB設備上使用Linux的論述,在此,USB是指由方形連接器而非扁平矩形連接器構(gòu)成的USB設備。

            本文引用地址:http://www.biyoush.com/article/1924.htm

            內(nèi)核模塊
            把USB加到基于Linux的設備上的第一種方法是編寫一個定制的Linux內(nèi)核模塊。這種方法通常要求相應開發(fā)主機操作系統(tǒng)(Windows、Linux以及其它OS)的驅(qū)動。
            借助定制內(nèi)核模塊在設備中的安裝,可以進行文件系統(tǒng)仿真等,使嵌入式應用將其USB主機當作遠程存儲設備對待。這一方法的另一潛在用途是構(gòu)成一種存儲轉(zhuǎn)發(fā)字符設備,從嵌入式應用程序中緩沖數(shù)據(jù)流,直到USB主機連接完成建立為止。
            對于基于StrongARM的Linux設備,其USB應用內(nèi)核模塊調(diào)用sa1100_usb_open(),對管理芯片的板上USB設備控制器外設的內(nèi)核代碼進行初始化。然后該模塊調(diào)用sa1100_usb_get_descriptor_ptr()和sa1100_usb_set_string_descriptor(),通過枚舉過程對USB主機的給定USB描述符進行設置。這些描述符包括設備供貨商及產(chǎn)品的數(shù)字標識符、正文字符串等主機可用來對設備進行識別的信息。甚至有一個序列號域,以便主機唯一地識別設備或?qū)SB上相同設備的多個實例加以區(qū)分。
            內(nèi)核模塊必須在開始USB通信前完成USB描述符的建立,這是因為枚舉過程由USB設備控制器驅(qū)動,一旦USB主機連上后會自動執(zhí)行。一切準備就緒后,USB設備模塊便調(diào)用sa1100_usb_start(),告訴內(nèi)核接受來自主機的USB連接請求。如果模塊在USB主機連上前調(diào)用sa1100_set_configured_ callback(),那么內(nèi)核將會在枚舉過程結(jié)束時調(diào)用所提供的回調(diào)函數(shù)?;卣{(diào)函數(shù)能很好地對設備完成連接狀態(tài)進行可視化指示。
            如果USB通信不再需要,那么設備的內(nèi)核模塊便調(diào)用sa1100_usb_stop(),然后是 sa1100_usb_close(),關(guān)閉SA1100的USB控制器。
            StrongARM USB控制器支持數(shù)據(jù)傳輸作業(yè)的bulk-in 和bulk-out。在從USB主機接收數(shù)據(jù)包時,內(nèi)核模塊調(diào)用sa1100_usb_recv(),把數(shù)據(jù)緩沖區(qū)和回調(diào)函數(shù)地址傳遞給它。然后內(nèi)核的底層USB設備控制代碼對來自主機的bulk-out包進行檢索,把內(nèi)容放于緩沖區(qū)中,并調(diào)用回調(diào)函數(shù)。
            回調(diào)函數(shù)必須從接收緩沖區(qū)提取數(shù)據(jù)并保存于其它位置或者把緩沖區(qū)空間加到一個隊列中,為下一個數(shù)據(jù)包的接收分配新的緩沖區(qū)。而后回調(diào)函數(shù)二次調(diào)用sa1100_usb_recv(),在需要時進行下一個數(shù)據(jù)包的接收。過程與對USB主機的數(shù)據(jù)傳輸相類似。在聚集起一幀的數(shù)據(jù)量后,內(nèi)核模塊將數(shù)據(jù)的地址、長度和回調(diào)地址傳遞給sa1100_usb_send()。傳輸完成時,內(nèi)核調(diào)用回調(diào)函數(shù)。
            主機
            主機端USB驅(qū)動的幾個例子在主流的Linux版本以及Linux內(nèi)核檔案組織分配的原始內(nèi)核源中都有提供。用于Handspring Visor(drivers/usb/serial/visor.c)的模塊是編寫較為簡潔易懂的模塊之一,作為USB主機端模塊的模板(drivers/usb/usb-skeleton.c)使用。

            高速串行
            對于大多數(shù)實際應用來說, 可以把USB總線當作一種高速串行端口考慮。如此在某些類型的嵌入式設備和應用中對它進行原型模擬是有意義的。StrongARM處理器的Linux內(nèi)核提供現(xiàn)成的USB設備驅(qū)動專工于此,稱作usb-char。
            在希望與USB主機通信時,Linux USB設備應用程序只是打開對其usb-char設備節(jié)點(字符型,最大10,最小240)的連接,然后開始讀寫數(shù)據(jù)即可。read()和 write()操作將一直返回錯誤值直到USB主機連上為止。一旦連接建立和枚舉完成,便開始通信,就像USB是一種點對點串行端口一樣。
            由于這種USB數(shù)據(jù)傳遞方法十分直接且實用,因此usb-char設備得到高效使用。它還為其它USB通信方法的實現(xiàn)提供了重要的參照基準。
            usb-char的實際動作從usbc_open()功能開始,部分內(nèi)容示于列表1中。
            列表1:打開USB上的串行連接
            static int usbc_open(struct inode *pInode, struct file *pFile)
            {
            int retval = 0;
            /* start usb core */
            sa1100_usb_open(_sb-char?;
            /* allocate memory for in-transit USB packets */
            tx_buf = (char*) kmalloc(TX_PACKET_SIZE, GFP_KERNEL | GFP_DMA);
            packet_buffer = (char*) kmalloc(RX_PACKET_SIZE, GFP_KERNEL | GFP_DMA);
            /* allocate memory for the receive buffer; the contents of this
            buffer are provided during read() */
            rx_ring.buf = (char*) kmalloc(RBUF_SIZE, GFP_KERNEL);
            /* set up USB descriptors */
            twiddle_descriptors();
            /* enable USB i/o */
            sa1100_usb_start();
            /* set up to receive a packet */
            kick_start_rx();
            return 0;
            twiddle_descriptors()功能建立起設備的USB描述符。在描述符全部建起后,準備從USB主機枚舉并接收一個數(shù)據(jù)幀。kick_start_rx()所需的代碼大多數(shù)情況下只是一種對sa1100_usb_recv() 的調(diào)用以建立回調(diào)而已。當USB主機發(fā)送數(shù)據(jù)包時,設備的內(nèi)核通過回調(diào)調(diào)用rx_done_callback_packet_buffer()函數(shù),把數(shù)據(jù)包的內(nèi)容移入usb-char 設備點上由read()返回的FIFO隊列。
            主機
            對于運行Linux的USB主機,usb-char相應的USB主機模塊稱為usbserial模塊。大多數(shù)Linux版本都包括Usbserial模塊,盡管通常不是自動裝入。在USB與設備的連接建立之前,usbserial 由modprobe 或 insmod載入。
            一旦USB設備開始枚舉,主機上的應用程序便用usbserial設備點(字符型,最大188,最小0以上)之一與設備進行通信。這些節(jié)點通常命名為/dev/ttyUSBn。Usbserial模塊在內(nèi)核報文日志記錄中報告它把哪個節(jié)點指定給USB設備使用:
            usbserial.c: 通用轉(zhuǎn)換器刪除
            usbserial.c: 通用轉(zhuǎn)換器當前連到ttyUSB0上。連接建立后,USB主機上的應用程序便通過讀寫指定的節(jié)點與USB設備進行通信。
            Linux主機上usbserial模塊的一種替代選擇是一種稱作libusb(libusb.sourceforge.net)的庫。這種庫使用低層內(nèi)核系統(tǒng)調(diào)用進行USB數(shù)據(jù)傳輸,而不是通過usbserial模塊,在某種程度上跨Linux內(nèi)核版本建立和使用時更方便。Libusb庫還提供大量有用的調(diào)試功能,這一點在對運行在USB鏈路上的復雜通信協(xié)議進行除錯時有幫助。用libusb與采用usb-char的USB設備進行通信時,Linux主機應用程序使用usb_open()函數(shù)建立與該設備的連接。然后應用程序使用usb_bulk_read()和usb_bulk_write()與設備交換數(shù)據(jù)。

            USB上的以太網(wǎng)
            另一種選擇是把USB作為一種以太網(wǎng)絡來對待。Linux具有在主機和設備端均可實現(xiàn)這種功能的模塊。由于iPAQ硬件既沒有可接入的串行端口也沒有一種專用的網(wǎng)絡接口,因此,iPAQ 的Linux內(nèi)核專門采用這種通信策略,在StrongARM的Linux內(nèi)核中,usb-eth模塊(arch/arm/mach-sa1100/usb-eth.c)對用USB作物理媒介的虛構(gòu)以太網(wǎng)設備進行仿真。一旦創(chuàng)建后,這一網(wǎng)絡界面便被指定一個IP地址,否則作為通常的以太網(wǎng)硬件對待。一旦USB主機連上后,usb-eth模塊便能使USB設備“看到” Internet(如果存在Internet的話),ping測其它IP地址,甚至“談論”DHCP, HTTP, NFS, telnet, 和e-mail。簡言之,任何在實際的以太網(wǎng)界面上運行的應用將不折不扣地在usb-eth接口上得到實現(xiàn),因為它們不能分辨出其正在使用的不是實在的以太網(wǎng)硬件。
            主機
            在Linux主機上,相應的Ethernet-over-USB內(nèi)核模塊稱為usbnet。當usbnet模塊得到安裝且設備的USB連接建立完成時,usbnet模塊便針對主機端內(nèi)核及用戶應用創(chuàng)建一個與實際硬件酷似的虛構(gòu)以太網(wǎng)界面,主機端應用程序通過運行設備IP地址ping測,可以檢查USB設備的存在。如果ping測成功,設備便加上了。

            結(jié)語
            Linux不再只是USB主機使用,當今它也是USB設備的合適選擇,Linux 下的USB通信是非常靈活和易用的。(鋤禾譯)

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



            關(guān)鍵詞: USB

            評論


            相關(guān)推薦

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

            關(guān)閉