summaryrefslogtreecommitdiff
path: root/tinyusb/device
diff options
context:
space:
mode:
Diffstat (limited to 'tinyusb/device')
-rw-r--r--tinyusb/device/dcd_lpc175x_6x.c56
-rw-r--r--tinyusb/device/dcd_lpc175x_6x.h38
-rw-r--r--tinyusb/device/usbd.c42
-rw-r--r--tinyusb/device/usbd.h2
-rw-r--r--tinyusb/device/usbd_dcd.h17
5 files changed, 90 insertions, 65 deletions
diff --git a/tinyusb/device/dcd_lpc175x_6x.c b/tinyusb/device/dcd_lpc175x_6x.c
index ad04cea18..cebe31ea3 100644
--- a/tinyusb/device/dcd_lpc175x_6x.c
+++ b/tinyusb/device/dcd_lpc175x_6x.c
@@ -74,42 +74,6 @@ static void bus_reset(void);
static tusb_error_t pipe_control_read(void * buffer, uint16_t length);
//--------------------------------------------------------------------+
-// SIE Command
-//--------------------------------------------------------------------+
-static inline void sie_cmd_code (sie_cmdphase_t phase, uint8_t code_data) ATTR_ALWAYS_INLINE;
-static inline void sie_cmd_code (sie_cmdphase_t phase, uint8_t code_data)
-{
- LPC_USB->USBDevIntClr = (DEV_INT_COMMAND_CODE_EMPTY_MASK | DEV_INT_COMMAND_DATA_FULL_MASK);
- LPC_USB->USBCmdCode = (phase << 8) | (code_data << 16);
-
- uint32_t const wait_flag = (phase == SIE_CMDPHASE_READ) ? DEV_INT_COMMAND_DATA_FULL_MASK : DEV_INT_COMMAND_CODE_EMPTY_MASK;
-#ifndef _TEST_
- while ((LPC_USB->USBDevIntSt & wait_flag) == 0); // TODO blocking forever potential
-#endif
- LPC_USB->USBDevIntClr = wait_flag;
-}
-
-static inline void sie_write (uint8_t cmd_code, uint8_t data_len, uint8_t data) ATTR_ALWAYS_INLINE;
-static inline void sie_write (uint8_t cmd_code, uint8_t data_len, uint8_t data)
-{
- sie_cmd_code(SIE_CMDPHASE_COMMAND, cmd_code);
-
- if (data_len)
- {
- sie_cmd_code(SIE_CMDPHASE_WRITE, data);
- }
-}
-
-static inline uint32_t sie_read (uint8_t cmd_code, uint8_t data_len) ATTR_ALWAYS_INLINE;
-static inline uint32_t sie_read (uint8_t cmd_code, uint8_t data_len)
-{
- // TODO multiple read
- sie_cmd_code(SIE_CMDPHASE_COMMAND , cmd_code);
- sie_cmd_code(SIE_CMDPHASE_READ , cmd_code);
- return LPC_USB->USBCmdData;
-}
-
-//--------------------------------------------------------------------+
// PIPE HELPER
//--------------------------------------------------------------------+
static inline uint8_t edpt_addr2phy(uint8_t endpoint_addr) ATTR_CONST ATTR_ALWAYS_INLINE;
@@ -239,22 +203,29 @@ void endpoint_control_isr(void)
void dcd_isr(uint8_t coreid)
{
+ (void) coreid;
uint32_t const device_int_status = LPC_USB->USBDevIntSt & LPC_USB->USBDevIntEn;
LPC_USB->USBDevIntClr = device_int_status;// Acknowledge handled interrupt
//------------- usb bus event -------------//
if (device_int_status & DEV_INT_DEVICE_STATUS_MASK)
{
- uint32_t const dev_status_reg = sie_read(SIE_CMDCODE_DEVICE_STATUS, 1);
+ uint8_t const dev_status_reg = sie_read(SIE_CMDCODE_DEVICE_STATUS, 1);
if (dev_status_reg & SIE_DEV_STATUS_RESET_MASK)
{
bus_reset();
- usbd_bus_reset(coreid);
+ usbd_dcd_bus_event_isr(0, USBD_BUS_EVENT_RESET);
+ }
+
+ if ( (dev_status_reg & SIE_DEV_STATUS_CONNECT_CHANGE_MASK) && !(dev_status_reg & SIE_DEV_STATUS_CONNECT_STATUS_MASK))
+ { // device is disconnected, require using VBUS (P1_30)
+ usbd_dcd_bus_event_isr(0, USBD_BUS_EVENT_UNPLUGGED);
}
- // TODO invoke some callbacks
- if (dev_status_reg & SIE_DEV_STATUS_CONNECT_CHANGE_MASK) { }
- if (dev_status_reg & SIE_DEV_STATUS_SUSPEND_CHANGE_MASK) { }
+ if ( (dev_status_reg & SIE_DEV_STATUS_SUSPEND_CHANGE_MASK) && (dev_status_reg & SIE_DEV_STATUS_SUSPEND_MASK) )
+ {
+ usbd_dcd_bus_event_isr(0, USBD_BUS_EVENT_SUSPENDED);
+ }
}
//------------- Control Endpoint (Slave Mode) -------------//
@@ -323,16 +294,19 @@ void dcd_isr(uint8_t coreid)
//--------------------------------------------------------------------+
void dcd_controller_connect(uint8_t coreid)
{
+ (void) coreid;
sie_write(SIE_CMDCODE_DEVICE_STATUS, 1, 1);
}
void dcd_controller_set_address(uint8_t coreid, uint8_t dev_addr)
{
+ (void) coreid;
sie_write(SIE_CMDCODE_SET_ADDRESS, 1, 0x80 | dev_addr); // 7th bit is : device_enable
}
void dcd_controller_set_configuration(uint8_t coreid)
{
+ (void) coreid;
sie_write(SIE_CMDCODE_CONFIGURE_DEVICE, 1, 1);
}
diff --git a/tinyusb/device/dcd_lpc175x_6x.h b/tinyusb/device/dcd_lpc175x_6x.h
index aed21edeb..f66438702 100644
--- a/tinyusb/device/dcd_lpc175x_6x.h
+++ b/tinyusb/device/dcd_lpc175x_6x.h
@@ -161,7 +161,7 @@ enum {
//------------- SIE Device Status (get/set from SIE_CMDCODE_DEVICE_STATUS) -------------//
enum {
- SIE_DEV_STATUS_CONNECT_MASK = BIT_(0),
+ SIE_DEV_STATUS_CONNECT_STATUS_MASK = BIT_(0),
SIE_DEV_STATUS_CONNECT_CHANGE_MASK = BIT_(1),
SIE_DEV_STATUS_SUSPEND_MASK = BIT_(2),
SIE_DEV_STATUS_SUSPEND_CHANGE_MASK = BIT_(3),
@@ -196,6 +196,42 @@ enum {
DD_STATUS_SYSTEM_ERROR
};
+//--------------------------------------------------------------------+
+// SIE Command
+//--------------------------------------------------------------------+
+static inline void sie_cmd_code (sie_cmdphase_t phase, uint8_t code_data) ATTR_ALWAYS_INLINE;
+static inline void sie_cmd_code (sie_cmdphase_t phase, uint8_t code_data)
+{
+ LPC_USB->USBDevIntClr = (DEV_INT_COMMAND_CODE_EMPTY_MASK | DEV_INT_COMMAND_DATA_FULL_MASK);
+ LPC_USB->USBCmdCode = (phase << 8) | (code_data << 16);
+
+ uint32_t const wait_flag = (phase == SIE_CMDPHASE_READ) ? DEV_INT_COMMAND_DATA_FULL_MASK : DEV_INT_COMMAND_CODE_EMPTY_MASK;
+#ifndef _TEST_
+ while ((LPC_USB->USBDevIntSt & wait_flag) == 0); // TODO blocking forever potential
+#endif
+ LPC_USB->USBDevIntClr = wait_flag;
+}
+
+static inline void sie_write (uint8_t cmd_code, uint8_t data_len, uint8_t data) ATTR_ALWAYS_INLINE;
+static inline void sie_write (uint8_t cmd_code, uint8_t data_len, uint8_t data)
+{
+ sie_cmd_code(SIE_CMDPHASE_COMMAND, cmd_code);
+
+ if (data_len)
+ {
+ sie_cmd_code(SIE_CMDPHASE_WRITE, data);
+ }
+}
+
+static inline uint32_t sie_read (uint8_t cmd_code, uint8_t data_len) ATTR_ALWAYS_INLINE;
+static inline uint32_t sie_read (uint8_t cmd_code, uint8_t data_len)
+{
+ // TODO multiple read
+ sie_cmd_code(SIE_CMDPHASE_COMMAND , cmd_code);
+ sie_cmd_code(SIE_CMDPHASE_READ , cmd_code);
+ return LPC_USB->USBCmdData;
+}
+
#ifdef __cplusplus
}
#endif
diff --git a/tinyusb/device/usbd.c b/tinyusb/device/usbd.c
index 328b881ea..aefdb78e1 100644
--- a/tinyusb/device/usbd.c
+++ b/tinyusb/device/usbd.c
@@ -71,7 +71,7 @@ static usbd_class_driver_t const usbd_class_drivers[TUSB_CLASS_MAPPED_INDEX_STAR
.open = hidd_open,
.control_request = hidd_control_request,
.isr = hidd_isr,
- .bus_reset = hidd_bus_reset
+ .close = hidd_close
},
#endif
@@ -82,7 +82,7 @@ static usbd_class_driver_t const usbd_class_drivers[TUSB_CLASS_MAPPED_INDEX_STAR
.open = mscd_open,
.control_request = mscd_control_request,
.isr = mscd_isr,
- .bus_reset = mscd_bus_reset
+ .close = mscd_close
},
#endif
@@ -93,7 +93,7 @@ static usbd_class_driver_t const usbd_class_drivers[TUSB_CLASS_MAPPED_INDEX_STAR
.open = cdcd_open,
.control_request = cdcd_control_request,
.isr = cdcd_isr,
- .bus_reset = cdcd_bus_reset
+ .close = cdcd_close
},
#endif
@@ -251,19 +251,6 @@ OSAL_TASK_FUNCTION(usbd_task) (void* p_task_para)
OSAL_TASK_LOOP_END
}
-void usbd_bus_reset(uint32_t coreid)
-{
- memclr_(&usbd_devices[coreid], sizeof(usbd_device_info_t));
-
- for (tusb_std_class_code_t class_code = TUSB_CLASS_AUDIO; class_code <= TUSB_CLASS_AUDIO_VIDEO; class_code++)
- {
- if ( usbd_class_drivers[class_code].bus_reset )
- {
- usbd_class_drivers[class_code].bus_reset( coreid );
- }
- }
-}
-
tusb_error_t usbd_init (void)
{
ASSERT_STATUS ( dcd_init() );
@@ -368,8 +355,29 @@ tusb_error_t get_descriptor_subtask(uint8_t coreid, tusb_control_request_t * p_r
//--------------------------------------------------------------------+
//--------------------------------------------------------------------+
-// DCD Callback API
+// USBD-DCD Callback API
//--------------------------------------------------------------------+
+void usbd_dcd_bus_event_isr(uint8_t coreid, usbd_bus_event_type_t bus_event)
+{
+ switch(bus_event)
+ {
+ case USBD_BUS_EVENT_RESET :
+ case USBD_BUS_EVENT_UNPLUGGED :
+ memclr_(&usbd_devices[coreid], sizeof(usbd_device_info_t));
+ for (tusb_std_class_code_t class_code = TUSB_CLASS_AUDIO; class_code <= TUSB_CLASS_AUDIO_VIDEO; class_code++)
+ {
+ if ( usbd_class_drivers[class_code].close ) usbd_class_drivers[class_code].close( coreid );
+ }
+ break;
+
+ case USBD_BUS_EVENT_SUSPENDED:
+ usbd_devices[coreid].state = TUSB_DEVICE_STATE_SUSPENDED;
+ break;
+
+ default: break;
+ }
+}
+
void usbd_setup_received_isr(uint8_t coreid, tusb_control_request_t * p_request)
{
usbd_devices[coreid].control_request = (*p_request);
diff --git a/tinyusb/device/usbd.h b/tinyusb/device/usbd.h
index e8e10e98b..d9b74c788 100644
--- a/tinyusb/device/usbd.h
+++ b/tinyusb/device/usbd.h
@@ -72,7 +72,7 @@ typedef struct {
tusb_error_t (* const open)(uint8_t, tusb_descriptor_interface_t const *, uint16_t*);
tusb_error_t (* const control_request) (uint8_t, tusb_control_request_t const *);
void (* const isr) (endpoint_handle_t, tusb_event_t, uint32_t);
- void (* const bus_reset) (uint8_t);
+ void (* const close) (uint8_t);
} usbd_class_driver_t;
//--------------------------------------------------------------------+
diff --git a/tinyusb/device/usbd_dcd.h b/tinyusb/device/usbd_dcd.h
index e72cdf060..8fbcc317c 100644
--- a/tinyusb/device/usbd_dcd.h
+++ b/tinyusb/device/usbd_dcd.h
@@ -55,24 +55,31 @@
extern "C" {
#endif
-#define USBD_MAX_INTERFACE 16 // TODO refractor later
-#define USBD_MAX_ENDPOINT 32 // TODO refractor later
+enum {
+ USBD_INTERFACE_NUM_MAX = 16 // USB specs specify up to 16 endpoints per device
+};
+typedef enum {
+ USBD_BUS_EVENT_RESET = 1,
+ USBD_BUS_EVENT_UNPLUGGED,
+ USBD_BUS_EVENT_SUSPENDED
+}usbd_bus_event_type_t;
typedef struct {
volatile uint8_t state;
uint8_t is_waiting_control_xfer; // set if task is waiting for control xfer to complete to proceed
tusb_control_request_t control_request;
- uint8_t interface2class[USBD_MAX_INTERFACE]; // determine interface number belongs to which class
+ uint8_t interface2class[USBD_INTERFACE_NUM_MAX]; // determine interface number belongs to which class
}usbd_device_info_t;
extern usbd_device_info_t usbd_devices[CONTROLLER_DEVICE_NUMBER];
//--------------------------------------------------------------------+
// callback from DCD ISR
//--------------------------------------------------------------------+
-void usbd_xfer_isr(endpoint_handle_t edpt_hdl, tusb_event_t event, uint32_t xferred_bytes);
-void usbd_bus_reset(uint32_t coreid);
+void usbd_dcd_bus_event_isr(uint8_t coreid, usbd_bus_event_type_t bus_event);
void usbd_setup_received_isr(uint8_t coreid, tusb_control_request_t * p_request);
+void usbd_xfer_isr(endpoint_handle_t edpt_hdl, tusb_event_t event, uint32_t xferred_bytes);
+
#ifdef __cplusplus
}