99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

基于DWC2的USB驅(qū)動(dòng)開發(fā)-UVC的單元和終端類請(qǐng)求驅(qū)動(dòng)代碼優(yōu)化

嵌入式USB開發(fā) ? 來源:嵌入式USB開發(fā) ? 作者:嵌入式USB開發(fā) ? 2023-07-14 09:44 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注
基于DWC2的USB驅(qū)動(dòng)開發(fā)-UVC的單元和終端類請(qǐng)求驅(qū)動(dòng)代碼優(yōu)化 (qq.com)

前言

前面介紹了UVC的處理單元和相機(jī)終端,可以看到各單元和終端的請(qǐng)求形式都是一樣的, 只是支持的CS和操作類型不一樣,數(shù)據(jù)的大小不一樣。目前的驅(qū)動(dòng)是基于層層switch去解析的,這樣代碼冗余非常大,每一個(gè)接口的每一個(gè)單元和終端的每一個(gè)CS的每一個(gè)操作類型都要單獨(dú)添加代碼處理,而且這些處理應(yīng)該位于類相關(guān)代碼中,對(duì)用戶不可見,用戶只需要關(guān)心具體的值的獲取與更新。而現(xiàn)在的處理方式做不到,現(xiàn)在用戶必須去修改這部分代碼才能獲取和更新值,并且添加修改接口,終端和單元就需要修改代碼。所以有必要對(duì)驅(qū)動(dòng)進(jìn)行優(yōu)化,下面介紹優(yōu)化細(xì)節(jié)。

https://mp.weixin.qq.com/s/4CTR1yjUmBsHqZPLEC7BhA

數(shù)據(jù)抽象

前面我們可以看到,單元和終端請(qǐng)求及其數(shù)據(jù)都是類似的,變化的是接口號(hào),單元和終端號(hào),CS,操作類型,值的大小,所以對(duì)這些進(jìn)行抽象,抽象為數(shù)據(jù)結(jié)構(gòu),對(duì)應(yīng)的變量即數(shù)據(jù)結(jié)構(gòu)的成員變量。

首先對(duì)CS對(duì)應(yīng)的值空間分配進(jìn)行抽象

規(guī)格書P173中類相關(guān)的請(qǐng)求,對(duì)應(yīng)如下,即對(duì)應(yīng)不同的數(shù)據(jù)類型,其中SET只有一個(gè),其他都是GET,暫時(shí)不考慮ALL的操作,對(duì)于ALL的操作預(yù)留回調(diào)接口到時(shí)單獨(dú)實(shí)現(xiàn),目前基本是不會(huì)用到ALL相關(guān)的操作的。

圖片

那么我們需要如下的值空間,共7個(gè)值

CUR 當(dāng)前值

MIN 最小值

MAX 最大值

RES 分辨率

LEN 數(shù)據(jù)長(zhǎng)度

INFO 信息

DEF 默認(rèn)值

最直接的分配空間的方法是以上7個(gè)類型各存一份,可連續(xù)放在一起。

但是不是所有的CS都支持這些值,所以為了減少空間占用,我們只分配支持的,不支持的不需要分配空間。并且我們還需要知道每個(gè)值的長(zhǎng)度,

于是一個(gè)CS需要一片空間,這一片空間再分配給具體的某個(gè)類型,這樣每個(gè)類型還需要一個(gè)長(zhǎng)度信息,于是抽象出如下結(jié)構(gòu)體

/**
 * struct usbd_uvc_utcs_t
 * UVC類的終端和單元對(duì)應(yīng)CS的值,所有操作類型的值空間分配
 */
typedef struct 
{
    uint8_t  cs;                  /**< Control Selector Codes                            */
    uint8_t* buffer;              /**< 數(shù)據(jù)緩沖區(qū)                                         */
    uint8_t  len[7];              /**< [CUR MIN MAX RES LEN INFO DEF]的順序,索引0對(duì)應(yīng)CUR   */
} usbd_uvc_utcs_t;

Cs即為對(duì)應(yīng)的CS

Buffer即分配給該CS下所有類型值的空間

Len[7]對(duì)應(yīng)7個(gè)類型,每個(gè)類型的長(zhǎng)度,長(zhǎng)度為0表示該類型不支持。

那么怎么知道該類型在buffer中的偏移呢,可以通過前面所有l(wèi)en累計(jì)來計(jì)算,

比如MAX在CUR和MIN后面,其偏移就是len[0]+len[1],

并且還可以用GET_XXX的值是連續(xù)遞增的特點(diǎn)來計(jì)算,比如GET_MAX=GET_CUR+2,

所以前面有2個(gè)值,所以計(jì)算偏移循環(huán)計(jì)算前面2個(gè)即可。

以上對(duì)小的顆粒CS的數(shù)據(jù)空間進(jìn)行了抽象,再往上一層,一個(gè)單元和終端支持多個(gè)CS,但是不一定所有的都會(huì)支持,所以需要再將支持的CS進(jìn)行組合

抽象出如下結(jié)構(gòu)體

typedef void (*uvc_ut_set_pf)(void* data, uint32_t len); /**< SET回調(diào)函數(shù) */
typedef void (*uvc_ut_get_pf)(void* data, uint32_t len); /**< GET回調(diào)函數(shù) */

/**
 * struct usbd_uvc_utcr_t
 * UVC類的終端和單元控制請(qǐng)求結(jié)構(gòu)體
 * Unit and Terminal Control Requests
 */
typedef struct usbd_uvc_utcr
{
    uint8_t itf;                /**< 位于的接口               */
    uint8_t id;                 /**< 終端和單元ID             */
    uint8_t csnum;              /**< 終端和單元的CS個(gè)數(shù)        */
    usbd_uvc_utcs_t* cs;        /**< 終端和單元CS對(duì)應(yīng)的值空間  */
    uvc_ut_set_pf set_cb;       /**< SET回調(diào)                  */
    uvc_ut_get_pf get_cb;       /**< GET回調(diào)                  */ 
    struct usbd_uvc_utcr* next; /**< 指向下一個(gè)終端或單元       */
} usbd_uvc_utcr_t;

用戶初始化

這樣用戶只需要分配上述空間,并注冊(cè)回調(diào)函數(shù),實(shí)現(xiàn)回調(diào)函數(shù)即可

usbd_uvc_utcr_t s_uvc_utcr2_t=
{
    0,                                                 /**< 接口0                     */
    2,                                                 /**< ID2                       */
    sizeof(s_uvc_utcs2_t)/sizeof(s_uvc_utcs2_t[0]),    /**< 總共19個(gè)屬性               */
    .cs=s_uvc_utcs2_t,                                 /**< 終端和端元CS及其值          */
    .set_cb=0,                                         /**< set回調(diào)                    */
    .get_cb=0,                                         /**< get回調(diào)                    */
    .next=0,                                           /**< usbd_uvc_reg_utcr時(shí)自動(dòng)鏈接 */
};

如下注冊(cè)即可
usbd_uvc_reg_utcr(&s_uvc_utcr2_t);

對(duì)應(yīng)s_uvc_utcs2_t一行對(duì)應(yīng)一個(gè)CS,我們根據(jù)手冊(cè)的描述來設(shè)置

以PU_BACKLIGHT_COMPENSATION_CONTROL為例

圖片

該CS支持的類型有CUR,MIN,MAX,RES,INFO,DEF除了LEN都支持

對(duì)應(yīng)長(zhǎng)度分別時(shí){2,2,2,2,0,1,2}總長(zhǎng)為11,所以需要11字節(jié)緩沖區(qū)

uint8_t s_backlight_buffer_au8[11];

/** 處理單元
* len[CUR MIN MAX RES LEN INFO DEF]
*/
usbd_uvc_utcs_t s_uvc_utcs2_t[]=
{
{
.cs = PU_BACKLIGHT_COMPENSATION_CONTROL,
.buffer = s_backlight_buffer_au8,
{2,2,2,2,0,1,2},
},
}

以上就完成了初始化,緩沖區(qū)可以動(dòng)態(tài)分配也可以靜態(tài)分配。

注冊(cè)過程

如下將每個(gè)終端和的單元的結(jié)構(gòu)體通過單向鏈表鏈接起來,usb_uvc為類結(jié)構(gòu)體全局變量,屬于驅(qū)動(dòng)部分這里不講,后面會(huì)講到。

/**

* @fn int usbd_uvc_reg_utcr(usbd_uvc_utcr_t* item)
* 注冊(cè)類相關(guān)單元和終端控制請(qǐng)求
* @param[in] item ref usbd_uvc_utcr_t
* @retval 0:成功.
* @retval !=0:其他值失敗.
  */
int usbd_uvc_reg_utcr(usbd_uvc_utcr_t* item)
  {
  if(item == (usbd_uvc_utcr_t*)0)
  {
  return -1;
  }
  if(usbd_uvc.utcr_list == (void*)0)
  {
  /* 當(dāng)前鏈表為空,直接添加到頭
  * 設(shè)置Next為空
    */
item- >next = (usbd_uvc_utcr_t*)0;
    usbd_uvc.utcr_list = item;
    }
    else
    {
    /* 當(dāng)前鏈表不為空,插入到頭
  * 設(shè)置Next為之前的頭
    */
item- >next = (usbd_uvc_utcr_t*)(usbd_uvc.utcr_list);
    usbd_uvc.utcr_list = item;
    }
    return 0;
    }

處理過程

可以簡(jiǎn)單了很多,且支持任意的接口,終端單元,CS和類型的配置。

static void uvc_class_ut_req(dwc_handle *dwc, ureq_t setup)
{
/* 搜尋終端和處理單元號(hào) */
usbd_uvc_utcr_t* p = 0;
usb_class_def* c_p;
int itf;
int id;
int cs;
int req;
int off = 0;
int len = 0;
int getsetlen = 0;
itf = setup- >wIndex & 0xFF;

/* 根據(jù)接口號(hào)查找接口類 */
c_p = dwc- >pclass_cb;
int getitf=0;
while(c_p != 0)
{
for(int i=0; i< 8; i++)
{
if(c_p- >itfs[i] == 0xFF)
{
break;
}
if(c_p- >itfs[i] == itf)
{
getitf = 1;
break;
}
}
if(getitf != 0)
{
p = c_p- >utcr_list;
break;
}
c_p= c_p- >next;
}
if(p == 0)
{
/* 沒有找到接口對(duì)應(yīng)的類 */
USBD_UVC_WARN(("unknow itf:%drn",itf));
return;
}

id =  (setup- >wIndex > > 8) & 0xFF;
cs = (setup- >wValue > > 8) & 0xFF;
req = setup- >bRequest;

#if 0
if((req & 0xF0) == 0x90)
{
/* GET_XXX_ALL*/
usb_ep0_set_stall(dwc); /* 暫時(shí)不支持 后面再實(shí)現(xiàn) */
return;
}
else if((req & 0xF0) == 0x10)
{
/* SET_CUR_ALL */
usb_ep0_set_stall(dwc); /* 暫時(shí)不支持 后面再實(shí)現(xiàn) */
return;
}
else
{
/* 其他的支持 */
}
#endif
while(p != (usbd_uvc_utcr_t*)0)
{
if((p- >itf == itf) && (p- >id == id))
{
for(int i=0; i< p- >csnum; i++)
{
if(cs == p- >cs[i].cs)
{
/* 如果長(zhǎng)度為0說明不支持,直接STALL返回 */
len = p- >cs[i].len[(req&0x0F) - 1];
if(len == 0)
{
usb_ep0_set_stall(dwc);
USBD_UVC_WARN(("NOT SUPPORT ITF:%d ID:%d CS:%d REQ%drn",itf,id,cs,req));
return;
}
getsetlen = setup- >wLength > len ? len  : setup- >wLength;
/* 計(jì)算偏移值 */
off = 0;
for(int j=0; j< ((req&0x0F) - 1); j++)
{
off += p- >cs[i].len[j];
}
/* 找到CS
* INFO CUR MIN MAX RES DEF LEN
*/
switch(req)
{
case GET_INFO:
case GET_CUR:
case GET_MIN:
case GET_MAX:
case GET_RES:
case GET_DEF:
case GET_LEN:
if(p- >get_cb != 0)
{
p- >get_cb(0,0);
}
usb_ep0_write(dwc, p- >cs[i].buffer + off, getsetlen);
USBD_UVC_LOG(("ITF:%d ID:%d GET CS:%d REQ:%x OF:%d LEN:%drn",itf,id,cs,req,off,getsetlen));
break;
case SET_CUR:
if(p- >set_cb != 0)
{
p- >set_cb(0,0);
}
usb_ep0_read(dwc, p- >cs[i].buffer + off, getsetlen, 0);
USBD_UVC_LOG(("%d %d SET %d %d %d %drn",itf,id,cs,req,off,getsetlen));
break;
default:
usb_ep0_set_stall(dwc);
break;
}
return;
}
}
}
p = p- >next;
}
/* 未找到匹配項(xiàng)則STALL */
usb_ep0_set_stall(dwc);
}

對(duì)比之前的設(shè)計(jì),

圖片

總結(jié)

以上實(shí)現(xiàn)了終端和單元請(qǐng)求相關(guān)驅(qū)動(dòng)的代碼,實(shí)現(xiàn)可分層設(shè)計(jì),可擴(kuò)展具備可移植性。后面再考慮實(shí)現(xiàn)ALL相關(guān)的操作。
審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    8190

    瀏覽量

    273120
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3826

    瀏覽量

    83016
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70786
  • USB驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    1

    文章

    138

    瀏覽量

    20766
  • 驅(qū)動(dòng)開發(fā)

    關(guān)注

    0

    文章

    134

    瀏覽量

    12317
  • uvc
    uvc
    +關(guān)注

    關(guān)注

    1

    文章

    128

    瀏覽量

    14951
  • DWC2
    +關(guān)注

    關(guān)注

    0

    文章

    35

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    基于DWC2USB驅(qū)動(dòng)開發(fā)-0x01開篇介紹與新思DWC2 USB2.0控制器簡(jiǎn)介

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-0x01開篇介紹與新思DWC2 USB2
    的頭像 發(fā)表于 05-08 18:10 ?5626次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-0x01開篇介紹與新思<b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0控制器簡(jiǎn)介

    基于DWC2USB驅(qū)動(dòng)開發(fā)-0x02 DWC2 USB2.0 IP功能特征介紹

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

    基于DWC2USB驅(qū)動(dòng)開發(fā)-IAD描述符詳解

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-IAD描述符詳解 (qq.com) 一.? 前言 IAD描述符用于一個(gè)設(shè)備功能關(guān)聯(lián)多個(gè)接口,可以用于實(shí)現(xiàn)組合設(shè)備。 二.參考文檔
    的頭像 發(fā)表于 06-27 08:45 ?44.5w次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-IAD描述符詳解

    基于DWC2USB驅(qū)動(dòng)開發(fā)-USB復(fù)位詳解

    本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-USB復(fù)位詳解 (qq.com) 一.前言 ? ? ? ? ?上一篇我們?cè)敿?xì)介紹了
    的頭像 發(fā)表于 07-07 11:18 ?11.8w次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-<b class='flag-5'>USB</b>復(fù)位詳解

    基于DWC2USB驅(qū)動(dòng)開發(fā)-USB連接詳解

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-USB連接詳解 (qq.com) 一.前言 ? 之前一直在閱讀手冊(cè),規(guī)格書,練習(xí)招式
    的頭像 發(fā)表于 07-07 08:46 ?4534次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-<b class='flag-5'>USB</b>連接詳解

    基于DWC2USB驅(qū)動(dòng)開發(fā)-高速設(shè)備枚舉為全速設(shè)備問題案例分析

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-高速設(shè)備枚舉為全速設(shè)備問題案例分析 (qq.com) 一.前言 ? 本文分享一個(gè)高速設(shè)備被枚舉為全速的問題。 ? ? 高速設(shè)備速
    的頭像 發(fā)表于 07-10 17:12 ?2043次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-高速設(shè)備枚舉為全速設(shè)備問題案例分析

    基于DWC2USB驅(qū)動(dòng)開發(fā)-UVC的處理單元詳解

    本篇來詳細(xì)分析下UVC的處理單元相關(guān)的內(nèi)容,同樣的我們理論結(jié)合實(shí)踐來進(jìn)行。
    的頭像 發(fā)表于 07-13 09:42 ?3067次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-<b class='flag-5'>UVC</b>的處理<b class='flag-5'>單元</b>詳解

    基于DWC2USB驅(qū)動(dòng)開發(fā)-UVC的相機(jī)終端詳解

    本篇來詳細(xì)分析下UVC的相機(jī)終端相關(guān)的內(nèi)容,同樣的我們理論結(jié)合實(shí)踐來進(jìn)行。
    的頭像 發(fā)表于 07-13 09:46 ?3414次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-<b class='flag-5'>UVC</b>的相機(jī)<b class='flag-5'>終端</b>詳解

    基于DWC2USB驅(qū)動(dòng)開發(fā)-設(shè)備驅(qū)動(dòng)框架

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-設(shè)備驅(qū)動(dòng)框架 (qq.com) 一.前
    的頭像 發(fā)表于 07-16 15:56 ?1832次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-設(shè)備<b class='flag-5'>類</b><b class='flag-5'>驅(qū)動(dòng)</b>框架

    基于DWC2USB驅(qū)動(dòng)開發(fā)-發(fā)送相關(guān)的寄存器DMA寄存器詳解

    本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-發(fā)送相關(guān)的寄存器DMA寄存器詳解 (qq.com) 前言 如下寄存器DIEPxxx,對(duì)應(yīng)IN端點(diǎn),和發(fā)送數(shù)據(jù)相關(guān),這一篇先介紹和
    的頭像 發(fā)表于 07-16 16:42 ?2269次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-發(fā)送相關(guān)的寄存器DMA寄存器詳解

    基于DWC2USB驅(qū)動(dòng)開發(fā)-USB包詳解

    不管什么通訊協(xié)議,比如UART,SPI,USB等等,不管是并口還是串口,不管是同步還是異步,我們從抽象的角度去看,其本質(zhì)都是一樣的。都是先定義物理信號(hào),物理信號(hào)可能是差分,單端,電流驅(qū)動(dòng)電壓驅(qū)動(dòng)等等
    的頭像 發(fā)表于 07-23 17:11 ?3356次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-<b class='flag-5'>USB</b>包詳解

    基于DWC2USB驅(qū)動(dòng)開發(fā)-數(shù)據(jù)不能發(fā)送問題分析案例

    本文轉(zhuǎn)自公眾號(hào)歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-數(shù)據(jù)不能發(fā)送問題分析案例 (qq.com) ? 一.前言 ? ? ? ?對(duì)于驅(qū)動(dòng)
    的頭像 發(fā)表于 08-08 09:43 ?3464次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-數(shù)據(jù)不能發(fā)送問題分析案例

    新思 DWC2 的參考手冊(cè)從哪里可以下載

    最近在學(xué)習(xí)STM32F4 USB驅(qū)動(dòng),有看到 dwc2驅(qū)動(dòng)代碼,但是沒有手冊(cè)用來參考,ST手冊(cè)上寄存器不全,從網(wǎng)上看到有下面兩個(gè)手冊(cè),但
    發(fā)表于 01-22 11:32

    如何對(duì)基于hal庫(kù)的DWC2 USB IP進(jìn)行調(diào)試呢

    背景之前適配 DWC2 USB IP 的時(shí)候,主要是基于 st 的 hal 庫(kù)來走的,當(dāng)時(shí)我就對(duì)他們的 hal 庫(kù)代碼不滿,只是無奈,迫于時(shí)間就沒重構(gòu),果不其然,usb bug 一堆,
    發(fā)表于 06-14 15:23

    基于DWC2USB驅(qū)動(dòng)開發(fā)-抽絲剝繭再論切換到狀態(tài)階段標(biāo)志DOEPINTn.StsPhseRcvd

    本文轉(zhuǎn)自公眾號(hào)系列文章,歡迎關(guān)注 基于DWC2USB驅(qū)動(dòng)開發(fā)-USB包詳解 (qq.com) 一.前言 前面我們對(duì)SETUP完成標(biāo)志DOE
    的頭像 發(fā)表于 07-24 18:04 ?2628次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動(dòng)</b><b class='flag-5'>開發(fā)</b>-抽絲剝繭再論切換到狀態(tài)階段標(biāo)志DOEPINTn.StsPhseRcvd