mirror of
https://github.com/hathach/tinyusb.git
synced 2025-02-21 03:40:52 +00:00
add rusb2_module_start(), more update for multiple ports for dcd rusb2
This commit is contained in:
parent
f308435b64
commit
95b77a0e73
@ -104,13 +104,6 @@ void board_init(void) {
|
|||||||
R_SYSTEM->TRCKCR = R_SYSTEM_TRCKCR_TRCKEN_Msk | 0x01;
|
R_SYSTEM->TRCKCR = R_SYSTEM_TRCKCR_TRCKEN_Msk | 0x01;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Enable USB module
|
|
||||||
R_MSTP->MSTPCRB &= ~(1U << 11U); // FS
|
|
||||||
|
|
||||||
#ifdef BOARD_HAS_USB_HIGHSPEED
|
|
||||||
R_MSTP->MSTPCRB &= ~(1U << 12U);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if CFG_TUSB_OS == OPT_OS_FREERTOS
|
#if CFG_TUSB_OS == OPT_OS_FREERTOS
|
||||||
// If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )
|
// If freeRTOS is used, IRQ priority is limit by max syscall ( smaller is higher )
|
||||||
NVIC_SetPriority(USBFS_INT_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);
|
NVIC_SetPriority(USBFS_INT_IRQn, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);
|
||||||
|
@ -65,9 +65,9 @@
|
|||||||
|
|
||||||
/* LINK core registers */
|
/* LINK core registers */
|
||||||
#if defined(__CCRX__)
|
#if defined(__CCRX__)
|
||||||
#define RUSB2 ((RUSB2_REG_t __evenaccess*) RUSB2_REG_BASE)
|
#define RUSB2 ((rusb2_reg_t __evenaccess*) RUSB2_REG_BASE)
|
||||||
#elif defined(__RX__)
|
#elif defined(__RX__)
|
||||||
#define RUSB2 ((RUSB2_REG_t*) RUSB2_REG_BASE)
|
#define RUSB2 ((rusb2_reg_t*) RUSB2_REG_BASE)
|
||||||
#elif (CFG_TUSB_RHPORT1_MODE & OPT_MODE_DEVICE)
|
#elif (CFG_TUSB_RHPORT1_MODE & OPT_MODE_DEVICE)
|
||||||
#define RUSB2 ((R_USB_HS0_Type*)R_USB_HS0_BASE)
|
#define RUSB2 ((R_USB_HS0_Type*)R_USB_HS0_BASE)
|
||||||
#else
|
#else
|
||||||
@ -145,10 +145,15 @@ typedef struct
|
|||||||
uint8_t ep[2][16]; /* a lookup table for a pipe index from an endpoint address */
|
uint8_t ep[2][16]; /* a lookup table for a pipe index from an endpoint address */
|
||||||
} dcd_data_t;
|
} dcd_data_t;
|
||||||
|
|
||||||
|
static dcd_data_t _dcd;
|
||||||
|
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
// INTERNAL OBJECT & FUNCTION DECLARATION
|
// INTERNAL OBJECT & FUNCTION DECLARATION
|
||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
static dcd_data_t _dcd;
|
|
||||||
|
TU_ATTR_ALWAYS_INLINE static inline bool is_highspeed(uint8_t rhport) {
|
||||||
|
return rhport == 1;
|
||||||
|
}
|
||||||
|
|
||||||
static unsigned find_pipe(unsigned xfer)
|
static unsigned find_pipe(unsigned xfer)
|
||||||
{
|
{
|
||||||
@ -543,38 +548,60 @@ static void process_pipe_brdy(uint8_t rhport, unsigned num)
|
|||||||
|
|
||||||
static void process_bus_reset(uint8_t rhport)
|
static void process_bus_reset(uint8_t rhport)
|
||||||
{
|
{
|
||||||
RUSB2->BEMPENB = 1;
|
rusb2_reg_t* rusb = RUSB2_REG(rhport);
|
||||||
RUSB2->BRDYENB = 1;
|
|
||||||
RUSB2->CFIFOCTR = RUSB2_CFIFOCTR_BCLR_Msk;
|
rusb->BEMPENB = 1;
|
||||||
RUSB2->D0FIFOSEL = 0;
|
rusb->BRDYENB = 1;
|
||||||
while (RUSB2->D0FIFOSEL_b.CURPIPE) ; /* if CURPIPE bits changes, check written value */
|
rusb->CFIFOCTR = RUSB2_CFIFOCTR_BCLR_Msk;
|
||||||
RUSB2->D1FIFOSEL = 0;
|
|
||||||
while (RUSB2->D1FIFOSEL_b.CURPIPE) ; /* if CURPIPE bits changes, check written value */
|
rusb->D0FIFOSEL = 0;
|
||||||
volatile uint16_t *ctr = (volatile uint16_t*)((uintptr_t) (&RUSB2->PIPE_CTR[0]));
|
while (rusb->D0FIFOSEL_b.CURPIPE) {} /* if CURPIPE bits changes, check written value */
|
||||||
volatile uint16_t *tre = (volatile uint16_t*)((uintptr_t) (&RUSB2->PIPE_TR[0].E));
|
|
||||||
|
rusb->D1FIFOSEL = 0;
|
||||||
|
while (rusb->D1FIFOSEL_b.CURPIPE) {} /* if CURPIPE bits changes, check written value */
|
||||||
|
|
||||||
|
volatile uint16_t *ctr = (volatile uint16_t*)((uintptr_t) (&rusb->PIPE_CTR[0]));
|
||||||
|
volatile uint16_t *tre = (volatile uint16_t*)((uintptr_t) (&rusb->PIPE_TR[0].E));
|
||||||
|
|
||||||
for (int i = 1; i <= 5; ++i) {
|
for (int i = 1; i <= 5; ++i) {
|
||||||
RUSB2->PIPESEL = i;
|
rusb->PIPESEL = i;
|
||||||
RUSB2->PIPECFG = 0;
|
rusb->PIPECFG = 0;
|
||||||
*ctr = RUSB2_PIPE_CTR_ACLRM_Msk;
|
*ctr = RUSB2_PIPE_CTR_ACLRM_Msk;
|
||||||
*ctr = 0;
|
*ctr = 0;
|
||||||
++ctr;
|
++ctr;
|
||||||
*tre = TU_BIT(8);
|
*tre = TU_BIT(8);
|
||||||
tre += 2;
|
tre += 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int i = 6; i <= 9; ++i) {
|
for (int i = 6; i <= 9; ++i) {
|
||||||
RUSB2->PIPESEL = i;
|
rusb->PIPESEL = i;
|
||||||
RUSB2->PIPECFG = 0;
|
rusb->PIPECFG = 0;
|
||||||
*ctr = RUSB2_PIPE_CTR_ACLRM_Msk;
|
*ctr = RUSB2_PIPE_CTR_ACLRM_Msk;
|
||||||
*ctr = 0;
|
*ctr = 0;
|
||||||
++ctr;
|
++ctr;
|
||||||
}
|
}
|
||||||
tu_varclr(&_dcd);
|
tu_varclr(&_dcd);
|
||||||
|
|
||||||
#if (CFG_TUSB_RHPORT1_MODE & OPT_MODE_DEVICE)
|
TU_LOG3("Bus reset, RHST = %u\r\n", rusb->DVSTCTR0_b.RHST);
|
||||||
dcd_event_bus_reset(rhport, TUSB_SPEED_HIGH, true);
|
tusb_speed_t speed;
|
||||||
#else
|
switch(rusb->DVSTCTR0 & RUSB2_DVSTCTR0_RHST_Msk) {
|
||||||
dcd_event_bus_reset(rhport, TUSB_SPEED_FULL, true);
|
case RUSB2_DVSTCTR0_RHST_LS:
|
||||||
#endif
|
speed = TUSB_SPEED_LOW;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RUSB2_DVSTCTR0_RHST_FS:
|
||||||
|
speed = TUSB_SPEED_FULL;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case RUSB2_DVSTCTR0_RHST_HS:
|
||||||
|
speed = TUSB_SPEED_HIGH;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
TU_ASSERT(false, );
|
||||||
|
}
|
||||||
|
|
||||||
|
dcd_event_bus_reset(rhport, speed, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void process_set_address(uint8_t rhport)
|
static void process_set_address(uint8_t rhport)
|
||||||
@ -625,56 +652,63 @@ static void enable_interrupt(uint32_t pswi)
|
|||||||
|
|
||||||
void dcd_init(uint8_t rhport)
|
void dcd_init(uint8_t rhport)
|
||||||
{
|
{
|
||||||
(void)rhport;
|
rusb2_reg_t* rusb = RUSB2_REG(rhport);
|
||||||
|
|
||||||
#if (CFG_TUSB_RHPORT1_MODE & OPT_MODE_DEVICE)
|
rusb2_module_start(rhport, true);
|
||||||
RUSB2->SYSCFG_b.HSE = 1;
|
|
||||||
RUSB2->PHYSET_b.DIRPD = 0;
|
|
||||||
R_BSP_SoftwareDelay((uint32_t) 1, BSP_DELAY_UNITS_MILLISECONDS);
|
|
||||||
RUSB2->PHYSET_b.PLLRESET = 0;
|
|
||||||
//RUSB2->PHYSET_b.REPSTART = 1;
|
|
||||||
RUSB2->SYSCFG_b.DRPD = 0;
|
|
||||||
RUSB2->SYSCFG_b.USBE = 1;
|
|
||||||
RUSB2->LPSTS_b.SUSPENDM = 1;
|
|
||||||
while (!RUSB2->PLLSTA_b.PLLLOCK);
|
|
||||||
//RUSB2->BUSWAIT |= 0x0F00U;
|
|
||||||
//RUSB2->PHYSET_b.REPSEL = 1;
|
|
||||||
RUSB2->CFIFOSEL_b.MBW = 1;
|
|
||||||
RUSB2->D0FIFOSEL_b.MBW = 1;
|
|
||||||
RUSB2->D1FIFOSEL_b.MBW = 1;
|
|
||||||
RUSB2->INTSTS0 = 0;
|
|
||||||
#else
|
|
||||||
RUSB2->SYSCFG_b.SCKE = 1;
|
|
||||||
while (!RUSB2->SYSCFG_b.SCKE) ;
|
|
||||||
RUSB2->SYSCFG_b.DRPD = 0;
|
|
||||||
RUSB2->SYSCFG_b.DCFM = 0;
|
|
||||||
RUSB2->SYSCFG_b.USBE = 1;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// MCU specific PHY init
|
if ( is_highspeed(rhport) ) {
|
||||||
rusb2_phy_init();
|
rusb->SYSCFG_b.HSE = 1;
|
||||||
|
|
||||||
#if (CFG_TUSB_RHPORT0_MODE & OPT_MODE_DEVICE)
|
// leave CLKSEL as default (0x11) 24Mhz
|
||||||
RUSB2->PHYSLEW = 0x5;
|
|
||||||
RUSB2->DPUSR0R_FS_b.FIXPHY0 = 0u; /* USB_BASE Transceiver Output fixed */
|
|
||||||
|
|
||||||
#define USB_VDCEN (0x0080U) /* b7: Regulator ON/OFF control */
|
// Power and reset UTMI Phy
|
||||||
RUSB2->USBMC = (uint16_t) (RUSB2->USBMC | (USB_VDCEN));
|
uint16_t physet = (rusb->PHYSET | RUSB2_PHYSET_PLLRESET_Msk) & ~RUSB2_PHYSET_DIRPD_Msk;
|
||||||
#endif
|
rusb->PHYSET = physet;
|
||||||
|
R_BSP_SoftwareDelay((uint32_t) 1, BSP_DELAY_UNITS_MILLISECONDS);
|
||||||
|
rusb->PHYSET_b.PLLRESET = 0;
|
||||||
|
|
||||||
|
// set UTMI to operating mode and wait for PLL lock confirmation
|
||||||
|
rusb->LPSTS_b.SUSPENDM = 1;
|
||||||
|
while (!rusb->PLLSTA_b.PLLLOCK) {}
|
||||||
|
|
||||||
|
rusb->SYSCFG_b.DRPD = 0;
|
||||||
|
rusb->SYSCFG_b.USBE = 1;
|
||||||
|
|
||||||
|
// Set CPU bus wait time (fine tunne later)
|
||||||
|
// rusb2->BUSWAIT |= 0x0F00U;
|
||||||
|
|
||||||
|
rusb->PHYSET_b.REPSEL = 1;
|
||||||
|
|
||||||
|
rusb->CFIFOSEL_b.MBW = 1;
|
||||||
|
rusb->D0FIFOSEL_b.MBW = 1;
|
||||||
|
rusb->D1FIFOSEL_b.MBW = 1;
|
||||||
|
} else {
|
||||||
|
rusb->SYSCFG_b.SCKE = 1;
|
||||||
|
while (!rusb->SYSCFG_b.SCKE) {}
|
||||||
|
rusb->SYSCFG_b.DRPD = 0;
|
||||||
|
rusb->SYSCFG_b.DCFM = 0;
|
||||||
|
rusb->SYSCFG_b.USBE = 1;
|
||||||
|
|
||||||
|
// MCU specific PHY init
|
||||||
|
rusb2_phy_init();
|
||||||
|
|
||||||
|
rusb->PHYSLEW = 0x5;
|
||||||
|
rusb->DPUSR0R_FS_b.FIXPHY0 = 0u; /* USB_BASE Transceiver Output fixed */
|
||||||
|
|
||||||
|
// rusb2->USBMC = (uint16_t) (rusb2->USBMC | RUSB2_USBMC_VDCEN_Msk);
|
||||||
|
}
|
||||||
|
|
||||||
/* Setup default control pipe */
|
/* Setup default control pipe */
|
||||||
RUSB2->DCPMAXP_b.MXPS = 64;
|
rusb->DCPMAXP_b.MXPS = 64;
|
||||||
RUSB2->INTENB0 = RUSB2_INTSTS0_VBINT_Msk | RUSB2_INTSTS0_BRDY_Msk | RUSB2_INTSTS0_BEMP_Msk |
|
|
||||||
RUSB2_INTSTS0_DVST_Msk | RUSB2_INTSTS0_CTRT_Msk | (USE_SOF ? RUSB2_INTSTS0_SOFR_Msk : 0) |
|
|
||||||
RUSB2_INTSTS0_RESM_Msk | RUSB2_INTSTS0_NRDY_Msk;
|
|
||||||
RUSB2->BEMPENB = 1;
|
|
||||||
RUSB2->BRDYENB = 1;
|
|
||||||
|
|
||||||
#if (CFG_TUSB_RHPORT0_MODE & OPT_MODE_DEVICE)
|
rusb->INTSTS0 = 0;
|
||||||
RUSB2->SYSCFG_b.DPRPU = 1; /* necessary in this position */
|
rusb->INTENB0 = RUSB2_INTSTS0_VBINT_Msk | RUSB2_INTSTS0_BRDY_Msk | RUSB2_INTSTS0_BEMP_Msk |
|
||||||
#endif
|
RUSB2_INTSTS0_DVST_Msk | RUSB2_INTSTS0_CTRT_Msk | (USE_SOF ? RUSB2_INTSTS0_SOFR_Msk : 0) |
|
||||||
|
RUSB2_INTSTS0_RESM_Msk | RUSB2_INTSTS0_NRDY_Msk;
|
||||||
|
rusb->BEMPENB = 1;
|
||||||
|
rusb->BRDYENB = 1;
|
||||||
|
|
||||||
if (RUSB2->INTSTS0_b.VBSTS) {
|
if (rusb->INTSTS0_b.VBSTS) {
|
||||||
dcd_connect(rhport);
|
dcd_connect(rhport);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -697,24 +731,24 @@ void dcd_set_address(uint8_t rhport, uint8_t dev_addr)
|
|||||||
|
|
||||||
void dcd_remote_wakeup(uint8_t rhport)
|
void dcd_remote_wakeup(uint8_t rhport)
|
||||||
{
|
{
|
||||||
(void)rhport;
|
rusb2_reg_t* rusb = RUSB2_REG(rhport);
|
||||||
RUSB2->DVSTCTR0_b.WKUP = 1;
|
rusb->DVSTCTR0_b.WKUP = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dcd_connect(uint8_t rhport)
|
void dcd_connect(uint8_t rhport)
|
||||||
{
|
{
|
||||||
(void)rhport;
|
rusb2_reg_t* rusb = RUSB2_REG(rhport);
|
||||||
#if (CFG_TUSB_RHPORT1_MODE & OPT_MODE_DEVICE)
|
|
||||||
RUSB2->SYSCFG_b.CNEN = 1;
|
if ( is_highspeed(rhport)) {
|
||||||
R_BSP_SoftwareDelay((uint32_t) 10, BSP_DELAY_UNITS_MILLISECONDS);
|
rusb->SYSCFG_b.CNEN = 1;
|
||||||
#endif
|
}
|
||||||
RUSB2->SYSCFG_b.DPRPU = 1;
|
rusb->SYSCFG_b.DPRPU = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dcd_disconnect(uint8_t rhport)
|
void dcd_disconnect(uint8_t rhport)
|
||||||
{
|
{
|
||||||
(void)rhport;
|
rusb2_reg_t* rusb = RUSB2_REG(rhport);
|
||||||
RUSB2->SYSCFG_b.DPRPU = 0;
|
rusb->SYSCFG_b.DPRPU = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dcd_sof_enable(uint8_t rhport, bool en)
|
void dcd_sof_enable(uint8_t rhport, bool en)
|
||||||
@ -861,76 +895,94 @@ void dcd_edpt_clear_stall(uint8_t rhport, uint8_t ep_addr)
|
|||||||
//--------------------------------------------------------------------+
|
//--------------------------------------------------------------------+
|
||||||
void dcd_int_handler(uint8_t rhport)
|
void dcd_int_handler(uint8_t rhport)
|
||||||
{
|
{
|
||||||
(void)rhport;
|
rusb2_reg_t* rusb = RUSB2_REG(rhport);
|
||||||
|
|
||||||
|
uint16_t is0 = rusb->INTSTS0;
|
||||||
|
|
||||||
unsigned is0 = RUSB2->INTSTS0;
|
|
||||||
/* clear active bits except VALID (don't write 0 to already cleared bits according to the HW manual) */
|
/* clear active bits except VALID (don't write 0 to already cleared bits according to the HW manual) */
|
||||||
RUSB2->INTSTS0 = ~((RUSB2_INTSTS0_CTRT_Msk | RUSB2_INTSTS0_DVST_Msk | RUSB2_INTSTS0_SOFR_Msk |
|
rusb->INTSTS0 = ~((RUSB2_INTSTS0_CTRT_Msk | RUSB2_INTSTS0_DVST_Msk | RUSB2_INTSTS0_SOFR_Msk |
|
||||||
RUSB2_INTSTS0_RESM_Msk | RUSB2_INTSTS0_VBINT_Msk) & is0) | RUSB2_INTSTS0_VALID_Msk;
|
RUSB2_INTSTS0_RESM_Msk | RUSB2_INTSTS0_VBINT_Msk) & is0) | RUSB2_INTSTS0_VALID_Msk;
|
||||||
if (is0 & RUSB2_INTSTS0_VBINT_Msk) {
|
|
||||||
if (RUSB2->INTSTS0_b.VBSTS) {
|
// VBUS changes
|
||||||
|
if ( is0 & RUSB2_INTSTS0_VBINT_Msk ) {
|
||||||
|
if ( rusb->INTSTS0_b.VBSTS ) {
|
||||||
dcd_connect(rhport);
|
dcd_connect(rhport);
|
||||||
} else {
|
} else {
|
||||||
dcd_disconnect(rhport);
|
dcd_disconnect(rhport);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (is0 & RUSB2_INTSTS0_RESM_Msk) {
|
|
||||||
|
// Resumed
|
||||||
|
if ( is0 & RUSB2_INTSTS0_RESM_Msk ) {
|
||||||
dcd_event_bus_signal(rhport, DCD_EVENT_RESUME, true);
|
dcd_event_bus_signal(rhport, DCD_EVENT_RESUME, true);
|
||||||
#if (0==USE_SOF)
|
#if (0 == USE_SOF)
|
||||||
RUSB2->INTENB0_b.SOFE = 0;
|
rusb->INTENB0_b.SOFE = 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
if ((is0 & RUSB2_INTSTS0_SOFR_Msk) && RUSB2->INTENB0_b.SOFE) {
|
|
||||||
|
// SOF received
|
||||||
|
if ( (is0 & RUSB2_INTSTS0_SOFR_Msk) && rusb->INTENB0_b.SOFE ) {
|
||||||
// USBD will exit suspended mode when SOF event is received
|
// USBD will exit suspended mode when SOF event is received
|
||||||
dcd_event_bus_signal(rhport, DCD_EVENT_SOF, true);
|
dcd_event_bus_signal(rhport, DCD_EVENT_SOF, true);
|
||||||
#if (0 == USE_SOF)
|
#if (0 == USE_SOF)
|
||||||
RUSB2->INTENB0_b.SOFE = 0;
|
rusb->INTENB0_b.SOFE = 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
if (is0 & RUSB2_INTSTS0_DVST_Msk) {
|
|
||||||
|
// Device state changes
|
||||||
|
if ( is0 & RUSB2_INTSTS0_DVST_Msk ) {
|
||||||
switch (is0 & RUSB2_INTSTS0_DVSQ_Msk) {
|
switch (is0 & RUSB2_INTSTS0_DVSQ_Msk) {
|
||||||
case RUSB2_INTSTS0_DVSQ_STATE_DEF:
|
case RUSB2_INTSTS0_DVSQ_STATE_DEF:
|
||||||
process_bus_reset(rhport);
|
process_bus_reset(rhport);
|
||||||
break;
|
break;
|
||||||
case RUSB2_INTSTS0_DVSQ_STATE_ADDR:
|
|
||||||
process_set_address(rhport);
|
case RUSB2_INTSTS0_DVSQ_STATE_ADDR:
|
||||||
break;
|
process_set_address(rhport);
|
||||||
case RUSB2_INTSTS0_DVSQ_STATE_SUSP0:
|
break;
|
||||||
case RUSB2_INTSTS0_DVSQ_STATE_SUSP1:
|
|
||||||
case RUSB2_INTSTS0_DVSQ_STATE_SUSP2:
|
case RUSB2_INTSTS0_DVSQ_STATE_SUSP0:
|
||||||
case RUSB2_INTSTS0_DVSQ_STATE_SUSP3:
|
case RUSB2_INTSTS0_DVSQ_STATE_SUSP1:
|
||||||
dcd_event_bus_signal(rhport, DCD_EVENT_SUSPEND, true);
|
case RUSB2_INTSTS0_DVSQ_STATE_SUSP2:
|
||||||
#if (0==USE_SOF)
|
case RUSB2_INTSTS0_DVSQ_STATE_SUSP3:
|
||||||
RUSB2->INTENB0_b.SOFE = 1;
|
dcd_event_bus_signal(rhport, DCD_EVENT_SUSPEND, true);
|
||||||
|
#if (0 == USE_SOF)
|
||||||
|
rusb->INTENB0_b.SOFE = 1;
|
||||||
#endif
|
#endif
|
||||||
default:
|
|
||||||
break;
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (is0 & RUSB2_INTSTS0_NRDY_Msk) {
|
|
||||||
RUSB2->NRDYSTS = 0;
|
if ( is0 & RUSB2_INTSTS0_NRDY_Msk ) {
|
||||||
|
rusb->NRDYSTS = 0;
|
||||||
}
|
}
|
||||||
if (is0 & RUSB2_INTSTS0_CTRT_Msk) {
|
|
||||||
if (is0 & RUSB2_INTSTS0_CTSQ_CTRL_RDATA) {
|
// Control transfer stage changes
|
||||||
|
if ( is0 & RUSB2_INTSTS0_CTRT_Msk ) {
|
||||||
|
if ( is0 & RUSB2_INTSTS0_CTSQ_CTRL_RDATA ) {
|
||||||
/* A setup packet has been received. */
|
/* A setup packet has been received. */
|
||||||
process_setup_packet(rhport);
|
process_setup_packet(rhport);
|
||||||
} else if (0 == (is0 & RUSB2_INTSTS0_CTSQ_Msk)) {
|
} else if ( 0 == (is0 & RUSB2_INTSTS0_CTSQ_Msk) ) {
|
||||||
/* A ZLP has been sent/received. */
|
/* A ZLP has been sent/received. */
|
||||||
process_status_completion(rhport);
|
process_status_completion(rhport);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (is0 & RUSB2_INTSTS0_BEMP_Msk) {
|
|
||||||
const unsigned s = RUSB2->BEMPSTS;
|
// Buffer empty
|
||||||
RUSB2->BEMPSTS = 0;
|
if ( is0 & RUSB2_INTSTS0_BEMP_Msk ) {
|
||||||
if (s & 1) {
|
const unsigned s = rusb->BEMPSTS;
|
||||||
|
rusb->BEMPSTS = 0;
|
||||||
|
if ( s & 1 ) {
|
||||||
process_pipe0_bemp(rhport);
|
process_pipe0_bemp(rhport);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (is0 & RUSB2_INTSTS0_BRDY_Msk) {
|
|
||||||
const unsigned m = RUSB2->BRDYENB;
|
// Buffer ready
|
||||||
unsigned s = RUSB2->BRDYSTS & m;
|
if ( is0 & RUSB2_INTSTS0_BRDY_Msk ) {
|
||||||
|
const unsigned m = rusb->BRDYENB;
|
||||||
|
unsigned s = rusb->BRDYSTS & m;
|
||||||
/* clear active bits (don't write 0 to already cleared bits according to the HW manual) */
|
/* clear active bits (don't write 0 to already cleared bits according to the HW manual) */
|
||||||
RUSB2->BRDYSTS = ~s;
|
rusb->BRDYSTS = ~s;
|
||||||
while (s) {
|
while (s) {
|
||||||
#if defined(__CCRX__)
|
#if defined(__CCRX__)
|
||||||
static const int Mod37BitPosition[] = {
|
static const int Mod37BitPosition[] = {
|
||||||
|
@ -76,38 +76,34 @@ static rusb2_controller_t rusb2_controller[] = {
|
|||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
TU_ATTR_ALWAYS_INLINE static inline void rusb2_int_enable(uint8_t rhport)
|
#define RUSB2_REG(_p) ((rusb2_reg_t*) rusb2_controller[_p].reg_base)
|
||||||
{
|
|
||||||
#if RUSB2_CONTROLLER_COUNT > 1
|
TU_ATTR_ALWAYS_INLINE static inline void rusb2_module_start(uint8_t rhport, bool start) {
|
||||||
NVIC_EnableIRQ(rusb2_controller[rhport].irqnum);
|
uint32_t const mask = 1U << (11+rhport);
|
||||||
#else
|
if (start) {
|
||||||
(void) rhport;
|
R_MSTP->MSTPCRB &= ~mask;
|
||||||
NVIC_EnableIRQ(rusb2_controller[0].irqnum);
|
}else {
|
||||||
#endif
|
R_MSTP->MSTPCRB |= mask;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
TU_ATTR_ALWAYS_INLINE static inline void rusb2_int_disable(uint8_t rhport)
|
TU_ATTR_ALWAYS_INLINE static inline void rusb2_int_enable(uint8_t rhport) {
|
||||||
{
|
NVIC_EnableIRQ(rusb2_controller[rhport].irqnum);
|
||||||
#if RUSB2_CONTROLLER_COUNT > 1
|
}
|
||||||
|
|
||||||
|
TU_ATTR_ALWAYS_INLINE static inline void rusb2_int_disable(uint8_t rhport) {
|
||||||
NVIC_DisableIRQ(rusb2_controller[rhport].irqnum);
|
NVIC_DisableIRQ(rusb2_controller[rhport].irqnum);
|
||||||
#else
|
|
||||||
(void) rhport;
|
|
||||||
NVIC_DisableIRQ(rusb2_controller[0].irqnum);
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MCU specific PHY init
|
// MCU specific PHY init
|
||||||
TU_ATTR_ALWAYS_INLINE static inline void rusb2_phy_init(void)
|
TU_ATTR_ALWAYS_INLINE static inline void rusb2_phy_init(void) {
|
||||||
{
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------+
|
||||||
|
// Application API for setting IRQ number
|
||||||
|
//--------------------------------------------------------------------+
|
||||||
void tud_int_set_irqnum(uint8_t rhport, int32_t irqnum) {
|
void tud_int_set_irqnum(uint8_t rhport, int32_t irqnum) {
|
||||||
#if RUSB2_CONTROLLER_COUNT > 1
|
|
||||||
rusb2_controller[rhport].irqnum = irqnum;
|
rusb2_controller[rhport].irqnum = irqnum;
|
||||||
#else
|
|
||||||
(void) rhport;
|
|
||||||
rusb2_controller[0].irqnum = irqnum;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -37,6 +37,12 @@ extern "C" {
|
|||||||
|
|
||||||
#define RUSB2_REG_BASE (0x000A0000)
|
#define RUSB2_REG_BASE (0x000A0000)
|
||||||
|
|
||||||
|
// Start/Stop MSTP TODO implement later
|
||||||
|
TU_ATTR_ALWAYS_INLINE static inline void rusb2_module_start(uint8_t rhport, bool start) {
|
||||||
|
(void) rhport;
|
||||||
|
(void) start;
|
||||||
|
}
|
||||||
|
|
||||||
TU_ATTR_ALWAYS_INLINE static inline void rusb2_int_enable(uint8_t rhport)
|
TU_ATTR_ALWAYS_INLINE static inline void rusb2_int_enable(uint8_t rhport)
|
||||||
{
|
{
|
||||||
(void) rhport;
|
(void) rhport;
|
||||||
|
@ -1653,6 +1653,7 @@ TU_ATTR_BIT_FIELD_ORDER_END
|
|||||||
|
|
||||||
#define RUSB2_DVSTCTR0_RHST_LS (1U << RUSB2_DVSTCTR0_RHST_Pos) /* Low-speed connection */
|
#define RUSB2_DVSTCTR0_RHST_LS (1U << RUSB2_DVSTCTR0_RHST_Pos) /* Low-speed connection */
|
||||||
#define RUSB2_DVSTCTR0_RHST_FS (2U << RUSB2_DVSTCTR0_RHST_Pos) /* Full-speed connection */
|
#define RUSB2_DVSTCTR0_RHST_FS (2U << RUSB2_DVSTCTR0_RHST_Pos) /* Full-speed connection */
|
||||||
|
#define RUSB2_DVSTCTR0_RHST_HS (3U << RUSB2_DVSTCTR0_RHST_Pos) /* Full-speed connection */
|
||||||
|
|
||||||
#define RUSB2_DEVADD_USBSPD_LS (1U << RUSB2_DEVADD_USBSPD_Pos) /* Target Device Low-speed */
|
#define RUSB2_DEVADD_USBSPD_LS (1U << RUSB2_DEVADD_USBSPD_Pos) /* Target Device Low-speed */
|
||||||
#define RUSB2_DEVADD_USBSPD_FS (2U << RUSB2_DEVADD_USBSPD_Pos) /* Target Device Full-speed */
|
#define RUSB2_DEVADD_USBSPD_FS (2U << RUSB2_DEVADD_USBSPD_Pos) /* Target Device Full-speed */
|
||||||
|
Loading…
x
Reference in New Issue
Block a user