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