mirror of
https://github.com/hathach/tinyusb.git
synced 2025-02-07 05:54:11 +08:00
fix #229
This commit is contained in:
parent
8a1b6327ba
commit
fe1eadf177
@ -311,8 +311,8 @@ bool cdcd_control_complete(uint8_t rhport, tusb_control_request_t const * reques
|
|||||||
// return false to stall control endpoint (e.g unsupported request)
|
// return false to stall control endpoint (e.g unsupported request)
|
||||||
bool cdcd_control_request(uint8_t rhport, tusb_control_request_t const * request)
|
bool cdcd_control_request(uint8_t rhport, tusb_control_request_t const * request)
|
||||||
{
|
{
|
||||||
//------------- Class Specific Request -------------//
|
// Handle class request only
|
||||||
TU_ASSERT(request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS);
|
TU_VERIFY(request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS);
|
||||||
|
|
||||||
// TODO Support multiple interfaces
|
// TODO Support multiple interfaces
|
||||||
uint8_t const itf = 0;
|
uint8_t const itf = 0;
|
||||||
|
@ -79,21 +79,17 @@ bool dfu_rtd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16
|
|||||||
bool dfu_rtd_control_complete(uint8_t rhport, tusb_control_request_t const * request)
|
bool dfu_rtd_control_complete(uint8_t rhport, tusb_control_request_t const * request)
|
||||||
{
|
{
|
||||||
(void) rhport;
|
(void) rhport;
|
||||||
|
(void) request;
|
||||||
|
|
||||||
//------------- Class Specific Request -------------//
|
// nothing to do
|
||||||
TU_VERIFY(request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS);
|
|
||||||
TU_VERIFY(request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_INTERFACE);
|
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool dfu_rtd_control_request(uint8_t rhport, tusb_control_request_t const * request)
|
bool dfu_rtd_control_request(uint8_t rhport, tusb_control_request_t const * request)
|
||||||
{
|
{
|
||||||
(void) rhport;
|
// Handle class request only
|
||||||
|
TU_VERIFY(request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS);
|
||||||
//------------- Class Specific Request -------------//
|
TU_VERIFY(request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_INTERFACE);
|
||||||
TU_ASSERT(request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS);
|
|
||||||
TU_ASSERT(request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_INTERFACE);
|
|
||||||
|
|
||||||
switch ( request->bRequest )
|
switch ( request->bRequest )
|
||||||
{
|
{
|
||||||
|
@ -191,89 +191,87 @@ bool hidd_open(uint8_t rhport, tusb_desc_interface_t const * desc_itf, uint16_t
|
|||||||
|
|
||||||
// Handle class control request
|
// Handle class control request
|
||||||
// return false to stall control endpoint (e.g unsupported request)
|
// return false to stall control endpoint (e.g unsupported request)
|
||||||
bool hidd_control_request(uint8_t rhport, tusb_control_request_t const * p_request)
|
bool hidd_control_request(uint8_t rhport, tusb_control_request_t const * request)
|
||||||
{
|
{
|
||||||
if (p_request->bmRequestType_bit.recipient != TUSB_REQ_RCPT_INTERFACE)
|
TU_VERIFY(request->bmRequestType_bit.recipient == TUSB_REQ_RCPT_INTERFACE);
|
||||||
{
|
|
||||||
return false;
|
hidd_interface_t* p_hid = get_interface_by_itfnum( (uint8_t) request->wIndex );
|
||||||
}
|
|
||||||
hidd_interface_t* p_hid = get_interface_by_itfnum( (uint8_t) p_request->wIndex );
|
|
||||||
TU_ASSERT(p_hid);
|
TU_ASSERT(p_hid);
|
||||||
|
|
||||||
if (p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD)
|
if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_STANDARD)
|
||||||
{
|
{
|
||||||
//------------- STD Request -------------//
|
//------------- STD Request -------------//
|
||||||
uint8_t const desc_type = tu_u16_high(p_request->wValue);
|
uint8_t const desc_type = tu_u16_high(request->wValue);
|
||||||
uint8_t const desc_index = tu_u16_low (p_request->wValue);
|
uint8_t const desc_index = tu_u16_low (request->wValue);
|
||||||
(void) desc_index;
|
(void) desc_index;
|
||||||
|
|
||||||
if (p_request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_HID)
|
if (request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_HID)
|
||||||
{
|
{
|
||||||
TU_VERIFY(p_hid->hid_descriptor != NULL);
|
TU_VERIFY(p_hid->hid_descriptor != NULL);
|
||||||
TU_VERIFY(tud_control_xfer(rhport, p_request, (void*) p_hid->hid_descriptor, p_hid->hid_descriptor->bLength));
|
TU_VERIFY(tud_control_xfer(rhport, request, (void*) p_hid->hid_descriptor, p_hid->hid_descriptor->bLength));
|
||||||
}
|
}
|
||||||
else if (p_request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_REPORT)
|
else if (request->bRequest == TUSB_REQ_GET_DESCRIPTOR && desc_type == HID_DESC_TYPE_REPORT)
|
||||||
{
|
{
|
||||||
uint8_t const * desc_report = tud_hid_descriptor_report_cb();
|
uint8_t const * desc_report = tud_hid_descriptor_report_cb();
|
||||||
tud_control_xfer(rhport, p_request, (void*) desc_report, p_hid->report_desc_len);
|
tud_control_xfer(rhport, request, (void*) desc_report, p_hid->report_desc_len);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
return false; // stall unsupported request
|
return false; // stall unsupported request
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS)
|
else if (request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS)
|
||||||
{
|
{
|
||||||
//------------- Class Specific Request -------------//
|
//------------- Class Specific Request -------------//
|
||||||
switch( p_request->bRequest )
|
switch( request->bRequest )
|
||||||
{
|
{
|
||||||
case HID_REQ_CONTROL_GET_REPORT:
|
case HID_REQ_CONTROL_GET_REPORT:
|
||||||
{
|
{
|
||||||
// wValue = Report Type | Report ID
|
// wValue = Report Type | Report ID
|
||||||
uint8_t const report_type = tu_u16_high(p_request->wValue);
|
uint8_t const report_type = tu_u16_high(request->wValue);
|
||||||
uint8_t const report_id = tu_u16_low(p_request->wValue);
|
uint8_t const report_id = tu_u16_low(request->wValue);
|
||||||
|
|
||||||
uint16_t xferlen = tud_hid_get_report_cb(report_id, (hid_report_type_t) report_type, p_hid->epin_buf, p_request->wLength);
|
uint16_t xferlen = tud_hid_get_report_cb(report_id, (hid_report_type_t) report_type, p_hid->epin_buf, request->wLength);
|
||||||
TU_ASSERT( xferlen > 0 );
|
TU_ASSERT( xferlen > 0 );
|
||||||
|
|
||||||
tud_control_xfer(rhport, p_request, p_hid->epin_buf, xferlen);
|
tud_control_xfer(rhport, request, p_hid->epin_buf, xferlen);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HID_REQ_CONTROL_SET_REPORT:
|
case HID_REQ_CONTROL_SET_REPORT:
|
||||||
TU_VERIFY(p_request->wLength <= sizeof(p_hid->epout_buf));
|
TU_VERIFY(request->wLength <= sizeof(p_hid->epout_buf));
|
||||||
tud_control_xfer(rhport, p_request, p_hid->epout_buf, p_request->wLength);
|
tud_control_xfer(rhport, request, p_hid->epout_buf, request->wLength);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HID_REQ_CONTROL_SET_IDLE:
|
case HID_REQ_CONTROL_SET_IDLE:
|
||||||
p_hid->idle_rate = tu_u16_high(p_request->wValue);
|
p_hid->idle_rate = tu_u16_high(request->wValue);
|
||||||
if ( tud_hid_set_idle_cb )
|
if ( tud_hid_set_idle_cb )
|
||||||
{
|
{
|
||||||
// stall request if callback return false
|
// stall request if callback return false
|
||||||
if ( !tud_hid_set_idle_cb(p_hid->idle_rate) ) return false;
|
if ( !tud_hid_set_idle_cb(p_hid->idle_rate) ) return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
tud_control_status(rhport, p_request);
|
tud_control_status(rhport, request);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HID_REQ_CONTROL_GET_IDLE:
|
case HID_REQ_CONTROL_GET_IDLE:
|
||||||
// TODO idle rate of report
|
// TODO idle rate of report
|
||||||
tud_control_xfer(rhport, p_request, &p_hid->idle_rate, 1);
|
tud_control_xfer(rhport, request, &p_hid->idle_rate, 1);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HID_REQ_CONTROL_GET_PROTOCOL:
|
case HID_REQ_CONTROL_GET_PROTOCOL:
|
||||||
{
|
{
|
||||||
uint8_t protocol = (uint8_t)(1-p_hid->boot_mode); // 0 is Boot, 1 is Report protocol
|
uint8_t protocol = (uint8_t)(1-p_hid->boot_mode); // 0 is Boot, 1 is Report protocol
|
||||||
tud_control_xfer(rhport, p_request, &protocol, 1);
|
tud_control_xfer(rhport, request, &protocol, 1);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case HID_REQ_CONTROL_SET_PROTOCOL:
|
case HID_REQ_CONTROL_SET_PROTOCOL:
|
||||||
p_hid->boot_mode = 1 - p_request->wValue; // 0 is Boot, 1 is Report protocol
|
p_hid->boot_mode = 1 - request->wValue; // 0 is Boot, 1 is Report protocol
|
||||||
|
|
||||||
if (tud_hid_boot_mode_cb) tud_hid_boot_mode_cb(p_hid->boot_mode);
|
if (tud_hid_boot_mode_cb) tud_hid_boot_mode_cb(p_hid->boot_mode);
|
||||||
|
|
||||||
tud_control_status(rhport, p_request);
|
tud_control_status(rhport, request);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default: return false; // stall unsupported request
|
default: return false; // stall unsupported request
|
||||||
|
@ -322,10 +322,9 @@ bool midid_control_complete(uint8_t rhport, tusb_control_request_t const * p_req
|
|||||||
bool midid_control_request(uint8_t rhport, tusb_control_request_t const * p_request)
|
bool midid_control_request(uint8_t rhport, tusb_control_request_t const * p_request)
|
||||||
{
|
{
|
||||||
(void) rhport;
|
(void) rhport;
|
||||||
|
(void) p_request;
|
||||||
|
|
||||||
//------------- Class Specific Request -------------//
|
// driver doesn't support any request yet
|
||||||
if (p_request->bmRequestType_bit.type != TUSB_REQ_TYPE_CLASS) return false;
|
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -149,7 +149,8 @@ bool mscd_open(uint8_t rhport, tusb_desc_interface_t const * itf_desc, uint16_t
|
|||||||
// return false to stall control endpoint (e.g unsupported request)
|
// return false to stall control endpoint (e.g unsupported request)
|
||||||
bool mscd_control_request(uint8_t rhport, tusb_control_request_t const * p_request)
|
bool mscd_control_request(uint8_t rhport, tusb_control_request_t const * p_request)
|
||||||
{
|
{
|
||||||
TU_ASSERT(p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS);
|
// Handle class request only
|
||||||
|
TU_VERIFY(p_request->bmRequestType_bit.type == TUSB_REQ_TYPE_CLASS);
|
||||||
|
|
||||||
switch ( p_request->bRequest )
|
switch ( p_request->bRequest )
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user