• <li id="00i08"><input id="00i08"></input></li>
  • <sup id="00i08"><tbody id="00i08"></tbody></sup>
    <abbr id="00i08"></abbr>
  • 新聞中心

    EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式Linux下USB驅動程序的設計

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

    作者: 時間:2013-10-08 來源:網絡 收藏

      一、引言

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

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

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

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

      主機控制驅動主要是對USB主機控制器的驅動,在大多數PC環境下,主機控制器都是由操作系統提供。設備一般都沒有USB主機控制器,只是工作在Slave模式下。如果要使USB具有主機功能,那么設備中需要選用一個帶主機控制器的USB接口控制芯片, 同時自己還要有實現該主機控制器的驅動程序。目前內核中只提供USB主機控制器的開放主機控制器和通用主機控制器接口兩種規格,而這兩種規格主要用在PC架構中。USB主機端驅動程序與主機控制器的結構如圖2所示。其中USB核是的一個子模塊,集中定義了一組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操作系統文章專題:linux操作系統詳解(linux不再難懂)

    linux相關文章:linux教程



    上一頁 1 2 3 下一頁

    評論


    相關推薦

    技術專區

    關閉
    主站蜘蛛池模板: 清涧县| 无棣县| 临夏市| 忻州市| 西和县| 沂南县| 连山| 山东省| 德江县| 台中县| 宾川县| 彰武县| 凤阳县| 凌海市| 安宁市| 桑植县| 时尚| 郓城县| 东乌珠穆沁旗| 济源市| 江陵县| 平利县| 红原县| 连云港市| 安庆市| 长沙市| 东阳市| 大余县| 巴青县| 扶绥县| 平湖市| 若尔盖县| 柳河县| 甘肃省| 甘孜| 枣庄市| 奈曼旗| 翼城县| 沅陵县| 新津县| 沙坪坝区|