• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            USB描述符詳解

            一、基本概念  

              1、USB協(xié)議本身很復(fù)雜,但方便在提供了統(tǒng)一的接口方式,使得驅(qū)動(dòng)程序在使用設(shè)備的時(shí)候,工作簡(jiǎn)化到了類似操作串行接口。

              2、USB設(shè)備可以看作提供了多個(gè)串口的設(shè)備,依據(jù)USB的規(guī)范,我們將每個(gè)串口稱作端點(diǎn)(Endpoint),要和這個(gè)端點(diǎn)通信,我們就要打開到這個(gè)端點(diǎn)的連接,這個(gè)連接就是管道(Pipe)。

              3、打開端點(diǎn)之后,就可以像串口一樣進(jìn)行數(shù)據(jù)傳輸了。USB有4種不同類型的傳輸方式:控制傳輸(Control Transfer),批量傳輸(Bulk Transfer),中斷傳輸(Interrupt Transfer)和實(shí)時(shí)傳輸(IsochTransfer)。

              4、由于一個(gè)設(shè)備可能要適應(yīng)多種情況,端點(diǎn)的設(shè)置會(huì)有多套,以備使用。端點(diǎn)設(shè)置稱為接口(Interface)。USB設(shè)備展現(xiàn)給我們能夠找到的東西就是這些Interface,我們選擇要用的Interface,就可以找到Endpoint,再打開Endpoint,就可以傳輸數(shù)據(jù)了。所以,在驅(qū)動(dòng)程序開始的時(shí)候,需要記錄下這些Interface。

              5、例如:OV511+的端點(diǎn)0是控制端點(diǎn),用來設(shè)置參數(shù)以及起停設(shè)備;端點(diǎn)1是實(shí)時(shí)傳輸端點(diǎn),用來傳輸視頻。端點(diǎn)1有8套不同的設(shè)置,主要區(qū)別就在于一次傳輸?shù)臄?shù)據(jù)幀的大小,所以在USBDeviceAttach的時(shí)候,要記錄這些設(shè)置到驅(qū)動(dòng)程序中,后面才能夠選用。

            二、描述符介紹
               標(biāo)準(zhǔn)的USB設(shè)備有5種USB描述符:設(shè)備描述符,配置描述符,字符串描述符,接口描述符,端點(diǎn)描述符。下面詳解:

            1、設(shè)備描述符:一個(gè)設(shè)備只有一個(gè)設(shè)備描述符

            typedef struct _USB_DEVICE_DESCRIPTOR_
            {
                BYTE        bLength,
                BYTE        bDescriptorType,
                WORD      bcdUSB,
                BYTE        bDeviceClass,
                BTYE        bDeviceSubClass,
                BYTE        bDeviceProtol,
                BYTE        bMaxPacketSize0,
                WORD      idVenderI,
                WORD      idProduct,
                WORD      bcdDevice,
                BYTE        iManufacturer,
                BYTE        iProduct,
                BYTE        iSerialNumber,
                BYTE        iNumConfiguations
            }USB_DEVICE_DESCRIPTOR;

            bLength : 描述符大小.固定為0x12.
            bDescriptorType : 設(shè)備描述符類型.固定為0x01.
            bcdUSB : USB 規(guī)范發(fā)布號(hào).表示了本設(shè)備能適用于那種協(xié)議,如2.0=0200,1.1=0110等.

            bDeviceClass : 類型代碼(由USB指定)。當(dāng)它的值是0時(shí),表示所有接口在配置描述符里,并且所有接口是獨(dú)立的。當(dāng)它的值是1到FEH時(shí),表示不同的接口關(guān)聯(lián)的。當(dāng)它的值是FFH時(shí),它是廠商自己定義的.
            bDeviceSubClass : 子類型代碼(由USB分配).如果bDeviceClass值是0,一定要設(shè)置為0.其它情況就跟據(jù)USB-IF組織定義的編碼.
            bDeviceProtocol : 協(xié)議代碼(由USB分配).如果使用USB-IF組織定義的協(xié)議,就需要設(shè)置這里的值,否則直接設(shè)置為0。如果廠商自己定義的可以設(shè)置為FFH.
            bMaxPacketSize0 : 端點(diǎn)0最大分組大小(只有8,16,32,64有效).
            idVendor : 供應(yīng)商ID(由USB分配).

            idProduct : 產(chǎn)品ID(由廠商分配).由供應(yīng)商ID和產(chǎn)品ID,就可以讓操作系統(tǒng)加載不同的驅(qū)動(dòng)程序.
            bcdDevice : 設(shè)備出產(chǎn)編碼.由廠家自行設(shè)置.

            iManufacturer : 廠商描述符字符串索引.索引到對(duì)應(yīng)的字符串描述符. 為0則表示沒有.
            iProduct : :產(chǎn)品描述符字符串索引.同上.
            iSerialNumber : 設(shè)備序列號(hào)字符串索引.同上.
            bNumConfigurations : 可能的配置數(shù).指配置字符串的個(gè)數(shù)
            2、配置描述符:配置描述符定義了設(shè)備的配置信息,一個(gè)設(shè)備可以有多個(gè)配置描述符
            typedef struct _USB_CONFIGURATION_DESCRIPTOR_
            {
                BYTE      bLength,
                BYTE      bDescriptorType,
                WORD    wTotalLength,
                BYTE      bNumInterfaces,
                BYTE      bConfigurationValue,
                BYTE      iConfiguration,
                BYTE      bmAttributes,
                BYTE      MaxPower
            }USB_CONFIGURATION_DESCRIPTOR;

            bLength : 描述符大小.固定為0x09.
            bDescriptorType : 配置描述符類型.固定為0x02.
            wTotalLength : 返回整個(gè)數(shù)據(jù)的長(zhǎng)度.指此配置返回的配置描述符,接口描述符以及端點(diǎn)描述符的全部大小.
            bNumInterfaces : 配置所支持的接口數(shù).指該配置配備的接口數(shù)量,也表示該配置下接口描述符數(shù)量.
            bConfigurationValue : 作為Set Configuration的一個(gè)參數(shù)選擇配置值.
            iConfiguration : 用于描述該配置字符串描述符的索引.
            bmAttributes : 供電模式選擇.Bit4-0保留,D7:總線供電,D6:自供電,D5:遠(yuǎn)程喚醒.
            MaxPower : 總線供電的USB設(shè)備的最大消耗電流.以2mA為單位.
            3、接口描述符:接口描述符說明了接口所提供的配置,一個(gè)配置所擁有的接口數(shù)量通過配置描述符的bNumInterfaces決定
            typedef struct _USB_INTERFACE_DESCRIPTOR_
            {
                BYTE      bLength,
                BYTE      bDescriptorType,
                BYTE      bInterfaceNumber,
                BYTE      bAlternateSetting,
                BYTE      bNumEndpoint,
                BYTE      bInterfaceClass,
                BYTE      bInterfaceSubClass,
                BYTE      bInterfaceProtocol,
                BYTE      iInterface
            }USB_INTERFACE_DESCRIPTOR;

            bLength : 描述符大小.固定為0x09.
            bDescriptorType : 接口描述符類型.固定為0x04.
            bInterfaceNumber: 該接口的編號(hào).
            bAlternateSetting : 用于為上一個(gè)字段選擇可供替換的位置.即備用的接口描述符標(biāo)號(hào).
            bNumEndpoint : 使用的端點(diǎn)數(shù)目.端點(diǎn)0除外.
            bInterfaceClass : 類型代碼(由USB分配).
            bInterfaceSunClass : 子類型代碼(由USB分配).
            bInterfaceProtocol : 協(xié)議代碼(由USB分配).
            iInterface : 字符串描述符的索引
            4、端點(diǎn)描述符:USB設(shè)備中的每個(gè)端點(diǎn)都有自己的端點(diǎn)描述符,由接口描述符中的bNumEndpoint決定其數(shù)量
            typedef struct _USB_ENDPOINT_DESCRIPTOR_
            {
                BYTE        bLength,
                BYTE        bDescriptorType,
                BYTE        bEndpointAddress,
                BYTE        bmAttributes,
                WORD      wMaxPacketSize,
                BYTE        bInterval
            }USB_ENDPOINT_DESCRIPTOR;

            bLength : 描述符大小.固定為0x07.
            bDescriptorType : 接口描述符類型.固定為0x05.
            bEndpointType : USB設(shè)備的端點(diǎn)地址.Bit7,方向,對(duì)于控制端點(diǎn)可以忽略,1/0:IN/OUT.Bit6-4,保留.BIt3-0:端點(diǎn)號(hào).
            bmAttributes : 端點(diǎn)屬性.Bit7-2,保留.BIt1-0:00控制,01同步,02批量,03中斷.
            wMaxPacketSize : 本端點(diǎn)接收或發(fā)送的最大信息包大小.
            bInterval : 輪訓(xùn)數(shù)據(jù)傳送端點(diǎn)的時(shí)間間隔.對(duì)于批量傳送和控制傳送的端點(diǎn)忽略.對(duì)于同步傳送的端點(diǎn),必須為1,對(duì)于中斷傳送的端點(diǎn),范圍為1-255.
            5、字符串描述符:其中字符串描述符是可選的.如果不支持字符串描述符,其設(shè)備,配置,接口描述符內(nèi)的所有字符串描述符索引都必須為0
            typedef struct _USB_STRING_DESCRIPTION_
            {
                BYTE      bLength,
                BYTE      bDescriptionType,
                BYTE      bString[1];
            }USB_STRING_DESCRIPTION;

            bLength : 描述符大小.由整個(gè)字符串的長(zhǎng)度加上bLength和bDescriptorType的長(zhǎng)度決定.
            bDescriptorType : 接口描述符類型.固定為0x03.
            bString[1] : Unicode編碼字符串.

            本文來自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/alien75/archive/2009/09/30/4622319.aspx

            posted on 2010-11-18 11:30 wrh 閱讀(2057) 評(píng)論(0)  編輯 收藏 引用


            只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            導(dǎo)航

            <2025年7月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            統(tǒng)計(jì)

            常用鏈接

            留言簿(19)

            隨筆檔案

            文章檔案

            收藏夾

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久一日本道色综合久久| 国内精品综合久久久40p| 亚洲国产一成久久精品国产成人综合| 国产精品一区二区久久国产| 99久久亚洲综合精品成人| 亚洲国产成人久久精品动漫| 久久夜色精品国产www| 无码人妻久久一区二区三区| 久久国产精品偷99| 亚洲va久久久久| 久久精品99久久香蕉国产色戒 | 理论片午午伦夜理片久久| 97精品伊人久久大香线蕉| 国产精品久久久久久久久鸭 | 91久久婷婷国产综合精品青草| 久久精品成人免费观看97| 久久精品国产亚洲av水果派| 久久er国产精品免费观看8| 日本久久久久亚洲中字幕 | 一本色道久久99一综合| 国产69精品久久久久99尤物| 久久精品日日躁夜夜躁欧美| 丁香五月综合久久激情| 精品永久久福利一区二区| 最新久久免费视频| 久久性精品| 国产三级观看久久| 国产一久久香蕉国产线看观看| 久久久久亚洲AV成人网人人网站| 久久久久女教师免费一区| 久久91精品国产91久久小草| 久久国产亚洲高清观看| 日韩AV无码久久一区二区| 欧美喷潮久久久XXXXx| 久久狠狠爱亚洲综合影院 | 久久久久久夜精品精品免费啦| 久久人妻AV中文字幕| 久久婷婷五月综合色奶水99啪| 久久免费香蕉视频| 一本综合久久国产二区| 伊人伊成久久人综合网777|