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

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

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

3天內不再提示

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

嵌入式USB開發 ? 來源:嵌入式USB開發 ? 作者:嵌入式USB開發 ? 2023-06-06 13:03 ? 次閱讀

本文轉自公眾號,歡迎關注

基于DWC2的USB驅動開發-0x0D PHY寄存器讀寫代碼編寫與測試 (qq.com)

PHY寄存器讀寫

1.1前言

我們前面重點介紹了ULPI接口和PHY的寄存器,這一篇來進行PHY寄存器讀寫的代碼編寫與測試。從這一篇開始就正真進入了驅動編寫的過程了。

1.2 GPVNDCTL寄存器介紹

DWC2提供了讀寫PHY寄存器的機制,對于應用來說就是操作一個寄存器GPVNDCTL:PHY供應商控制寄存器。能夠讀寫PHY寄存器這在有些底層問題分析時很重要。

《DesignWare Cores USB 2.0 Hi-Speed On-TheGo (OTG) Databook》的P391 5.4.14 GPVNDCTL 有該寄存器的介紹。

IP必須配置OTG_VENDOR_CTL_INTERFACE = 1 才支持該功能。

GHWCFG3寄存器的b9查看該配置值。

圖片

圖片

對于UTMI+PHY,DWC_otg核心使用UTMI+供應商控制接口進行PHY寄存器訪問。對于ULPI PHY,核心使用ULPI接口進行PHY寄存器訪問。應用程序設置GPVNDCTL來訪問PHY寄存器,并對PHY寄存器的訪問進行計時,應用程序輪詢此寄存器中的VStatus Done位來確認是否完成PHY寄存器的訪問。

該寄存器的描述如下

偏移0x34 訪問大小32位

image.png

image.png

image.png

圖片

我們重點關注和PHY讀寫有關的位域,其他的位暫時用不到,先不管。

NewRegReq: 軟件寫1觸發一次操作。

VStsDone: 當應用程序設置NewRegReq為1時,硬件清除該位,操作完成后硬件再置位該位。軟件查詢該位以判斷是否完成,注意代碼中需要考慮查詢超時機制。

VStsBsy: 忙標志,正在進行操作時硬件置位該位,操作完成時硬件清零,可以認為是和VStsDone相反的標志。

RegWr: 0表示讀PHY寄存器,1表示寫PHY寄存器

RegAddr: PHY寄存器地址,PHY立即寄存器的6位地址。設置為6'h2F用于擴展PHY寄存器集訪問。

VCtrl:UTMI+供應商控制寄存器地址(VCtrl)供應商定義的4位并行輸出總線的4位寄存器地址。該字段的位11:8被置于utmi_vontrol[3:0]上。ULPI擴展寄存器地址(ExtRegAddr)PHY擴展寄存器地址。

RegData: 寫寄存器時寫入寄存器的數據。讀寄存器時讀到的寄存器內容,設置VStatus Done時有效。

DisUlpiDrvr:讀寫PHY寄存器無關,

應用程序在完成ULPI Carkit中斷(GINTSTS.ULPICKINT)處理后設置此位。設置后,控制器將禁用輸出信號驅動器,并屏蔽ULPI接口的輸入信號。控制器在啟用ULPI接口之前清除該位。

1.3 代碼編寫

讀PHY寄存器

  1. RegWr設置為0
  2. RegAddr設置為立即寄存器的6位地址,如果是擴展寄存器則設置為0x2F且設置VCtrl為擴展寄存器的值。
  3. NewRegReq置1啟動操作
  4. 等待VStsDone變為1
  5. 讀出RegData

寫PHY寄存器

  1. RegWr設置為1
  2. RegAddr設置為立即寄存器的6位地址,如果是擴展寄存器則設置為0x2F且設置VCtrl為擴展寄存器的值。
  3. RegData設置為待寫入寄存器的值
  4. NewRegReq置1啟動操作
  5. 等待VStsDone變為1

代碼如下

/**
 * \\fn static uint8_t hw_dwc2_is_vndctlsupt(void)
 * 判斷是否支持供應商控制接口(VndctlSupt)
 * \\retval 0 不支持 供應商控制接口(VndctlSupt)
 * \\retval 1 支持
*/
static uint8_t hw_dwc2_is_vndctlsupt(void)
{
    return ((USB_OTG_READ_REG(CFG_GHWCFG3_ADDR) & VNDCTLSUPT_MASK) > > VNDCTLSUPT_OFFSET) & 0x01;
    //return (uint8_t)(s_dwc2_reg_t- >ghwcfg3._b.vndctlsupt);
}


/**
 * \\fn  int hw_dwc2_read_phyreg(uint8_t regaddr, uint8_t* regval, uint32_t timeout)
 * \\param[in] regaddr PHY寄存器,立即寄存器和擴展寄存器統一編碼,高2位為0表示立即寄存器,
 * 高兩位不為0表示擴展寄存器。
 * \\param[out] regval 存儲讀出的寄存器值
 * \\param[in] timeout 查詢是否完成的次數
 * \\retval -1 不支持供應商控制接口(VndctlSupt)
 * \\retval -2 讀超時
 * \\retval 0  讀成功
*/
int hw_dwc2_read_phyreg(uint8_t regaddr, uint8_t* regval, uint32_t timeout)
{
    /* 判斷是否支持供應商控制接口(VndctlSupt) */
    if(hw_dwc2_is_vndctlsupt() == 0)
    {
        return -1;
    }
#if 0
    s_dwc2_reg_t- >gpvndctl._b.regwr = 0; /* 讀模式 */
    if((regaddr & 0xC0) != 0)
    {
        /* 擴展寄存器 */
        s_dwc2_reg_t- >gpvndctl._b.regaddr = 0x2F;
        s_dwc2_reg_t- >gpvndctl._b.vctrl = regaddr;
    }
    else
    {
        /* 立即寄存器 */
        s_dwc2_reg_t- >gpvndctl._b.regaddr = regaddr;
        s_dwc2_reg_t- >gpvndctl._b.vctrl = 0;    
    }
    s_dwc2_reg_t- >gpvndctl._b.newregreq = 1;  /* 啟動操作 */
    while ((s_dwc2_reg_t- >gpvndctl._b.vstsdone == 0) && (timeout-- > 0));  /* 等待完成 */

    /* 根據標志返回值或者錯誤 */
    if(s_dwc2_reg_t- >gpvndctl._b.vstsdone != 0)
    {
        *regval = s_dwc2_reg_t- >gpvndctl._b.regdata;
        //s_dwc2_reg_t- >gpvndctl._b.vstsdone = 1;  /* newregreq =1時硬件清0,沒必要手動清零 */
        return 0;
    }
    else
    {
        return -2;
    }
#else
    uint32_t tmp = 0;
    tmp &= ~REGWR_MASK; /* 讀模式 */
    if((regaddr & 0xC0) != 0)
    {
        /* 擴展寄存器 */
        tmp |= ((uint32_t)0x2F < < REGADDR_OFFSET);
        tmp |= ((uint32_t)regaddr < < VCTRL_OFFSET);
    }
    else
    {
        /* 立即寄存器 */
        tmp |= ((uint32_t)regaddr < < REGADDR_OFFSET);
        tmp |= ((uint32_t)0 < < VCTRL_OFFSET);  
    }   
    tmp |= NEWREGREQ_MASK;                       /* 啟動操作 */
    USB_OTG_WRITE_REG(CFG_GPVNDCTL_ADDR,tmp);


    while(((USB_OTG_READ_REG(CFG_GPVNDCTL_ADDR)&VSTSDONE_MASK) == 0) && (timeout-- > 0));  /* 等待完成 */
    if(((USB_OTG_READ_REG(CFG_GPVNDCTL_ADDR)&VSTSDONE_MASK) != 0))
    {
        *regval = (USB_OTG_READ_REG(CFG_GPVNDCTL_ADDR) > > REGDATA_OFFSET) & 0xFF; /* 讀出寄存器的值 */
        USB_OTG_WRITE_REG(CFG_GPVNDCTL_ADDR,USB_OTG_READ_REG(CFG_GPVNDCTL_ADDR) | VSTSDONE_MASK);
        /* newregreq =1時硬件清0,沒必要手動清零 */
        return 0;
    }
    else
    {
        return -2;
    }
#endif
}


/**
 * \\fn  int hw_dwc2_write_phyreg(uint8_t regaddr, uint8_t regval, uint32_t timeout)
 * \\param[in] regaddr PHY寄存器,立即寄存器和擴展寄存器統一編碼,高2位為0表示立即寄存器,
 * 高兩位不為0表示擴展寄存器。
 * \\param[out] regval 寫入寄存器的值
 * \\param[in] timeout 查詢是否完成的次數
 * \\retval -1 不支持供應商控制接口(VndctlSupt)
 * \\retval -2 讀超時
 * \\retval 0  讀成功
*/
int hw_dwc2_write_phyreg(uint8_t regaddr, uint8_t regval, uint32_t timeout)
{
    /* 判斷是否支持供應商控制接口(VndctlSupt) */
    if(hw_dwc2_is_vndctlsupt() == 0)
    {
        return -1;
    }


#if 0
    /* 不能使用結構體單位域操作,因為regdata需要vstsdone=1才能訪問
     * 且vstsdone是W1C,所以單位域讀-修改-寫時vstsdone寫入1導致清0,導致后面regdata不能寫入
    */
    s_dwc2_reg_t- >gpvndctl._b.regwr = 1; /* 寫模式 */
    if((regaddr & 0xC0) != 0)
    {
        /* 擴展寄存器 */
        s_dwc2_reg_t- >gpvndctl._b.regaddr = 0x2F;
        s_dwc2_reg_t- >gpvndctl._b.vctrl = regaddr;
    }
    else
    {
        /* 立即寄存器 */
        s_dwc2_reg_t- >gpvndctl._b.regaddr = regaddr;
        s_dwc2_reg_t- >gpvndctl._b.vctrl = 0;    
    }
    s_dwc2_reg_t- >gpvndctl._b.regdata = regval; /* 寫入寄存器的值 */
    s_dwc2_reg_t- >gpvndctl._b.newregreq = 1;    /* 啟動操作 此時regdata回讀未0,導致回寫為0 不對*/
    while ((s_dwc2_reg_t- >gpvndctl._b.vstsdone == 0) && (timeout-- > 0));  /* 等待完成 */

    /* 根據標志返回值或者錯誤 */
    if(s_dwc2_reg_t- >gpvndctl._b.vstsdone != 0)
    {
        // s_dwc2_reg_t- >gpvndctl._b.vstsdone = 1;  /* newregreq =1時硬件清0,沒必要手動清零 */
        return 0;
    }
    else
    {
        return -2;
    }
#else
    uint32_t tmp = 0;
    tmp |= REGWR_MASK; /* 寫模式 */
    if((regaddr & 0xC0) != 0)
    {
        /* 擴展寄存器 */
        tmp |= ((uint32_t)0x2F < < REGADDR_OFFSET);
        tmp |= ((uint32_t)regaddr < < VCTRL_OFFSET);
    }
    else
    {
        /* 立即寄存器 */
        tmp |= ((uint32_t)regaddr < < REGADDR_OFFSET);
        tmp |= ((uint32_t)0 < < VCTRL_OFFSET);  
    }   
    tmp |= ((uint32_t)regval < < REGDATA_OFFSET); /* 寫入寄存器的值 */
    tmp |= NEWREGREQ_MASK;                       /* 啟動操作 */
    USB_OTG_WRITE_REG(CFG_GPVNDCTL_ADDR,tmp);


    while(((USB_OTG_READ_REG(CFG_GPVNDCTL_ADDR)&VSTSDONE_MASK) == 0) && (timeout-- > 0));  /* 等待完成 */
    if(((USB_OTG_READ_REG(CFG_GPVNDCTL_ADDR)&VSTSDONE_MASK) != 0))
    {
        USB_OTG_WRITE_REG(CFG_GPVNDCTL_ADDR,USB_OTG_READ_REG(CFG_GPVNDCTL_ADDR) | VSTSDONE_MASK);
        /* newregreq =1時硬件清0,沒必要手動清零 */
        return 0;
    }
    else
    {
        return -2;
    }
#endif
}

1.4 測試

1.4.1 立即寄存器讀VID PID

這里使用的PHY型號是USB3343

VID PID寄存器值如下

圖片

測試代碼如下

uint8_t regval;
    int res = 0;


    /* 讀VID PID */
    res = hw_dwc2_read_phyreg(0x00,&regval,1000);
    if(res != 0)
    {
        return res;
    }
    usb_hal_info("[VIDL]:0x%x\\r\\n",regval);
    res = hw_dwc2_read_phyreg(0x01,&regval,1000);
    if(res != 0)
    {
        return res;
    }
    usb_hal_info("[VIDH]:0x%x\\r\\n",regval);
    res = hw_dwc2_read_phyreg(0x02,&regval,1000);
    if(res != 0)
    {
        return res;
    }
    usb_hal_info("[PIDL]:0x%x\\r\\n",regval);
    res = hw_dwc2_read_phyreg(0x03,&regval,1000);
    if(res != 0)
    {
        return res;
    }
    usb_hal_info("[PIDH]:0x%x\\r\\n",regval);

打印如下,可以看到讀出的值是正確的

image.png

也可以直接使用仿真器修改寄存器操作

(gdb) set (unsigned int )0x03000034=0x02000000 // 讀0寄存器

(gdb) x /1xw 0x03000034

0x3000034: 0x08000024

(gdb) set (unsigned int )0x03000034=0x02010000 // 讀1寄存器

(gdb) x /1xw 0x03000034

0x3000034: 0x08010004

(gdb) set (unsigned int )0x03000034=0x02020000 // 讀2寄存器

(gdb) x /1xw 0x03000034

0x3000034: 0x08020009

(gdb) set (unsigned int )0x03000034=0x02030000 // 讀3寄存器

(gdb) x /1xw 0x03000034

0x3000034: 0x08030000

1.4.2 立即寄存器讀寫寄存器

圖片

0x16處的Scratch寄存器是用戶可以自由使用的寄存器,可以使用該寄存器測試

0x16對應讀寫

0x17對應Set

0x18對應Clr

測試代碼如下

/* 讀Scratch Register初始值 */
    res = hw_dwc2_read_phyreg(0x16,&regval,1000);
    if(res != 0)
    {
        return res;
    }
    usb_hal_info("[Scratch Register]:0x%x\\r\\n",regval);


    /* 寫入0x55回讀是否正確 */
    hw_dwc2_write_phyreg(0x16,0x55,1000);
    if(res != 0)
    {
        return res;
    }
    res = hw_dwc2_read_phyreg(0x16,&regval,1000);
    if(res != 0)
    {
        return res;
    }
    if(regval != 0x55)
    {
        usb_hal_info("[Scratch Register Write Err]:0x%x\\r\\n",regval);
    }
    else
    {
        usb_hal_info("[Scratch Register Write OK]:0x%x\\r\\n",regval);
    }


    /* 0x55置位0xAA變為0xFF */
    hw_dwc2_write_phyreg(0x17,0xAA,1000);
    if(res != 0)
    {
        return res;
    }
    res = hw_dwc2_read_phyreg(0x16,&regval,1000);
    if(res != 0)
    {
        return res;
    }
    if(regval != 0xFF)
    {
        usb_hal_info("[Scratch Register Set Err]:0x%x\\r\\n",regval);
    }
    else
    {
        usb_hal_info("[Scratch Register Set OK]:0x%x\\r\\n",regval);
    }


    /* 0xFF清除0x55變為0xAA */
    hw_dwc2_write_phyreg(0x18,0x55,1000);
    if(res != 0)
    {
        return res;
    }
    res = hw_dwc2_read_phyreg(0x16,&regval,1000);
    if(res != 0)
    {
        return res;
    }
    if(regval != 0xAA)
    {
        usb_hal_info("[Scratch Register Clr Err]:0x%x\\r\\n",regval);
    }
    else
    {
        usb_hal_info("[Scratch Register Clr OK]:0x%x\\r\\n",regval);
    }

打印如下

圖片

直接使用仿真器操作

(gdb) set (unsigned int )0x03000034=0x02560055 //寫0x16寄存器為0x55

(gdb) set (unsigned int )0x03000034=0x02160000 //讀0x16寄存器

(gdb) x /1xw 0x03000034 //查看讀回來的值為0x55 正確

0x3000034: 0x08160055

(gdb) set (unsigned int )0x03000034=0x025700AA //設置0x16寄存器,即操作0x17置位0xAA位

(gdb) set (unsigned int )0x03000034=0x02160000 //讀0x16寄存器

(gdb) x /1xw 0x03000034

0x3000034: 0x081600ff //查看讀回來的值為0xFF 正確

(gdb)

1.4.3 問題

位域操作和宏操作

  1. 寫regwr時 done標志被清零了,因為是讀-修改-寫的方式,VstsDone讀出來為1再修改其他位回寫時VstsDone寫入1,但是該位為W1C,寫1清0,所以回寫時會清除標志。雖然這里不會有什么問題,但是這里有編程者未意料到的副作用,在其他地方可能會導致問題,所以不建議使用位域一步步的操作。
  2. 位域的操作可能被優化,比如這里位于regdata等因為是字節對齊的,所以使用了字節操作指令,但是按照DWC2手冊應該要求都是按照32位訪問的,所以這里帶來了未預料的問題。
  3. 寫入regdata后,實際上回讀的值是0,所以最后s_dwc2_reg_t->gpvndctl._b.newregreq = 1;讀-寫0修改后讀出regdata是0,再寫入就是0了,而不是上一步寫入的s_dwc2_reg_t->gpvndctl._b.regdata = regval;了,所以不能使用這種位域一步步設置的方式。

以下驗證regdata寫入是不能回讀的,寫入0x55回讀是0

圖片

所以regdata在手冊中描述的rw不完全是可讀可寫,而是寫時只寫不可讀,讀時只有Vstsdone才能讀。

  1. 位域操作有太多的副作用,比如上面的W1C,寫入不能回讀,位域訪問寬度被優化修改,等等都可能導致問題,而且位域一步步操作都需要讀-修改-寫,所以效率也低,最好使用直接的寄存器宏一次讀出,臨時變量存儲修改,最后一次寫入的方式。

圖片

所以不能使用結構體一步一步修改的方式,而是使用宏,一次性修改整個寄存器。

圖片

圖片

1.5總結

以上測試了PHY立即寄存器的讀寫,由于使用的PHY USB3343沒有擴展寄存器,所以擴展寄存器讀寫沒有測試。注意上面也介紹了盡量使用宏的方式進行寄存器操作,而不要使用位域的方式,位域的方式存在諸多副作用。

審核編輯:湯梓紅

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

    關注

    31

    文章

    5336

    瀏覽量

    120230
  • usb
    usb
    +關注

    關注

    60

    文章

    7936

    瀏覽量

    264474
  • PHY
    PHY
    +關注

    關注

    2

    文章

    301

    瀏覽量

    51732
  • 驅動開發
    +關注

    關注

    0

    文章

    130

    瀏覽量

    12072
  • DWC2
    +關注

    關注

    0

    文章

    35

    瀏覽量

    125
收藏 人收藏

    評論

    相關推薦

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

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

    STM32串口接收不定長數據:采用標志位(比如0X0D,0X0A)結束法

    缺點:有些情況下會導致數據丟失(可能返回數據中0x0d0a本身為有效數據)
    的頭像 發表于 09-23 14:06 ?5848次閱讀

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

    本文轉自公眾號,歡迎關注 基于DWC2USB驅動開發-0x01開篇介紹與新思DWC2
    的頭像 發表于 05-08 18:10 ?4584次閱讀
    基于<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'>0x</b>01開篇介紹與新思<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 ?9357次閱讀
    基于<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'>0x</b>02 <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 ?3297次閱讀
    基于<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'>0x</b>05 <b class='flag-5'>DWC2</b> <b class='flag-5'>USB</b>2.0 IP <b class='flag-5'>寄存器</b>介紹

    基于DWC2USB驅動開發-0x0B ULPI接口寄存器介紹

    以上詳細介紹了PHY相關的寄存器內容,標準部分是所有PHY都需要按照該規范實現的,還有廠商自定義部分可以自定義。正是因為規范對寄存器功能進行了規范所以LINK部分的IP才能做到兼容通用
    的頭像 發表于 06-05 15:36 ?4274次閱讀
    基于<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'>0x0</b>B ULPI接口<b class='flag-5'>寄存器</b>介紹

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

    本文轉自公眾號歡迎關注 基于DWC2USB驅動開發-USB復位詳解 (qq.com) 一.前言 ? ? ? ? ?上一篇我們詳細介紹了
    的頭像 發表于 07-07 11:18 ?6.4w次閱讀
    基于<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 ?3690次閱讀
    基于<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 ?1307次閱讀
    基于<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寄存器詳解 (qq
    的頭像 發表于 07-16 16:42 ?1641次閱讀
    基于<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>DMA<b class='flag-5'>寄存器</b>詳解

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

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

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

    本篇講解Scatter/Gather DMA模式下控制傳輸相關的寄存器。控制傳輸是USB驅動的核心部分,控制傳輸調通了驅動就完成了一大半,而驅動
    的頭像 發表于 07-24 00:07 ?2558次閱讀
    基于<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驅動開發-數據不能發送問題分析案例

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

    基于DWC_ether_qos的以太網驅動開發-MDIO驅動編寫測試

    本文轉自公眾號歡迎關注 基于DWC_ether_qos的以太網驅動開發-MDIO驅動編寫測試
    的頭像 發表于 08-30 09:37 ?3736次閱讀
    基于<b class='flag-5'>DWC</b>_ether_qos的以太網<b class='flag-5'>驅動</b><b class='flag-5'>開發</b>-MDIO<b class='flag-5'>驅動</b><b class='flag-5'>編寫</b>與<b class='flag-5'>測試</b>

    RK3399平臺上USB控制PHY的連接方式和配置說明

    判斷切換為何種模式,ID腳的電平變化觸發控制ID腳中斷,然后由軟件切換到對應模式。目前使用兩種驅動版本,一個是upstream 版,驅動dwc2目錄下,主要從upstream開源項
    發表于 05-12 17:46
    主站蜘蛛池模板: 精品99久久久久成人网站| 三叶草成人| 国产精品人妻无码久久久蜜桃 | free18sex性自拍裸舞| 亚洲粉嫩美白在线| 秋葵app秋葵官网18在线观看| 九九热在线视频| 国产AV电影区二区三区曰曰骚网| 在线免费观看成年人视频| 香蕉99久久久久成人麻豆| 暖暖 免费 高清 日本在线 | 少妇无套内谢久久久久| 麻豆精品传媒2021网站入口| 国产偷国产偷亚洲高清SWAG| 超碰国产亚洲人人| 91进入蜜桃臀在线播放| 亚洲三级黄色片| 小黄文污到你湿| 色欲人妻无码AV精品一区二区| 久久在精品线影院| 国产在线午夜| 国产精品久久久久影院色老大| TUBE19UP老师学生| 97在线精品视频| 伊人影院久久| 一个人的免费高清影院| 亚洲AV国产精品无码精| 无限资源好看片2019免费观看| 人人碰在线视频| 欧美gay69| 欧美成人免费观看久久| 麻豆一区二区三区蜜桃免费| 九色91精品国产网站| 黑人开嫩苞| 国产网站免费观看| 国产乱子影视频上线免费观看| 国产成人精视频在线观看免费 | 久久操韩国自偷拍| 精品动漫国产亚洲AV在线观看| 国产午夜在线精品三级a午夜电影| 国产av在线看的|