<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      USB Gadget設(shè)備枚舉失敗的處理方法

      技術(shù)背景

      我們的板子作為 USB Gadget 設(shè)備通過(guò) USB 線接入 USB 主機(jī)使用,我們的板子被主機(jī)識(shí)別為一個(gè) Compsite Device,這個(gè) Compsite Device 是由我們板子根據(jù) Host 口實(shí)際接的 USB 設(shè)備動(dòng)態(tài)創(chuàng)建的,所以它包含哪些功能,由接在 Host 口的設(shè)備決定。假設(shè)我們的板的 USB Host 口接了一個(gè)鍵盤(pán)和一個(gè)鼠標(biāo),那個(gè)我們的板就會(huì)被主機(jī)識(shí)別為一個(gè)支持鍵盤(pán)和鼠標(biāo)功能的 Compsite Device。我們板上 Host 口接的設(shè)備的數(shù)據(jù)會(huì)被轉(zhuǎn)發(fā)給 USB 主機(jī)。

      問(wèn)題描述

      某個(gè)鼠標(biāo)接入我們板 USB Host 口后,我們板子使用此鼠標(biāo)創(chuàng)建的 USB Gadget 設(shè)備無(wú)法被 Windows 系統(tǒng)枚舉成功,異常現(xiàn)象為:

      1. 一個(gè)聯(lián)想鼠標(biāo),接入我們板,我們板作 USB Gadget 接入 WIN10 系統(tǒng)后,系統(tǒng)無(wú)法識(shí)別,無(wú)法完成 USB 枚舉過(guò)程
      2. 這個(gè)聯(lián)想鼠標(biāo)直接接在 WIN10 系統(tǒng)上,是能正常識(shí)別和工作的
      3. 這個(gè)聯(lián)想鼠標(biāo)接入 Ubuntu 系統(tǒng),也是能正常識(shí)別和工作的

      分析過(guò)程

      從應(yīng)用層程序入手,排除 USB 設(shè)備描述符與 HID 報(bào)文描述符設(shè)置等應(yīng)用層問(wèn)題,對(duì)比分析 Linux 與 Windows 系統(tǒng) USB 枚舉過(guò)程差異,跟蹤 Linux 內(nèi)核代碼 configfs 驅(qū)動(dòng)部分。

      原因解析

      Linux 系統(tǒng)在 USB 設(shè)枚舉過(guò)程中獲取到設(shè)備的實(shí)際 HID 報(bào)文描述符長(zhǎng)度后,會(huì)使用此實(shí)際長(zhǎng)度作為期望的長(zhǎng)度,來(lái)獲取 HID 報(bào)文描述符。而 WIN10 會(huì)使用實(shí)際長(zhǎng)度另加上 64 作為期望長(zhǎng)度來(lái)獲取 HID 報(bào)文描述符。這是 Windows 系統(tǒng)和 Linux 系統(tǒng)的差異,這個(gè)差異會(huì)引起異常,而 WIN10 的這種處理機(jī)制也是符合 USB 規(guī)范的,所以此異常應(yīng)該是 Linux 內(nèi)核的一個(gè) BUG。

      主機(jī)端在獲取 HID 報(bào)文描述符時(shí)如何判斷設(shè)備端已經(jīng)應(yīng)答完畢是這個(gè)問(wèn)題的關(guān)鍵。

      控制傳輸中的最大包長(zhǎng):高速設(shè)備最大包長(zhǎng)是 64 字節(jié);低速設(shè)備是 8;全速設(shè)備可以是 8 或 16 或 32 或 64。最大包長(zhǎng)表示一個(gè)端點(diǎn)單次接收/發(fā)送數(shù)據(jù)的能力,實(shí)際上就是該端點(diǎn)對(duì)應(yīng)的緩沖區(qū)的大小。當(dāng)一次傳輸?shù)臄?shù)據(jù)量超過(guò)該端點(diǎn)的最大包長(zhǎng)時(shí),需要將數(shù)據(jù)拆分成多個(gè)包傳輸,只有最后一個(gè)包可以小于最大包長(zhǎng),除最后一個(gè)包外的其他包都應(yīng)等于最大包長(zhǎng)。所以在一次控制傳輸中,如果一個(gè)端點(diǎn)收到/發(fā)送了一個(gè)長(zhǎng)度小于最大包長(zhǎng)的包,則表示此次數(shù)據(jù)傳輸結(jié)束。

      在設(shè)備枚舉階段,傳輸類(lèi)型是控制傳輸,最大包長(zhǎng)由 MaxPacketSize 參數(shù)(對(duì)于 USB 2.0 設(shè)備此值是 64)指定。一次控制傳輸?shù)臄?shù)據(jù)會(huì)被切割成多個(gè)包,只有最后一個(gè)包的長(zhǎng)度可以小于最大包長(zhǎng)。當(dāng)主機(jī)接收到的數(shù)據(jù)量已經(jīng)等于期待數(shù)據(jù)長(zhǎng)度時(shí),直接就可以判定應(yīng)答已經(jīng)結(jié)束了。當(dāng)主機(jī)接收的數(shù)據(jù)量小于期待數(shù)據(jù)長(zhǎng)度時(shí),若接收到的最新的應(yīng)答數(shù)據(jù)包的長(zhǎng)度小于最大包長(zhǎng),說(shuō)明這個(gè)包是這次傳輸?shù)淖詈笠粋€(gè)包,表示應(yīng)答已完畢;若最新收到的數(shù)據(jù)包等于最大包長(zhǎng),主機(jī)是無(wú)法判斷這個(gè)包是不是本次傳輸?shù)淖詈笠粋€(gè)包的 ,USB 協(xié)議規(guī)定,針對(duì)這種情況,當(dāng)設(shè)備端應(yīng)答的數(shù)據(jù)量小于主機(jī)側(cè)期待的數(shù)據(jù)長(zhǎng)度,而應(yīng)答數(shù)據(jù)量又剛好能被最大包長(zhǎng)整除(即被切割成多個(gè)完整的包),就需要額外再發(fā)送一個(gè) ZLP 包(Zero Length Packet)以指示本次傳輸完成。

      異常的這個(gè)聯(lián)想鼠標(biāo),它的 HID 報(bào)文描述符是 64 字節(jié)長(zhǎng)(剛好等于 MaxPacketSize 參數(shù)),當(dāng) WIN10 系統(tǒng)以期望長(zhǎng)度 128(64+64) 來(lái)獲取 HID 報(bào)文描述符時(shí),內(nèi)核 Gadget 驅(qū)動(dòng)只回復(fù)了實(shí)際的 64 個(gè)字節(jié)(它沒(méi)有發(fā) ZLP 包)的 HID 報(bào)文描述符,此時(shí) Linux Gadget 認(rèn)為自己已經(jīng)應(yīng)答完畢,而 WIN10 收到的回復(fù)不足 128 字節(jié)但最后一個(gè)包又是整包,它認(rèn)為傳輸還沒(méi)完成一直在等新數(shù)據(jù),直到超時(shí),總線進(jìn)入異常狀態(tài),WIN10 復(fù)位 USB 總線,設(shè)備側(cè)內(nèi)核 USB 驅(qū)動(dòng)模塊進(jìn)入錯(cuò)亂狀態(tài)。原因就是,Linux Gadget 驅(qū)動(dòng)在這種特殊情況下沒(méi)發(fā) ZLP 包。這就是問(wèn)題描述中現(xiàn)象 1 的原因。

      為什么這個(gè)鼠標(biāo)接在 Ububtu 上又正常呢,因?yàn)?Ubuntu 期待的長(zhǎng)度就是 64,收到 64 字節(jié)的應(yīng)答,它就認(rèn)為應(yīng)答已經(jīng)完畢。

      解決方法

      知道了原因就好解決了。修復(fù)內(nèi)核 BUG,在 Gadget 的驅(qū)動(dòng)代碼里,判斷當(dāng)一次應(yīng)答的數(shù)據(jù)量小于主機(jī)期待的長(zhǎng)度且應(yīng)答數(shù)據(jù)量又能被最大包長(zhǎng)整除時(shí),多發(fā)一個(gè) ZLP 包。問(wèn)題解決。

      posted @ 2025-06-20 08:42  葉余  閱讀(175)  評(píng)論(0)    收藏  舉報(bào)
      主站蜘蛛池模板: 亚洲av永久无码精品水牛影视| 国产精品麻豆成人av网| 精品中文人妻在线不卡| 中文无码妇乱子伦视频| 风韵丰满熟妇啪啪区老熟熟女| 欧美大胆老熟妇乱子伦视频| 91精品国产综合久蜜臀| 久久精品国产一区二区三区不卡| 日本少妇自慰免费完整版| 国产精品一区二区三区黄色| 国产精品成人久久电影| 日本中文字幕不卡在线一区二区| 成人亚欧欧美激情在线观看 | av中文字幕一区人妻| 久女女热精品视频在线观看| 中文字幕无码av激情不卡| 国产精品国产三级国产午| 成人无码午夜在线观看| 忘忧草日本在线播放www| 亚洲欧美精品一中文字幕| 777奇米四色成人影视色区| 精品少妇爆乳无码aⅴ区| 漂亮的保姆hd完整版免费韩国 | 亚洲综合无码久久精品综合| 久久综合97丁香色香蕉| 日本强好片久久久久久aaa| 尤物国精品午夜福利视频| 中文字幕99国产精品| 免费观看日本污污ww网站69| 国产精品久久久久久久久久直播| 无套内谢少妇高清毛片| 丰满熟女人妻一区二区三| 亚洲精品三区四区成人少| 日本中文字幕乱码免费| 在线观看免费人成视频色| 资源新版在线天堂偷自拍| 日本中文字幕乱码免费| 色综合热无码热国产| 91精品国产一二三产区| 全黄h全肉边做边吃奶视频 | 双城市|