精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

基于DWC2的USB驅動開發-控制傳輸中斷相關寄存器

嵌入式USB開發 ? 來源:嵌入式USB開發 ? 作者:嵌入式USB開發 ? 2023-07-24 00:07 ? 次閱讀

本文轉自公眾號系列文章,歡迎關注
基于DWC2的USB驅動開發-USB包詳解 (qq.com)

一.前言

本篇講解Scatter/Gather DMA模式下控制傳輸相關的寄存器??刂苽鬏斒?a target="_blank">USB驅動的核心部分,控制傳輸調通了驅動就完成了一大半,而驅動的核心又是中斷的處理。

二.控制傳輸相關的DMA描述符

Scatter/Gather DMA模式的優點是可以提供一個描述符鏈表,一次處理更多的數據,控制器自動去索引描述符鏈表,進行相應的DMA處理。而Buffer DMA模式一次只能處理一個DMA操作。

來簡單回顧下控制傳輸,控制傳輸包括

Setup,Data,Status三個階段,不是所有情況都需要包括三種階段,存在無數據階段的控制傳輸。

存在三種可能

控制寫

控制讀

無數據的控制傳輸,2階段控制傳輸。

控制傳輸需要準備以下幾種描述符

2.1.SETUP

為了接收最多可能存在的3個連續的SETUP包,所以需要準備一個描述符鏈表包括3個描述符。該描述符也可以用于接收控制讀傳輸主機發送的狀態包(0長包)。

該描述符鏈表的前面兩個還可以作為ping-pong提高接收效率。

第三個描述符,初始化為空,最終設置為以接收在數據和狀態階段主機又異常發了SETUP。

圖片

2.2IN

圖片

2.3OUT

圖片

三.控制傳輸相關的中斷處理

3.1相關寄存器

首先我們來看和中斷相關的一些寄存器,控制傳輸對應的就是端點0所以和其他端點其實是一樣的,只不過其多了一些比如SETUP等狀態而已。

首先我們來看相關的寄存器

首先全局的:GAHBCFG寄存器的bit0 GlblIntrMsk作為全局中斷的總開關,置位使能總中斷。

然后寄存器GINTMSK/2的bit19,bit18,OEPIntMsk和IEPIntMsk作為所有的OUT和IN端點的中斷使能,對應的狀態寄存器是GINTSTS/2。

然后DIEPMSK和DOEPMSK控制所有的OUT和IN端點的中斷類型,哪些使能。

對應的狀態寄存器是DIEPINTi 和DOEPINTi。

最后DAINTMSK控制某一個端點是否使能中斷。對應的狀態寄存器是DAINT。

注意

DIEPMSK和DOEPMSK是對所有端點的配置,不能對某一個端點使能某些類型中斷,對另外一個端點使能其他類型的中斷。

以上形成了金字塔式的總分式,層層控制的中斷開關控制。

而中斷的處理順序是層層解析的方式,先通過

DAINT查看是哪個端點產生的中斷,然后通過DIEPINTi 和DOEPINTi確認對應端點具體的中斷類型。

DAINT的標志的置位和清除是跟著DIEPINTi 和DOEPINTi變化的,該寄存器軟件只讀。對應DIEPINTi 和DOEPINTi寄存器有標志置位則該寄存器對應位置位,DIEPINTi 和DOEPINTi寄存器所有標志位清除則該寄存器對應位清除。

而GINTSTS.OEPInt和GINTSTS.IEPInt是跟著DAINT的狀態走的,軟件也是只讀的,DAINT對應位有置為則該位置位,DAINT中對應所有寄存器都清零,則該位也清零。

DIEPINTi 和DOEPINTi寄存器的標志都是寫1清零。所以對于IN和OUT中斷的標志清除,只需要對這兩個寄存器對應位寫1清零即可。DAINT和GINTSTS.OEPInt和GINTSTS.IEPInt是根據上述寄存器狀態硬件清除無需軟件手動清。

對比DIEPMSK和DIEPINTi可知,DIEP的NYET,Bble,PktDrp,TxFEmp是不受MASK控制的。

圖片

對比DOEPMSK和DOEPINTi可知,DOEP的StupPktRcvd,PktDrpSts是不受MASK控制的。

圖片

對比如IN和OUT中斷類型有一些相同的,有一些不一樣的,比如OUT多了Setup等。

圖片

拓撲結構如下

圖片

3.2中斷處理

前面提到控制傳輸對應端點0,和其他端點沒什么本質區別。其中斷狀態主要關注

DIEPINTn和DOEPINTn兩個寄存器以確定具體的中斷類型。

前面回顧了控制傳輸有3個階段,所以對于驅動編寫來說重點要知道當前處于什么階段以決定下一步軟件要怎么做,所以軟件一般使用狀態機記錄當前狀態然后根據中斷標志確定下一個階段。從上面可以看到DIEPINTn和DOEPINTn兩個寄存器有很多的中斷類型,并不是所有的都和控制傳輸的階段有關的,控制器設計時就考慮到了這一點,盡量精簡標志的邏輯,通過盡可能少的標志組合可以確定當前階段。

手冊《10.3.1 Interrupt Handling》中做了一個總結,

軟件只需要關心以下標志即可

DIEPINTn.XferCompl 如果描述符中IOC設置,表示IN端點對應的描述符處理完

DIEPINTn.InTknTxfEmp TxFIFO空時收到了主機發的IN令牌,此時設備沒有數據可回

DOEPINTn.XferCompl 如果描述符中IOC設置,表示OUT端點對應的描述符處理完

DOEPINTn.SetUp 表示控制器在Setup包后收到了IN和OUT令牌。

DOEPINTn.StsPhseRcvd 控制寫傳輸主機切換到了狀態階段,此時設備需要發狀態包(0長包)

當控制器看到需要為OUT端點設置多個中斷位時,控制器會對這些中斷設置進行一些優化,減少中斷的有效組合的數量,以簡化應用程序處理。

控制器對中斷處理的優先級如下

DOEPINTn.XferCompl>DOEPINTn.StsPhseRcvd(SI)>DOEPINTon.SetUp.

基于此,應用程序只需要解碼下表中所示的OUT端點的中斷組合:

場景StsPhseRcvd (SI)SetUp (SPD)XferCompl (IOC)說明
A001控制器更新了描述符,軟件需要查詢描述符的SR位以確定數據是SETUP包還是OUT傳輸的數據。
B010前面收到了SETUP包且Setup階段完成,即收到了Setup包的內容。
C011控制器更新了描述符,對應Setup包。且Setup階段完成。
D100控制OUT傳輸,主機切換到了狀態階段。
E101在A的基礎上且主機切換到了控制寫的狀態階段,即D+A.

總結一下就是B和C確定當前處于Setup完成階段,根據Setup包內容軟件決定后面是發數據還是讀數據,還是回狀態包(無數據)。

D和E確定當前處于控制寫的狀態階段,設備需要回0長包。

A需要根據描述符的SR位以確定當前是收到的SETUP包還是OUT數據包。

四.總結

本篇重點介紹了中斷相關寄存器,以及OUT端點相關中斷的組合以確定當前處于控制傳輸的什么階段。兩者都是驅動編寫的重點需要理解的內容。下一篇我們繼續介紹控制傳輸,軟件的編寫。

審核編輯:湯梓紅

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

    關注

    31

    文章

    5325

    瀏覽量

    120052
  • usb
    usb
    +關注

    關注

    60

    文章

    7903

    瀏覽量

    264046
  • 編程
    +關注

    關注

    88

    文章

    3596

    瀏覽量

    93609
  • 中斷
    +關注

    關注

    5

    文章

    895

    瀏覽量

    41401
  • 開發板
    +關注

    關注

    25

    文章

    4959

    瀏覽量

    97214
  • 代碼
    +關注

    關注

    30

    文章

    4753

    瀏覽量

    68368
  • 單板計算機
    +關注

    關注

    0

    文章

    74

    瀏覽量

    15615
  • 編譯
    +關注

    關注

    0

    文章

    654

    瀏覽量

    32813
  • 驅動開發
    +關注

    關注

    0

    文章

    130

    瀏覽量

    12065
  • DWC2
    +關注

    關注

    0

    文章

    35

    瀏覽量

    120
收藏 人收藏

    評論

    相關推薦

    基于DWC2USB驅動開發-0x06 DWC2 USB2.0 IP 頭文件與寄存器的讀寫操作

    上一篇我們介紹了控制器寄存器,而驅動的編寫底層無非就是配置各種寄存器,所以第一步先要準備寄存器的頭文件,對
    的頭像 發表于 05-16 14:04 ?2368次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-0x06 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP 頭文件與<b class='flag-5'>寄存器</b>的讀寫操作

    基于DWC2USB驅動開發-IN端點發送相關寄存器詳解

    上一篇我們介紹了IN端點,發送,DMA相關的兩個寄存器,這一篇繼續講另外的幾個寄存器。
    的頭像 發表于 07-17 07:41 ?1753次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-IN端點發送<b class='flag-5'>相關</b>的<b class='flag-5'>寄存器</b>詳解

    基于DWC2USB驅動開發-DOEP接收相關的其他寄存器詳解

    前面介紹了DOEP的DMA相關寄存器,這一篇繼續來講剩下的寄存器。
    的頭像 發表于 07-19 10:50 ?1456次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-DOEP接收<b class='flag-5'>相關</b>的其他<b class='flag-5'>寄存器</b>詳解

    基于DWC2USB驅動開發-0x01開篇介紹與新思DWC2 USB2.0控制器簡介

    本文轉自公眾號,歡迎關注 基于DWC2USB驅動開發-0x01開篇介紹與新思DWC2 USB2
    的頭像 發表于 05-08 18:10 ?4513次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-0x01開篇介紹與新思<b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0<b class='flag-5'>控制器</b>簡介

    基于DWC2USB驅動開發-0x02 DWC2 USB2.0 IP功能特征介紹

    DWC2即新思(Synopsys )的DesignWare? Cores USB 2.0 HiSpeed On-The-Go (OTG)控制器IP,被大量使用。從linux的內核源碼驅動
    的頭像 發表于 05-09 10:09 ?9123次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-0x02 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP功能特征介紹

    基于DWC2USB驅動開發-0x05 DWC2 USB2.0 IP 寄存器介紹

    本文對控制器寄存器有了一個整體上的概覽,先了解個大概,了解寄存器的組織結構,大致了解一下常用的寄存器。后面編程時再一個個對照每一個寄存器
    的頭像 發表于 05-16 12:50 ?3200次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-0x05 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP <b class='flag-5'>寄存器</b>介紹

    基于DWC2USB驅動開發-0x0D PHY寄存器讀寫代碼編寫與測試

    我們前面重點介紹了ULPI接口和PHY的寄存器,這一篇來進行PHY寄存器讀寫的代碼編寫與測試。從這一篇開始就正真進入了驅動編寫的過程了。
    的頭像 發表于 06-06 13:03 ?2165次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-0x0D PHY<b class='flag-5'>寄存器</b>讀寫代碼編寫與測試

    基于DWC2USB驅動開發-USB復位詳解

    本文轉自公眾號歡迎關注 基于DWC2USB驅動開發-USB復位詳解 (qq.com) 一.前言 ? ? ? ? ?上一篇我們詳細介紹了
    的頭像 發表于 07-07 11:18 ?5.9w次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-<b class='flag-5'>USB</b>復位詳解

    基于DWC2USB驅動開發-USB連接詳解

    本文轉自公眾號,歡迎關注 基于DWC2USB驅動開發-USB連接詳解 (qq.com) 一.前言 ? 之前一直在閱讀手冊,規格書,練習招式
    的頭像 發表于 07-07 08:46 ?3581次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-<b class='flag-5'>USB</b>連接詳解

    基于DWC2USB驅動開發-設備類驅動框架

    本文轉自公眾號,歡迎關注 基于DWC2USB驅動開發-設備類驅動框架 (qq.com) 一.前言 從軟件頂層,從數據流的角度來看
    的頭像 發表于 07-16 15:56 ?1286次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-設備類<b class='flag-5'>驅動</b>框架

    基于DWC2USB驅動開發-發送相關寄存器DMA寄存器詳解

    本文轉自公眾號,歡迎關注 基于DWC2USB驅動開發-發送相關寄存器DMA
    的頭像 發表于 07-16 16:42 ?1587次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-發送<b class='flag-5'>相關</b>的<b class='flag-5'>寄存器</b>DMA<b class='flag-5'>寄存器</b>詳解

    基于DWC2USB驅動開發-DOEP接收相關的DMA寄存器詳解

    前面我們詳細介紹了發送即DIEP相關的一些寄存器,這一篇我們來看看接收即DOEP相關的一些寄存器。形式上DOEP和DIEP寄存器是類似的。不
    的頭像 發表于 07-19 09:00 ?1221次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-DOEP接收<b class='flag-5'>相關</b>的DMA<b class='flag-5'>寄存器</b>詳解

    基于DWC2USB驅動開發-數據不能發送問題分析案例

    本文轉自公眾號歡迎關注 基于DWC2USB驅動開發-數據不能發送問題分析案例 (qq.com) ? 一.前言 ? ? ? ?對于驅動
    的頭像 發表于 08-08 09:43 ?2149次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-數據不能發送問題分析案例

    如何對基于hal庫的DWC2 USB IP進行調試呢

    背景之前適配 DWC2 USB IP 的時候,主要是基于 st 的 hal 庫來走的,當時我就對他們的 hal 庫代碼不滿,只是無奈,迫于時間就沒重構,果不其然,usb bug 一堆,隨意舉例,這還
    發表于 06-14 15:23

    51單片機與中斷相關寄存器

    51單片機與中斷相關寄存器簡介中斷控制寄存器IE中斷
    發表于 11-12 11:36 ?8次下載
    51單片機與<b class='flag-5'>中斷</b><b class='flag-5'>相關</b>的<b class='flag-5'>寄存器</b>