免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
usb枚舉過(guò)程

對(duì)2440USB HOST進(jìn)行初始化完畢(主要包括對(duì)符合OHCI規(guī)范的寄存器的初始化總線復(fù)位、中斷使能、清除中斷標(biāo)志、電源管理、內(nèi)存指針寄存器的初始化,各種數(shù)據(jù)結(jié)構(gòu)的初始化等),等待USB設(shè)備的插入,當(dāng)2440檢測(cè)到有設(shè)備插入,就要對(duì)設(shè)備進(jìn)行枚舉了。那么為什么要對(duì)設(shè)備進(jìn)行枚舉呢?起始枚舉就相當(dāng)于主機(jī)和設(shè)備建立連接的過(guò)程(接頭),HostDevice詢問(wèn)一些東西,Device將自身的設(shè)備類型,如何進(jìn)行通信報(bào)告給Host,這樣Host就知道怎么著對(duì)Device進(jìn)行操作了。

枚舉的過(guò)程實(shí)際上用到而且只用到了總線的“控制傳輸(Control Transfer)”的傳輸方式。這種傳輸方式通常用于配置/命令/狀態(tài)等情形,其中的設(shè)置操作setup和狀態(tài)操作status過(guò)程的數(shù)據(jù)包具有USB協(xié)議定義的數(shù)據(jù)結(jié)構(gòu),因此,控制傳輸只能通過(guò)消息管道進(jìn)行。

一個(gè)完整的控制傳輸包括三個(gè)過(guò)程:1.建立連接    2.數(shù)據(jù)過(guò)程(可選)         3.狀態(tài)過(guò)程

建立連接的過(guò)程都是有Host發(fā)起,它開始于一個(gè)Setup令牌包,后面緊跟一個(gè)DATA0包。如果是控制輸入傳輸,數(shù)據(jù)過(guò)程則為輸入數(shù)據(jù),若是控制輸出傳輸,則數(shù)據(jù)過(guò)程是輸出數(shù)據(jù)。

數(shù)據(jù)過(guò)程的可選型是指設(shè)置過(guò)程需要指定數(shù)據(jù)長(zhǎng)度,如果指定為0,則沒有數(shù)據(jù)過(guò)程。狀態(tài)過(guò)程跟在數(shù)據(jù)過(guò)程之后,狀態(tài)過(guò)程恰好和數(shù)據(jù)過(guò)程的數(shù)據(jù)傳輸方向相反,因?yàn)榇穗A段主要是用來(lái)確認(rèn)之前兩階段的所有數(shù)據(jù)都已經(jīng)正確傳輸了。

       好了,下面就結(jié)合我的這個(gè)實(shí)例來(lái)看看枚舉的詳細(xì)過(guò)程:

       1.控制2440U盤發(fā)送第一個(gè)Setup包,內(nèi)容是80 06 00 01 00 00 08 00,其中最后的0008表示得到DEVICE_DCESCRIPTOR的前8個(gè)字節(jié),因?yàn)檫@個(gè)包的主要目的是要獲得USB Device中端點(diǎn)0的最大包的大?。ǖ?/span>8個(gè)字節(jié)),所以只需要8個(gè)字節(jié)就可以了。USB Device返回的設(shè)備標(biāo)識(shí)符為12 01 10 01 00 00 00 40,下面我們需要對(duì)0x40記錄下來(lái),將其放到Endpoint Descriptor數(shù)據(jù)結(jié)構(gòu)的DWORD0MPSbit16~bit32)塊中去。

       2.接下來(lái)2440發(fā)送第二個(gè)Setup包,內(nèi)容是00 05 01 00 00 00 00 00這一個(gè)次的作用是為USB設(shè)備分配地址(相當(dāng)于SD卡中的RCA)。如果USB Device接收并接受了此地址設(shè)置包,會(huì)返回一個(gè)長(zhǎng)度為0的數(shù)據(jù)包。Host接收到長(zhǎng)度為0的狀態(tài)包之后就會(huì)返回一個(gè)ACKDevice,Device再接收到這個(gè)ACK之后,就可以啟用新地址了。這樣Device就得到了一個(gè)唯一的設(shè)備地址,作為主機(jī)通信的唯一表示。

3.發(fā)送第三個(gè)Setup包,內(nèi)容是80 06 00 02 00 00 09 00,這次是為了獲取配置描述符集合的大小,此位位于讀回?cái)?shù)據(jù)的第三個(gè)字節(jié)。U盤返回的數(shù)據(jù)為09 02 20 00 01 01 00 80 32,即描述符集合總大小為0x20。

4.發(fā)送第四個(gè)Setup包,內(nèi)容是80 06 00 02 00 00 09 00,和上次不同的僅僅是,這次要讀回來(lái)的數(shù)據(jù)是整個(gè)配置描述符區(qū)域。U盤返回來(lái)的數(shù)據(jù)是09 02 20 00 01 01 00 80 32 09 04 00 00 02 08 06 50 00 07 05 82 02 40 00 00 07 05 02 02 40 00 00

這時(shí)候我們就可以知道該設(shè)備是什么類型的設(shè)備,支持什么樣的操作了。

上述這兩個(gè)過(guò)程也有的程序就是直接讀取0xff個(gè)字符大小,當(dāng)然同樣可以達(dá)到讀回設(shè)備描述符集合的目的。

至此,我們已經(jīng)得到了所需要的設(shè)備信息,之后就可以對(duì)設(shè)備進(jìn)行配置了。

5.向設(shè)備發(fā)送第五個(gè)Setup包,數(shù)據(jù)為00 09 01 00 00 00 00 00USB Device返回一個(gè)長(zhǎng)度為0的數(shù)據(jù)包,表明數(shù)據(jù)正確接收。

至此,USB的枚舉過(guò)程就完成了。

以上是我的理解,不知道有沒有什么問(wèn)題。有什么問(wèn)題希望大家指出,謝謝!

附:USB1.1規(guī)范中對(duì)枚舉過(guò)程的說(shuō)明
9.1.2 Bus Enumeration
When a USB device is attached to or removed from the USB, the host uses a process known as bus
enumeration to identify and manage the device state changes necessary. When a USB device is attached to
a powered port, the following actions are taken:
1. The hub to which the USB device is now attached informs the host of the event via a reply on its status
change pipe (refer to Section 11.13.3 for more information). At this point, the USB device is in the
Powered state and the port to which it is attached is disabled.
2. The host determines the exact nature of the change by querying the hub.
3. Now that the host knows the port to which the new device has been attached, the host then waits for at
least 100 ms to allow completion of an insertion process and for power at the device to become stable.
The host then issues a port enable and reset command to that port. Refer to Section 7.1.7.1 and Figure
7-19 for sequence of events and timings of connection through device reset.
4. The hub maintains the reset signal to that port for 10 ms (See Section 11.5.1.5). When the reset signal
is released, the port has been enabled. The USB device is now in the Default state and can draw no
more than 100mA from VBUS. All of its registers and state have been reset and it answers to the
default address.
5. The host assigns a unique address to the USB device, moving the device to the Address state.
6. Before the USB device receives a unique address, its Default Control Pipe is still accessible via the
default address. The host reads the device descriptor to determine what actual maximum data payload
size this USB device’s default pipe can use.
7. The host reads the configuration information from the device by reading each configuration zero to
n-1, where n is the number of configurations. This process may take several milliseconds to complete.
8. Based on the configuration information and how the USB device will be used, the host assigns a
configuration value to the device. The device is now in the Configured state and all of the endpoints in
this configuration have taken on their described characteristics. The USB device may now draw the
amount of VBUS power described in its descriptor for the selected configuration. From the device’s
point of view it is now ready for use.
When the USB device is removed, the hub again sends a notification to the host. Detaching a device
disables the port to which it had been attached. Upon receiving the detach notification, the host will update
its local topological information.



當(dāng)USB設(shè)備插拔時(shí)候,主機(jī)會(huì)使用稱為總線枚舉的過(guò)程來(lái)識(shí)別和管理設(shè)備。當(dāng)USB設(shè)備插入端口時(shí),主機(jī)所要作的事情是:
(1) USB設(shè)備通過(guò)所連接的集線器向主機(jī)報(bào)告連接事件,此時(shí),設(shè)備處于上電的狀態(tài),而連接的端口處于禁止的狀態(tài)。
(2) 主機(jī)通過(guò)查詢集線器端口確定變化的類型。
(3) 主機(jī)等待100ms讓設(shè)備的電源變得穩(wěn)定,然后向端口發(fā)出復(fù)位命令。
(4) 集線器在該端口執(zhí)行復(fù)位處理,復(fù)位完成后激活該端口。此時(shí),USB設(shè)備處于默認(rèn)狀態(tài)。
(5) 主機(jī)給設(shè)備分配一個(gè)唯一的地址,使設(shè)備進(jìn)入尋址狀態(tài)。
(6) 在USB設(shè)備接受到唯一的地址前,主機(jī)仍可以以默認(rèn)控制管道和地址訪問(wèn)設(shè)備。主機(jī)讀出設(shè)備描述符,確定設(shè)備默認(rèn)管道的實(shí)際最大數(shù)據(jù)的有效負(fù)載。
(7) 通過(guò)讀0~n-1個(gè)配置,主機(jī)可查找到設(shè)備的配置。
(8) 主機(jī)給設(shè)備分配一個(gè)配置值,使設(shè)備處于配置狀態(tài)。從設(shè)備的觀點(diǎn)來(lái)看,它已經(jīng)可以使用了。

6.      USB的枚舉過(guò)程

內(nèi)核輔助線程khubd用來(lái)監(jiān)視與該集線器連接的所有端口,通常情況下,該線程處于休眠狀態(tài),當(dāng)集線器驅(qū)動(dòng)程序檢測(cè)到USB端口狀態(tài)變化后,該內(nèi)核線程立馬喚醒。

USB的枚舉過(guò)程:USB的枚舉過(guò)程是熱插拔USB設(shè)備的起始步驟,該過(guò)程中,主機(jī)控制器獲取設(shè)備的相關(guān)信息并配置好設(shè)備,集線器驅(qū)動(dòng)程序負(fù)責(zé)該枚舉過(guò)程。枚舉過(guò)程主要分如下幾步:

Step1:根集線器報(bào)告插入設(shè)備導(dǎo)致的端口電流變化,集線器驅(qū)動(dòng)程序檢測(cè)到這一狀態(tài)變化后,喚醒khubd線程。

Step2:khubd識(shí)別出電流變化的那個(gè)端口

Step3:khubd通過(guò)給控制端點(diǎn)0發(fā)送控制URB來(lái)實(shí)現(xiàn)從1-127中選出一個(gè)數(shù)作為插入設(shè)備的批量端點(diǎn)

Step4:khubd利用端口0使用的控制URB從插入的設(shè)備那里獲得設(shè)備描述符,然后獲得配置描述符,并選擇一個(gè)合適的。

Step5:khubd請(qǐng)求USB核心把對(duì)應(yīng)的客戶驅(qū)動(dòng)程序和該USB設(shè)備掛鉤。

主機(jī)控制器驅(qū)動(dòng)程序負(fù)責(zé)USB總線通信基本的職責(zé)
} 處理USB狀態(tài)。管理狀態(tài)并報(bào)告狀態(tài)信息
} 數(shù)據(jù)串行/解串行,將設(shè)備申請(qǐng)傳輸?shù)臄?shù)據(jù)轉(zhuǎn)換成比特流
} 生成frame或microframe
} 處理數(shù)據(jù)傳輸?shù)恼?qǐng)求
} 處理USB總線協(xié)議
} 進(jìn)行差錯(cuò)檢測(cè)和控制
} 處理能源管理請(qǐng)求,把總線置為suspended狀態(tài)以及響應(yīng)wakeup事件
} 提供root hub功能,讓設(shè)備可以連接到主機(jī)控制器

usbcore注冊(cè)了USB總線,USB文件系統(tǒng),USB Hub以及USB的設(shè)備驅(qū)動(dòng)usb generic driver等。

數(shù)據(jù)包分Token, Data, Handshake, Special,四種包有自己的數(shù)據(jù)組織方式
usb_hub_init()開啟一個(gè)名為"khubd"的內(nèi)核線程
hub_port_connect_change()是核心函數(shù),以端口發(fā)現(xiàn)有新的USB設(shè)備插入為例,USB Hub為USB設(shè)備做了以下幾步重要的工作,注意這里所謂的USB設(shè)備是指插入U(xiǎn)SB Hub的外接USB設(shè)備(包括Hub和Functions),接下來(lái)Hub都在為USB設(shè)備服務(wù)。

1) usb_alloc_dev() 為USB設(shè)備申請(qǐng)一個(gè)sturct usb_device結(jié)構(gòu)。

2) usb_set_device_state() 設(shè)置USB設(shè)備狀態(tài)為上電狀態(tài)。(硬件上設(shè)備已進(jìn)入powered狀態(tài))。

3) choose_address() 為USB設(shè)備選擇一個(gè)地址,利用一個(gè)輪詢算法為設(shè)備從0-127里選擇一個(gè)地址號(hào)。

4) hub_port_init() 端口初始化,實(shí)質(zhì)就是獲取設(shè)備描述符device descriptor。

5) usb_get_status() 這個(gè)有點(diǎn)特殊,它是專門給Hub又外接Hub而準(zhǔn)備的。

6) usb_new_device() 這時(shí)USB設(shè)備已經(jīng)進(jìn)入了Configured狀態(tài),調(diào)用device_add()在USB總線上尋找驅(qū)動(dòng),若匹配成功,則加載對(duì)應(yīng)的驅(qū)動(dòng)程序。

OTG的傳輸協(xié)議有三類 - ADP,SRP,HNP。

    ADP(Attach Detection Protocol) 當(dāng)USB總線上沒有供電時(shí),ADP允許OTG設(shè)備或USB設(shè)備決定連接狀態(tài)。
    SRP(Session Request Protocol) 允許從設(shè)備也可以控制主設(shè)備。
    HNP(Host Negotiation Protocol) 允許兩個(gè)設(shè)備互換主從角色。

枚舉的過(guò)程實(shí)際上用到而且只用到了總線的“控制傳輸(Control Transfer)”的傳輸方式。這種傳輸方式通常用于配置/命令/狀態(tài)等情形,其中的設(shè)置操作setup和狀態(tài)操作status過(guò)程的數(shù)據(jù)包具有USB協(xié)議定義的數(shù)據(jù)結(jié)構(gòu),因此,控制傳輸只能通過(guò)消息管道進(jìn)行。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
USB設(shè)備開發(fā)基礎(chǔ)知識(shí)整理
ISP1161驅(qū)動(dòng)開發(fā)
USB設(shè)備驅(qū)動(dòng)開發(fā)-USB協(xié)議相關(guān)(1)
Linux usb子系統(tǒng)(一):子系統(tǒng)架構(gòu)
在 Java 應(yīng)用程序中訪問(wèn)USB設(shè)備—編程愛好者網(wǎng)站
Linux設(shè)備驅(qū)動(dòng)程序?qū)W習(xí)(17)-USB 驅(qū)動(dòng)程序(二)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服