diff options
| author | hathach <[email protected]> | 2018-03-23 14:57:17 +0700 |
|---|---|---|
| committer | hathach <[email protected]> | 2018-03-23 14:57:17 +0700 |
| commit | 9dd20e3ede9acae1b20135abdb187bd444d04570 (patch) | |
| tree | 198a1b0f9f32e9344d691d5a7c8841132e190429 /tinyusb/device | |
| parent | 63aa3ab2c97c271c8d39e625763eb6faa68d500a (diff) | |
fix compatible issue with MacOS, response to GET CONFIGURATION request
Diffstat (limited to 'tinyusb/device')
| -rw-r--r-- | tinyusb/device/usbd.c | 40 | ||||
| -rw-r--r-- | tinyusb/device/usbd.h | 21 |
2 files changed, 35 insertions, 26 deletions
diff --git a/tinyusb/device/usbd.c b/tinyusb/device/usbd.c index 14ec47e6a..939ab255d 100644 --- a/tinyusb/device/usbd.c +++ b/tinyusb/device/usbd.c @@ -49,6 +49,29 @@ #include "usbd.h"
#include "device/usbd_pvt.h"
+
+typedef struct {
+ void (* init) (void);
+ tusb_error_t (* open)(uint8_t rhport, tusb_desc_interface_t const * desc_intf, uint16_t* p_length);
+ tusb_error_t (* control_request_st) (uint8_t rhport, tusb_control_request_t const *);
+ tusb_error_t (* xfer_cb) (uint8_t rhport, uint8_t ep_addr, tusb_event_t, uint32_t);
+// void (* routine)(void);
+ void (* sof)(uint8_t rhport);
+ void (* close) (uint8_t);
+} usbd_class_driver_t;
+
+
+enum {
+ USBD_INTERFACE_NUM_MAX = 16 // USB specs specify up to 16 endpoints per device
+};
+
+typedef struct {
+ volatile uint8_t state;
+ uint8_t config_num;
+
+ uint8_t interface2class[USBD_INTERFACE_NUM_MAX]; // determine interface number belongs to which class
+}usbd_device_info_t;
+
//--------------------------------------------------------------------+
// MACRO CONSTANT TYPEDEF
//--------------------------------------------------------------------+
@@ -334,6 +357,11 @@ static tusb_error_t proc_control_request_st(uint8_t rhport, tusb_control_request usbd_control_stall(rhport); // stall unsupported descriptor
}
}
+ else if (TUSB_REQ_GET_CONFIGURATION == p_request->bRequest )
+ {
+ memcpy(usbd_enum_buffer, &usbd_devices[rhport].config_num, 1);
+ STASK_INVOKE( usbd_control_xfer_st(rhport, p_request->bmRequestType_bit.direction, (uint8_t*) usbd_enum_buffer, 1), error );
+ }
else if ( TUSB_REQ_SET_ADDRESS == p_request->bRequest )
{
tusb_dcd_set_address(rhport, (uint8_t) p_request->wValue);
@@ -400,7 +428,9 @@ static tusb_error_t proc_control_request_st(uint8_t rhport, tusb_control_request static tusb_error_t proc_set_config_req(uint8_t rhport, uint8_t config_number)
{
tusb_dcd_set_config(rhport, config_number);
+
usbd_devices[rhport].state = TUSB_DEVICE_STATE_CONFIGURED;
+ usbd_devices[rhport].config_num = config_number;
//------------- parse configuration & open drivers -------------//
uint8_t const * p_desc_config = tusbd_descriptor_pointers.p_configuration;
@@ -482,7 +512,7 @@ static uint16_t get_descriptor(uint8_t rhport, tusb_control_request_t const * co // up to Host's length
len = min16_of(p_request->wLength, len );
- ASSERT( len <= TUSB_CFG_DEVICE_ENUM_BUFFER_SIZE, TUSB_ERROR_NOT_ENOUGH_MEMORY);
+ TU_ASSERT( len <= TUSB_CFG_DEVICE_ENUM_BUFFER_SIZE, 0);
memcpy(usbd_enum_buffer, desc_data, len);
(*pp_buffer) = usbd_enum_buffer;
@@ -508,9 +538,6 @@ void tusb_dcd_bus_event(uint8_t rhport, usbd_bus_event_type_t bus_event) {
if ( usbd_class_drivers[class_code].close ) usbd_class_drivers[class_code].close( rhport );
}
-
- // invoke callback
- tud_umount_cb(rhport);
break;
case USBD_BUS_EVENT_SOF:
@@ -524,7 +551,10 @@ void tusb_dcd_bus_event(uint8_t rhport, usbd_bus_event_type_t bus_event) }
break;
- case USBD_BUS_EVENT_UNPLUGGED : break;
+ case USBD_BUS_EVENT_UNPLUGGED:
+ // invoke callback
+ tud_umount_cb(rhport);
+ break;
case USBD_BUS_EVENT_SUSPENDED:
usbd_devices[rhport].state = TUSB_DEVICE_STATE_SUSPENDED;
diff --git a/tinyusb/device/usbd.h b/tinyusb/device/usbd.h index 66ffb9b2a..545b636d8 100644 --- a/tinyusb/device/usbd.h +++ b/tinyusb/device/usbd.h @@ -70,27 +70,6 @@ typedef struct { // define by application
extern tusbd_descriptor_pointer_t tusbd_descriptor_pointers;
-typedef struct {
- void (* init) (void);
- tusb_error_t (* open)(uint8_t rhport, tusb_desc_interface_t const * desc_intf, uint16_t* p_length);
- tusb_error_t (* control_request_st) (uint8_t rhport, tusb_control_request_t const *);
- tusb_error_t (* xfer_cb) (uint8_t rhport, uint8_t ep_addr, tusb_event_t, uint32_t);
-// void (* routine)(void);
- void (* sof)(uint8_t rhport);
- void (* close) (uint8_t);
-} usbd_class_driver_t;
-
-
-enum {
- USBD_INTERFACE_NUM_MAX = 16 // USB specs specify up to 16 endpoints per device
-};
-
-
-typedef struct {
- volatile uint8_t state;
- uint8_t interface2class[USBD_INTERFACE_NUM_MAX]; // determine interface number belongs to which class
-}usbd_device_info_t;
-
//--------------------------------------------------------------------+
// APPLICATION API
//--------------------------------------------------------------------+
|
