瀏覽代碼

ep_config function revised. minor bugfix

Dmitry 9 年之前
父節點
當前提交
c42c9d7b92
共有 4 個文件被更改,包括 104 次插入182 次删除
  1. 14 37
      src/usb_32v0.c
  2. 48 62
      src/usb_32v0A.S
  3. 14 48
      src/usb_32v1.c
  4. 28 35
      src/usb_32v1A.S

+ 14 - 37
src/usb_32v0.c

@@ -32,24 +32,6 @@ typedef struct {
 
 typedef union pma_table {
     struct {
-    uint16_t    txadr;
-    uint16_t    txcnt;
-    uint16_t    rxadr;
-    uint16_t    rxcnt;
-    };
-    struct {
-    uint16_t    txadr0;
-    uint16_t    txcnt0;
-    uint16_t    txadr1;
-    uint16_t    txcnt1;
-    };
-    struct {
-    uint16_t    rxadr0;
-    uint16_t    rxcnt0;
-    uint16_t    rxadr1;
-    uint16_t    rxcnt1;
-    };
-    struct {
     pma_rec     tx;
     pma_rec     rx;
     };
@@ -88,8 +70,8 @@ static uint16_t get_next_pma(uint16_t sz) {
     unsigned _result = USB_PMASIZE;
     for (int i = 0; i < 8; i++) {
         pma_table *tbl = EPT(i);
-        if ((tbl->rxadr) && (tbl->rxadr < _result)) _result = tbl->rxadr;
-        if ((tbl->txadr) && (tbl->txadr < _result)) _result = tbl->txadr;
+        if ((tbl->rx.addr) && (tbl->rx.addr < _result)) _result = tbl->rx.addr;
+        if ((tbl->tx.addr) && (tbl->tx.addr < _result)) _result = tbl->tx.addr;
     }
     if ( _result < (8 * sizeof(pma_table) + sz)) {
         return 0;
@@ -169,7 +151,6 @@ void setaddr (uint8_t addr) {
     USB->DADDR = USB_DADDR_EF | addr;
 }
 
-
 bool ep_config(uint8_t ep, uint8_t eptype, uint16_t epsize) {
     volatile uint16_t *reg = EPR(ep);
     pma_table *tbl = EPT(ep);
@@ -198,18 +179,16 @@ bool ep_config(uint8_t ep, uint8_t eptype, uint16_t epsize) {
         uint16_t _pma;
         _pma = get_next_pma(epsize);
         if (_pma == 0) return false;
+        tbl->tx.addr = _pma;
+        tbl->tx.cnt  = 0;
         if ((eptype == USB_EPTYPE_ISOCHRONUS) ||
             (eptype == (USB_EPTYPE_BULK | USB_EPTYPE_DBLBUF))) {
-            tbl->txadr0 = _pma;
             _pma = get_next_pma(epsize);
             if (_pma == 0) return false;
-            tbl->txadr1 = _pma;
-            tbl->txcnt0 = 0;
-            tbl->txcnt1 = 0;
+            tbl->tx1.addr = _pma;
+            tbl->tx1.cnt  = 0;
             EP_DTX_UNSTALL(reg);
         } else {
-            tbl->txadr = _pma;
-            tbl->txcnt = 0;
             EP_TX_UNSTALL(reg);
         }
     }
@@ -229,18 +208,16 @@ bool ep_config(uint8_t ep, uint8_t eptype, uint16_t epsize) {
         }
         _pma = get_next_pma(epsize);
         if (_pma == 0) return false;
+        tbl->rx.addr = _pma;
+        tbl->rx.cnt = _rxcnt;
         if ((eptype == USB_EPTYPE_ISOCHRONUS) ||
             (eptype == (USB_EPTYPE_BULK | USB_EPTYPE_DBLBUF))) {
-            tbl->rxadr0 = _pma;
             _pma = get_next_pma(epsize);
             if (_pma == 0) return false;
-            tbl->rxadr1 = _pma;
-            tbl->rxcnt0 = _rxcnt;
-            tbl->rxcnt1 = _rxcnt;
+            tbl->rx0.addr = _pma;
+            tbl->rx0.cnt  = _rxcnt;
             EP_DRX_UNSTALL(reg);
         } else {
-            tbl->rxadr = _pma;
-            tbl->rxcnt = _rxcnt;
             EP_RX_UNSTALL(reg);
         }
     }
@@ -250,10 +227,10 @@ bool ep_config(uint8_t ep, uint8_t eptype, uint16_t epsize) {
 void ep_deconfig(uint8_t ep) {
     pma_table *ept = EPT(ep);
     *EPR(ep) &= ~USB_EPREG_MASK;
-    ept->rxadr = 0;
-    ept->rxcnt = 0;
-    ept->txadr = 0;
-    ept->txcnt = 0;
+    ept->rx.addr = 0;
+    ept->rx.cnt  = 0;
+    ept->tx.addr = 0;
+    ept->tx.cnt  = 0;
 }
 
 static uint16_t pma_read (uint8_t *buf, uint16_t blen, pma_rec *rx) {

+ 48 - 62
src/usb_32v0A.S

@@ -249,40 +249,37 @@ _enable:
  * in  R1 <- 0 if unstall, !0 if stall
  */
 _ep_setstall:
+    push    {r4, lr}
     lsls    r2, r0, #28
     lsrs    r2, #26
     ldr     r3, =#USB_EPBASE
     adds    r3, r2          // epr -> r3
     movs    r2, 0x30        // TX_STAT_MASK -> r2
-    cmp     r0, #80
+    ldrh    r4, [r3]
+    lsls    r4, #21
+    lsrs    r4, #29         // EP_TYPE | EP_KIND -> R4 LSB
+    cmp     r4, #0x04       // ISO ?
+    beq     .L_eps_exit
+    cmp     r0, #0x80
     blo     .L_eps_rx
 .L_eps_tx:
     ldr     r0, =#TX_STALL   //stall TX
-    tst     r1, r1
+    cmp     r1, #0x00
     bne     .L_eps_reg_set
 .L_eps_tx_unstall:
-    ldrh    r1, [r3]        // *epr -> r1
-    lsls    r1, #21
-    lsrs    r1, #29         // EPTTYPE | EPKIND mask only
     ldr     r0, =#DTX_USTALL //unstall dblbulk or iso TX (VALID and clr DTOG_TX & SWBUF_TX)
-    cmp     r1, #0x01       // if doublebuffered bulk endpoint
+    cmp     r4, #0x01       // if doublebuffered bulk endpoint
     beq     .L_eps_reg_set
-    cmp     r1, #0x04       // if isochronous endpoint
     ldr     r0, =#TX_USTALL  // unstall other TX (NAKED + clr DTOG_TX)
     b       .L_eps_reg_set
 .L_eps_rx:
     lsls    r2, #8          // RX_STAT_MASK -> R2
     ldr     r0,=#RX_STALL    //stall RX
-    tst     r1, r1
+    cmp     r1, #0x00
     bne     .L_eps_reg_set
 .L_eps_rx_unstall:
-    ldrh    r1, [r3]        // *epr -> r1
-    lsls    r1, #21
-    lsrs    r1, #29         // EPTTYPE | EPKIND mask only
     ldr     r0, =#DRX_USTALL //unstall dblbulk or iso (VALID. clr DTOG_RX set SWBUF_RX)
-    cmp     r1, #0x01       // if dblbulk
-    beq     .L_eps_reg_set
-    cmp     r1, #0x04       // if iso
+    cmp     r4, #0x01       // if dblbulk
     beq     .L_eps_reg_set
     ldr     r0, =#RX_USTALL  // unstall other RX (VALID + clr
 /* R0 - mask and toggle bits
@@ -298,7 +295,7 @@ _ep_setstall:
     ands    r1, r0
     strh    r1, [r3]
 .L_eps_exit:
-    bx      lr
+    pop     {r4, pc}
     .size   _ep_setstall, . - _ep_setstall
 
 
@@ -372,7 +369,7 @@ _ep_read:
     strh    r5, [r3]        // toggling SW_RX
     ldrh    r5, [r3]
 .L_epr_notog:
-    negs    r5, r5
+    mvns    r5, r5
     lsls    r5, #8          // shift ~SW_RX to DTOG_RX
 .L_epr_iso:
     lsrs    r5, #15         // DTOG_RX -> CF
@@ -460,7 +457,7 @@ _ep_write:
     sxtb    r0, r0
     b       .L_epw_exit
 .L_epw_dbl:
-    negs    r5, r5
+    mvns    r5, r5
     lsrs    r5, #8          // ~SWBUF_TX -> DTOG_TX
 .L_epw_iso:
     lsrs    r5, #7          // DTOG_TX -> CF
@@ -512,29 +509,25 @@ _ep_write:
 
 _get_next_pma:
     push    {r1, r3, r4, lr}
-    movs    r1, #16
+    movs    r1, #0x3C
     movs    r3, #1
     lsls    r3, #10         //R3 MAX_PMA_SIZE
     ldr     r0, =#USB_PMABASE
 .L_gnp_chkaddr:
-    ldrh    r4, [r0, #0]    //addr
+    ldrh    r4, [r0, r1]
     tst     r4, r4
     beq     .L_gnp_nxtaddr
     cmp     r3, r4
     blo     .L_gnp_nxtaddr
     mov     r3, r4
 .L_gnp_nxtaddr:
-    adds    r0, #4
-    subs    r1, #1
-    bne     .L_gnp_chkaddr
+    subs    r1, #0x04
+    bhs     .L_gnp_chkaddr
     subs    r0, r3, r2
     blo     .L_gnp_exit
     cmp     r0, #0x40       //check for the pma table overlap
 .L_gnp_exit:
     pop     {r1, r3, r4, pc}
-
-
-
     .size   _get_next_pma, . - _get_next_pma
 
     .thumb_func
@@ -579,17 +572,20 @@ _ep_config:
     ldr     r5, =#USB_PMABASE
     lsls    r4, #1
     adds    r5, r4
+/* setup buffer table */
+/* TX or TX0 */
     bl      _get_next_pma
     bcc     .L_epc_fail
-    strh    r0, [r5, #TXADDR]    //store txaddr or txaddr0
+    strh    r0, [r5, #TXADDR]   //store txaddr or txaddr0
     movs    r0, #0x00
-    strh    r0, [r5, #TXCOUNT]    //store txcnt
-    cmp     r1, #0x06       // is DBLBULK
+    strh    r0, [r5, #TXCOUNT]  //store txcnt
+    cmp     r1, #0x06           // is DBLBULK
     beq     .L_epc_txdbl
-    ldr     r3, =#TX_USTALL  //set state NAKED , clr DTOG_TX
-    cmp     r1, #0x01       // is ISO
-    bne     .L_epc_txsetstate   //
+    ldr     r3, =#TX_USTALL     //set state NAKED , clr DTOG_TX
+    cmp     r1, #0x01
+    bne     .L_epc_txsetstate   //if single buffered
 .L_epc_txdbl:
+/* TX1 */
     ldr     r3, =#DTX_USTALL //set state VALID clr DTOG_TX & SWBUF_TX
     bl      _get_next_pma
     bcc     .L_epc_fail
@@ -607,6 +603,7 @@ _ep_config:
     cmp     r1, #0x00       //is a control ep ?
     bne     .L_epc_exit
 .L_epc_setuprx:
+/* calculating RX_COUNT field. result in R3*/
     mov     r3, r2
     cmp     r2, #62
     bls     .L_epc_rxbb
@@ -624,35 +621,32 @@ _ep_config:
     ldr     r5, =#USB_PMABASE
     lsls    r4, #1
     adds    r5, r4
+/* setup buffer table */
+    bl      _get_next_pma
+    bcc     .L_epc_fail
+/* set RX or RX1 */
+    strh    r0, [r5, #RXADDR]
+    strh    r3, [r5, #RXCOUNT]
+    ldr     r0, =#RX_USTALL
+/* check if doublebuffered */
     cmp     r1, 0x06    //if dblbulk
     beq     .L_epc_rxdbl
     cmp     r1, 0x01    // iso
-    bne     .L_epc_rxsngl
+    bne     .L_epc_rxsetstate
 .L_epc_rxdbl:
     bl      _get_next_pma
     bcc     .L_epc_fail
     strh    r0, [r5, #RXADDR0]    //store rxaddr0
     strh    r3, [r5, #RXCOUNT0]    //store rxcnt0
-    bl      _get_next_pma
-    bcc     .L_epc_fail
-    strh    r0, [r5, #RXADDR1]    //store rxaddr1
-    strh    r3, [r5, #RXCOUNT1]    //store rxcnt1
-    ldr     r3, =#DRX_USTALL
-    b       .L_epc_rxsetstate
-.L_epc_rxsngl:
-    bl      _get_next_pma
-    bcc     .L_epc_fail
-    strh    r0, [r5, #RXADDR]    //store rxaddr1 or rxaddr
-    strh    r3, [r5, #RXCOUNT]    //store rxcnt1 or rxcnt
-    ldr     r3, =#RX_USTALL
+    ldr     r0, =#DRX_USTALL
 .L_epc_rxsetstate:
     ldr     r5, =#USB_EPBASE
     lsrs    r4, #1
-    ldrh    r0, [r5, r4]
-    eors    r0, r3
-    lsrs    r3, #16
-    ands    r0, r3
-    strh    r0, [r5, r4]
+    ldrh    r3, [r5, r4]
+    eors    r3, r0
+    lsrs    r0, #16
+    ands    r3, r0
+    strh    r3, [r5, r4]
 .L_epc_exit:
     movs    r0, #0x01
     pop     {r4, r5, pc}
@@ -689,12 +683,9 @@ _ep_deconfig:
     strh    r0, [r3, #RXADDR]
     strh    r0, [r3, #RXCOUNT]
     bx      lr
-
     .size   _ep_deconfig, . - _ep_config
 
 
-
-
 #define ISTRSHIFT   8
 #define ISTRBIT(bit) ((1 << bit) >> ISTRSHIFT)
 
@@ -770,10 +761,10 @@ _evt_poll:
     b       .L_ep_clristr
 
 .L_ep_wkupm:
-    ldrh    r1, [r3, #0]            //R1 USB->CNTR
+    ldrh    r1, [r3, #USB_CNTR]     //R1 USB->CNTR
     movs    r5, #0x08
     bics    r1, r5                  //clr FSUSP
-    strh    r1, [r3, #0]            //USB->CNTR R2
+    strh    r1, [r3, #USB_CNTR]     //USB->CNTR R2
     movs    r1, #usbd_evt_wkup
     movs    r4, #ISTRBIT(12)
     b       .L_ep_clristr
@@ -786,7 +777,6 @@ _evt_poll:
     movs    r1, #usbd_evt_susp
     movs    r4, #ISTRBIT(11)
     b       .L_ep_clristr
-
 /* do reset routine */
 .L_ep_resetm:
     movs    r1, #7
@@ -797,7 +787,7 @@ _evt_poll:
     ldrh    r4, [r2]
     bics    r4, r5
     strh    r4, [r2]
-    movs    r4, #0
+    movs    r4, #0x00
     strh    r4, [r0, #TXADDR]
     strh    r4, [r0, #TXCOUNT]
     strh    r4, [r0, #RXADDR]
@@ -805,9 +795,8 @@ _evt_poll:
     adds    r2, #4
     adds    r0, #8
     subs    r1, #1
-    bpl     .L_ep_reset_loop
-    movs    r2, #0x00
-    strh    r2, [r3, #USB_BTABLE]     // 0 -> USB->BTABLE
+    bhs     .L_ep_reset_loop
+    strh    r4, [r3, #USB_BTABLE]
     movs    r1, #usbd_evt_reset
     movs    r4, #ISTRBIT(10)
 .L_ep_clristr:
@@ -818,12 +807,9 @@ _evt_poll:
 .L_ep_callback:
     pop     {r0, r3, r4, r5 }
     bx      r3
-
     .size   _evt_poll, . - _evt_poll
 
 
-
-
     .pool
 
    .end

+ 14 - 48
src/usb_32v1.c

@@ -34,36 +34,6 @@ typedef struct {
 
 typedef union pma_table {
     struct {
-    uint16_t    txadr;
-    uint16_t    :16;
-    uint16_t    txcnt;
-    uint16_t    :16;
-    uint16_t    rxadr;
-    uint16_t    :16;
-    uint16_t    rxcnt;
-    uint16_t    :16;
-    };
-    struct {
-    uint16_t    txadr0;
-    uint16_t    :16;
-    uint16_t    txcnt0;
-    uint16_t    :16;
-    uint16_t    txadr1;
-    uint16_t    :16;
-    uint16_t    txcnt1;
-    uint16_t    :16;
-    };
-    struct {
-    uint16_t    rxadr0;
-    uint16_t    :16;
-    uint16_t    rxcnt0;
-    uint16_t    :16;
-    uint16_t    rxadr1;
-    uint16_t    :16;
-    uint16_t    rxcnt1;
-    uint16_t    :16;
-    };
-    struct {
     pma_rec     tx;
     pma_rec     rx;
     };
@@ -102,8 +72,8 @@ static uint16_t get_next_pma(uint16_t sz) {
     unsigned _result = USB_PMASIZE;
     for (int i = 0; i < 8; i++) {
         pma_table *tbl = EPT(i);
-        if ((tbl->rxadr) && (tbl->rxadr < _result)) _result = tbl->rxadr;
-        if ((tbl->txadr) && (tbl->txadr < _result)) _result = tbl->txadr;
+        if ((tbl->tx.addr) && (tbl->tx.addr < _result)) _result = tbl->tx.addr;
+        if ((tbl->rx.addr) && (tbl->rx.addr < _result)) _result = tbl->rx.addr;
     }
     if ( _result < (4 * sizeof(pma_table) + sz)) {
         return 0;
@@ -217,18 +187,16 @@ bool ep_config(uint8_t ep, uint8_t eptype, uint16_t epsize) {
         uint16_t _pma;
         _pma = get_next_pma(epsize);
         if (_pma == 0) return false;
+        tbl->tx.addr = _pma;
+        tbl->tx.cnt  = 0;
         if ((eptype == USB_EPTYPE_ISOCHRONUS) ||
             (eptype == (USB_EPTYPE_BULK | USB_EPTYPE_DBLBUF))) {
-            tbl->txadr0 = _pma;
             _pma = get_next_pma(epsize);
             if (_pma == 0) return false;
-            tbl->txadr1 = _pma;
-            tbl->txcnt0 = 0;
-            tbl->txcnt1 = 0;
+            tbl->tx1.addr = _pma;
+            tbl->tx1.cnt  = 0;
             EP_DTX_UNSTALL(reg);
         } else {
-            tbl->txadr = _pma;
-            tbl->txcnt = 0;
             EP_TX_UNSTALL(reg);
         }
     }
@@ -248,18 +216,16 @@ bool ep_config(uint8_t ep, uint8_t eptype, uint16_t epsize) {
         }
         _pma = get_next_pma(epsize);
         if (_pma == 0) return false;
+        tbl->rx.addr = _pma;
+        tbl->rx.cnt  = _rxcnt;
         if ((eptype == USB_EPTYPE_ISOCHRONUS) ||
             (eptype == (USB_EPTYPE_BULK | USB_EPTYPE_DBLBUF))) {
-            tbl->rxadr0 = _pma;
             _pma = get_next_pma(epsize);
             if (_pma == 0) return false;
-            tbl->rxadr1 = _pma;
-            tbl->rxcnt0 = _rxcnt;
-            tbl->rxcnt1 = _rxcnt;
+            tbl->rx0.addr = _pma;
+            tbl->rx0.cnt  = _rxcnt;
             EP_DRX_UNSTALL(reg);
         } else {
-            tbl->rxadr = _pma;
-            tbl->rxcnt = _rxcnt;
             EP_RX_UNSTALL(reg);
         }
     }
@@ -269,10 +235,10 @@ bool ep_config(uint8_t ep, uint8_t eptype, uint16_t epsize) {
 void ep_deconfig(uint8_t ep) {
     pma_table *ept = EPT(ep);
     *EPR(ep) &= ~USB_EPREG_MASK;
-    ept->rxadr = 0;
-    ept->rxcnt = 0;
-    ept->txadr = 0;
-    ept->txcnt = 0;
+    ept->rx.addr = 0;
+    ept->rx.cnt  = 0;
+    ept->tx.addr = 0;
+    ept->tx.cnt  = 0;
 }
 
 static uint16_t pma_read (uint8_t *buf, uint16_t blen, pma_rec *rx) {

+ 28 - 35
src/usb_32v1A.S

@@ -261,40 +261,37 @@ _enable:
  * in  R1 <- 0 if unstall, !0 if stall
  */
 _ep_setstall:
+    push    {r4, lr}
     lsls    r2, r0, #28
     lsrs    r2, #26
     ldr     r3, =#USB_EPBASE
     adds    r3, r2          // epr -> r3
     movs    r2, 0x30        // TX_STAT_MASK -> r2
-    cmp     r0, #80
+    ldrh    r4, [r3]
+    lsls    r4, #21
+    lsrs    r4, #29         // EP_TYPE | EP_KIND -> R4 LSB
+    cmp     r4, #0x04       // ISO ?
+    beq     .L_eps_exit
+    cmp     r0, #0x80
     blo     .L_eps_rx
 .L_eps_tx:
     ldr     r0, =#TX_STALL   //stall TX
-    tst     r1, r1
+    cmp     r1, #0x00
     bne     .L_eps_reg_set
 .L_eps_tx_unstall:
-    ldrh    r1, [r3]        // *epr -> r1
-    lsls    r1, #21
-    lsrs    r1, #29         // EPTTYPE | EPKIND mask only
     ldr     r0, =#DTX_USTALL //unstall dblbulk or iso TX (VALID and clr DTOG_TX & SWBUF_TX)
-    cmp     r1, #0x01       // if doublebuffered bulk endpoint
+    cmp     r4, #0x01       // if doublebuffered bulk endpoint
     beq     .L_eps_reg_set
-    cmp     r1, #0x04       // if isochronous endpoint
     ldr     r0, =#TX_USTALL  // unstall other TX (NAKED + clr DTOG_TX)
     b       .L_eps_reg_set
 .L_eps_rx:
     lsls    r2, #8          // RX_STAT_MASK -> R2
     ldr     r0,=#RX_STALL    //stall RX
-    tst     r1, r1
+    cmp     r1, #0x00
     bne     .L_eps_reg_set
 .L_eps_rx_unstall:
-    ldrh    r1, [r3]        // *epr -> r1
-    lsls    r1, #21
-    lsrs    r1, #29         // EPTTYPE | EPKIND mask only
     ldr     r0, =#DRX_USTALL //unstall dblbulk or iso (VALID. clr DTOG_RX set SWBUF_RX)
-    cmp     r1, #0x01       // if dblbulk
-    beq     .L_eps_reg_set
-    cmp     r1, #0x04       // if iso
+    cmp     r4, #0x01       // if dblbulk
     beq     .L_eps_reg_set
     ldr     r0, =#RX_USTALL  // unstall other RX (VALID + clr
 /* R0 - mask and toggle bits
@@ -310,7 +307,7 @@ _ep_setstall:
     ands    r1, r0
     strh    r1, [r3]
 .L_eps_exit:
-    bx      lr
+    pop     {r4, pc}
     .size   _ep_setstall, . - _ep_setstall
 
 
@@ -384,7 +381,7 @@ _ep_read:
     strh    r5, [r3]        // toggling SW_RX
     ldrh    r5, [r3]
 .L_epr_notog:
-    negs    r5, r5
+    mvns    r5, r5
     lsls    r5, #8          // shift ~SW_RX to DTOG_RX
 .L_epr_iso:
     lsrs    r5, #15         // DTOG_RX -> CF
@@ -472,7 +469,7 @@ _ep_write:
     sxtb    r0, r0
     b       .L_epw_exit
 .L_epw_dbl:
-    negs    r5, r5
+    mvns    r5, r5
     lsrs    r5, #8          // ~SWBUF_TX -> DTOG_TX
 .L_epw_iso:
     lsrs    r5, #7          // DTOG_TX -> CF
@@ -639,35 +636,31 @@ _ep_config:
     ldr     r5, =#USB_PMABASE
     lsls    r4, #2
     adds    r5, r4
+/* RX or RX1 */
+    bl      _get_next_pma
+    bcc     .L_epc_fail
+    strh    r0, [r5, #RXADDR]
+    strh    r3, [r5, #RXCOUNT]
+    ldr     r0, =#RX_USTALL
+/* check if doublebuffered */
     cmp     r1, 0x06    //if dblbulk
     beq     .L_epc_rxdbl
     cmp     r1, 0x01    // iso
-    bne     .L_epc_rxsngl
+    bne     .L_epc_rxsetstate
 .L_epc_rxdbl:
     bl      _get_next_pma
     bcc     .L_epc_fail
     strh    r0, [r5, #RXADDR0]    //store rxaddr0
     strh    r3, [r5, #RXCOUNT0]    //store rxcnt0
-    bl      _get_next_pma
-    bcc     .L_epc_fail
-    strh    r0, [r5, #RXADDR1]    //store rxaddr1
-    strh    r3, [r5, #RXCOUNT1]    //store rxcnt1
-    ldr     r3, =#DRX_USTALL
-    b       .L_epc_rxsetstate
-.L_epc_rxsngl:
-    bl      _get_next_pma
-    bcc     .L_epc_fail
-    strh    r0, [r5, #RXADDR]    //store rxaddr1 or rxaddr
-    strh    r3, [r5, #RXCOUNT]    //store rxcnt1 or rxcnt
-    ldr     r3, =#RX_USTALL
+    ldr     r0, =#DRX_USTALL
 .L_epc_rxsetstate:
     ldr     r5, =#USB_EPBASE
     lsrs    r4, #1
-    ldrh    r0, [r5, r4]
-    eors    r0, r3
-    lsrs    r3, #16
-    ands    r0, r3
-    strh    r0, [r5, r4]
+    ldrh    r3, [r5, r4]
+    eors    r3, r0
+    lsrs    r0, #16
+    ands    r3, r0
+    strh    r3, [r5, r4]
 .L_epc_exit:
     movs    r0, #0x01
     pop     {r4, r5, pc}