在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,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首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > USB驅(qū)動程序框架搭建

            USB驅(qū)動程序框架搭建

            作者: 時間:2016-12-15 來源:網(wǎng)絡(luò) 收藏
            1.首先我們先從理論上淺談一下USB驅(qū)動的框架
            app:
            -------------------------------------------
            USB設(shè)備驅(qū)動程序 // 知道數(shù)據(jù)含義
            內(nèi)核 --------------------------------------
            USB總線驅(qū)動程序 // 1. 識別, 2. 找到匹配的設(shè)備驅(qū)動, 3. 提供USB讀寫函數(shù) (它不知道數(shù)據(jù)含義)
            -------------------------------------------
            USB主機控制器
            UHCI OHCI EHCI
            硬件 -----------
            USB設(shè)備
            UHCI: intel, 低速(1.5Mbps)/全速(12Mbps)
            OHCI: microsoft 低速/全速
            EHCI: 高速(480Mbps)
            也就是說最底層是usb設(shè)備,往上是USB總線控制器、USB總線驅(qū)動程序、USB驅(qū)動程序,最后是應(yīng)用程序。其中USB總線控制器包括三種:UHCI OHCI EHCI
            2. USB總線驅(qū)動程序的作用
            1. 識別USB設(shè)備
            1.1 分配地址
            1.2 并告訴USB設(shè)備(set address)
            1.3 發(fā)出命令獲取描述符
            描述符的信息可以在includelinuxusbCh9.h看到
            2. 查找并安裝對應(yīng)的設(shè)備驅(qū)動程序
            3. 提供USB讀寫函數(shù)
            3、我們開始正式構(gòu)建linux usb框架了,小心了?。?!
            首先我們需要從開發(fā)板獲得一些信息:
            把USB設(shè)備接到開發(fā)板上,看輸出信息:
            usb 1-1: new full speed USB device using s3c2410-ohci and address 2
            usb 1-1: configuration #1 chosen from 1 choice
            scsi0 : SCSI emulation for USB Mass Storage devices
            scsi 0:0:0:0: Direct-Access HTC Android Phone 0100 PQ: 0 ANSI: 2
            sd 0:0:0:0: [sda] Attached SCSI removable disk
            拔掉
            usb 1-1: USB disconnect, address 2
            再接上:
            usb 1-1: new full speed USB device using s3c2410-ohci and address 3
            usb 1-1: configuration #1 chosen from 1 choice
            scsi1 : SCSI emulation for USB Mass Storage devices
            scsi 1:0:0:0: Direct-Access HTC Android Phone 0100 PQ: 0 ANSI: 2
            sd 1:0:0:0: [sda] Attached SCSI removable disk
            接著我們就可以根據(jù)這些信息進(jìn)行分析了:
            首先我們在內(nèi)核的dirvers目錄下搜索:“USB device using
            grep "USB device using" * -nR
            結(jié)果搜到了下面這條信息:usb/core/hub.c:2186: "%s %s speed %sUSB device using %s and address %d",
            那么我們就從usb/core/hub.c這個文件開始分析:
            "%s %s speed %sUSB device using %s and address %d"這句話在hub_port_init 函數(shù)中被調(diào)用
            hub_port_init 在函數(shù)hub_port_connect_change中被調(diào)用
            hub_port_connect_change在函數(shù)hub_events中被調(diào)用
            hub_events在函數(shù)hub_thread中被調(diào)用
            hub_thread函數(shù)里有這么一句:
            wait_event_interruptible(khubd_wait,!list_empty(&hub_event_list) ||kthread_should_stop());
            說明進(jìn)程會在khubd_wait這個等待隊列里休眠,那么誰把它喚醒呢?我們搜索一下
            在kick_khubd函數(shù)里有這么一句:wake_up(&khubd_wait);把進(jìn)程喚醒了
            kick_khubd被函數(shù)hub_irq調(diào)用,根據(jù)注釋信息我們知道當(dāng)連接發(fā)生變化或則出現(xiàn)措施就會發(fā)生中斷,從而進(jìn)入這個函數(shù)。
            那么我們大致可以總結(jié)出了框架:
            hub_irq //發(fā)生接口狀態(tài)變化或出現(xiàn)錯誤時調(diào)用
            kick_khubd
            wake_up//喚醒進(jìn)程
            hub_thread//進(jìn)程在這個函數(shù)里休眠了,被wake up喚醒后會繼續(xù)執(zhí)行
            hub_port_connect_change //我們重點來分析它
            udev = usb_alloc_dev(hdev, hdev->bus, port1);
            dev->dev.bus = &usb_bus_type;//指定設(shè)備總線是usb類型的
            choose_address(udev);//在0到128之間找到一個設(shè)備地址,至于為什么是128我們之前已經(jīng)講過了
            hub_port_init
            hub_set_address//將上面找到的地址告訴usb設(shè)備
            usb_get_device_descriptor(udev, 8);//獲取設(shè)備描述符
            usb_get_device_descriptor(udev, USB_DT_DEVICE_SIZE);//再次獲取設(shè)備描述符,我們在 //usb協(xié)議分析里面有談到過的
            usb_new_device//把所有的描述符都讀出來并解析
            usb_get_configuration(udev);//獲取配置信息
            usb_cache_string(udev, udev->descriptor.iProduct);//讀取產(chǎn)品信息
            usb_cache_string(udev,udev->descriptor.iManufacturer);//讀取制造商信息
            usb_cache_string(udev, udev->descriptor.iSerialNumber);//讀取序列號信息
            __usb_get_extra_descriptor//獲得一些額外的信息
            device_add(&udev->dev);// 把device放入usb_bus_type的dev鏈表,
            // 從usb_bus_type的driver鏈表里取出usb_driver,
            // 把usb_interface和usb_driver的id_table比較
            // 如果能匹配,調(diào)用usb_driver的probe
            我們來總結(jié)一下上面的框架:首先接上usb設(shè)備時會發(fā) 生中斷,然后喚醒進(jìn)程。接著先設(shè)置usb設(shè)備的地址,然后獲取設(shè)備描述符和配置描述符等各種描述符,這是為了尋找驅(qū)動程序。接著將usb設(shè)備加入到鏈表里,和驅(qū)動比較,如果匹配就調(diào)用probe函數(shù)。



            關(guān)鍵詞: USB驅(qū)動程序框架搭

            評論


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

            關(guān)閉