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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 嵌入式Linux下USB驅(qū)動(dòng)程序的設(shè)計(jì)

          嵌入式Linux下USB驅(qū)動(dòng)程序的設(shè)計(jì)

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

            一、引言

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

            (Universal Serial Bus)即通用串行總線,是一種全新的雙向同步傳輸?shù)闹С譄岵灏蔚臄?shù)據(jù)傳輸總線,其目的是為了提供一種兼容不同速度的、可擴(kuò)充的并且使用方便的外圍設(shè)備接口,同時(shí)也是為了解決計(jì)算機(jī)接口的太多的弊端而設(shè)計(jì)的。一個(gè)系統(tǒng)主要有三部分組成:互連、USB主機(jī)、USB設(shè)備三部分組成的,其結(jié)構(gòu)如圖1所示。在編寫USB設(shè)備設(shè)計(jì)時(shí),可以分為三部分編寫:主機(jī)端設(shè)備、主機(jī)控制器設(shè)計(jì)和設(shè)備端驅(qū)動(dòng)程序三部分,在本文中重點(diǎn)介紹主機(jī)端驅(qū)動(dòng)程序的設(shè)計(jì)。

            二、USB設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)

            USB設(shè)備驅(qū)動(dòng)程序的設(shè)計(jì)包括主機(jī)端設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)、主機(jī)控制器驅(qū)動(dòng)程序設(shè)計(jì)和設(shè)備端驅(qū)動(dòng)程序設(shè)計(jì)三部分組成。主機(jī)端設(shè)備驅(qū)動(dòng)程序就是通常說(shuō)的設(shè)備驅(qū)動(dòng)程序,它是主機(jī)環(huán)境中為用戶應(yīng)用程序提供一個(gè)訪問USB外設(shè)的接口。為這部分驅(qū)動(dòng)程序提供編程接口,驅(qū)動(dòng)程序設(shè)計(jì)者只要按照需求編寫驅(qū)動(dòng)程序框架,通過調(diào)用操作系統(tǒng)提供的API接口函數(shù)可以完成對(duì)USB外設(shè)的特定訪問。

            主機(jī)控制驅(qū)動(dòng)主要是對(duì)USB主機(jī)控制器的驅(qū)動(dòng),在大多數(shù)PC環(huán)境下,主機(jī)控制器都是由操作系統(tǒng)提供。設(shè)備一般都沒有USB主機(jī)控制器,只是工作在Slave模式下。如果要使USB具有主機(jī)功能,那么設(shè)備中需要選用一個(gè)帶主機(jī)控制器的USB接口控制芯片, 同時(shí)自己還要有實(shí)現(xiàn)該主機(jī)控制器的驅(qū)動(dòng)程序。目前內(nèi)核中只提供USB主機(jī)控制器的開放主機(jī)控制器和通用主機(jī)控制器接口兩種規(guī)格,而這兩種規(guī)格主要用在PC架構(gòu)中。USB主機(jī)端驅(qū)動(dòng)程序與主機(jī)控制器的結(jié)構(gòu)如圖2所示。其中USB核是的一個(gè)子模塊,集中定義了一組USB相關(guān)的數(shù)據(jù)結(jié)構(gòu)、宏以及API函數(shù)。

            USB設(shè)備驅(qū)動(dòng)程序是常說(shuō)的設(shè)備固件程序的一部分,提供設(shè)備信息與主機(jī)的通信接口。設(shè)備端USB驅(qū)動(dòng)程序設(shè)計(jì)由以下幾部分處理程序組成。初始化例程:完成描述符指針、端點(diǎn)、配置改變等操作。數(shù)據(jù)傳輸例程:完成控制傳輸、批量傳輸、中斷傳輸及同步傳輸?shù)葌鬏敺绞较碌臄?shù)據(jù)收發(fā)工作。標(biāo)準(zhǔn)設(shè)備處理請(qǐng)求:處理標(biāo)準(zhǔn)設(shè)備請(qǐng)求。廠商請(qǐng)求處理:處理生產(chǎn)商指定請(qǐng)求。其他操作:處理主機(jī)發(fā)出的端口復(fù)位、配置改變等操作。

            1.USB設(shè)備驅(qū)動(dòng)程序框架

            USB驅(qū)動(dòng)程序首先要向Linux內(nèi)核注冊(cè)自己,并告訴系統(tǒng)它所支持的設(shè)備類型以及它所支持的操作。這些信息通過一個(gè)usb_driver結(jié)構(gòu)來(lái)傳遞。usb_driver結(jié)構(gòu)如下:

            static struct usb_driver skel_driver = {

            name: "skeleton";/*驅(qū)動(dòng)程序的名稱*/

            probe: skel_probe; /*設(shè)備列舉時(shí)被調(diào)用*/

            disconnect: skel_disconnect; /*設(shè)備被卸載時(shí)被調(diào)用*/

            fops: skel_fops; /*指向一個(gè)file_operation結(jié)構(gòu),內(nèi)核通過它來(lái)訪問驅(qū)動(dòng)程序的文件操作函數(shù),與用戶程序的read、write等操作進(jìn)行交互*/

            minor USB_SKEL_MINOR_BASE; /*指向設(shè)備的次設(shè)備號(hào),用于系統(tǒng)識(shí)別主設(shè)備號(hào)相同的設(shè)備(即一個(gè)驅(qū)動(dòng)程序可以同時(shí)支持多個(gè)USB設(shè)備*/

            id_table: skel_table; /*保存設(shè)備的廠商ID和產(chǎn)品ID,作為該設(shè)備的唯一標(biāo)識(shí),驅(qū)動(dòng)程序向系統(tǒng)注冊(cè)后,當(dāng)下次插入時(shí),系統(tǒng)根據(jù)這個(gè)標(biāo)識(shí)查找正確的驅(qū)動(dòng)程序,實(shí)現(xiàn)設(shè)備的即插即用*/

            };

            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)注冊(cè)和注銷

            USB驅(qū)動(dòng)程序注冊(cè),就是把在初始化函數(shù)中填好的use_driver結(jié)構(gòu)作為參數(shù)傳遞給

            use_register()函數(shù)即可,函數(shù)的調(diào)用方法為:

            result=usb_register(skel_driver);

            當(dāng)要從系統(tǒng)卸載驅(qū)動(dòng)程序時(shí),也是將use_driver結(jié)構(gòu)作為參數(shù)傳遞給usb_deregister 函數(shù)處理。 函數(shù)的調(diào)用格式為:

            static void __exit usb_skel_exit(void)

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

            usb_deregister(skel_driver);

            }

            module_exit(usb_skel_exit);

            當(dāng)USB設(shè)備插入時(shí),為了使linux-hotplug(Linux中PCI、USB等設(shè)備熱插拔支持)系統(tǒng)自動(dòng)裝載驅(qū)動(dòng)程序,需要?jiǎng)?chuàng)建一個(gè)MODULE_DEVICE_TABLE。核心代碼如下(這個(gè)模塊僅支持某一特定設(shè)備):

            /* 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和產(chǎn)品ID提供了一個(gè)設(shè)備的唯一標(biāo)識(shí)。當(dāng)系統(tǒng)插入一個(gè)ID匹配的USB設(shè)備到USB總線時(shí),驅(qū)動(dòng)會(huì)在USB core中注冊(cè),驅(qū)動(dòng)程序中probe 函數(shù)也就會(huì)被調(diào)用。usb_device 結(jié)構(gòu)指針、接口號(hào)和接口ID都會(huì)被傳遞到函數(shù)中。

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

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



          上一頁(yè) 1 2 3 下一頁(yè)

          評(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); })();