在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

從數據傳輸的角度理解Gadge框架

麥辣雞腿堡 ? 來源:嵌入式Linux系統開發 ? 作者:嵌入式Linux系統開 ? 2023-07-13 11:41 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

5.1 使用流程

USB 協議中,永遠是 Host 主動發起傳輸。作為一個 Gadget 驅動程序,它永遠都是這樣:

  • 想接收數據:
    • 先構造好 usb_request:分配 buffer、設置回調函數
    • 把 usb_request 放入隊列
    • UDC 和 Host 完成 USB 傳輸,在 usb_request 中填充數據,并觸發中斷調用 usb_request 的回調函數
  • 想發送數據:
    • 先構造好 usb_request:分配 buffer、在 buffer 里填充數據、設置回調函數
    • 把 usb_request 放入隊列
    • UDC 和 Host 完成 USB 傳輸,把 usb_request 的數據發給 Host,并觸發中斷調用 usb_request 的回調函數

5.2 endpoint 是核心

USB 傳輸的對象是 endpoint,使用流程如下:

  • 功能驅動里,通過 endpoint 描述符表明需要怎樣的 endpoint,比如(注意:bEndpointAddress 是表明方向,里面還沒有地址,driversusbgadgetfunctionf_loopback.c):

圖片

  • 功能驅動里,它的 bind 函數根據 endpoint 描述符向底層申請分配 endpoint,比如:

圖片

  • 功能驅動里,使能 endpoint,比如:

圖片

  • 功能驅動里,給 endpoint 分配 buffer、設置 usb_request、提交 usb_request,比如:

圖片

5.3 回調函數

功能驅動里構造的 usb_request,可以是接收 Host 發來的數據,也可以是向 Host 發送數據。當傳輸完成,usb_request 的回調函數被調用。

在回調函數里,可以再次提交 usb_request。

怎么調用到回調函數?源頭是 UDC 的中斷函數。

5.3.1 IMX6ULL

調用關系如下:

// 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
   udc_irq
                if (USBi_UI  & intr)
                    isr_tr_complete_handler(ci);
                     err = isr_tr_complete_low(hwep);
                        usb_gadget_giveback_request(&hweptemp- >ep, &hwreq- >req);
                         req- >complete(ep, req);

5.3.2 STM32MP157

調用關系如下:

// 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);
     dwc2_hsotg_handle_outdone(hsotg, idx);
      dwc2_hsotg_complete_request(hsotg, hs_ep, hs_req, result);
       usb_gadget_giveback_request(&hs_ep- >ep, &hs_req- >req);
        req- >complete(ep, req);
  }

  for (ep = 0; ep < hsotg- >num_of_eps  && daint_in;
      ep++, daint_in > >= 1) {
   if (daint_in & 1)
    dwc2_hsotg_epint(hsotg, ep, 1);
     dwc2_hsotg_complete_in(hsotg, hs_ep);
      dwc2_hsotg_complete_request(hsotg, hs_ep, hs_req, 0);
       usb_gadget_giveback_request(&hs_ep- >ep, &hs_req- >req);
        req- >complete(ep, req);
  }

5.4 f_loopback分析

loopback 就是回環,Host 發數據給 Gadget,然后再讀 Gadget 就可以得到原樣的數據。

5.4.1 Gadget接收數據

Host 選擇某個配置時,默認會選擇這個配置下那些接口的第 0 個設置(altsetting);

當 Host 發來 USB_REQ_SET_INTERFACE 請求時,可以選擇指定的設置。

所以,我們從 f_loopback.c 的函數loopback_set_alt開始分析。

調用關系為:

loopback_set_alt
 enable_loopback
  result = enable_endpoint(cdev, loop, loop- >in_ep);
  
  result = enable_endpoint(cdev, loop, loop- >out_ep);
  
  result = alloc_requests(cdev, loop);

圖片

如上圖所示,先提交的是 out_req,它在等待 Host 發來數據。

假設斷點 loop->out_ep 的 out_req 獲得了數據,它的回調函數loopback_complete被調用,如下:

圖片

5.4.2 Gadget 回環數據

圖片

5.5 f_sourcesink 分析

前面的 f_loopback 也實現了兩個方向的數據傳輸:Host 到 Gadget、Gadget 到 Host,但是它們之間是有依賴關系的,Host 必須先發送數據再讀數據。

f_sourcesink.c 也實現了兩個方向的數據傳輸:Host 到 Gadget、Gadget 到 Host,它們是獨立的。

  • Host 讀 Gadget:驅動程序里構造好數據,Host 可以讀到,Gadget 作為源(source)
  • Host 寫 Gadget:驅動程序里得到 Host 發來的數據,Gadget 作為目的(sink)

5.5.1 Host 寫 Gadget

Host 選擇某個配置時,默認會選擇這個配置下那些接口的第 0 個設置(altsetting);

當 Host 發來 USB_REQ_SET_INTERFACE 請求時,可以選擇指定的設置。

所為,我們從 f_sourcesink.c 的函數sourcesink_set_alt開始分析。

sourcesink_set_alt
 enable_source_sink(cdev, ss, alt);

圖片

作為"source",函數source_sink_start_ep會構造數據、提交 usb_request:

圖片

當 Host 讀取到數據后,usb_request 的回調函數被調用,它只是再次提交 USB 請求,給 Host 繼續提供跟上次一樣的數據:

圖片

5.5.2 Host 讀 Gadget

仍然從 f_sourcesink.c 的函數sourcesink_set_alt開始分析。

sourcesink_set_alt
 enable_source_sink(cdev, ss, alt);

圖片

作為"sink",函數source_sink_start_ep會故意把數據設置為 0x55(這是為了調試,當讀到數據時可以看到 0x55 被覆蓋)、提交 usb_request:

圖片

當 Host 發來數據,usb_request 的回調函數被調用,它檢查收到的數據,再次提交 usb_request:

圖片

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5146

    文章

    19599

    瀏覽量

    316330
  • Linux
    +關注

    關注

    87

    文章

    11497

    瀏覽量

    213280
  • 框架
    +關注

    關注

    0

    文章

    404

    瀏覽量

    17852
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    無線數據傳輸模塊的實際應用

    隨著無線數據傳輸技術的發展,無線傳輸模塊的穩定可靠、安裝簡便、靈活性高等優勢獲得了廣泛的應用,特別是在無線抄表、環境監測等方向,無線數據傳輸模塊發揮著重要的傳輸
    發表于 06-18 04:21

    USART數據傳輸模型怎么理解

    親愛的所有人,正如我所能檢查到的,有三種不同的數據傳輸方式:a)使用逐字節模型-這用于一次傳輸一個字節;b)使用文件I/O類型讀/寫傳輸模型-應用程序調用USART驅動程序讀/寫例程通過USART
    發表于 04-23 13:56

    DMA進行數據傳輸和CPU進行數據傳輸的疑問

    求大佬解答,本人正在學習STM32單片機中DMA直接數據存儲部分的內容 看了DMA簡介后,也上手過實例代碼,但是沒有實際的項目經驗,所以有以下疑問: DMA外設在進行數據傳輸的操作,是否也是需要經過
    發表于 05-25 17:18

    數據傳輸

    通信工程叢書--數據傳輸 這資料還是不錯的,可供參考學習哦!
    發表于 03-25 00:53 ?29次下載

    數據傳輸介質

    2.5  數據傳輸介質      傳輸介質是通信網絡中連接計算機的具體物理設備和數據傳輸物理通路。傳輸介質的特性包括物理描述
    發表于 06-27 21:47 ?0次下載

    什么是內部數據傳輸

    什么是內部數據傳輸率       數據傳輸率的單位一般采用MB/s或Mbit/s,尤其在內部數據傳輸率上官方數據中更多的采
    發表于 06-17 07:39 ?1859次閱讀

    IDE數據傳輸模式

    IDE數據傳輸模式 隨著技術的發展,產品對數據傳輸速度要求的提高,IDE接口硬盤的數
    發表于 12-25 14:58 ?460次閱讀

    Modem數據傳輸標準

     Modem數據傳輸標準 數據傳輸標準是指MODEM的
    發表于 12-28 13:29 ?1116次閱讀

    RAID卡的數據傳輸速度

    RAID卡的數據傳輸速度              數據傳輸速度是指硬盤接口的傳輸速度。比如ATA100接口硬盤的
    發表于 01-09 10:47 ?2140次閱讀

    數據傳輸,數據傳輸的工作方式有哪些?

    數據傳輸,數據傳輸的工作方式有哪些? 將數據從一個地方傳輸到另一個地方的方法多得令人難以置信。 數
    發表于 03-18 14:41 ?6070次閱讀

    數據傳輸速率是什么意思

    數據傳輸速率是什么意思 數據傳輸速率是通過信道每秒可傳輸的數字信息量的量度。數據傳輸速率也稱為吞吐率。數據傳輸速率由很
    發表于 03-18 14:45 ?5086次閱讀

    tcp_ip 協議講座:介紹數據傳輸

    介紹了tcp協議:數據傳輸的問題(交互式數據傳輸,批量數據傳輸,流量控制,擁塞避免)
    的頭像 發表于 07-03 11:05 ?3713次閱讀
    tcp_ip 協議講座:介紹<b class='flag-5'>數據傳輸</b>

    硬件軟件角度理解Gadget框架

    2. 硬件軟件角度理解 Gadget 框架 USB 傳輸的核心是 endpoint,使用 endpoint 可以收發
    的頭像 發表于 07-13 11:32 ?1513次閱讀
    <b class='flag-5'>從</b>硬件軟件<b class='flag-5'>角度</b><b class='flag-5'>理解</b>Gadget<b class='flag-5'>框架</b>

    SPI數據傳輸有哪些方式

    SPI 數據傳輸可以有兩種方式:同步方式和異步方式。 同步方式:數據傳輸的發起者必須等待本次傳輸的結束,期間不能做其它事情,用代碼來解釋就是,調用傳輸的函數后,直到
    的頭像 發表于 07-25 10:54 ?5745次閱讀
    SPI<b class='flag-5'>數據傳輸</b>有哪些方式

    網絡數據傳輸速率的單位是什么

    網絡數據傳輸速率的單位是 bps(bit per second) ,即比特每秒,也可以表示為b/s或bit/s。它表示的是每秒鐘傳輸的二進制數的位數。比特(bit)是計算機中數據量的單位,也是信息論
    的頭像 發表于 10-12 10:20 ?4442次閱讀
    主站蜘蛛池模板: 国产网站免费 | 欧美爱爱帝国综合社区 | 天天干天天拍天天操 | 色综合美国色农夫网 | 综合五月激情 | 九九视频这里只有精品 | 久久青草国产手机看片福利盒子 | 1314亚洲人成网站在线观看 | 日本一区二区在线免费观看 | 日本不卡视频在线 | 国产伦精品一区二区三区免费 | 亚洲欧美日韩国产一区二区三区精品 | 亚洲精品美女久久久久网站 | 国产精品免费看久久久香蕉 | 国产高清在线精品一区 | 日本黄视频网站 | 久久精品国产99国产精品澳门 | 国产成人毛片毛片久久网 | 一区二区网站 | 最新天堂网 | 日韩在线视频一区 | 人人草人人 | 美女下面小内内的沟 | 99精品热 | 国产高清精品自在久久 | 国产美女亚洲精品久久久综合 | 亚洲你懂得| 9299yy看片淫黄大片在线 | 好男人午夜 | 天天舔天天射天天操 | 狠狠色噜狠狠狠狠 | 放荡女同老师和女同学生 | 香蕉视频久久久 | 天堂网色| 在线天堂中文在线资源网 | 日本不卡毛片一二三四 | 在线播放真实国产乱子伦 | 日本免费xxxx色视频 | 成人影院在线观看视频 | 波多野吉衣一区二区三区在线观看 | 色偷偷免费视频 |