all the usb regs too

This commit is contained in:
R
2024-04-14 07:54:20 +01:00
parent 688dc3c871
commit 673d6b6eab
2 changed files with 16 additions and 7 deletions
+12 -7
View File
@@ -193,10 +193,15 @@ extern uint32_t USB_SECTOR_STASH[128];
#define R32_GPIOA_CFGHR (*(volatile uint32_t*)0x40010804) #define R32_GPIOA_CFGHR (*(volatile uint32_t*)0x40010804)
#define R32_GPIOA_BSHR (*(volatile uint32_t*)0x40010810) #define R32_GPIOA_BSHR (*(volatile uint32_t*)0x40010810)
#define R16_USBD_EPR(n) (*(volatile uint16_t*)(0x40005C00 + 4 * (n))) // #define R16_USBD_EPR(n) (*(volatile uint16_t*)(0x40005C00 + 4 * (n)))
#define R16_USBD_CNTR (*(volatile uint16_t*)0x40005C40) // #define R16_USBD_CNTR (*(volatile uint16_t*)0x40005C40)
#define R16_USBD_ISTR (*(volatile uint16_t*)0x40005C44) // #define R16_USBD_ISTR (*(volatile uint16_t*)0x40005C44)
#define R16_USBD_DADDR (*(volatile uint16_t*)0x40005C4C) // #define R16_USBD_DADDR (*(volatile uint16_t*)0x40005C4C)
// XXX wrong access size
extern volatile uint32_t R16_USBD_EPR[16];
extern volatile uint16_t R16_USBD_CNTR;
extern volatile uint16_t R16_USBD_ISTR;
extern volatile uint16_t R16_USBD_DADDR;
#define R32_FLASH_KEYR (*(volatile uint32_t*)0x40022004) #define R32_FLASH_KEYR (*(volatile uint32_t*)0x40022004)
#define R32_FLASH_STATR (*(volatile uint32_t*)0x4002200C) #define R32_FLASH_STATR (*(volatile uint32_t*)0x4002200C)
@@ -233,14 +238,14 @@ extern uint32_t USB_SECTOR_STASH[128];
// WARNING: only one level of non-inline subroutine calls are possible // WARNING: only one level of non-inline subroutine calls are possible
__attribute__((always_inline)) static inline void set_ep_mode(uint32_t epidx, uint32_t epaddr, uint32_t eptype, uint32_t stat_rx, uint32_t stat_tx, uint32_t xtra, int clear_dtog) { __attribute__((always_inline)) static inline void set_ep_mode(uint32_t epidx, uint32_t epaddr, uint32_t eptype, uint32_t stat_rx, uint32_t stat_tx, uint32_t xtra, int clear_dtog) {
uint32_t val = R16_USBD_EPR(epidx); uint32_t val = R16_USBD_EPR[epidx];
uint32_t cur_stats; uint32_t cur_stats;
if (clear_dtog) if (clear_dtog)
cur_stats = val & 0x7070; cur_stats = val & 0x7070;
else else
cur_stats = val & 0x3030; cur_stats = val & 0x3030;
uint32_t want_stats = (stat_rx << 12) | (stat_tx) << 4; uint32_t want_stats = (stat_rx << 12) | (stat_tx) << 4;
R16_USBD_EPR(epidx) = epaddr | (eptype << 9) | xtra | (cur_stats ^ want_stats); R16_USBD_EPR[epidx] = epaddr | (eptype << 9) | xtra | (cur_stats ^ want_stats);
} }
__attribute__((always_inline)) static inline uint32_t min(uint32_t a, uint32_t b) { __attribute__((always_inline)) static inline uint32_t min(uint32_t a, uint32_t b) {
@@ -396,7 +401,7 @@ __attribute__((naked)) int main(void) {
R16_USBD_CNTR = 0; R16_USBD_CNTR = 0;
} else if (usb_int_status & (1 << 15)) { } else if (usb_int_status & (1 << 15)) {
uint32_t epidx = usb_int_status & 0xf; uint32_t epidx = usb_int_status & 0xf;
uint32_t ep_status = R16_USBD_EPR(epidx); uint32_t ep_status = R16_USBD_EPR[epidx];
if ((ep_status & (1 << 15)) && (epidx == 0)) { if ((ep_status & (1 << 15)) && (epidx == 0)) {
if (ep_status & (1 << 11)) { if (ep_status & (1 << 11)) {
// setup, STAT_RX and STAT_TX both now NAK // setup, STAT_RX and STAT_TX both now NAK
+4
View File
@@ -32,6 +32,10 @@ SECTIONS
. = ALIGN(4); . = ALIGN(4);
} >FLASH } >FLASH
PROVIDE( R16_USBD_EPR = 0x40005C00 );
PROVIDE( R16_USBD_CNTR = 0x40005C40 );
PROVIDE( R16_USBD_ISTR = 0x40005C44 );
PROVIDE( R16_USBD_DADDR = 0x40005C4C );
PROVIDE( __global_pointer$ = 0x40006000 ); PROVIDE( __global_pointer$ = 0x40006000 );
PROVIDE( USB_DESCS = 0x40006000 ); PROVIDE( USB_DESCS = 0x40006000 );
PROVIDE( USB_EP0_OUT = 0x40006020 ); PROVIDE( USB_EP0_OUT = 0x40006020 );