RM新时代网站-首页

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

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

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

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

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

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

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

PHY寄存器讀寫

1.1前言

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

1.2 GPVNDCTL寄存器介紹

DWC2提供了讀寫PHY寄存器的機(jī)制,對于應(yīng)用來說就是操作一個寄存器GPVNDCTL:PHY供應(yīng)商控制寄存器。能夠讀寫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+供應(yīng)商控制接口進(jìn)行PHY寄存器訪問。對于ULPI PHY,核心使用ULPI接口進(jìn)行PHY寄存器訪問。應(yīng)用程序設(shè)置GPVNDCTL來訪問PHY寄存器,并對PHY寄存器的訪問進(jìn)行計時,應(yīng)用程序輪詢此寄存器中的VStatus Done位來確認(rèn)是否完成PHY寄存器的訪問。

該寄存器的描述如下

偏移0x34 訪問大小32位

image.png

image.png

image.png

圖片

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

NewRegReq: 軟件寫1觸發(fā)一次操作。

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

VStsBsy: 忙標(biāo)志,正在進(jìn)行操作時硬件置位該位,操作完成時硬件清零,可以認(rèn)為是和VStsDone相反的標(biāo)志。

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

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

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

RegData: 寫寄存器時寫入寄存器的數(shù)據(jù)。讀寄存器時讀到的寄存器內(nèi)容,設(shè)置VStatus Done時有效。

DisUlpiDrvr:讀寫PHY寄存器無關(guān),

應(yīng)用程序在完成ULPI Carkit中斷(GINTSTS.ULPICKINT)處理后設(shè)置此位。設(shè)置后,控制器將禁用輸出信號驅(qū)動器,并屏蔽ULPI接口的輸入信號??刂破髟趩⒂肬LPI接口之前清除該位。

1.3 代碼編寫

讀PHY寄存器

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

寫PHY寄存器

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

代碼如下

/**
 * \\fn static uint8_t hw_dwc2_is_vndctlsupt(void)
 * 判斷是否支持供應(yīng)商控制接口(VndctlSupt)
 * \\retval 0 不支持 供應(yīng)商控制接口(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寄存器,立即寄存器和擴(kuò)展寄存器統(tǒng)一編碼,高2位為0表示立即寄存器,
 * 高兩位不為0表示擴(kuò)展寄存器。
 * \\param[out] regval 存儲讀出的寄存器值
 * \\param[in] timeout 查詢是否完成的次數(shù)
 * \\retval -1 不支持供應(yīng)商控制接口(VndctlSupt)
 * \\retval -2 讀超時
 * \\retval 0  讀成功
*/
int hw_dwc2_read_phyreg(uint8_t regaddr, uint8_t* regval, uint32_t timeout)
{
    /* 判斷是否支持供應(yīng)商控制接口(VndctlSupt) */
    if(hw_dwc2_is_vndctlsupt() == 0)
    {
        return -1;
    }
#if 0
    s_dwc2_reg_t- >gpvndctl._b.regwr = 0; /* 讀模式 */
    if((regaddr & 0xC0) != 0)
    {
        /* 擴(kuò)展寄存器 */
        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));  /* 等待完成 */

    /* 根據(jù)標(biāo)志返回值或者錯誤 */
    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)
    {
        /* 擴(kuò)展寄存器 */
        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寄存器,立即寄存器和擴(kuò)展寄存器統(tǒng)一編碼,高2位為0表示立即寄存器,
 * 高兩位不為0表示擴(kuò)展寄存器。
 * \\param[out] regval 寫入寄存器的值
 * \\param[in] timeout 查詢是否完成的次數(shù)
 * \\retval -1 不支持供應(yīng)商控制接口(VndctlSupt)
 * \\retval -2 讀超時
 * \\retval 0  讀成功
*/
int hw_dwc2_write_phyreg(uint8_t regaddr, uint8_t regval, uint32_t timeout)
{
    /* 判斷是否支持供應(yīng)商控制接口(VndctlSupt) */
    if(hw_dwc2_is_vndctlsupt() == 0)
    {
        return -1;
    }


#if 0
    /* 不能使用結(jié)構(gòu)體單位域操作,因為regdata需要vstsdone=1才能訪問
     * 且vstsdone是W1C,所以單位域讀-修改-寫時vstsdone寫入1導(dǎo)致清0,導(dǎo)致后面regdata不能寫入
    */
    s_dwc2_reg_t- >gpvndctl._b.regwr = 1; /* 寫模式 */
    if((regaddr & 0xC0) != 0)
    {
        /* 擴(kuò)展寄存器 */
        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,導(dǎo)致回寫為0 不對*/
    while ((s_dwc2_reg_t- >gpvndctl._b.vstsdone == 0) && (timeout-- > 0));  /* 等待完成 */

    /* 根據(jù)標(biāo)志返回值或者錯誤 */
    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)
    {
        /* 擴(kuò)展寄存器 */
        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對應(yīng)讀寫

0x17對應(yīng)Set

0x18對應(yīng)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變?yōu)?xFF */
    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變?yōu)?xAA */
    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 //設(shè)置0x16寄存器,即操作0x17置位0xAA位

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

(gdb) x /1xw 0x03000034

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

(gdb)

1.4.3 問題

位域操作和宏操作

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

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

圖片

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

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

圖片

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

圖片

圖片

1.5總結(jié)

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

審核編輯:湯梓紅

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

    關(guān)注

    31

    文章

    5336

    瀏覽量

    120228
  • usb
    usb
    +關(guān)注

    關(guān)注

    60

    文章

    7936

    瀏覽量

    264456
  • PHY
    PHY
    +關(guān)注

    關(guān)注

    2

    文章

    301

    瀏覽量

    51732
  • 驅(qū)動開發(fā)
    +關(guān)注

    關(guān)注

    0

    文章

    130

    瀏覽量

    12072
  • DWC2
    +關(guān)注

    關(guān)注

    0

    文章

    35

    瀏覽量

    125
收藏 人收藏

    評論

    相關(guān)推薦

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

    上一篇我們介紹了控制寄存器,而驅(qū)動編寫底層無非就是配置各種寄存器,所以第一步先要準(zhǔn)備寄存器
    的頭像 發(fā)表于 05-16 14:04 ?2414次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</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串口接收不定長數(shù)據(jù):采用標(biāo)志位(比如0X0D,0X0A)結(jié)束法

    缺點:有些情況下會導(dǎo)致數(shù)據(jù)丟失(可能返回數(shù)據(jù)中0x0d、0a本身為有效數(shù)據(jù))
    的頭像 發(fā)表于 09-23 14:06 ?5848次閱讀

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

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

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

    DWC2即新思(Synopsys )的DesignWare? Cores USB 2.0 HiSpeed On-The-Go (OTG)控制IP,被大量使用。從linux的內(nèi)核源碼驅(qū)動
    的頭像 發(fā)表于 05-09 10:09 ?9357次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動</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ū)動開發(fā)-0x05 DWC2 USB2.0 IP 寄存器介紹

    本文對控制寄存器有了一個整體上的概覽,先了解個大概,了解寄存器的組織結(jié)構(gòu),大致了解一下常用的寄存器。后面編程時再一個個對照每一個寄存器
    的頭像 發(fā)表于 05-16 12:50 ?3297次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</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驅(qū)動開發(fā)-0x0B ULPI接口寄存器介紹

    以上詳細(xì)介紹了PHY相關(guān)的寄存器內(nèi)容,標(biāo)準(zhǔn)部分是所有PHY都需要按照該規(guī)范實現(xiàn)的,還有廠商自定義部分可以自定義。正是因為規(guī)范對寄存器功能進(jìn)行了規(guī)范所以LINK部分的IP才能做到兼容通用
    的頭像 發(fā)表于 06-05 15:36 ?4272次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-<b class='flag-5'>0x0</b>B ULPI接口<b class='flag-5'>寄存器</b>介紹

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

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

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

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

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

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

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

    本文轉(zhuǎn)自公眾號,歡迎關(guān)注 基于DWC2USB驅(qū)動開發(fā)-發(fā)送相關(guān)的寄存器DMA寄存器詳解 (qq
    的頭像 發(fā)表于 07-16 16:42 ?1639次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-發(fā)送相關(guān)的<b class='flag-5'>寄存器</b>DMA<b class='flag-5'>寄存器</b>詳解

    基于DWC2USB驅(qū)動開發(fā)-DOEP接收相關(guān)的DMA寄存器詳解

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

    基于DWC2USB驅(qū)動開發(fā)-控制傳輸中斷相關(guān)寄存器

    本篇講解Scatter/Gather DMA模式下控制傳輸相關(guān)的寄存器??刂苽鬏斒?b class='flag-5'>USB驅(qū)動的核心部分,控制傳輸調(diào)通了驅(qū)動就完成了一大半,而驅(qū)動
    的頭像 發(fā)表于 07-24 00:07 ?2558次閱讀
    基于<b class='flag-5'>DWC2</b>的<b class='flag-5'>USB</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-控制傳輸中斷相關(guān)<b class='flag-5'>寄存器</b>

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

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

    基于DWC_ether_qos的以太網(wǎng)驅(qū)動開發(fā)-MDIO驅(qū)動編寫測試

    本文轉(zhuǎn)自公眾號歡迎關(guān)注 基于DWC_ether_qos的以太網(wǎng)驅(qū)動開發(fā)-MDIO驅(qū)動編寫測試
    的頭像 發(fā)表于 08-30 09:37 ?3735次閱讀
    基于<b class='flag-5'>DWC</b>_ether_qos的以太網(wǎng)<b class='flag-5'>驅(qū)動</b><b class='flag-5'>開發(fā)</b>-MDIO<b class='flag-5'>驅(qū)動</b><b class='flag-5'>編寫</b>與<b class='flag-5'>測試</b>

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

    判斷切換為何種模式,ID腳的電平變化觸發(fā)控制ID腳中斷,然后由軟件切換到對應(yīng)模式。目前使用兩種驅(qū)動版本,一個是upstream 版,驅(qū)動dwc2目錄下,主要從upstream開源項
    發(fā)表于 05-12 17:46
    RM新时代网站-首页