mirror of
https://github.com/hathach/tinyusb.git
synced 2025-02-07 05:54:11 +08:00
adding universal register structs for musb
This commit is contained in:
parent
a9df933e0d
commit
e339702a2a
@ -54,6 +54,8 @@ _Pragma("GCC diagnostic ignored \"-Waddress-of-packed-member\"");
|
||||
#error "Unsupported MCU"
|
||||
#endif
|
||||
|
||||
#define MUSB_REGS(rhport) ((musb_regs_t*) MUSB_BASES[rhport])
|
||||
|
||||
/*------------------------------------------------------------------
|
||||
* MACRO TYPEDEF CONSTANT ENUM DECLARATION
|
||||
*------------------------------------------------------------------*/
|
||||
@ -381,7 +383,7 @@ static void process_ep0(uint8_t rhport)
|
||||
return;
|
||||
}
|
||||
|
||||
volatile musb_ctl_regs_t *ctrl_regs = musb_dcd_ctl_regs(rhport);
|
||||
musb_regs_t* musb_regs = MUSB_REGS(rhport);
|
||||
|
||||
/* When CSRL0 is zero, it means that completion of sending a any length packet
|
||||
* or receiving a zero length packet. */
|
||||
@ -389,7 +391,7 @@ static void process_ep0(uint8_t rhport)
|
||||
/* STATUS IN */
|
||||
if (*(const uint16_t*)(uintptr_t)&_dcd.setup_packet == 0x0500) {
|
||||
/* The address must be changed on completion of the control transfer. */
|
||||
ctrl_regs->FADDR = (uint8_t)_dcd.setup_packet.wValue;
|
||||
musb_regs->faddr = (uint8_t)_dcd.setup_packet.wValue;
|
||||
}
|
||||
_dcd.setup_packet.bmRequestType = REQUEST_TYPE_INVALID;
|
||||
dcd_event_xfer_complete(rhport,
|
||||
@ -442,7 +444,7 @@ static void process_edpt_n(uint8_t rhport, uint_fast8_t ep_addr)
|
||||
|
||||
static void process_bus_reset(uint8_t rhport)
|
||||
{
|
||||
volatile musb_ctl_regs_t *ctrl_regs = musb_dcd_ctl_regs(rhport);
|
||||
musb_regs_t* musb_regs = MUSB_REGS(rhport);
|
||||
/* When bmRequestType is REQUEST_TYPE_INVALID(0xFF),
|
||||
* a control transfer state is SETUP or STATUS stage. */
|
||||
_dcd.setup_packet.bmRequestType = REQUEST_TYPE_INVALID;
|
||||
@ -450,15 +452,15 @@ static void process_bus_reset(uint8_t rhport)
|
||||
/* When pipe0.buf has not NULL, DATA stage works in progress. */
|
||||
_dcd.pipe0.buf = NULL;
|
||||
|
||||
ctrl_regs->TXIE = 1; /* Enable only EP0 */
|
||||
ctrl_regs->RXIE = 0;
|
||||
musb_regs->intr_txen = 1; /* Enable only EP0 */
|
||||
musb_regs->intr_rxen = 0;
|
||||
|
||||
/* Clear FIFO settings */
|
||||
for (unsigned i = 1; i < TUP_DCD_ENDPOINT_MAX; ++i) {
|
||||
musb_dcd_reset_fifo(rhport, i, 0);
|
||||
musb_dcd_reset_fifo(rhport, i, 1);
|
||||
}
|
||||
dcd_event_bus_reset(rhport, (ctrl_regs->POWER & USB_POWER_HSMODE) ? TUSB_SPEED_HIGH : TUSB_SPEED_FULL, true);
|
||||
dcd_event_bus_reset(rhport, (musb_regs->power & USB_POWER_HSMODE) ? TUSB_SPEED_HIGH : TUSB_SPEED_FULL, true);
|
||||
}
|
||||
|
||||
/*------------------------------------------------------------------
|
||||
@ -467,8 +469,8 @@ static void process_bus_reset(uint8_t rhport)
|
||||
|
||||
void dcd_init(uint8_t rhport)
|
||||
{
|
||||
volatile musb_ctl_regs_t *ctrl_regs = musb_dcd_ctl_regs(rhport);
|
||||
ctrl_regs->IE |= USB_IE_SUSPND;
|
||||
musb_regs_t* musb_regs = MUSB_REGS(rhport);
|
||||
musb_regs->intrusben |= USB_IE_SUSPND;
|
||||
musb_dcd_int_clear(rhport);
|
||||
musb_dcd_phy_init(rhport);
|
||||
dcd_connect(rhport);
|
||||
@ -497,30 +499,29 @@ void dcd_set_address(uint8_t rhport, uint8_t dev_addr)
|
||||
}
|
||||
|
||||
// Wake up host
|
||||
void dcd_remote_wakeup(uint8_t rhport)
|
||||
{
|
||||
volatile musb_ctl_regs_t *ctrl_regs = musb_dcd_ctl_regs(rhport);
|
||||
ctrl_regs->POWER |= USB_POWER_RESUME;
|
||||
void dcd_remote_wakeup(uint8_t rhport) {
|
||||
musb_regs_t* musb_regs = MUSB_REGS(rhport);
|
||||
musb_regs->power |= USB_POWER_RESUME;
|
||||
|
||||
unsigned cnt = SystemCoreClock / 1000;
|
||||
while (cnt--) __NOP();
|
||||
|
||||
ctrl_regs->POWER &= ~USB_POWER_RESUME;
|
||||
musb_regs->power &= ~USB_POWER_RESUME;
|
||||
}
|
||||
|
||||
// Connect by enabling internal pull-up resistor on D+/D-
|
||||
void dcd_connect(uint8_t rhport)
|
||||
{
|
||||
volatile musb_ctl_regs_t *ctrl_regs = musb_dcd_ctl_regs(rhport);
|
||||
ctrl_regs->POWER |= TUD_OPT_HIGH_SPEED ? USB_POWER_HSENAB : 0;
|
||||
ctrl_regs->POWER |= USB_POWER_SOFTCONN;
|
||||
musb_regs_t* musb_regs = MUSB_REGS(rhport);
|
||||
musb_regs->power |= TUD_OPT_HIGH_SPEED ? USB_POWER_HSENAB : 0;
|
||||
musb_regs->power |= USB_POWER_SOFTCONN;
|
||||
}
|
||||
|
||||
// Disconnect by disabling internal pull-up resistor on D+/D-
|
||||
void dcd_disconnect(uint8_t rhport)
|
||||
{
|
||||
volatile musb_ctl_regs_t *ctrl_regs = musb_dcd_ctl_regs(rhport);
|
||||
ctrl_regs->POWER &= ~USB_POWER_SOFTCONN;
|
||||
musb_regs_t* musb_regs = MUSB_REGS(rhport);
|
||||
musb_regs->power &= ~USB_POWER_SOFTCONN;
|
||||
}
|
||||
|
||||
void dcd_sof_enable(uint8_t rhport, bool en)
|
||||
@ -552,23 +553,25 @@ bool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * ep_desc)
|
||||
pipe->remaining = 0;
|
||||
|
||||
volatile musb_epn_regs_t *regs = musb_dcd_epn_regs(rhport, epn);
|
||||
volatile musb_ctl_regs_t *ctrl_regs = musb_dcd_ctl_regs(rhport);
|
||||
musb_regs_t* musb_regs = MUSB_REGS(rhport);
|
||||
if (dir_in) {
|
||||
regs->TXMAXP = mps;
|
||||
regs->TXCSRH = (xfer == TUSB_XFER_ISOCHRONOUS) ? USB_TXCSRH1_ISO : 0;
|
||||
if (regs->TXCSRL & USB_TXCSRL1_TXRDY)
|
||||
if (regs->TXCSRL & USB_TXCSRL1_TXRDY) {
|
||||
regs->TXCSRL = USB_TXCSRL1_CLRDT | USB_TXCSRL1_FLUSH;
|
||||
else
|
||||
} else {
|
||||
regs->TXCSRL = USB_TXCSRL1_CLRDT;
|
||||
ctrl_regs->TXIE |= TU_BIT(epn);
|
||||
}
|
||||
musb_regs->intr_txen |= TU_BIT(epn);
|
||||
} else {
|
||||
regs->RXMAXP = mps;
|
||||
regs->RXCSRH = (xfer == TUSB_XFER_ISOCHRONOUS) ? USB_RXCSRH1_ISO : 0;
|
||||
if (regs->RXCSRL & USB_RXCSRL1_RXRDY)
|
||||
if (regs->RXCSRL & USB_RXCSRL1_RXRDY) {
|
||||
regs->RXCSRL = USB_RXCSRL1_CLRDT | USB_RXCSRL1_FLUSH;
|
||||
else
|
||||
} else {
|
||||
regs->RXCSRL = USB_RXCSRL1_CLRDT;
|
||||
ctrl_regs->RXIE |= TU_BIT(epn);
|
||||
}
|
||||
musb_regs->intr_rxen |= TU_BIT(epn);
|
||||
}
|
||||
|
||||
/* Setup FIFO */
|
||||
@ -580,11 +583,11 @@ bool dcd_edpt_open(uint8_t rhport, tusb_desc_endpoint_t const * ep_desc)
|
||||
void dcd_edpt_close_all(uint8_t rhport)
|
||||
{
|
||||
volatile musb_epn_regs_t *regs;
|
||||
volatile musb_ctl_regs_t *ctrl_regs = musb_dcd_ctl_regs(rhport);
|
||||
musb_regs_t* musb_regs = MUSB_REGS(rhport);
|
||||
unsigned const ie = musb_dcd_get_int_enable(rhport);
|
||||
musb_dcd_int_disable(rhport);
|
||||
ctrl_regs->TXIE = 1; /* Enable only EP0 */
|
||||
ctrl_regs->RXIE = 0;
|
||||
musb_regs->intr_txen = 1; /* Enable only EP0 */
|
||||
musb_regs->intr_rxen = 0;
|
||||
for (unsigned i = 1; i < TUP_DCD_ENDPOINT_MAX; ++i) {
|
||||
regs = musb_dcd_epn_regs(rhport, i);
|
||||
regs->TXMAXP = 0;
|
||||
@ -596,10 +599,11 @@ void dcd_edpt_close_all(uint8_t rhport)
|
||||
|
||||
regs->RXMAXP = 0;
|
||||
regs->RXCSRH = 0;
|
||||
if (regs->RXCSRL & USB_RXCSRL1_RXRDY)
|
||||
if (regs->RXCSRL & USB_RXCSRL1_RXRDY) {
|
||||
regs->RXCSRL = USB_RXCSRL1_CLRDT | USB_RXCSRL1_FLUSH;
|
||||
else
|
||||
} else {
|
||||
regs->RXCSRL = USB_RXCSRL1_CLRDT;
|
||||
}
|
||||
|
||||
musb_dcd_reset_fifo(rhport, i, 0);
|
||||
musb_dcd_reset_fifo(rhport, i, 1);
|
||||
@ -614,25 +618,27 @@ void dcd_edpt_close(uint8_t rhport, uint8_t ep_addr)
|
||||
unsigned const dir_in = tu_edpt_dir(ep_addr);
|
||||
|
||||
volatile musb_epn_regs_t *regs = musb_dcd_epn_regs(rhport, epn);
|
||||
volatile musb_ctl_regs_t *ctrl_regs = musb_dcd_ctl_regs(rhport);
|
||||
musb_regs_t* musb_regs = MUSB_REGS(rhport);
|
||||
unsigned const ie = musb_dcd_get_int_enable(rhport);
|
||||
musb_dcd_int_disable(rhport);
|
||||
if (dir_in) {
|
||||
ctrl_regs->TXIE &= ~TU_BIT(epn);
|
||||
musb_regs->intr_txen &= ~TU_BIT(epn);
|
||||
regs->TXMAXP = 0;
|
||||
regs->TXCSRH = 0;
|
||||
if (regs->TXCSRL & USB_TXCSRL1_TXRDY)
|
||||
if (regs->TXCSRL & USB_TXCSRL1_TXRDY) {
|
||||
regs->TXCSRL = USB_TXCSRL1_CLRDT | USB_TXCSRL1_FLUSH;
|
||||
else
|
||||
} else {
|
||||
regs->TXCSRL = USB_TXCSRL1_CLRDT;
|
||||
}
|
||||
} else {
|
||||
ctrl_regs->RXIE &= ~TU_BIT(epn);
|
||||
musb_regs->intr_rxen &= ~TU_BIT(epn);
|
||||
regs->RXMAXP = 0;
|
||||
regs->RXCSRH = 0;
|
||||
if (regs->RXCSRL & USB_RXCSRL1_RXRDY)
|
||||
if (regs->RXCSRL & USB_RXCSRL1_RXRDY) {
|
||||
regs->RXCSRL = USB_RXCSRL1_CLRDT | USB_RXCSRL1_FLUSH;
|
||||
else
|
||||
} else {
|
||||
regs->RXCSRL = USB_RXCSRL1_CLRDT;
|
||||
}
|
||||
}
|
||||
musb_dcd_reset_fifo(rhport, epn, dir_in);
|
||||
if (ie) musb_dcd_int_enable(rhport);
|
||||
@ -650,8 +656,9 @@ bool dcd_edpt_xfer(uint8_t rhport, uint8_t ep_addr, uint8_t * buffer, uint16_t t
|
||||
if (epnum) {
|
||||
_dcd.pipe_buf_is_fifo[tu_edpt_dir(ep_addr)] &= ~TU_BIT(epnum - 1);
|
||||
ret = edpt_n_xfer(rhport, ep_addr, buffer, total_bytes);
|
||||
} else
|
||||
} else {
|
||||
ret = edpt0_xfer(rhport, ep_addr, buffer, total_bytes);
|
||||
}
|
||||
if (ie) musb_dcd_int_enable(rhport);
|
||||
return ret;
|
||||
}
|
||||
@ -719,18 +726,18 @@ void dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)
|
||||
void dcd_int_handler(uint8_t rhport)
|
||||
{
|
||||
uint_fast8_t is, txis, rxis;
|
||||
volatile musb_ctl_regs_t *ctrl_regs;
|
||||
|
||||
//Part specific ISR setup/entry
|
||||
musb_dcd_int_handler_enter(rhport);
|
||||
|
||||
ctrl_regs = musb_dcd_ctl_regs(rhport);
|
||||
is = ctrl_regs->IS; /* read and clear interrupt status */
|
||||
txis = ctrl_regs->TXIS; /* read and clear interrupt status */
|
||||
rxis = ctrl_regs->RXIS; /* read and clear interrupt status */
|
||||
musb_regs_t* musb_regs = MUSB_REGS(rhport);
|
||||
|
||||
is = musb_regs->intrusb; /* read and clear interrupt status */
|
||||
txis = musb_regs->intr_tx; /* read and clear interrupt status */
|
||||
rxis = musb_regs->intr_rx; /* read and clear interrupt status */
|
||||
// TU_LOG1("D%2x T%2x R%2x\r\n", is, txis, rxis);
|
||||
|
||||
is &= ctrl_regs->IE; /* Clear disabled interrupts */
|
||||
is &= musb_regs->intrusben; /* Clear disabled interrupts */
|
||||
if (is & USB_IS_DISCON) {
|
||||
}
|
||||
if (is & USB_IS_SOF) {
|
||||
@ -746,7 +753,7 @@ void dcd_int_handler(uint8_t rhport)
|
||||
dcd_event_bus_signal(rhport, DCD_EVENT_SUSPEND, true);
|
||||
}
|
||||
|
||||
txis &= ctrl_regs->TXIE; /* Clear disabled interrupts */
|
||||
txis &= musb_regs->intr_txen; /* Clear disabled interrupts */
|
||||
if (txis & USB_TXIE_EP0) {
|
||||
process_ep0(rhport);
|
||||
txis &= ~TU_BIT(0);
|
||||
@ -756,7 +763,7 @@ void dcd_int_handler(uint8_t rhport)
|
||||
process_edpt_n(rhport, tu_edpt_addr(num, TUSB_DIR_IN));
|
||||
txis &= ~TU_BIT(num);
|
||||
}
|
||||
rxis &= ctrl_regs->RXIE; /* Clear disabled interrupts */
|
||||
rxis &= musb_regs->intr_rxen; /* Clear disabled interrupts */
|
||||
while (rxis) {
|
||||
unsigned const num = __builtin_ctz(rxis);
|
||||
process_edpt_n(rhport, tu_edpt_addr(num, TUSB_DIR_OUT));
|
||||
|
@ -28,12 +28,14 @@
|
||||
#define TUSB_MUSB_MAX32_H_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "mxc_device.h"
|
||||
#include "usbhs_regs.h"
|
||||
|
||||
const uintptr_t MUSB_BASES[] = { MXC_BASE_USBHS };
|
||||
|
||||
#if CFG_TUD_ENABLED
|
||||
#define USBHS_M31_CLOCK_RECOVERY
|
||||
|
||||
@ -92,14 +94,12 @@ static inline void musb_dcd_int_handler_enter(uint8_t rhport) {
|
||||
}
|
||||
}
|
||||
|
||||
static inline void musb_dcd_int_handler_exit(uint8_t rhport)
|
||||
{
|
||||
static inline void musb_dcd_int_handler_exit(uint8_t rhport) {
|
||||
//restore register index
|
||||
musb_periph_inst[rhport]->index = isr_saved_index;
|
||||
}
|
||||
|
||||
static inline void musb_dcd_phy_init(uint8_t rhport)
|
||||
{
|
||||
static inline void musb_dcd_phy_init(uint8_t rhport) {
|
||||
//Interrupt for VBUS disconnect
|
||||
musb_periph_inst[rhport]->mxm_int_en |= MXC_F_USBHS_MXM_INT_EN_NOVBUS;
|
||||
|
||||
@ -136,42 +136,32 @@ static inline void musb_dcd_phy_init(uint8_t rhport)
|
||||
musb_periph_inst[rhport]->m31_phy_ponrst = 1;
|
||||
}
|
||||
|
||||
static inline volatile musb_ctl_regs_t* musb_dcd_ctl_regs(uint8_t rhport)
|
||||
{
|
||||
volatile musb_ctl_regs_t *regs = (volatile musb_ctl_regs_t*)((uintptr_t)&(musb_periph_inst[rhport]->faddr));
|
||||
return regs;
|
||||
}
|
||||
|
||||
static inline volatile musb_epn_regs_t* musb_dcd_epn_regs(uint8_t rhport, unsigned epnum)
|
||||
{
|
||||
static inline volatile musb_epn_regs_t* musb_dcd_epn_regs(uint8_t rhport, unsigned epnum) {
|
||||
//Need to set index to map EP registers
|
||||
musb_periph_inst[rhport]->index = epnum;
|
||||
volatile musb_epn_regs_t *regs = (volatile musb_epn_regs_t*)((uintptr_t)&(musb_periph_inst[rhport]->inmaxp));
|
||||
volatile musb_epn_regs_t* regs = (volatile musb_epn_regs_t*) ((uintptr_t) &(musb_periph_inst[rhport]->inmaxp));
|
||||
return regs;
|
||||
}
|
||||
|
||||
static inline volatile musb_ep0_regs_t* musb_dcd_ep0_regs(uint8_t rhport)
|
||||
{
|
||||
static inline volatile musb_ep0_regs_t* musb_dcd_ep0_regs(uint8_t rhport) {
|
||||
//Need to set index to map EP0 registers
|
||||
musb_periph_inst[rhport]->index = 0;
|
||||
volatile musb_ep0_regs_t *regs = (volatile musb_ep0_regs_t*)((uintptr_t)&(musb_periph_inst[rhport]->csr0));
|
||||
volatile musb_ep0_regs_t* regs = (volatile musb_ep0_regs_t*) ((uintptr_t) &(musb_periph_inst[rhport]->csr0));
|
||||
return regs;
|
||||
}
|
||||
|
||||
static volatile void *musb_dcd_ep_get_fifo_ptr(uint8_t rhport, unsigned epnum)
|
||||
{
|
||||
volatile uint32_t *ptr;
|
||||
static volatile void* musb_dcd_ep_get_fifo_ptr(uint8_t rhport, unsigned epnum) {
|
||||
volatile uint32_t* ptr;
|
||||
|
||||
ptr = &(musb_periph_inst[rhport]->fifo0);
|
||||
ptr += epnum;
|
||||
|
||||
return (volatile void *) ptr;
|
||||
return (volatile void*) ptr;
|
||||
}
|
||||
|
||||
|
||||
static inline void musb_dcd_setup_fifo(uint8_t rhport, unsigned epnum, unsigned dir_in, unsigned mps)
|
||||
{
|
||||
(void)mps;
|
||||
static inline void musb_dcd_setup_fifo(uint8_t rhport, unsigned epnum, unsigned dir_in, unsigned mps) {
|
||||
(void) mps;
|
||||
|
||||
//Most likely the caller has already grabbed the right register block. But
|
||||
//as a precaution save and restore the register bank anyways
|
||||
@ -180,7 +170,7 @@ static inline void musb_dcd_setup_fifo(uint8_t rhport, unsigned epnum, unsigned
|
||||
musb_periph_inst[rhport]->index = epnum;
|
||||
|
||||
//Disable double buffering
|
||||
if(dir_in) {
|
||||
if (dir_in) {
|
||||
musb_periph_inst[rhport]->incsru |= (MXC_F_USBHS_INCSRU_DPKTBUFDIS | MXC_F_USBHS_INCSRU_MODE);
|
||||
} else {
|
||||
musb_periph_inst[rhport]->outcsru |= (MXC_F_USBHS_OUTCSRU_DPKTBUFDIS);
|
||||
@ -189,8 +179,7 @@ static inline void musb_dcd_setup_fifo(uint8_t rhport, unsigned epnum, unsigned
|
||||
musb_periph_inst[rhport]->index = saved_index;
|
||||
}
|
||||
|
||||
static inline void musb_dcd_reset_fifo(uint8_t rhport, unsigned epnum, unsigned dir_in)
|
||||
{
|
||||
static inline void musb_dcd_reset_fifo(uint8_t rhport, unsigned epnum, unsigned dir_in) {
|
||||
//Most likely the caller has already grabbed the right register block. But
|
||||
//as a precaution save and restore the register bank anyways
|
||||
unsigned saved_index = musb_periph_inst[rhport]->index;
|
||||
@ -198,7 +187,7 @@ static inline void musb_dcd_reset_fifo(uint8_t rhport, unsigned epnum, unsigned
|
||||
musb_periph_inst[rhport]->index = epnum;
|
||||
|
||||
//Disable double buffering
|
||||
if(dir_in) {
|
||||
if (dir_in) {
|
||||
musb_periph_inst[rhport]->incsru |= (MXC_F_USBHS_INCSRU_DPKTBUFDIS);
|
||||
} else {
|
||||
musb_periph_inst[rhport]->outcsru |= (MXC_F_USBHS_OUTCSRU_DPKTBUFDIS);
|
||||
@ -210,7 +199,7 @@ static inline void musb_dcd_reset_fifo(uint8_t rhport, unsigned epnum, unsigned
|
||||
#endif // CFG_TUD_ENABLED
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif // TUSB_MUSB_MAX32_H_
|
||||
|
@ -42,6 +42,8 @@
|
||||
#error "Unsupported MCUs"
|
||||
#endif
|
||||
|
||||
const uintptr_t MUSB_BASES[] = { USB0_BASE };
|
||||
|
||||
|
||||
// Header supports both device and host modes. Only include what's necessary
|
||||
#if CFG_TUD_ENABLED
|
||||
@ -95,12 +97,6 @@ static inline void musb_dcd_int_handler_exit(uint8_t rhport){
|
||||
//Nothing to do for this part
|
||||
}
|
||||
|
||||
static inline volatile musb_ctl_regs_t* musb_dcd_ctl_regs(uint8_t rhport)
|
||||
{
|
||||
volatile musb_ctl_regs_t *regs = (volatile musb_ctl_regs_t*)((uintptr_t)&(musb_periph_inst[rhport]->FADDR));
|
||||
return regs;
|
||||
}
|
||||
|
||||
static inline volatile musb_epn_regs_t* musb_dcd_epn_regs(uint8_t rhport, unsigned epnum)
|
||||
{
|
||||
uintptr_t baseptr = (uintptr_t)&(musb_periph_inst[rhport]->TXMAXP1);
|
||||
|
@ -32,8 +32,8 @@
|
||||
*
|
||||
*******************************************************************************/
|
||||
|
||||
#ifndef _TUSB_MUSB_TYPE_H_
|
||||
#define _TUSB_MUSB_TYPE_H_
|
||||
#ifndef TUSB_MUSB_TYPE_H_
|
||||
#define TUSB_MUSB_TYPE_H_
|
||||
|
||||
#include "stdint.h"
|
||||
|
||||
@ -41,6 +41,22 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#ifndef __IO
|
||||
#define __IO volatile
|
||||
#endif
|
||||
|
||||
#ifndef __I
|
||||
#define __I volatile const
|
||||
#endif
|
||||
|
||||
#ifndef __O
|
||||
#define __O volatile
|
||||
#endif
|
||||
|
||||
#ifndef __R
|
||||
#define __R volatile const
|
||||
#endif
|
||||
|
||||
// Endpoint register mapping. Non-zero end points.
|
||||
typedef struct TU_ATTR_PACKED {
|
||||
uint16_t TXMAXP;
|
||||
@ -60,17 +76,131 @@ typedef struct TU_ATTR_PACKED {
|
||||
uint8_t COUNT0;
|
||||
} musb_ep0_regs_t;
|
||||
|
||||
// Control register mapping
|
||||
typedef struct TU_ATTR_PACKED {
|
||||
uint8_t FADDR;
|
||||
uint8_t POWER;
|
||||
uint16_t TXIS;
|
||||
uint16_t RXIS;
|
||||
uint16_t TXIE;
|
||||
uint16_t RXIE;
|
||||
uint8_t IS;
|
||||
uint8_t IE;
|
||||
} musb_ctl_regs_t;
|
||||
typedef struct {
|
||||
//------------- Common -------------//
|
||||
__IO uint8_t faddr; // 0x00: FADDR
|
||||
__IO uint8_t power; // 0x01: POWER
|
||||
|
||||
__IO uint16_t intr_tx; // 0x02: INTR_TX
|
||||
__IO uint16_t intr_rx; // 0x04: INTR_RX
|
||||
|
||||
__IO uint16_t intr_txen; // 0x06: INTR_TXEN
|
||||
__IO uint16_t intr_rxen; // 0x08: INTR_RXEN
|
||||
|
||||
__IO uint8_t intrusb; // 0x0A: INTRUSB
|
||||
__IO uint8_t intrusben; // 0x0B: INTRUSBEN
|
||||
|
||||
__IO uint16_t frame; // 0x0C: FRAME
|
||||
__IO uint8_t index; // 0x0E: INDEX
|
||||
__IO uint8_t testmode; // 0x0F: TESTMODE
|
||||
__IO uint16_t inmaxp; // 0x10: INMAXP
|
||||
union {
|
||||
__IO uint8_t csr0; // 0x12: CSR0
|
||||
__IO uint8_t incsrl; // 0x12: INCSRL
|
||||
};
|
||||
__IO uint8_t incsru; // 0x13: INCSRU
|
||||
__IO uint16_t outmaxp; // 0x14: OUTMAXP
|
||||
__IO uint8_t outcsrl; // 0x16: OUTCSRL
|
||||
__IO uint8_t outcsru; // 0x17: OUTCSRU
|
||||
union {
|
||||
__IO uint16_t count0; // 0x18: COUNT0
|
||||
__IO uint16_t outcount; // 0x18: OUTCOUNT
|
||||
};
|
||||
__R uint16_t rsv_0x1a_0x1f[3];
|
||||
__IO uint32_t fifo0; // 0x20: FIFO0
|
||||
__IO uint32_t fifo1; // 0x24: FIFO1
|
||||
__IO uint32_t fifo2; // 0x28: FIFO2
|
||||
__IO uint32_t fifo3; // 0x2c: FIFO3
|
||||
__IO uint32_t fifo4; // 0x30: FIFO4
|
||||
__IO uint32_t fifo5; // 0x34: FIFO5
|
||||
__IO uint32_t fifo6; // 0x38: FIFO6
|
||||
__IO uint32_t fifo7; // 0x3c: FIFO7
|
||||
__IO uint32_t fifo8; // 0x40: FIFO8
|
||||
__IO uint32_t fifo9; // 0x44: FIFO9
|
||||
__IO uint32_t fifo10; // 0x48: FIFO10
|
||||
__IO uint32_t fifo11; // 0x4c: FIFO11
|
||||
__IO uint32_t fifo12; // 0x50: FIFO12
|
||||
__IO uint32_t fifo13; // 0x54: FIFO13
|
||||
__IO uint32_t fifo14; // 0x58: FIFO14
|
||||
__IO uint32_t fifo15; // 0x5c: FIFO15
|
||||
__IO uint8_t devctl; // 0x60: DEVCTL
|
||||
__IO uint8_t misc; // 0x61: MISC
|
||||
|
||||
//------------- Dynammic FIFO -------------//
|
||||
__IO uint8_t txfifo_sz; // 0x62: TXFIFO_SZ
|
||||
__IO uint8_t rxfifo_sz; // 0x63: RXFIFO_SZ
|
||||
__IO uint16_t txfifo_addr; // 0x64: TXFIFO_ADDR
|
||||
__IO uint16_t rxfifo_addr; // 0x66: RXFIFO_ADDR
|
||||
|
||||
//------------- Additional Control/Status -------------//
|
||||
union {
|
||||
__O uint32_t vcontrol; // 0x68: VCONTROL
|
||||
__IO uint32_t vstatus; // 0x68: VSTATUS
|
||||
};
|
||||
__IO uint16_t hwvers; // 0x6c: HWVERS
|
||||
__R uint16_t rsv_0x6e_0x77[5];
|
||||
|
||||
//------------- Additional Configuration -------------//
|
||||
__IO uint8_t epinfo; // 0x78: EPINFO
|
||||
__IO uint8_t raminfo; // 0x79: RAMINFO
|
||||
__IO uint8_t softreset; // 0x7A: SOFTRESET (Analog), Link info
|
||||
__IO uint8_t vplen; // 0x7B: VPLEN
|
||||
__IO uint8_t hs_eof1; // 0x7C: HS_EOF1
|
||||
__IO uint8_t fs_eof1; // 0x7D: FS_EOF1
|
||||
__IO uint8_t ls_eof1; // 0x7E: LS_EOF1
|
||||
__IO uint8_t soft_rst; // 0x7F: SOFT_RST
|
||||
|
||||
//------------- Extended -------------//
|
||||
__IO uint16_t ctuch; // 0x80: CTUCH
|
||||
__IO uint16_t cthsrtn; // 0x82: CTHSRTN
|
||||
__R uint32_t rsv_0x84_0x3ff[223];
|
||||
|
||||
//------------- Analog PHY -------------//
|
||||
__IO uint32_t mxm_usb_reg_00; // 0x400: MXM_USB_REG_00
|
||||
__IO uint32_t m31_phy_utmi_reset; // 0x404: M31_PHY_UTMI_RESET
|
||||
__IO uint32_t m31_phy_utmi_vcontrol; // 0x408: M31_PHY_UTMI_VCONTROL
|
||||
__IO uint32_t m31_phy_clk_en; // 0x40C: M31_PHY_CLK_EN
|
||||
__IO uint32_t m31_phy_ponrst; // 0x410: M31_PHY_PONRST
|
||||
__IO uint32_t m31_phy_noncry_rstb; // 0x414: M31_PHY_NONCRY_RSTB
|
||||
__IO uint32_t m31_phy_noncry_en; // 0x418: M31_PHY_NONCRY_EN
|
||||
__R uint32_t rsv_0x41c;
|
||||
__IO uint32_t m31_phy_u2_compliance_en; // 0x420: M31_PHY_U2_COMPLIANCE_EN
|
||||
__IO uint32_t m31_phy_u2_compliance_dac_adj; // 0x424: M31_PHY_U2_COMPLIANCE_DAC_ADJ
|
||||
__IO uint32_t m31_phy_u2_compliance_dac_adj_en; // 0x428: M31_PHY_U2_COMPLIANCE_DAC_ADJ_EN
|
||||
__IO uint32_t m31_phy_clk_rdy; // 0x42C: M31_PHY_CLK_RDY
|
||||
__IO uint32_t m31_phy_pll_en; // 0x430: M31_PHY_PLL_EN
|
||||
__IO uint32_t m31_phy_bist_ok; // 0x434: M31_PHY_BIST_OK
|
||||
__IO uint32_t m31_phy_data_oe; // 0x438: M31_PHY_DATA_OE
|
||||
__IO uint32_t m31_phy_oscouten; // 0x43C: M31_PHY_OSCOUTEN
|
||||
__IO uint32_t m31_phy_lpm_alive; // 0x440: M31_PHY_LPM_ALIVE
|
||||
__IO uint32_t m31_phy_hs_bist_mode; // 0x444: M31_PHY_HS_BIST_MODE
|
||||
__IO uint32_t m31_phy_coreclkin; // 0x448: M31_PHY_CORECLKIN
|
||||
__IO uint32_t m31_phy_xtlsel; // 0x44C: M31_PHY_XTLSEL
|
||||
__IO uint32_t m31_phy_ls_en; // 0x450: M31_PHY_LS_EN
|
||||
__IO uint32_t m31_phy_debug_sel; // 0x454: M31_PHY_DEBUG_SEL
|
||||
__IO uint32_t m31_phy_debug_out; // 0x458: M31_PHY_DEBUG_OUT
|
||||
__IO uint32_t m31_phy_outclksel; // 0x45C: M31_PHY_OUTCLKSEL
|
||||
__IO uint32_t m31_phy_xcfgi_31_0; // 0x460: M31_PHY_XCFGI_31_0
|
||||
__IO uint32_t m31_phy_xcfgi_63_32; // 0x464: M31_PHY_XCFGI_63_32
|
||||
__IO uint32_t m31_phy_xcfgi_95_64; // 0x468: M31_PHY_XCFGI_95_64
|
||||
__IO uint32_t m31_phy_xcfgi_127_96; // 0x46C: M31_PHY_XCFGI_127_96
|
||||
__IO uint32_t m31_phy_xcfgi_137_128; // 0x470: M31_PHY_XCFGI_137_128
|
||||
__IO uint32_t m31_phy_xcfg_hs_coarse_tune_num; // 0x474: M31_PHY_XCFG_HS_COARSE_TUNE_NUM
|
||||
__IO uint32_t m31_phy_xcfg_hs_fine_tune_num; // 0x478: M31_PHY_XCFG_HS_FINE_TUNE_NUM
|
||||
__IO uint32_t m31_phy_xcfg_fs_coarse_tune_num; // 0x47C: M31_PHY_XCFG_FS_COARSE_TUNE_NUM
|
||||
__IO uint32_t m31_phy_xcfg_fs_fine_tune_num; // 0x480: M31_PHY_XCFG_FS_FINE_TUNE_NUM
|
||||
__IO uint32_t m31_phy_xcfg_lock_range_max; // 0x484: M31_PHY_XCFG_LOCK_RANGE_MAX
|
||||
__IO uint32_t m31_phy_xcfgi_lock_range_min; // 0x488: M31_PHY_XCFGI_LOCK_RANGE_MIN
|
||||
__IO uint32_t m31_phy_xcfg_ob_rsel; // 0x48C: M31_PHY_XCFG_OB_RSEL
|
||||
__IO uint32_t m31_phy_xcfg_oc_rsel; // 0x490: M31_PHY_XCFG_OC_RSEL
|
||||
__IO uint32_t m31_phy_xcfgo; // 0x494: M31_PHY_XCFGO
|
||||
__IO uint32_t mxm_int; // 0x498: MXM_INT
|
||||
__IO uint32_t mxm_int_en; // 0x49C: MXM_INT_EN
|
||||
__IO uint32_t mxm_suspend; // 0x4A0: MXM_SUSPEND
|
||||
__IO uint32_t mxm_reg_a4; // 0x4A4: MXM_REG_A4
|
||||
} musb_regs_t;
|
||||
|
||||
TU_VERIFY_STATIC(sizeof(musb_regs_t) == 0x4A8, "size is not correct");
|
||||
|
||||
//*****************************************************************************
|
||||
//
|
||||
|
Loading…
x
Reference in New Issue
Block a user