Merge pull request #349 from hathach/nxp-dcd-disconnect

implement Nxp mcu dcd disconnect
This commit is contained in:
Ha Thach 2020-04-16 17:07:15 +07:00 committed by GitHub
commit 33888519dd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 59 additions and 10 deletions

2
.gitignore vendored
View File

@ -11,7 +11,7 @@ latex
*.elf *.elf
*.ind *.ind
.env .env
/examples/*/*/build-* /examples/*/*/build*
test_old/ test_old/
tests_obsolete/ tests_obsolete/
_build _build

View File

@ -50,3 +50,7 @@ JLINK_IF = swd
# flash by copying bin file to DAP Mass Storage # flash by copying bin file to DAP Mass Storage
flash: $(BUILD)/$(BOARD)-firmware.bin flash: $(BUILD)/$(BOARD)-firmware.bin
cp $< /media/$(USER)/RT1015-EVK/ cp $< /media/$(USER)/RT1015-EVK/
# flash using pyocd
#flash: $(BUILD)/$(BOARD)-firmware.hex
# pyocd flash -b MIMXRT1015-EVK $<

View File

@ -106,10 +106,10 @@ void dcd_set_config (uint8_t rhport, uint8_t config_num);
// Wake up host // Wake up host
void dcd_remote_wakeup(uint8_t rhport); void dcd_remote_wakeup(uint8_t rhport);
// Connect or disconnect D+/D- line pull-up resistor. // Connect by enabling internal pull-up resistor on D+/D-
// Defined in dcd source if MCU has internal pull-up.
// Otherwise, may be defined in BSP.
void dcd_connect(uint8_t rhport) TU_ATTR_WEAK; void dcd_connect(uint8_t rhport) TU_ATTR_WEAK;
// Disconnect by disabling internal pull-up resistor on D+/D-
void dcd_disconnect(uint8_t rhport) TU_ATTR_WEAK; void dcd_disconnect(uint8_t rhport) TU_ATTR_WEAK;
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+

View File

@ -181,9 +181,7 @@ void dcd_init(uint8_t rhport)
LPC_USB->UDCAH = (uint32_t) _dcd.udca; LPC_USB->UDCAH = (uint32_t) _dcd.udca;
LPC_USB->DMAIntEn = (DMA_INT_END_OF_XFER_MASK /*| DMA_INT_NEW_DD_REQUEST_MASK*/ | DMA_INT_ERROR_MASK); LPC_USB->DMAIntEn = (DMA_INT_END_OF_XFER_MASK /*| DMA_INT_NEW_DD_REQUEST_MASK*/ | DMA_INT_ERROR_MASK);
sie_write(SIE_CMDCODE_DEVICE_STATUS, 1, 1); // connect // Clear pending IRQ
// USB IRQ priority should be set by application previously
NVIC_ClearPendingIRQ(USB_IRQn); NVIC_ClearPendingIRQ(USB_IRQn);
} }
@ -219,6 +217,18 @@ void dcd_remote_wakeup(uint8_t rhport)
(void) rhport; (void) rhport;
} }
void dcd_connect(uint8_t rhport)
{
(void) rhport;
sie_write(SIE_CMDCODE_DEVICE_STATUS, 1, SIE_DEV_STATUS_CONNECT_STATUS_MASK);
}
void dcd_disconnect(uint8_t rhport)
{
(void) rhport;
sie_write(SIE_CMDCODE_DEVICE_STATUS, 1, 0);
}
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// CONTROL HELPER // CONTROL HELPER
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+

View File

@ -95,7 +95,7 @@ enum {
CMDSTAT_DEVICE_ADDR_MASK = TU_BIT(7 )-1, CMDSTAT_DEVICE_ADDR_MASK = TU_BIT(7 )-1,
CMDSTAT_DEVICE_ENABLE_MASK = TU_BIT(7 ), CMDSTAT_DEVICE_ENABLE_MASK = TU_BIT(7 ),
CMDSTAT_SETUP_RECEIVED_MASK = TU_BIT(8 ), CMDSTAT_SETUP_RECEIVED_MASK = TU_BIT(8 ),
CMDSTAT_DEVICE_CONNECT_MASK = TU_BIT(16), ///< reflect the softconnect only, does not reflect the actual attached state CMDSTAT_DEVICE_CONNECT_MASK = TU_BIT(16), ///< reflect the soft-connect only, does not reflect the actual attached state
CMDSTAT_DEVICE_SUSPEND_MASK = TU_BIT(17), CMDSTAT_DEVICE_SUSPEND_MASK = TU_BIT(17),
CMDSTAT_CONNECT_CHANGE_MASK = TU_BIT(24), CMDSTAT_CONNECT_CHANGE_MASK = TU_BIT(24),
CMDSTAT_SUSPEND_CHANGE_MASK = TU_BIT(25), CMDSTAT_SUSPEND_CHANGE_MASK = TU_BIT(25),
@ -209,6 +209,18 @@ void dcd_remote_wakeup(uint8_t rhport)
(void) rhport; (void) rhport;
} }
void dcd_connect(uint8_t rhport)
{
(void) rhport;
DCD_REGS->DEVCMDSTAT |= CMDSTAT_DEVICE_CONNECT_MASK;
}
void dcd_disconnect(uint8_t rhport)
{
(void) rhport;
DCD_REGS->DEVCMDSTAT &= ~CMDSTAT_DEVICE_CONNECT_MASK;
}
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// DCD Endpoint Port // DCD Endpoint Port
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+

View File

@ -322,7 +322,7 @@ void dcd_init(uint8_t rhport)
{ {
tu_memclr(&_dcd_data, sizeof(dcd_data_t)); tu_memclr(&_dcd_data, sizeof(dcd_data_t));
dcd_registers_t* const dcd_reg = _dcd_controller[rhport].regs; dcd_registers_t* dcd_reg = _dcd_controller[rhport].regs;
// Reset controller // Reset controller
dcd_reg->USBCMD |= USBCMD_RESET; dcd_reg->USBCMD |= USBCMD_RESET;
@ -342,7 +342,6 @@ void dcd_init(uint8_t rhport)
dcd_reg->USBINTR = INTR_USB | INTR_ERROR | INTR_PORT_CHANGE | INTR_RESET | INTR_SUSPEND /*| INTR_SOF*/; dcd_reg->USBINTR = INTR_USB | INTR_ERROR | INTR_PORT_CHANGE | INTR_RESET | INTR_SUSPEND /*| INTR_SOF*/;
dcd_reg->USBCMD &= ~0x00FF0000; // Interrupt Threshold Interval = 0 dcd_reg->USBCMD &= ~0x00FF0000; // Interrupt Threshold Interval = 0
dcd_reg->USBCMD |= TU_BIT(0); // connect
} }
void dcd_int_enable(uint8_t rhport) void dcd_int_enable(uint8_t rhport)
@ -376,6 +375,18 @@ void dcd_remote_wakeup(uint8_t rhport)
(void) rhport; (void) rhport;
} }
void dcd_connect(uint8_t rhport)
{
dcd_registers_t* dcd_reg = _dcd_controller[rhport].regs;
dcd_reg->USBCMD |= USBCMD_RUN_STOP;
}
void dcd_disconnect(uint8_t rhport)
{
dcd_registers_t* dcd_reg = _dcd_controller[rhport].regs;
dcd_reg->USBCMD &= ~USBCMD_RUN_STOP;
}
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// HELPER // HELPER
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+

View File

@ -91,6 +91,18 @@ void dcd_remote_wakeup (uint8_t rhport)
(void) rhport; (void) rhport;
} }
// Connect by enabling internal pull-up resistor on D+/D-
void dcd_connect(uint8_t rhport)
{
(void) rhport;
}
// Disconnect by disabling internal pull-up resistor on D+/D-
void dcd_disconnect(uint8_t rhport)
{
(void) rhport;
}
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// Endpoint API // Endpoint API
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+