From 72b5b61597c91d146b332149dd4408b511c5441d Mon Sep 17 00:00:00 2001 From: hathach Date: Tue, 11 Jun 2013 16:01:30 +0700 Subject: [PATCH] able to xfer device descriptor on control endpoint of lpc176x --- tinyusb/device/dcd.h | 1 + tinyusb/device/dcd_lpc175x_6x.c | 43 +++++++++++++++++++++++++++------ tinyusb/device/usbd.c | 2 +- tinyusb/hal/hal_lpc13uxx.c | 3 +++ 4 files changed, 40 insertions(+), 9 deletions(-) diff --git a/tinyusb/device/dcd.h b/tinyusb/device/dcd.h index b6d2f6bd..939a5107 100644 --- a/tinyusb/device/dcd.h +++ b/tinyusb/device/dcd.h @@ -62,6 +62,7 @@ tusb_error_t dcd_controller_reset(uint8_t coreid) ATTR_WARN_UNUSED_RESULT; void dcd_controller_connect(uint8_t coreid); void dcd_isr(uint8_t coreid); +tusb_error_t dcd_pipe_control_write(uint8_t coreid, void const * buffer, uint16_t length); void dcd_pipe_control_write_zero_length(uint8_t coreid); tusb_error_t dcd_endpoint_configure(uint8_t coreid, tusb_descriptor_endpoint_t const * p_endpoint_desc) ATTR_WARN_UNUSED_RESULT; void dcd_device_set_address(uint8_t coreid, uint8_t dev_addr); diff --git a/tinyusb/device/dcd_lpc175x_6x.c b/tinyusb/device/dcd_lpc175x_6x.c index 19367a88..9d3ca62a 100644 --- a/tinyusb/device/dcd_lpc175x_6x.c +++ b/tinyusb/device/dcd_lpc175x_6x.c @@ -90,6 +90,7 @@ static inline uint32_t sie_command_read (uint8_t cmd_code, uint8_t data_len) ATT static inline uint32_t sie_command_read (uint8_t cmd_code, uint8_t data_len) { // TODO multiple read + sie_commamd_code(SIE_CMDPHASE_COMMAND, cmd_code); sie_commamd_code(SIE_CMDPHASE_READ, cmd_code); return LPC_USB->USBCmdData; } @@ -97,6 +98,7 @@ static inline uint32_t sie_command_read (uint8_t cmd_code, uint8_t data_len) //--------------------------------------------------------------------+ // IMPLEMENTATION //--------------------------------------------------------------------+ + void endpoint_control_isr(uint8_t coreid) { (void) coreid; // suppress compiler warning @@ -124,16 +126,16 @@ void endpoint_control_isr(uint8_t coreid) usbd_isr(0, TUSB_EVENT_SETUP_RECEIVED); }else { -// ASSERT(false, (void) 0); // not current supported + //ASSERT(false, (void) 0); // not current supported } - + sie_command_write(SIE_CMDCODE_ENDPOINT_SELECT+0, 0, 0); sie_command_write(SIE_CMDCODE_BUFFER_CLEAR, 0, 0); } // control IN if (endpoint_int_status & BIT_(1)) { - + (void) endpoint_int_status; } LPC_USB->USBEpIntClr = endpoint_int_status; // acknowledge interrupt @@ -141,13 +143,13 @@ void endpoint_control_isr(uint8_t coreid) void dcd_isr(uint8_t coreid) { - uint32_t device_int_status = LPC_USB->USBDevIntSt & LPC_USB->USBDevIntEn & DEV_INT_ALL_MASK; + uint32_t const device_int_status = LPC_USB->USBDevIntSt & LPC_USB->USBDevIntEn & DEV_INT_ALL_MASK; LPC_USB->USBDevIntClr = device_int_status;// Acknowledge handled interrupt //------------- usb bus event -------------// if (device_int_status & DEV_INT_DEVICE_STATUS_MASK) { - uint32_t dev_status_reg = sie_command_read(SIE_CMDCODE_DEVICE_STATUS, 1); + uint32_t const dev_status_reg = sie_command_read(SIE_CMDCODE_DEVICE_STATUS, 1); if (dev_status_reg & SIE_DEV_STATUS_RESET_MASK) { usbd_isr(coreid, TUSB_EVENT_BUS_RESET); @@ -173,7 +175,8 @@ void dcd_isr(uint8_t coreid) if (device_int_status & DEV_INT_ERROR_MASK) { - ASSERT(false, (void) 0); + uint32_t error_status = sie_command_read(SIE_CMDCODE_READ_ERROR_STATUS, 1); +// ASSERT(false, (void) 0); } } @@ -213,8 +216,8 @@ tusb_error_t dcd_init(void) LPC_USB->USBDMAIntEn = (DMA_INT_END_OF_XFER_MASK | DMA_INT_NEW_DD_REQUEST_MASK | DMA_INT_ERROR_MASK ); // clear all stall on control endpoint IN & OUT if any - sie_command_write(SIE_CMDCODE_ENDPOINT_SET_STATUS , 0, 0); - sie_command_write(SIE_CMDCODE_ENDPOINT_SET_STATUS + 1, 0, 0); + sie_command_write(SIE_CMDCODE_ENDPOINT_SET_STATUS , 1, 0); + sie_command_write(SIE_CMDCODE_ENDPOINT_SET_STATUS + 1, 1, 0); return TUSB_ERROR_NONE; } @@ -234,6 +237,30 @@ void dcd_device_set_address(uint8_t coreid, uint8_t dev_addr) sie_command_write(SIE_CMDCODE_SET_ADDRESS, 1, 0x80 | dev_addr); // 7th bit is : device_enable } +tusb_error_t dcd_pipe_control_write(uint8_t coreid, void const * buffer, uint16_t length) +{ + LPC_USB->USBCtrl = SLAVE_CONTROL_WRITE_ENABLE_MASK; // logical endpoint = 0 + LPC_USB->USBTxPLen = length; + + for (uint16_t count = 0; count < (length + 3) / 4; count++) + { + LPC_USB->USBTxData = *((uint32_t *)buffer); // NOTE: cortex M3 have no problem with alignment + buffer += 4; + } + + LPC_USB->USBCtrl = 0; + + sie_command_write(SIE_CMDCODE_ENDPOINT_SELECT+1, 0, 0); // select control IN endpoint + sie_command_write(SIE_CMDCODE_BUFFER_VALIDATE, 0, 0); + + return TUSB_ERROR_NONE; +} + +tusb_error_t dcd_pipe_control_read(uint8_t coreid) +{ + return TUSB_ERROR_NONE; +} + void dcd_pipe_control_write_zero_length(uint8_t coreid) { LPC_USB->USBCtrl = SLAVE_CONTROL_WRITE_ENABLE_MASK; // logical endpoint = 0 diff --git a/tinyusb/device/usbd.c b/tinyusb/device/usbd.c index 8004e2bf..01deb866 100644 --- a/tinyusb/device/usbd.c +++ b/tinyusb/device/usbd.c @@ -89,7 +89,7 @@ void std_get_descriptor(uint8_t coreid) switch ( desc_type ) { case TUSB_DESC_TYPE_DEVICE: - + dcd_pipe_control_write(coreid, &app_tusb_desc_device, sizeof(tusb_descriptor_device_t)); break; default: diff --git a/tinyusb/hal/hal_lpc13uxx.c b/tinyusb/hal/hal_lpc13uxx.c index 29128eec..d4e3fa98 100644 --- a/tinyusb/hal/hal_lpc13uxx.c +++ b/tinyusb/hal/hal_lpc13uxx.c @@ -49,8 +49,11 @@ tusb_error_t hal_init(void) /* Pull-down is needed, or internally, VBUS will be floating. This is to address the wrong status in VBUSDebouncing bit in CmdStatus register. */ + // set PIO0_3 as USB_VBUS LPC_IOCON->PIO0_3 &= ~0x1F; LPC_IOCON->PIO0_3 |= (0x01<<0); /* Secondary function VBUS */ + + // set PIO0_6 as usb connect LPC_IOCON->PIO0_6 &= ~0x07; LPC_IOCON->PIO0_6 |= (0x01<<0); /* Secondary function SoftConn */