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

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ā)-0x0C 驅(qū)動(dòng)框架設(shè)計(jì)

嵌入式USB開發(fā) ? 來(lái)源: 嵌入式USB開發(fā) ? 作者: 嵌入式USB開發(fā) ? 2023-06-05 17:15 ? 次閱讀

本文轉(zhuǎn)自公眾號(hào),歡迎關(guān)注

基于DWC2的USB驅(qū)動(dòng)開發(fā)-0x0C 驅(qū)動(dòng)框架設(shè)計(jì) (qq.com)

一. 驅(qū)動(dòng)架構(gòu)

1.1 前言

前面我們介紹了DWC2的控制器相關(guān)的寄存器,驅(qū)動(dòng)的編寫本質(zhì)上就是進(jìn)行寄存器的配置。為了代碼的健壯性,可移植性,可調(diào)試性等我們必須設(shè)計(jì)一個(gè)比較好的架構(gòu)。對(duì)于驅(qū)動(dòng)編程來(lái)說(shuō)輸入就是各個(gè)寄存器,如果使用的都是DWC2的話甚至來(lái)說(shuō)寄存器都是一樣的輸入就只需要寄存器基地址,即如果都是使用該IP的驅(qū)動(dòng)甚至只要修改寄存器基地址,然后移植中斷等一些和SOC相關(guān)的內(nèi)容即可復(fù)用。

1.2 架構(gòu)框圖

圖片

整體的設(shè)計(jì)思想如下:

借鑒面向?qū)ο蟮脑O(shè)計(jì)的依賴倒置原則:

面向接口編程,不依賴具體實(shí)現(xiàn)編程,應(yīng)用層不直接依賴具體實(shí)現(xiàn)而是依賴接口,上層調(diào)用接口底層實(shí)現(xiàn)接口,接口是硬件隔離的橋梁.

接口即對(duì)應(yīng)上圖的HAL層。

硬件: 對(duì)于使用DWC2控制器的則還可以復(fù)用HW層本身的內(nèi)容,只需要修改寄存器的基地址即可,因?yàn)镈WC2控制器寄存器都是一樣的。另外需要修改一些和SOC相關(guān)的內(nèi)容,比如中斷的設(shè)置。對(duì)于不同的控制器和SOC平臺(tái)的則需要根據(jù)具體的平臺(tái)進(jìn)行封裝。理論上也可以直接依賴硬件實(shí)現(xiàn)HAL層,而不需要HW層的封裝,但是這樣的話直接在HAL層操作寄存器代碼的閱讀性上不佳。

HW層:即對(duì)頭文件中寄存器的操作進(jìn)行封裝,主要采用宏的方式封裝,目的是為了可閱讀性。同時(shí)對(duì)于一些聯(lián)系緊密的操作放在一起進(jìn)行封裝,比如初始化等,提供比如結(jié)構(gòu)體參數(shù)等,進(jìn)行相應(yīng)的參數(shù)配置。這一層對(duì)于使用同樣的DWC2控制器的也完全可復(fù)用。

HAL層:這是硬件和上層隔離的一層,定義了一系列接口,協(xié)議棧調(diào)用該接口進(jìn)行硬件操作,而HAL調(diào)用HW層實(shí)現(xiàn)上述的接口。對(duì)于不使用DWC2控制器的,則需要重新實(shí)現(xiàn)HAL層,而同使用DWC2控制器的則本層也通用。本層的設(shè)計(jì)原則是接口個(gè)數(shù)盡可能少和簡(jiǎn)單但是要足夠滿足協(xié)議棧層的需要。符合面向?qū)ο笤O(shè)計(jì)的最少知道原則。

協(xié)議棧層:依賴HAL接口,實(shí)現(xiàn)USB規(guī)格書規(guī)定的協(xié)議。

協(xié)議棧和HAL層以及以下的層次,盡可能不進(jìn)行資源分配(比如內(nèi)存)等預(yù)留相應(yīng)的接口,資源分配由應(yīng)用層實(shí)現(xiàn),這樣設(shè)計(jì)的目的是在嵌入式開發(fā)環(huán)境資源往往受限,資源的分配往往需要應(yīng)用層來(lái)把控,應(yīng)用層來(lái)負(fù)責(zé)。底層盡可能少的依賴資源,盡可能保持確定性,避免過多動(dòng)態(tài)行為。

應(yīng)用層:調(diào)用協(xié)議棧實(shí)現(xiàn)具體的應(yīng)用功能。

考慮到通用性和可移植性,我們要支持OS和無(wú)OS的實(shí)現(xiàn),所以非必要不依賴OS相關(guān)的API,如果不可避免則盡可能少依賴,且實(shí)現(xiàn)需要依賴的API的OS和NONE-OS版本,將依賴抽離出來(lái)作為需要移植實(shí)現(xiàn)的部分,使得在不同OS和裸機(jī)下都能運(yùn)行,這里會(huì)涉及到協(xié)議棧基于中斷驅(qū)動(dòng)的處理方式和基于事件驅(qū)動(dòng)的處理方式兩種實(shí)現(xiàn),后面到協(xié)議棧設(shè)計(jì)部分再說(shuō)。

1.3 調(diào)試方案

調(diào)試手段是驅(qū)動(dòng)開發(fā)中需要重點(diǎn)考慮的一環(huán),沒有合適的調(diào)試手段,遇到問題,會(huì)兩眼一抹黑完全無(wú)從下手。進(jìn)行USB開發(fā),硬件上示波器和協(xié)議分析儀是必須的。另外軟件上也需要一些手段配合調(diào)試。以下是幾種常見的方式。

1.3.1 仿真器

這是嵌入式開發(fā)必須的,尤其是驅(qū)動(dòng)開發(fā)階段,需要跟蹤代碼流,寄存器的配置,變量的值等等。仿真器調(diào)試有個(gè)問題就是需要中斷正常的程序流.USB是一個(gè)有著嚴(yán)格時(shí)序要求,且高速的協(xié)議,程序中斷會(huì)導(dǎo)致USB的處理過程由于超時(shí)等導(dǎo)致異常,所以很多時(shí)候不能通過仿真器打斷點(diǎn)等方式進(jìn)行調(diào)試。

1.3.2 IO

USB由于其嚴(yán)格的時(shí)序要求,且高速的處理,很多時(shí)候我們需要測(cè)試相應(yīng)的處理時(shí)間,使用定時(shí)器進(jìn)行計(jì)時(shí)并打印時(shí)間是一種方法,但是對(duì)于高精度計(jì)時(shí)定時(shí)器的處理代碼本身需要時(shí)間會(huì)帶來(lái)誤差。這時(shí)使用IO翻轉(zhuǎn),來(lái)指示某種狀態(tài)的變化非常有用,比如測(cè)試SOF之間的時(shí)間,可以在SOF中斷中翻轉(zhuǎn)IO,使用示波器或者邏輯分析儀測(cè)量波形即可。翻轉(zhuǎn)IO往往一條指令即可,這使得代碼帶來(lái)的誤差減小。

更重要的是可以通過多個(gè)IO關(guān)聯(lián)多個(gè)事件,看到多個(gè)事件之間的關(guān)聯(lián)關(guān)系,尤其是使用示波器和邏輯分析儀查看時(shí)。曲線會(huì)非常直觀。這是使用定時(shí)器打印所不具備的。

IO翻轉(zhuǎn)的調(diào)試方法是嵌入式實(shí)時(shí)分析中重要的手段。

1.3.3 串口打印

USB的處理流程對(duì)應(yīng)著狀態(tài)的流轉(zhuǎn),實(shí)際對(duì)于軟件來(lái)說(shuō)過是各種中斷的進(jìn)入與退出。使用仿真器跟蹤會(huì)破壞USB的處理流程導(dǎo)致超時(shí)等,所以需要一個(gè)非中斷方式的跟蹤事件的方式。常見的方式是使用串口打印,這里要注意串口打印不能使用阻塞方式,否則同樣的會(huì)導(dǎo)致USB處理流的異常。一般采用緩沖區(qū)的方式,打印接口將數(shù)據(jù)寫入緩沖區(qū),主循環(huán)或者其他線程中將緩沖區(qū)的數(shù)據(jù)通過串口發(fā)送。

當(dāng)然除了串口打印還有很多其他類似的方式比如 Jlink提供的rtt等性能更高,也可以使用網(wǎng)口等接口,根據(jù)具體平臺(tái)而定。

串口打印可是設(shè)置為宏的方式,debug版本使能,release版本可不使能,打印輸出也可以設(shè)置等級(jí)和類別,這樣通過等級(jí)和類別控制輸出,避免一次打印過多干擾分析,也可以使用CLI動(dòng)態(tài)配置等級(jí)可列別的控制。

如下是一個(gè)簡(jiǎn)單的示例,依賴printf,假設(shè)printf已經(jīng)實(shí)現(xiàn)是一個(gè)非阻塞的版本(即寫入緩沖區(qū)),其他地方再真正的發(fā)送數(shù)據(jù)。可以通過宏配置不同等級(jí)的LOG,且打印信息對(duì)應(yīng)不同的顏色。

頭文件中

#define USB_HAL_DEBUG 1
#define USB_HAL_LOG_LEVEL_ERROR 1
#define USB_HAL_LOG_LEVEL_WARN 1
#define USB_HAL_LOG_LEVEL_INFO 1


/** Debug levels */
typedef enum 
{
    USB_HAL_DEBUG_ERROR = 0,
    USB_HAL_DEBUG_WARN  = 1,
    USB_HAL_DEBUG_INFO  = 2,
}USB_HAL_DEBUG_e;


#define USB_HAL_DEBUG_COLOR_MASK_COLOR  0x0F
#define USB_HAL_DEBUG_COLOR_MASK_MODIFIER   0xF0


typedef enum {
    /* Colors */
    USB_HAL_DEBUG_COLOR_RESET       = 0xF0,
    USB_HAL_DEBUG_COLOR_BLACK       = 0x01,
    USB_HAL_DEBUG_COLOR_RED     = 0x02,
    USB_HAL_DEBUG_COLOR_GREEN       = 0x03,
    USB_HAL_DEBUG_COLOR_YELLOW  = 0x04,
    USB_HAL_DEBUG_COLOR_BLUE        = 0x05,
    USB_HAL_DEBUG_COLOR_MAGENTA = 0x06,
    USB_HAL_DEBUG_COLOR_CYAN        = 0x07,
    USB_HAL_DEBUG_COLOR_WHITE       = 0x08,
    /* Modifiers */
    USB_HAL_DEBUG_COLOR_NORMAL  = 0x0F,
    USB_HAL_DEBUG_COLOR_BOLD        = 0x10,
    USB_HAL_DEBUG_COLOR_UNDERLINE   = 0x20,
    USB_HAL_DEBUG_COLOR_BLINK       = 0x30,
    USB_HAL_DEBUG_COLOR_HIDE        = 0x40,
} USB_HAL_DEBUG_COLOR_e;


void usb_hal_do_debug(USB_HAL_DEBUG_e level, const char *format, ...);


#ifdef USB_HAL_DEBUG
    #define usb_hal_debug(level, format, ...) do { usb_hal_do_debug(level, format, ##__VA_ARGS__); } while(0)
#else
    #define usb_hal_debug(...) do {} while (0)
#endif


#ifdef USB_HAL_LOG_LEVEL_ERROR
    #define usb_hal_error(format, ...) usb_hal_debug(USB_HAL_DEBUG_ERROR, format, ##__VA_ARGS__)
#else
    #define usb_hal_error(...) do {} while (0)
#endif


#ifdef USB_HAL_LOG_LEVEL_WARN
    #define usb_hal_warn(format, ...) usb_hal_debug(USB_HAL_DEBUG_WARN, format, ##__VA_ARGS__)
#else
    #define usb_hal_warn(...) do {} while (0)
#endif


#ifdef USB_HAL_LOG_LEVEL_INFO
    #define usb_hal_info(format, ...) usb_hal_debug(USB_HAL_DEBUG_INFO, format, ##__VA_ARGS__)
#else
    #define usb_hal_info(...) do {} while (0)
#endif

c文件中

static void usb_hal_set_color(uint32_t color) 
{


    unsigned int color_code, modifier_code;
    switch (color & USB_HAL_DEBUG_COLOR_MASK_COLOR) 
    {
        case USB_HAL_DEBUG_COLOR_BLACK:
            color_code = 30; break;
        case USB_HAL_DEBUG_COLOR_RED:
            color_code = 31; break;
        case USB_HAL_DEBUG_COLOR_GREEN:
            color_code = 32; break;
        case USB_HAL_DEBUG_COLOR_YELLOW:
            color_code = 33; break;
        case USB_HAL_DEBUG_COLOR_BLUE:
            color_code = 34; break;
        case USB_HAL_DEBUG_COLOR_MAGENTA:
            color_code = 35; break;
        case USB_HAL_DEBUG_COLOR_CYAN:
            color_code = 36; break;
        case USB_HAL_DEBUG_COLOR_WHITE:
            color_code = 37; break;
        case USB_HAL_DEBUG_COLOR_RESET:
        default:
            color_code = 0; break;
    }
    
    switch (color & USB_HAL_DEBUG_COLOR_MASK_MODIFIER) 
    {
        case USB_HAL_DEBUG_COLOR_BOLD:
            modifier_code = 1; break;
        case USB_HAL_DEBUG_COLOR_UNDERLINE:
            modifier_code = 2; break;
        case USB_HAL_DEBUG_COLOR_BLINK:
            modifier_code = 3; break;
        case USB_HAL_DEBUG_COLOR_HIDE:
            modifier_code = 4; break;
        case USB_HAL_DEBUG_COLOR_NORMAL:
        default:
            modifier_code = 0; break;
    }


    printf("\\\\033[%u;%um", modifier_code, color_code);
}


void usb_hal_do_debug(USB_HAL_DEBUG_e level, const char *format, ...)
{
    uint32_t color = USB_HAL_DEBUG_COLOR_RESET;
    va_list args;


    switch(level) 
    {
    case USB_HAL_DEBUG_INFO:
        color = USB_HAL_DEBUG_COLOR_GREEN | USB_HAL_DEBUG_COLOR_BOLD;
        break;
    case USB_HAL_DEBUG_ERROR:
        color = USB_HAL_DEBUG_COLOR_RED | USB_HAL_DEBUG_COLOR_BOLD;
        break;
    case USB_HAL_DEBUG_WARN:
        color = USB_HAL_DEBUG_COLOR_YELLOW | USB_HAL_DEBUG_COLOR_BOLD;
        break;
    default:
        return;
    }
    va_start(args, format);
    usb_hal_set_color(color);


    vprintf(format, args);


    //printf("\\\\r\\\\n");
    usb_hal_set_color(USB_HAL_DEBUG_COLOR_RESET);


    va_end(args);
}

1.4 總結(jié)

以上從整體上設(shè)計(jì)了整個(gè)的驅(qū)動(dòng)框架,重點(diǎn)考慮可移植性,可維護(hù)性等原則,借鑒面向?qū)ο蟮囊恍┰O(shè)計(jì)思想和原則。同時(shí)提供了一些調(diào)試方案供參考。前面磨刀已經(jīng)磨了很久了,后面我們就開始正式進(jì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

    文章

    7945

    瀏覽量

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

    關(guān)注

    1

    文章

    136

    瀏覽量

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

    關(guān)注

    0

    文章

    130

    瀏覽量

    12077
  • 驅(qū)動(dòng)框架
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    4036
  • DWC2
    +關(guān)注

    關(guān)注

    0

    文章

    35

    瀏覽量

    132
收藏 人收藏

    評(píng)論

    相關(guā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
    的頭像 發(fā)表于 05-08 18:10 ?4611次閱讀
    基于<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'>0x</b>01開篇介紹與新思<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 ?9420次閱讀
    基于<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'>0x</b>02 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP功能特征介紹

    基于DWC2USB驅(qū)動(dòng)開發(fā)-0x07 DWC2 USB2.0 IP 配置參數(shù)

    混淆,IP的配置參數(shù)固定之后就不能改了,就決定了IP所具有的能力。對(duì)于軟件開發(fā)者來(lái)說(shuō)也要了解其具體的配置,因?yàn)橹挥兄喇?dāng)前IP的配置,知道支持哪些功能,哪些是軟件可以配置的哪些是硬件固定了無(wú)法配置的,等等這些,后面寫驅(qū)動(dòng)才心中有數(shù)。 配置相關(guān)
    的頭像 發(fā)表于 05-17 09:49 ?2303次閱讀

    基于DWC2USB驅(qū)動(dòng)開發(fā)-0x0E 使用邏輯分析儀分析ULPI數(shù)據(jù)

    工欲善其事必先利其器,所以在USB開發(fā)中工具很重要,示波器,邏輯分析儀,USB協(xié)議分析儀等都不可少。在底層問題分析時(shí)缺少有力工具時(shí)很難進(jìn)一步分析,本文分享了ULPI抓包分析,實(shí)際抓包波形因?yàn)樾盘?hào)質(zhì)量問題可能沒有那么理想,所以信號(hào)
    的頭像 發(fā)表于 06-07 16:56 ?1649次閱讀
    基于<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'>0x0</b>E 使用邏輯分析儀分析ULPI數(shù)據(jù)

    基于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 ?14.7w次閱讀
    基于<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 ?6.6w次閱讀
    基于<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 ?3710次閱讀
    基于<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 ?1421次閱讀
    基于<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ā)-設(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 ?1321次閱讀
    基于<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'>驅(qū)動(dòng)</b><b class='flag-5'>框架</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 ?1658次閱讀
    基于<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 ?2599次閱讀
    基于<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 ?2314次閱讀
    基于<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ā)送問題分析案例

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

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

    基于DWC2USB驅(qū)動(dòng)開發(fā)-0x0A ULPI接口同步模式介紹

    同步模式是ULPI必須支持的且主要的模式,內(nèi)容比較多,對(duì)于軟件開發(fā)人員來(lái)說(shuō)重點(diǎn)關(guān)注下總線時(shí)序,即數(shù)據(jù)是如何交互的,這樣必要的的時(shí)候可以使用邏輯分析儀進(jìn)行抓包分析。另外重點(diǎn)關(guān)注下各個(gè)狀態(tài)是如何反應(yīng)在ULPI的寄存器中的
    的頭像 發(fā)表于 06-04 15:35 ?4020次閱讀
    基于<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'>0x0</b>A ULPI接口同步模式介紹

    基于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 ?1597次閱讀
    基于<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
    主站蜘蛛池模板: 国产黄色网页| 激情文学综合| 国产色司机在线视频免费观看| 网站一级片| 一区二区三区视频在线| 四虎影院com| yy6080一级毛片高清| 国产成人精品亚洲日本在线| 免费看美女禁处爆涌视频| 亚洲国产毛片aaaaa无费看| 色多多成视频人在线观看| 成 人 免 费 黄 色| 日本videosgratis教师69| 亚洲国产成人久久| 色吧在线视频| 永久免费影视在线观看| 69日本xxxxxxxxx56| 日韩免费视频一区二区| 一本大道加勒比久久| 久久精品福利| 亚洲午夜一区二区三区| 日本三级三级三级免费看| 国产一区二区影院| 国产小视频在线观看www| 亚洲入口无毒网址你懂的| 国产一区二区三区毛片| 69色视频| 色婷婷精品视频| 五月天天色| sss欧美一区二区三区| 日韩怡红院| 天天视频黄| 在线免费黄| a久久久久一级毛片护士免费| 国产精品区在线12p| 鸥美三级| 午夜影院18| 美女扒开下面让男人捅| 激情丁香婷婷| 婷婷成人丁香五月综合激情| 日韩成人免费一级毛片|