色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

從獲取描述符的角度理解Gadget框架

麥辣雞腿堡 ? 來源:嵌入式Linux系統(tǒng)開發(fā) ? 作者:嵌入式Linux系統(tǒng)開 ? 2023-07-13 11:38 ? 次閱讀

安裝好 gadget 驅(qū)動(dòng)程序后(比如 modprobe g_zero), 它只是構(gòu)造好了各類描述符。在設(shè)備的枚舉過程會(huì)讀取描述符。

使用 OTG 線連接電腦和開發(fā)板時(shí),電腦軟件會(huì)執(zhí)行如下操作:

  • 使用控制傳輸,讀取設(shè)備信息(設(shè)備描述符):第一次讀取時(shí),它只需要得到 8 字節(jié)數(shù)據(jù),因?yàn)榈?8 個(gè)數(shù)據(jù)表示端點(diǎn) 0 能傳輸?shù)淖畲髷?shù)據(jù)長度。
  • Host 分配地址給設(shè)備,然后把新地址發(fā)給設(shè)備。
  • 使用新地址,重新讀取設(shè)備描述符,設(shè)備描述符長度是 18
  • 讀取配置描述符:它傳入的長度是 255,想一次性把當(dāng)前配置描述符、它下面的接口描述符、端點(diǎn)描述符全部讀出來。
  • 讀取字符描述符。

上述過程里,設(shè)備方都是接收到 Host 發(fā)給 endpoint 0 的數(shù)據(jù),然后做出回應(yīng)。不同的 Gadget 設(shè)備,在返回描述符給主機(jī)時(shí),這些操作都是一樣的,只是回應(yīng)的數(shù)據(jù)不同而已。源碼分析的起點(diǎn)都是某個(gè)中斷函數(shù):

  • IMX6ULL:ci_irq(drivers/usb/chipidea/core.c)
  • STM32MP157: dwc2_hsotg_irq(drivers/usb/dwc2/gadget.c)

4.1 IMX6ULL 的核心函數(shù)

IMX6ULL 芯片中 USB 控制器型號(hào)是 chipidea,在Linux-4.9.88driversusbchipideacore.c中注冊(cè)了中斷函數(shù):

ci_hdrc_probe
 ret = devm_request_irq(dev, ci- >irq, ci_irq, IRQF_SHARED,
   ci- >platdata- >name, ci);

發(fā)生中斷后,對(duì)于 endpoint 0 的數(shù)據(jù)處理流程如下:

// Linux-4.9.88driversusbchipideacore.c
ci_irq
 /* Handle device/host interrupt */
 if (ci- >role != CI_ROLE_END)
  ret = ci_role(ci)- >irq(ci);  // udc_irq
   
   // Linux-4.9.88driversusbchipideaudc.c
   udc_irq
                if (USBi_UI  & intr)
                 // Linux-4.9.88driversusbchipideaudc.c
                    isr_tr_complete_handler(ci);
                        /* Only handle setup packet below */
                        if (i == 0 &&
                            hw_test_and_clear(ci, OP_ENDPTSETUPSTAT, BIT(0)))
                            // Linux-4.9.88driversusbchipideaudc.c
                            isr_setup_packet_handler(ci);

函數(shù)isr_setup_packet_handler就是處理 endpoint 0 接收到的控制傳輸?shù)年P(guān)鍵。

4.2 STM32MP157的核心函數(shù)

STM32MP157 芯片中 USB 控制器型號(hào)是 dwc2,在Linux-5.4driversusbdwc2gadget.c中注冊(cè)了中斷函數(shù):

dwc2_gadget_init
 ret = devm_request_irq(hsotg- >dev, hsotg- >irq, dwc2_hsotg_irq,
          IRQF_SHARED, dev_name(hsotg- >dev), hsotg);

發(fā)生中斷后,函數(shù)dwc2_hsotg_irq被調(diào)用,它處理 endpoint 中斷有兩種方法:

  • 使用 DMA 時(shí):調(diào)用dwc2_hsotg_epint來處理
  • 不使用 DMA 時(shí):調(diào)用dwc2_hsotg_handle_rx來處理

dwc2_hsotg_epint為例進(jìn)行分析,對(duì)于 endpoint 0 的數(shù)據(jù)處理流程如下:

// Linux-5.4driversusbdwc2gadget.c
dwc2_hsotg_irq
  // 處理endpoint中斷
  for (ep = 0; ep < hsotg- >num_of_eps && daint_out; ep++, daint_out > >= 1) {
   if (daint_out & 1)
    dwc2_hsotg_epint(hsotg, ep, 0);
  }

  for (ep = 0; ep < hsotg- >num_of_eps  && daint_in; ep++, daint_in > >= 1) {
   if (daint_in & 1)
    dwc2_hsotg_epint(hsotg, ep, 1);
  }

函數(shù)dwc2_hsotg_epint中,對(duì)于 endpoint 0 的處理如下:

// Linux-5.4driversusbdwc2gadget.c
dwc2_hsotg_epint
    if (idx == 0 && !hs_ep- >req)
     dwc2_hsotg_enqueue_setup(hsotg);

函數(shù)dwc2_hsotg_enqueue_setup被調(diào)用時(shí),Gadget 設(shè)備已經(jīng)收到了 SETUP 令牌包,但是還沒收到 DATA0 令牌包。dwc2_hsotg_enqueue_setup的作用是,設(shè)置、啟動(dòng)一個(gè) request,核心在于設(shè)置了 request 的 complete 函數(shù)(當(dāng) SETTUP 事務(wù)完成后這個(gè)函數(shù)被調(diào)用):

圖片

當(dāng)控制傳輸?shù)?setup事務(wù)"完成時(shí),函數(shù)dwc2_hsotg_complete_setup被調(diào)用。

4.3 如何處理控制傳輸

無論是 MX6ULL 的函數(shù)isr_setup_packet_handler,還是 STM32M157 的函數(shù)dwc2_hsotg_complete_setup,它們都是在 Gadget 設(shè)備收到"SETUP事務(wù)"后才被調(diào)用。接收完"SETUP事務(wù)"后,就可以從里面知道這個(gè)控制傳輸想做什么(req.bRequest 是什么),然后就可以處理它了。

怎么處理呢?可以分為 3 層:

圖片

  • UDC 驅(qū)動(dòng)程序:類似"設(shè)置地址"的控制傳輸,在底層的 UDC 驅(qū)動(dòng)程序里就可以處理,
    • 這類請(qǐng)求有:
      USB_REQ_SET_ADDRESS
      USB_REQ_SET_FEATURE     // 有一些請(qǐng)求可能需要上報(bào)改 gadget driver
      USB_REQ_CLEAR_FEATURE   // 有一些請(qǐng)求可能需要上報(bào)改 gadget driver
      USB_REQ_GET_STATUS      // 有一些請(qǐng)求可能需要上報(bào)改 gadget driver
      
    • 驅(qū)動(dòng)程序位置
      IMX6ULL: Linux-4.9.88driversusbchipideaudc.c, 函數(shù) isr_setup_packet_handler
      STM32MP157: Linux-5.4driversusbdwc2gadget.c, 函數(shù) dwc2_hsotg_complete_setup
      
  • gadget driver:涉及描述符的操作
    • 這類請(qǐng)求有:
      USB_REQ_GET_DESCRIPTOR
      USB_REQ_SET_CONFIGURATION
      USB_REQ_GET_CONFIGURATION
      USB_REQ_SET_INTERFACE
      USB_REQ_GET_INTERFACE
      USB_REQ_GET_STATUS     // 底層 UDC 驅(qū)動(dòng)無法處理的話, gadget driver 來處理
      USB_REQ_CLEAR_FEATURE  // 底層 UDC 驅(qū)動(dòng)無法處理的話, gadget driver 來處理
      USB_REQ_SET_FEATURE    // 底層 UDC 驅(qū)動(dòng)無法處理的話, gadget driver 來處理
      
    • 驅(qū)動(dòng)程序位置
      文件:driversusbgadgetcomposite.c
      函數(shù):composite_setup
      
  • usb_configuration 或 usb_function 的處理:這是二選一的。大部分設(shè)備使用控制傳輸實(shí)現(xiàn)標(biāo)準(zhǔn)的 USB 請(qǐng)求,但是也可以用控制傳輸來進(jìn)行實(shí)現(xiàn)相關(guān)的請(qǐng)求,對(duì)于這些非標(biāo)準(zhǔn)的請(qǐng)求,就需要上層驅(qū)動(dòng)來處理。
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 嵌入式
    +關(guān)注

    關(guān)注

    5087

    文章

    19145

    瀏覽量

    306136
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11320

    瀏覽量

    209851
  • 框架
    +關(guān)注

    關(guān)注

    0

    文章

    403

    瀏覽量

    17511
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    UBL UBOOT 描述符

    ?? 在DM368的開發(fā)包目錄下/psp/flash-utils/DM36x/GNU:執(zhí)行make 可以省成UBL:ubl_DM36x_nand.bin ;我想問的是如何添加UBL 的描述符?燒寫到
    發(fā)表于 06-21 08:48

    USB設(shè)備檢測過程的USB設(shè)備的描述符

    USB 設(shè)備的總體信息,它是枚舉過程中主機(jī)設(shè)備讀取的第一個(gè)描述符。設(shè)備描述符總共有 18 個(gè)字節(jié),分為 14 個(gè)字段,如表 6-5 所示。(2)配置描述符配置、接口以及端點(diǎn)
    發(fā)表于 11-12 09:23

    ARM中,Linux 文件描述符到底是什么?

    進(jìn)程所有打開的文件。內(nèi)核空間是虛擬地址空間的一部分,想死磕的讀者請(qǐng)猛擊《C語言內(nèi)存精講》,不想糾纏細(xì)節(jié)的讀者可以這樣理解:進(jìn)程啟動(dòng)后要占用內(nèi)存,其中一部分內(nèi)存分配給了文件描述符表。除了文件描述符表,系統(tǒng)
    發(fā)表于 10-23 16:11

    USB HID報(bào)告及報(bào)告描述符簡介

    在USB中,USB HOST是通過各種描述符來識(shí)別設(shè)備的,有設(shè)備描述符,配置描述符,接口描述符,端點(diǎn)描述符,字符串
    發(fā)表于 04-12 11:13 ?4045次閱讀

    Descriptor描述符解釋

    Descriptor即描述符,是一個(gè)完整的數(shù)據(jù)結(jié)構(gòu),可以通過C語言等編程實(shí)現(xiàn),并存儲(chǔ)在USB設(shè)備中,用于描述一個(gè)USB設(shè)備的所有屬性,USB主機(jī)是通過一系列命令來要求設(shè)備發(fā)送這些信息的。
    發(fā)表于 07-16 09:39 ?2650次閱讀

    Linux中文件及文件描述符概述

    6.2 Linux中文件及文件描述符概述 在Linux中對(duì)目錄和設(shè)備的操作都等同于文件的操作,因此,大大簡化了系統(tǒng)對(duì)不同設(shè)備的處理,提高了效率。Linux中的文件主要分為4種:普通文件、目錄文件
    發(fā)表于 10-18 14:35 ?0次下載

    USB設(shè)備鍵值表描述符說明資料免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是USB設(shè)備鍵值表描述符說明資料免費(fèi)下載包括了:1.設(shè)備描述符的結(jié)構(gòu),2. 配置描述符的結(jié)構(gòu),3. 接口描述符的結(jié)構(gòu),4. HID
    發(fā)表于 07-16 16:56 ?35次下載
    USB設(shè)備鍵值表<b class='flag-5'>描述符</b>說明資料免費(fèi)下載

    USB各描述符之間的依賴是怎么樣的

    USB 是個(gè)通用的總線,端口都是統(tǒng)一的。但是USB 設(shè)備卻各種各樣,例如USB 鼠標(biāo), USB鍵盤, U盤等等,那么USB 主機(jī)是如何識(shí)別出不同的設(shè)備的呢?這就要依賴于描述符了。USB 的描述符主要有設(shè)備描述符,配置
    發(fā)表于 07-23 16:53 ?8次下載
    USB各<b class='flag-5'>描述符</b>之間的依賴是怎么樣的

    隱藏描述符工具應(yīng)用程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是HID Descriptor Tool隱藏描述符工具應(yīng)用程序免費(fèi)下載。
    發(fā)表于 01-08 08:00 ?11次下載
    隱藏<b class='flag-5'>描述符</b>工具應(yīng)用程序免費(fèi)下載

    Linux系統(tǒng)編程中的文件描述符調(diào)用

    表示,文件描述符的范圍0開始,到上限值-1,默認(rèn)情況下,上限值為1024,也就是說,進(jìn)程默認(rèn)情況下最多可以打開1024個(gè)文件。負(fù)數(shù)是不合法的文件描述符,當(dāng)函數(shù)調(diào)用出錯(cuò)時(shí),返回的文件描述符
    的頭像 發(fā)表于 09-02 09:50 ?1694次閱讀
    Linux系統(tǒng)編程中的文件<b class='flag-5'>描述符</b>調(diào)用

    科普一下什么是USB的描述符

    以及行為呢?這就要通過描述符來實(shí)現(xiàn)了。那么什么是USB的描述符呢?其實(shí)就是一些傳遞的協(xié)議信息,比如設(shè)備的類型、廠商ID、產(chǎn)品ID、端點(diǎn)情況、版本號(hào)等信息。 既然描述符是協(xié)議信息,那么不同的版本也會(huì)有所不同,比如USB1.1協(xié)議定
    的頭像 發(fā)表于 12-02 14:41 ?3983次閱讀

    USB Gadget zero應(yīng)用實(shí)例程序

    interface 進(jìn)而得到 endpoint 讀寫數(shù)據(jù):操作 endpoint 1.2 zero 設(shè)備的描述符 在 Ubuntu 里執(zhí)行如下命令,根據(jù) VID:PID 獲取設(shè)備信息: $ lsusb -v -d 0525 :a4a0 可以列出 zero 設(shè)備的
    的頭像 發(fā)表于 07-13 11:14 ?1121次閱讀
    USB <b class='flag-5'>Gadget</b> zero應(yīng)用實(shí)例程序

    硬件軟件角度理解Gadget框架

    2. 硬件軟件角度理解 Gadget 框架 USB 傳輸?shù)暮诵氖?endpoint,使用 endpoint 可以收發(fā)數(shù)據(jù)。在 endpoi
    的頭像 發(fā)表于 07-13 11:32 ?1137次閱讀
    <b class='flag-5'>從</b>硬件軟件<b class='flag-5'>角度</b><b class='flag-5'>理解</b><b class='flag-5'>Gadget</b><b class='flag-5'>框架</b>

    Gadget框架構(gòu)造描述符

    假設(shè)你要【模擬】一個(gè) USB 設(shè)備: 這個(gè) USB 設(shè)備含有廠家信息:它記錄在設(shè)備描述符里,所以設(shè)備描述符應(yīng)該由你提供 這個(gè)芯片可能有多種配置,這也是由你決定,所以配置描述符應(yīng)該由你提供 某個(gè)配置下
    的頭像 發(fā)表于 07-13 11:34 ?674次閱讀
    <b class='flag-5'>Gadget</b><b class='flag-5'>框架</b>構(gòu)造<b class='flag-5'>描述符</b>

    Python的優(yōu)雅之處:Descriptor(描述符

    學(xué)習(xí) Python 這么久了,說起 Python 的優(yōu)雅之處,能讓我脫口而出的, Descriptor(描述符)特性可以排得上號(hào)。 描述符 是Python 語言獨(dú)有的特性,它不僅在應(yīng)用層使用,在語言
    的頭像 發(fā)表于 11-02 10:52 ?1025次閱讀
    Python的優(yōu)雅之處:Descriptor(<b class='flag-5'>描述符</b>)
    主站蜘蛛池模板: 老师扒开尿口男生摸尿口| 亚洲国产成人精品青青草原100| 欧美精品专区第1页| 人C交ZZZ0OOZZZ000| 亚洲 制服 欧美 中文字幕| 最近中文字幕2019免费版日本| 白百合在线观看| 国产亚洲精品视频在线网| 美女pk精子2小游戏| 天天操人人射| 91黄色影院| 国产精品免费大片| 两个吃奶一个添下面视频| 少妇第一次交换| 真实农村女人野外自拍照片| 动漫美女3d被爆漫画| 久久精麻豆亚洲AV国产品| 日韩毛片大全| 中文字幕无码亚洲字幕成A人蜜桃| 古代荡女丫鬟高H辣文纯肉| 久久久久九九| 丝袜美女自摸| 91嫩草视频在线观看| 国产偷抇久久精品A片蜜臀A| 欧美成人无码A区在线观看免费| 亚洲精品无码葡京AV天堂| YELLOW免费观看2019| 久久精品视频在线看99| 挺进绝色老师的紧窄小肉六| 97成人免费视频| 黄子佼81岁父亲现状曝光| 日日噜噜大屁股熟妇| 2022精品福利在线小视频| 国产在线视频在线观看| 欧洲电影巜肉欲丛林| 在线国产三级| 国产亚洲精品AV片在线观看播放| 欧美日韩高清一区二区三区| 伊人久久五月丁婷婷| 国产乱码精品一区二区三区四川| 欧洲vs美洲完整视频|