嵌入式Linux下USB驅動程序的設計

2021-01-09 電子產品世界

  一、引言

本文引用地址:http://www.eepw.com.cn/article/237803.htm

  USB(Universal Serial Bus)即通用串行總線,是一種全新的雙向同步傳輸的支持熱插拔的數據傳輸總線,其目的是為了提供一種兼容不同速度的、可擴充的並且使用方便的外圍設備接口,同時也是為了解決計算機接口的太多的弊端而設計的。一個USB系統主要有三部分組成:USB互連、USB主機、USB設備三部分組成的,其結構如圖1所示。在編寫USB設備驅動程序設計時,可以分為三部分編寫:主機端設備驅動程序、主機控制器驅動程序設計和設備端驅動程序三部分,在本文中重點介紹主機端驅動程序的設計。

  二、USB設備驅動程序的設計

  USB設備驅動程序的設計包括主機端設備驅動程序設計、主機控制器驅動程序設計和設備端驅動程序設計三部分組成。主機端設備驅動程序就是通常說的設備驅動程序,它是主機環境中為用戶應用程式提供一個訪問USB外設的接口。Linux為這部分驅動程序提供編程接口,驅動程序設計者只要按照需求編寫驅動程序框架,通過調用作業系統提供的API接口函數可以完成對USB外設的特定訪問。

  主機控制驅動主要是對USB主機控制器的驅動,在大多數PC環境下,主機控制器都是由作業系統提供。嵌入式設備一般都沒有USB主機控制器,只是工作在Slave模式下。如果要使USB具有主機功能,那麼設備中需要選用一個帶主機控制器的USB接口控制晶片, 同時自己還要有實現該主機控制器的驅動程序。目前Linux內核中只提供USB主機控制器的開放主機控制器和通用主機控制器接口兩種規格,而這兩種規格主要用在PC架構中。USB主機端驅動程序與主機控制器的結構如圖2所示。其中USB核是Linux的一個子模塊,集中定義了一組USB相關的數據結構、宏以及API函數。

  USB設備驅動程序是常說的設備固件程序的一部分,提供設備信息與主機的通信接口。設備端USB驅動程序設計由以下幾部分處理程序組成。初始化例程:完成描述符指針、端點、配置改變等操作。數據傳輸例程:完成控制傳輸、批量傳輸、中斷傳輸及同步傳輸等傳輸方式下的數據收發工作。標準設備處理請求:處理標準設備請求。廠商請求處理:處理生產商指定請求。其他操作:處理主機發出的埠復位、配置改變等操作。

  1.USB設備驅動程序框架

  USB驅動程序首先要向Linux內核註冊自己,並告訴系統它所支持的設備類型以及它所支持的操作。這些信息通過一個usb_driver結構來傳遞。usb_driver結構如下:

  static struct usb_driver skel_driver = {

  name: "skeleton";/*驅動程序的名稱*/

  probe: skel_probe; /*設備列舉時被調用*/

  disconnect: skel_disconnect; /*設備被卸載時被調用*/

  fops: skel_fops; /*指向一個file_operation結構,內核通過它來訪問驅動程序的文件操作函數,與用戶程序的read、write等操作進行交互*/

  minor USB_SKEL_MINOR_BASE; /*指向設備的次設備號,用於系統識別主設備號相同的設備(即一個驅動程序可以同時支持多個USB設備*/

  id_table: skel_table; /*保存設備的廠商ID和產品ID,作為該設備的唯一標識,驅動程序向系統註冊後,當下次插入時,系統根據這個標識查找正確的驅動程序,實現設備的即插即用*/

  };

  static struct file_operation skel_fops={

  {

  owner:THIS_MODULE,

  read:skel_read,

  write:skel_write,

  ioctl:skel_ioctl,

  open:skel_open,

  release:skel_release,

  };

  (1)註冊和註銷

  USB驅動程序註冊,就是把在初始化函數中填好的use_driver結構作為參數傳遞給

  use_register()函數即可,函數的調用方法為:

  result=usb_register(skel_driver);

  當要從系統卸載驅動程序時,也是將use_driver結構作為參數傳遞給usb_deregister 函數處理。 函數的調用格式為:

  static void __exit usb_skel_exit(void)

  { /* deregister this driver with the USB subsystem */

  usb_deregister(skel_driver);

  }

  module_exit(usb_skel_exit);

  當USB設備插入時,為了使linux-hotplug(Linux中PCI、USB等設備熱插拔支持)系統自動裝載驅動程序,需要創建一個MODULE_DEVICE_TABLE。核心代碼如下(這個模塊僅支持某一特定設備):

  /* table of devices that work with this driver */

  static struct usb_device_id skel_table [] = {

  { USB_DEVICE(USB_SKEL_VENDOR_ID,

  USB_SKEL_PRODUCT_ID) },

  { } /* Terminating entry */

  };

  MODULE_DEVICE_TABLE (usb, skel_table);

  USB_DEVICE宏利用廠商ID和產品ID提供了一個設備的唯一標識。當系統插入一個ID匹配的USB設備到USB總線時,驅動會在USB core中註冊,驅動程序中probe 函數也就會被調用。usb_device 結構指針、接口號和接口ID都會被傳遞到函數中。

相關焦點

  • 嵌入式Linux的USB驅動設計
    摘要:本文主要介紹了Linux平臺的USB設備驅動開發的一般步驟方法和技巧,通過詳細介紹USB的相關概念和Linux中USB設備驅動程序的數據結構,框架和步驟,並通過設計和實現一個驅動的實例,總結了USB驅動的一般方法和技巧。
  • Linux環境下的USB攝像頭驅動開發
    摘要:嵌入式環境下的USB攝像頭驅動需要充分利用USB總線與內核中的USB核心密切配合併且保證數據流的高速與穩定。本文從Linux內核的USB核心模塊出發,遵循Video4Linux接口標準,採用urb策略與內存映射的方式以提高數據讀取速度,設計開發了基於Linux環境下的USB攝像頭驅動,並在ARM9實驗平臺上對該驅動程序進行了測試與分析。
  • Linux USB總線驅動框架分析
    1、USB驅動引入USB(全稱 Universal Serial Bus,通用串行總線),已經成為PC及嵌入式設備中最常用、最便捷的通信接口。Linux USB子系統較為龐大,本文主要對Linux系統下的USB總線驅動框架進行概述,重點的細節待後續文章展開。
  • 基於μCLinux的USB驅動程序實現
    在此介紹FTDI公司的USB晶片FT245BL的主要性能、工作原理,並將其應用在Blackfin ADSP-BF533微處理器的嵌入式開發平臺上,說明在μClinux下編寫與加載USB接口晶片FT245BL的驅動程序方法,實現了DSP主板的 USB埠通信。
  • USB設備驅動程序
    // drivers\hid\usbhid\usbmouse.c#include "linux/kernel.h"#include "linux/slab.h"#include "linux/module.h"#include "linux/init.h"#include "linux/usb/input.h
  • linux下USB驅動移植
    >#include linux/device.h>#include linux/delay.h>/*end add*//**********************add by lfc*************************************/static struct s3c2410_hcd_info usb_sbc2410
  • 基於嵌入式Linux系統的3G/4G路由器設計
    Linux硬體平臺模塊的功能主要有兩個方面,一方面要支持無線網卡和無線數據卡的驅動,另一方面要通過嵌入式Linux系統中的iptables數據包過濾系統將無線區域網和3G/4G網絡連通。本設計方案中採用的嵌入式Linux系統的內核版本號為2.6.32,該內核中與 USB設備的VID和PID號相關的源碼存在kernel/drivers/usb/serial/option.c中,修改該文件並添加本 終端設計方案中所採用的華為E392無線上網卡的VID和PID,過程如下:# define HUAWEI_VENDOR_ID 0x12D1# define
  • 一種基於嵌入式Linux系統的的無線路由器設計方案
    本文引用地址:http://www.eepw.com.cn/article/262484.htmlinux作業系統文章專題:linux作業系統詳解(linux不再難懂)  目前,WiFi技術能夠支持IEEE的802.11b、802.11g和802.1ln標準,分別支持10
  • 實時嵌入式作業系統VxWorks設備驅動程序的設計
    摘要:在嵌入式實時系統中進行軟硬體開發的關鍵是編寫高效可靠的設備驅動程序,而VxWorks下END網口驅動程序是設備驅動程序中較為複雜的一類。
  • 基於ARM11的嵌入式Linux NAND FLASH模擬U盤掛載分析與實現
    摘要:介紹了嵌入式Linux作業系統下基於三星微處理器S3C6410的NAND FLASH模擬U盤的原理與實現方法。作業系統採用Linux 2.6.28版本,平臺為飛凌OK6410-A開發板。
  • SEP6200平臺上Linux內核的USB OTG驅動設計
    首先介紹了OTG標準中的對話請求協議(SRP)和主機交換協議(HNP),然後制定並設計了基於USB控制晶片USB3343的硬體模塊方案,最後根據Linux內核中已有的USB驅動架構完成了USB OTG設備驅動的設計,並最終實現了SEP6200嵌入式平臺USB Host和Device角色的自由轉換功能。
  • 基於USB設備的Linux網絡驅動程序開發
    它支持主流的TCP/IP以及IPX/SPX、 NETBEUI等眾多網絡協議,無論在嵌入式系統,伺服器還是桌面作業系統領域,Linux都取得了廣泛的應用。網絡驅動程序和網絡硬體設備實現網絡協議棧中的數據鏈路層和物理層,對上層協議提供支持,是網絡協議棧的重要組成部分,對Linux的網絡性能起著決定作用。本文主要討論基於USB總線的 Linux網絡驅動程序的設計和實現方法。2.
  • 基於Qt的嵌入式Linux通訊簿程序設計
    摘 要: 隨著嵌入式系統的發展,在Linux 下使用Qt 開發嵌入式應用程式是嵌入式圖形用戶界面( GUI) 系統應用研究的重點。通過一個通訊簿程序的設計,給出了基於Qt 的嵌入式Linux 程序開發的關鍵技術,包括QtDesigner、信號與槽機制的使用、程序主要功能代碼的實現以及程序開發的整體過程。
  • 嵌入式Linux學習方法 適合初學者設計學習計劃
    又是arm,又是linux,又是uboot頭都大了。不知道自己究竟從哪裡開始?本文引用地址:http://www.eepw.com.cn/article/201706/361182.htm  下面就跟著我學習設計嵌入式工程師的修煉日記吧!
  • 嵌入式Linux移植實時設備驅動程序
    在嵌入式程序的密集I/O空間中,同樣重要的是,將RTOS的應用硬體接口代碼向具有更加規範化模式的Linux設備啟動程序的移植。本文將縱覽幾種常用的內存映射I/O方法,它們經常出現於舊的嵌入式應用中。它們涵蓋的範圍,包括從對中斷服務例程的特殊使用和用戶線程對硬體訪問,到出現於有些ROTS中的半規範化驅動程序模型。
  • 嵌入式Linux應用程式訪問物理地址的實例
    由於驅動對外需要有個統一接口,所以定義了一些結構體,鍊表等機制,以便讓應用程式操作簡單化,數據在內核一應用之間的複製,填充結構體等都需要時間開銷,有時按這種標準調用方式,因為操作時間過長,無法完成設計目的。
  • 嵌入式Linux設備驅動開發之:按鍵驅動程序實例
    按鍵同樣使用GPIO接口,但按鍵本身需要外部的輸入,即在驅動程序中要處理外部中斷。按鍵硬體驅動原理圖如圖11-7所示。在圖11-7的4×4矩陣按鍵(K1~K16)電路中,使用4個輸入/輸出埠(EINT0、EINT2、EINT11和EINT19)和4個輸出埠(KSCAN0~KSCAN3)。
  • 《嵌入式Linux應用程式開發標準教程》(第2版)
    編程基礎Linux下C編程基礎之:Linux下C語言編程概述Linux下C編程基礎之:常用編輯器Linux下C編程基礎之:gcc編譯器Linux下C編程基礎之:gdb調試器Linux下C編程基礎之:make工程管理器Linux下C編程基礎之:使用autotoolsLinux下C編程基礎之:實驗內容
  • 嵌入式開發課程簡介
    本期學習的主要目標是精通嵌入式Linux下的程序設計,熟練掌握嵌入式Linux的開發環境,深刻體會整個嵌入式Linux項目開發流程,強化學員對Linux應用開發的能力,了解QT GUI開發。能夠獨立完成Mplayer應用開發項目。在工作中能很快適應項目中所涉及到的多任務編程,並且能快速轉移到其它作業系統應用開發。
  • 嵌入式Linux設備驅動開發之:GPIO驅動程序實例
    根據各種系統設計的需求,通過軟體方法可以將這些埠配置成具有相應功能(例如:外部中斷或數據總線)的埠。為了控制這些埠,S3C2410處理器為每個埠組分別提供幾種相應的控制寄存器。其中最常用的有埠配置寄存器(GPACON~GPHCON)和埠數據寄存器(GPADAT~GPHDAT)。