add tuh_descriptor_get() and tuh_descriptor_device_get()

This commit is contained in:
hathach 2022-03-04 19:26:54 +07:00
parent 3a7d1cfead
commit e08a875d52
4 changed files with 58 additions and 47 deletions

View File

@ -38,6 +38,7 @@
#define TU_MIN(_x, _y) ( ( (_x) < (_y) ) ? (_x) : (_y) ) #define TU_MIN(_x, _y) ( ( (_x) < (_y) ) ? (_x) : (_y) )
#define TU_MAX(_x, _y) ( ( (_x) > (_y) ) ? (_x) : (_y) ) #define TU_MAX(_x, _y) ( ( (_x) > (_y) ) ? (_x) : (_y) )
#define TU_U16(_high, _low) ((uint16_t) (((_high) << 8) | (_low)))
#define TU_U16_HIGH(_u16) ((uint8_t) (((_u16) >> 8) & 0x00ff)) #define TU_U16_HIGH(_u16) ((uint8_t) (((_u16) >> 8) & 0x00ff))
#define TU_U16_LOW(_u16) ((uint8_t) ((_u16) & 0x00ff)) #define TU_U16_LOW(_u16) ((uint8_t) ((_u16) & 0x00ff))
#define U16_TO_U8S_BE(_u16) TU_U16_HIGH(_u16), TU_U16_LOW(_u16) #define U16_TO_U8S_BE(_u16) TU_U16_HIGH(_u16), TU_U16_LOW(_u16)

View File

@ -407,6 +407,7 @@ bool tud_init (uint8_t rhport)
if ( tud_inited() ) return true; if ( tud_inited() ) return true;
TU_LOG2("USBD init\r\n"); TU_LOG2("USBD init\r\n");
TU_LOG2_INT(sizeof(usbd_device_t));
tu_varclr(&_usbd_dev); tu_varclr(&_usbd_dev);

View File

@ -96,7 +96,7 @@ typedef struct {
//------------- device -------------// //------------- device -------------//
volatile uint8_t state; // device state, value from enum tusbh_device_state_t volatile uint8_t state; // device state, value from enum tusbh_device_state_t
uint8_t itf2drv[16]; // map interface number to driver (0xff is invalid) uint8_t itf2drv[8]; // map interface number to driver (0xff is invalid)
uint8_t ep2drv[CFG_TUH_ENDPOINT_MAX][2]; // map endpoint to driver ( 0xff is invalid ) uint8_t ep2drv[CFG_TUH_ENDPOINT_MAX][2]; // map endpoint to driver ( 0xff is invalid )
struct TU_ATTR_PACKED struct TU_ATTR_PACKED
@ -253,6 +253,34 @@ bool tuh_vid_pid_get(uint8_t dev_addr, uint16_t* vid, uint16_t* pid)
return true; return true;
} }
bool tuh_descriptor_get(uint8_t daddr, uint8_t type, uint8_t index,
void* buffer, uint16_t len, tuh_control_complete_cb_t complete_cb)
{
tusb_control_request_t const request =
{
.bmRequestType_bit =
{
.recipient = TUSB_REQ_RCPT_DEVICE,
.type = TUSB_REQ_TYPE_STANDARD,
.direction = TUSB_DIR_IN
},
.bRequest = TUSB_REQ_GET_DESCRIPTOR,
.wValue = tu_htole16( TU_U16(type, index) ),
.wIndex = 0,
.wLength = len
};
TU_ASSERT( tuh_control_xfer(daddr, &request, buffer, complete_cb) );
return true;
}
bool tuh_descriptor_device_get(uint8_t daddr, void* buffer, uint16_t len, tuh_control_complete_cb_t complete_cb)
{
return tuh_descriptor_get(daddr, TUSB_DESC_DEVICE, 0, buffer, len, complete_cb);
}
uint8_t tuh_i_manufacturer_get(uint8_t dev_addr) { uint8_t tuh_i_manufacturer_get(uint8_t dev_addr) {
TU_VERIFY(tuh_mounted(dev_addr)); TU_VERIFY(tuh_mounted(dev_addr));
usbh_device_t const* dev = get_device(dev_addr); usbh_device_t const* dev = get_device(dev_addr);
@ -338,7 +366,6 @@ bool tuh_init(uint8_t rhport)
if (_usbh_initialized) return _usbh_initialized; if (_usbh_initialized) return _usbh_initialized;
TU_LOG2("USBH init\r\n"); TU_LOG2("USBH init\r\n");
TU_LOG2_INT(sizeof(usbh_device_t)); TU_LOG2_INT(sizeof(usbh_device_t));
tu_memclr(_usbh_devices, sizeof(_usbh_devices)); tu_memclr(_usbh_devices, sizeof(_usbh_devices));
@ -785,23 +812,10 @@ static bool enum_request_addr0_device_desc(void)
uint8_t const addr0 = 0; uint8_t const addr0 = 0;
TU_ASSERT( usbh_edpt_control_open(addr0, 8) ); TU_ASSERT( usbh_edpt_control_open(addr0, 8) );
//------------- Get first 8 bytes of device descriptor to get Control Endpoint Size -------------// // Get first 8 bytes of device descriptor for Control Endpoint size
TU_LOG2("Get 8 byte of Device Descriptor\r\n"); TU_LOG2("Get 8 byte of Device Descriptor\r\n");
tusb_control_request_t const request =
{
.bmRequestType_bit =
{
.recipient = TUSB_REQ_RCPT_DEVICE,
.type = TUSB_REQ_TYPE_STANDARD,
.direction = TUSB_DIR_IN
},
.bRequest = TUSB_REQ_GET_DESCRIPTOR,
.wValue = TUSB_DESC_DEVICE << 8,
.wIndex = 0,
.wLength = 8
};
TU_ASSERT( tuh_control_xfer(addr0, &request, _usbh_ctrl_buf, enum_get_addr0_device_desc_complete) );
TU_ASSERT(tuh_descriptor_device_get(addr0, _usbh_ctrl_buf, 8, enum_get_addr0_device_desc_complete));
return true; return true;
} }
@ -909,22 +923,8 @@ static bool enum_set_address_complete(uint8_t dev_addr, tusb_control_request_t c
// Get full device descriptor // Get full device descriptor
TU_LOG2("Get Device Descriptor\r\n"); TU_LOG2("Get Device Descriptor\r\n");
tusb_control_request_t const new_request =
{
.bmRequestType_bit =
{
.recipient = TUSB_REQ_RCPT_DEVICE,
.type = TUSB_REQ_TYPE_STANDARD,
.direction = TUSB_DIR_IN
},
.bRequest = TUSB_REQ_GET_DESCRIPTOR,
.wValue = TUSB_DESC_DEVICE << 8,
.wIndex = 0,
.wLength = sizeof(tusb_desc_device_t)
};
TU_ASSERT(tuh_control_xfer(new_addr, &new_request, _usbh_ctrl_buf, enum_get_device_desc_complete));
TU_ASSERT(tuh_descriptor_device_get(new_addr, _usbh_ctrl_buf, sizeof(tusb_desc_device_t), enum_get_device_desc_complete));
return true; return true;
} }

View File

@ -39,7 +39,7 @@
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
typedef bool (*tuh_complete_cb_t)(xfer_result_t result); typedef bool (*tuh_complete_cb_t)(xfer_result_t result);
typedef bool (*tuh_control_complete_cb_t)(uint8_t dev_addr, tusb_control_request_t const * request, xfer_result_t result); typedef bool (*tuh_control_complete_cb_t)(uint8_t daddr, tusb_control_request_t const * request, xfer_result_t result);
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// APPLICATION API // APPLICATION API
@ -58,40 +58,49 @@ void tuh_task(void);
extern void hcd_int_handler(uint8_t rhport); extern void hcd_int_handler(uint8_t rhport);
#define tuh_int_handler hcd_int_handler #define tuh_int_handler hcd_int_handler
bool tuh_vid_pid_get(uint8_t dev_addr, uint16_t* vid, uint16_t* pid); //------------- descriptors -------------//
// Get an descriptor
bool tuh_descriptor_get(uint8_t daddr, uint8_t type, uint8_t index,
void* buffer, uint16_t len, tuh_control_complete_cb_t complete_cb);
// Get device descriptor
bool tuh_descriptor_device_get(uint8_t daddr, void* buffer, uint16_t len, tuh_control_complete_cb_t complete_cb);
bool tuh_vid_pid_get(uint8_t daddr, uint16_t* vid, uint16_t* pid);
// Gets the string indices for common device descriptor data. // Gets the string indices for common device descriptor data.
uint8_t tuh_i_manufacturer_get(uint8_t dev_addr); uint8_t tuh_i_manufacturer_get(uint8_t daddr);
uint8_t tuh_i_serial_get(uint8_t dev_addr); uint8_t tuh_i_serial_get(uint8_t daddr);
uint8_t tuh_i_product_get(uint8_t dev_addr); uint8_t tuh_i_product_get(uint8_t daddr);
// Reads the string descriptor at the string index into the buffer. This is the // Reads the string descriptor at the string index into the buffer. This is the
// full response so the first entry is the length and the constant 0x03 for // full response so the first entry is the length and the constant 0x03 for
// string descriptor type. // string descriptor type.
bool tuh_string_get(uint8_t dev_addr, uint8_t string_index, uint16_t* buf, size_t len, tuh_complete_cb_t complete_cb); bool tuh_string_get(uint8_t daddr, uint8_t string_index, uint16_t* buf, size_t len, tuh_complete_cb_t complete_cb);
tusb_speed_t tuh_speed_get(uint8_t dev_addr); tusb_speed_t tuh_speed_get(uint8_t daddr);
// Check if device is connected and configured // Check if device is connected and configured
bool tuh_mounted(uint8_t dev_addr); bool tuh_mounted(uint8_t daddr);
// Check if device is suspended // Check if device is suspended
static inline bool tuh_suspended(uint8_t dev_addr) static inline bool tuh_suspended(uint8_t daddr)
{ {
// TODO implement suspend & resume on host // TODO implement suspend & resume on host
(void) dev_addr; (void) daddr;
return false; return false;
} }
// Check if device is ready to communicate with // Check if device is ready to communicate with
TU_ATTR_ALWAYS_INLINE TU_ATTR_ALWAYS_INLINE
static inline bool tuh_ready(uint8_t dev_addr) static inline bool tuh_ready(uint8_t daddr)
{ {
return tuh_mounted(dev_addr) && !tuh_suspended(dev_addr); return tuh_mounted(daddr) && !tuh_suspended(daddr);
} }
// Carry out control transfer // Carry out control transfer
bool tuh_control_xfer (uint8_t dev_addr, tusb_control_request_t const* request, void* buffer, tuh_control_complete_cb_t complete_cb); bool tuh_control_xfer (uint8_t daddr, tusb_control_request_t const* request, void* buffer, tuh_control_complete_cb_t complete_cb);
//--------------------------------------------------------------------+ //--------------------------------------------------------------------+
// APPLICATION CALLBACK // APPLICATION CALLBACK
@ -99,10 +108,10 @@ bool tuh_control_xfer (uint8_t dev_addr, tusb_control_request_t const* request,
//TU_ATTR_WEAK uint8_t tuh_attach_cb (tusb_desc_device_t const *desc_device); //TU_ATTR_WEAK uint8_t tuh_attach_cb (tusb_desc_device_t const *desc_device);
// Invoked when device is mounted (configured) // Invoked when device is mounted (configured)
TU_ATTR_WEAK void tuh_mount_cb (uint8_t dev_addr); TU_ATTR_WEAK void tuh_mount_cb (uint8_t daddr);
/// Invoked when device is unmounted (bus reset/unplugged) /// Invoked when device is unmounted (bus reset/unplugged)
TU_ATTR_WEAK void tuh_umount_cb(uint8_t dev_addr); TU_ATTR_WEAK void tuh_umount_cb(uint8_t daddr);
#ifdef __cplusplus #ifdef __cplusplus
} }