191
bdk/usb/usbd.c
191
bdk/usb/usbd.c
@@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Enhanced USB Device (EDCI) driver for Tegra X1
|
||||
*
|
||||
* Copyright (c) 2019-2024 CTCaer
|
||||
* Copyright (c) 2019-2025 CTCaer
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms and conditions of the GNU General Public License,
|
||||
@@ -101,7 +101,11 @@ typedef struct _usbd_controller_t
|
||||
bool configuration_set;
|
||||
bool max_lun_set;
|
||||
bool bulk_reset_req;
|
||||
u32 intr_idle_rate;
|
||||
bool intr_idle_req;
|
||||
bool hid_report_sent;
|
||||
void *hid_rpt_buffer;
|
||||
u32 hid_rpt_size;
|
||||
u32 charger_detect;
|
||||
} usbd_controller_t;
|
||||
|
||||
@@ -881,7 +885,7 @@ int usbd_set_ep_stall(u32 endpoint, int ep_stall)
|
||||
return USB_RES_OK;
|
||||
}
|
||||
|
||||
static void _usbd_handle_get_class_request(bool *transmit_data, u8 *descriptor, int *size, bool *ep_stall)
|
||||
static void _usbd_handle_get_class_request(bool *transmit_data, u8 *desc, int *size, bool *ep_stall)
|
||||
{
|
||||
u8 _bRequest = usbd_otg->control_setup.bRequest;
|
||||
u16 _wIndex = usbd_otg->control_setup.wIndex;
|
||||
@@ -889,9 +893,9 @@ static void _usbd_handle_get_class_request(bool *transmit_data, u8 *descriptor,
|
||||
u16 _wLength = usbd_otg->control_setup.wLength;
|
||||
|
||||
bool valid_interface = _wIndex == usbd_otg->interface_num;
|
||||
bool valid_len = (_bRequest == USB_REQUEST_BULK_GET_MAX_LUN) ? 1 : 0;
|
||||
bool valid_val = (_bRequest >= USB_REQUEST_BULK_GET_MAX_LUN) ? (!_wValue) : true;
|
||||
|
||||
if (!valid_interface || _wValue != 0 || _wLength != valid_len)
|
||||
if (!valid_interface || !valid_val)
|
||||
{
|
||||
*ep_stall = true;
|
||||
return;
|
||||
@@ -899,23 +903,51 @@ static void _usbd_handle_get_class_request(bool *transmit_data, u8 *descriptor,
|
||||
|
||||
switch (_bRequest)
|
||||
{
|
||||
case USB_REQUEST_INTR_GET_REPORT:
|
||||
if (usbd_otg->hid_rpt_size != _wLength)
|
||||
break;
|
||||
|
||||
// _wValue unused as there's only one report type and id.
|
||||
*transmit_data = true;
|
||||
*size = usbd_otg->hid_rpt_size;
|
||||
memcpy(desc, usbd_otg->hid_rpt_buffer, usbd_otg->hid_rpt_size);
|
||||
return;
|
||||
|
||||
case USB_REQUEST_INTR_SET_IDLE:
|
||||
if (_wLength)
|
||||
break;
|
||||
|
||||
usbd_otg->intr_idle_rate = (_wValue & 0xFF) * 4 * 1000; // Only one interface so upper byte ignored.
|
||||
usbd_otg->intr_idle_req = true;
|
||||
_usbd_ep_ack(USB_EP_CTRL_IN);
|
||||
return; // DELAYED_STATUS;
|
||||
|
||||
case USB_REQUEST_BULK_RESET:
|
||||
if (_wLength)
|
||||
break;
|
||||
|
||||
_usbd_ep_ack(USB_EP_CTRL_IN);
|
||||
usbd_otg->bulk_reset_req = true;
|
||||
break; // DELAYED_STATUS;
|
||||
return; // DELAYED_STATUS;
|
||||
|
||||
case USB_REQUEST_BULK_GET_MAX_LUN:
|
||||
if (_wLength != 1)
|
||||
break;
|
||||
|
||||
*transmit_data = true;
|
||||
*size = 1;
|
||||
descriptor[0] = usbd_otg->max_lun; // Set 0 LUN for 1 drive supported.
|
||||
desc[0] = usbd_otg->max_lun; // Set 0 LUN for 1 drive supported.
|
||||
usbd_otg->max_lun_set = true;
|
||||
break;
|
||||
return;
|
||||
|
||||
default:
|
||||
*ep_stall = true;
|
||||
break;
|
||||
}
|
||||
|
||||
*ep_stall = true;
|
||||
}
|
||||
|
||||
static void _usbd_handle_get_descriptor(bool *transmit_data, void **descriptor, int *size, bool *ep_stall)
|
||||
static void _usbd_handle_get_descriptor(bool *transmit_data, void **desc, int *size, bool *ep_stall)
|
||||
{
|
||||
u8 descriptor_type = usbd_otg->control_setup.wValue >> 8;
|
||||
u8 descriptor_subtype = usbd_otg->control_setup.wValue & 0xFF;
|
||||
@@ -931,7 +963,7 @@ static void _usbd_handle_get_descriptor(bool *transmit_data, void **descriptor,
|
||||
usb_device_descriptor.bcdDevice = (soc_rev >> 16) & 0xF; // MINORREV.
|
||||
usb_device_descriptor.bcdDevice |= ((soc_rev >> 4) & 0xF) << 8; // MAJORREV.
|
||||
*/
|
||||
*descriptor = usbd_otg->desc->dev;
|
||||
*desc = usbd_otg->desc->dev;
|
||||
*size = usbd_otg->desc->dev->bLength;
|
||||
*transmit_data = true;
|
||||
return;
|
||||
@@ -941,13 +973,13 @@ static void _usbd_handle_get_descriptor(bool *transmit_data, void **descriptor,
|
||||
{
|
||||
if (usbd_otg->port_speed == USB_HIGH_SPEED) // High speed. 512 bytes.
|
||||
{
|
||||
usbd_otg->desc->cfg->endpoint[0].wMaxPacketSize = 0x200;
|
||||
usbd_otg->desc->cfg->endpoint[1].wMaxPacketSize = 0x200;
|
||||
for (u32 i = 0; i < usbd_otg->desc->cfg->interface.bNumEndpoints; i++)
|
||||
usbd_otg->desc->cfg->endpoint[i].wMaxPacketSize = 0x200; // No burst.
|
||||
}
|
||||
else // Full speed. 64 bytes.
|
||||
{
|
||||
usbd_otg->desc->cfg->endpoint[0].wMaxPacketSize = 0x40;
|
||||
usbd_otg->desc->cfg->endpoint[1].wMaxPacketSize = 0x40;
|
||||
for (u32 i = 0; i < usbd_otg->desc->cfg->interface.bNumEndpoints; i++)
|
||||
usbd_otg->desc->cfg->endpoint[i].wMaxPacketSize = 0x40;
|
||||
}
|
||||
}
|
||||
else
|
||||
@@ -955,20 +987,22 @@ static void _usbd_handle_get_descriptor(bool *transmit_data, void **descriptor,
|
||||
usb_cfg_hid_descr_t *tmp = (usb_cfg_hid_descr_t *)usbd_otg->desc->cfg;
|
||||
if (usbd_otg->port_speed == USB_HIGH_SPEED) // High speed. 512 bytes.
|
||||
{
|
||||
tmp->endpoint[0].wMaxPacketSize = 0x200;
|
||||
tmp->endpoint[1].wMaxPacketSize = 0x200;
|
||||
tmp->endpoint[0].bInterval = usbd_otg->gadget == USB_GADGET_HID_GAMEPAD ? 4 : 3; // 8ms : 4ms.
|
||||
tmp->endpoint[1].bInterval = usbd_otg->gadget == USB_GADGET_HID_GAMEPAD ? 4 : 3; // 8ms : 4ms.
|
||||
for (u32 i = 0; i < tmp->interface.bNumEndpoints; i++)
|
||||
{
|
||||
tmp->endpoint[i].wMaxPacketSize = 0x200;
|
||||
tmp->endpoint[i].bInterval = usbd_otg->gadget == USB_GADGET_HID_GAMEPAD ? 4 : 3; // 8ms : 4ms.
|
||||
}
|
||||
}
|
||||
else // Full speed. 64 bytes.
|
||||
{
|
||||
tmp->endpoint[0].wMaxPacketSize = 0x40;
|
||||
tmp->endpoint[1].wMaxPacketSize = 0x40;
|
||||
tmp->endpoint[0].bInterval = usbd_otg->gadget == USB_GADGET_HID_GAMEPAD ? 8 : 4; // 8ms : 4ms.
|
||||
tmp->endpoint[1].bInterval = usbd_otg->gadget == USB_GADGET_HID_GAMEPAD ? 8 : 4; // 8ms : 4ms.
|
||||
for (u32 i = 0; i < tmp->interface.bNumEndpoints; i++)
|
||||
{
|
||||
tmp->endpoint[i].wMaxPacketSize = 0x40;
|
||||
tmp->endpoint[i].bInterval = usbd_otg->gadget == USB_GADGET_HID_GAMEPAD ? 8 : 4; // 8ms : 4ms.
|
||||
}
|
||||
}
|
||||
}
|
||||
*descriptor = usbd_otg->desc->cfg;
|
||||
*desc = usbd_otg->desc->cfg;
|
||||
*size = usbd_otg->desc->cfg->config.wTotalLength;
|
||||
*transmit_data = true;
|
||||
return;
|
||||
@@ -976,23 +1010,23 @@ static void _usbd_handle_get_descriptor(bool *transmit_data, void **descriptor,
|
||||
switch (descriptor_subtype)
|
||||
{
|
||||
case 1:
|
||||
*descriptor = usbd_otg->desc->vendor;
|
||||
*desc = usbd_otg->desc->vendor;
|
||||
*size = usbd_otg->desc->vendor[0];
|
||||
break;
|
||||
case 2:
|
||||
*descriptor = usbd_otg->desc->product;
|
||||
*desc = usbd_otg->desc->product;
|
||||
*size = usbd_otg->desc->product[0];
|
||||
break;
|
||||
case 3:
|
||||
*descriptor = usbd_otg->desc->serial;
|
||||
*desc = usbd_otg->desc->serial;
|
||||
*size = usbd_otg->desc->serial[0];
|
||||
break;
|
||||
case 0xEE:
|
||||
*descriptor = usbd_otg->desc->ms_os;
|
||||
*desc = usbd_otg->desc->ms_os;
|
||||
*size = usbd_otg->desc->ms_os->bLength;
|
||||
break;
|
||||
default:
|
||||
*descriptor = usbd_otg->desc->lang_id;
|
||||
*desc = usbd_otg->desc->lang_id;
|
||||
*size = 4;
|
||||
break;
|
||||
}
|
||||
@@ -1002,7 +1036,7 @@ static void _usbd_handle_get_descriptor(bool *transmit_data, void **descriptor,
|
||||
if (!usbd_otg->desc->dev_qual)
|
||||
goto exit;
|
||||
usbd_otg->desc->dev_qual->bNumOtherConfigs = 1;
|
||||
*descriptor = usbd_otg->desc->dev_qual;
|
||||
*desc = usbd_otg->desc->dev_qual;
|
||||
*size = usbd_otg->desc->dev_qual->bLength;
|
||||
*transmit_data = true;
|
||||
return;
|
||||
@@ -1011,22 +1045,22 @@ static void _usbd_handle_get_descriptor(bool *transmit_data, void **descriptor,
|
||||
goto exit;
|
||||
if (usbd_otg->port_speed == USB_HIGH_SPEED)
|
||||
{
|
||||
usbd_otg->desc->cfg_other->endpoint[0].wMaxPacketSize = 0x40;
|
||||
usbd_otg->desc->cfg_other->endpoint[1].wMaxPacketSize = 0x40;
|
||||
for (u32 i = 0; i < usbd_otg->desc->cfg_other->interface.bNumEndpoints; i++)
|
||||
usbd_otg->desc->cfg_other->endpoint[i].wMaxPacketSize = 0x40;
|
||||
}
|
||||
else
|
||||
{
|
||||
usbd_otg->desc->cfg_other->endpoint[0].wMaxPacketSize = 0x200;
|
||||
usbd_otg->desc->cfg_other->endpoint[1].wMaxPacketSize = 0x200;
|
||||
for (u32 i = 0; i < usbd_otg->desc->cfg_other->interface.bNumEndpoints; i++)
|
||||
usbd_otg->desc->cfg_other->endpoint[i].wMaxPacketSize = 0x200;
|
||||
}
|
||||
if ((usbd_otg->charger_detect & 1) && (usbd_otg->charger_detect & 2))
|
||||
usbd_otg->desc->cfg_other->config.bMaxPower = 500 / 2;
|
||||
*descriptor = usbd_otg->desc->cfg_other;
|
||||
*desc = usbd_otg->desc->cfg_other;
|
||||
*size = usbd_otg->desc->cfg_other->config.wTotalLength;
|
||||
*transmit_data = true;
|
||||
return;
|
||||
case USB_DESCRIPTOR_DEVICE_BINARY_OBJECT:
|
||||
*descriptor = usbd_otg->desc->dev_bot;
|
||||
*desc = usbd_otg->desc->dev_bot;
|
||||
*size = usbd_otg->desc->dev_bot->wTotalLength;
|
||||
*transmit_data = true;
|
||||
return;
|
||||
@@ -1086,7 +1120,7 @@ static int _usbd_handle_ep0_control_transfer()
|
||||
bool ep_stall = false;
|
||||
bool transmit_data = false;
|
||||
|
||||
u8 *descriptor = (u8 *)USB_DESCRIPTOR_ADDR;
|
||||
u8 *desc = (u8 *)USB_DESCRIPTOR_ADDR;
|
||||
int size = 0;
|
||||
|
||||
u8 _bmRequestType = usbd_otg->control_setup.bmRequestType;
|
||||
@@ -1099,17 +1133,17 @@ static int _usbd_handle_ep0_control_transfer()
|
||||
|
||||
switch (_bmRequestType)
|
||||
{
|
||||
case (USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_DEVICE):
|
||||
case (USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_DEVICE): // 0x00.
|
||||
res = _usbd_handle_set_request(&ep_stall);
|
||||
break;
|
||||
|
||||
case (USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_INTERFACE):
|
||||
case (USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_INTERFACE): // 0x01.
|
||||
res = _usbd_ep_ack(USB_EP_CTRL_IN);
|
||||
if (!res)
|
||||
usbd_otg->interface_num = _wValue;
|
||||
break;
|
||||
|
||||
case (USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_ENDPOINT):
|
||||
case (USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_ENDPOINT): // 0x02.
|
||||
switch (_bRequest)
|
||||
{
|
||||
case USB_REQUEST_CLEAR_FEATURE:
|
||||
@@ -1153,25 +1187,25 @@ static int _usbd_handle_ep0_control_transfer()
|
||||
}
|
||||
break;
|
||||
|
||||
case (USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_CLASS | USB_SETUP_RECIPIENT_INTERFACE):
|
||||
memset(descriptor, 0, _wLength);
|
||||
_usbd_handle_get_class_request(&transmit_data, descriptor, &size, &ep_stall);
|
||||
case (USB_SETUP_HOST_TO_DEVICE | USB_SETUP_TYPE_CLASS | USB_SETUP_RECIPIENT_INTERFACE): // 0x21.
|
||||
memset(desc, 0, _wLength);
|
||||
_usbd_handle_get_class_request(&transmit_data, desc, &size, &ep_stall);
|
||||
break;
|
||||
|
||||
case (USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_DEVICE):
|
||||
case (USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_DEVICE): // 0x80.
|
||||
switch (_bRequest)
|
||||
{
|
||||
case USB_REQUEST_GET_STATUS:
|
||||
descriptor[0] = USB_STATUS_DEV_SELF_POWERED;
|
||||
descriptor[1] = 0; // No support for remove wake up.
|
||||
desc[0] = USB_STATUS_DEV_SELF_POWERED;
|
||||
desc[1] = 0; // No support for remove wake up.
|
||||
transmit_data = true;
|
||||
size = 2;
|
||||
break;
|
||||
case USB_REQUEST_GET_DESCRIPTOR:
|
||||
_usbd_handle_get_descriptor(&transmit_data, (void **)&descriptor, &size, &ep_stall);
|
||||
_usbd_handle_get_descriptor(&transmit_data, (void **)&desc, &size, &ep_stall);
|
||||
break;
|
||||
case USB_REQUEST_GET_CONFIGURATION:
|
||||
descriptor = (u8 *)&usbd_otg->config_num;
|
||||
desc = (u8 *)&usbd_otg->config_num;
|
||||
size = _wLength;
|
||||
transmit_data = true;
|
||||
break;
|
||||
@@ -1181,28 +1215,28 @@ static int _usbd_handle_ep0_control_transfer()
|
||||
}
|
||||
break;
|
||||
|
||||
case (USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_INTERFACE):
|
||||
case (USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_INTERFACE): // 0x81.
|
||||
if (_bRequest == USB_REQUEST_GET_INTERFACE)
|
||||
{
|
||||
memset(descriptor, 0, _wLength);
|
||||
descriptor[0] = usbd_otg->interface_num;
|
||||
memset(desc, 0, _wLength);
|
||||
desc[0] = usbd_otg->interface_num;
|
||||
size = _wLength;
|
||||
}
|
||||
else if (_bRequest == USB_REQUEST_GET_STATUS)
|
||||
{
|
||||
memset(descriptor, 0, _wLength);
|
||||
memset(desc, 0, _wLength);
|
||||
size = _wLength;
|
||||
}
|
||||
else if (_bRequest == USB_REQUEST_GET_DESCRIPTOR && (_wValue >> 8) == USB_DESCRIPTOR_HID_REPORT && usbd_otg->gadget > USB_GADGET_UMS)
|
||||
else if (_bRequest == USB_REQUEST_GET_DESCRIPTOR && (_wValue >> 8) == USB_DESCRIPTOR_HID_REPORT && usbd_otg->gadget >= USB_GADGET_HID_GAMEPAD)
|
||||
{
|
||||
if (usbd_otg->gadget == USB_GADGET_HID_GAMEPAD)
|
||||
{
|
||||
descriptor = (u8 *)&hid_report_descriptor_jc;
|
||||
desc = (u8 *)&hid_report_descriptor_jc;
|
||||
size = hid_report_descriptor_jc_size;
|
||||
}
|
||||
else // USB_GADGET_HID_TOUCHPAD
|
||||
{
|
||||
descriptor = (u8 *)&hid_report_descriptor_touch;
|
||||
desc = (u8 *)&hid_report_descriptor_touch;
|
||||
size = hid_report_descriptor_touch_size;
|
||||
}
|
||||
|
||||
@@ -1219,7 +1253,7 @@ static int _usbd_handle_ep0_control_transfer()
|
||||
transmit_data = true;
|
||||
break;
|
||||
|
||||
case (USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_ENDPOINT):
|
||||
case (USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_STANDARD | USB_SETUP_RECIPIENT_ENDPOINT): // 0x82.
|
||||
if (_bRequest == USB_REQUEST_GET_STATUS)
|
||||
{
|
||||
int ep_req;
|
||||
@@ -1243,12 +1277,12 @@ static int _usbd_handle_ep0_control_transfer()
|
||||
}
|
||||
|
||||
size = _wLength;
|
||||
memset(descriptor, 0, size);
|
||||
memset(desc, 0, size);
|
||||
|
||||
if (_usbd_get_ep_status(ep_req) == USB_EP_STATUS_STALLED)
|
||||
descriptor[0] = USB_STATUS_EP_HALTED;
|
||||
desc[0] = USB_STATUS_EP_HALTED;
|
||||
else
|
||||
descriptor[0] = USB_STATUS_EP_OK;
|
||||
desc[0] = USB_STATUS_EP_OK;
|
||||
|
||||
transmit_data = true;
|
||||
}
|
||||
@@ -1256,24 +1290,24 @@ static int _usbd_handle_ep0_control_transfer()
|
||||
_usbd_stall_reset_ep1(3, USB_EP_CFG_STALL);
|
||||
break;
|
||||
|
||||
case (USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_CLASS | USB_SETUP_RECIPIENT_INTERFACE):
|
||||
memset(descriptor, 0, _wLength);
|
||||
_usbd_handle_get_class_request(&transmit_data, descriptor, &size, &ep_stall);
|
||||
case (USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_CLASS | USB_SETUP_RECIPIENT_INTERFACE): // 0xA1.
|
||||
memset(desc, 0, _wLength);
|
||||
_usbd_handle_get_class_request(&transmit_data, desc, &size, &ep_stall);
|
||||
break;
|
||||
|
||||
case (USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_VENDOR | USB_SETUP_RECIPIENT_INTERFACE):
|
||||
case (USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_VENDOR | USB_SETUP_RECIPIENT_DEVICE):
|
||||
case (USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_VENDOR | USB_SETUP_RECIPIENT_DEVICE): // 0xC0.
|
||||
case (USB_SETUP_DEVICE_TO_HOST | USB_SETUP_TYPE_VENDOR | USB_SETUP_RECIPIENT_INTERFACE): // 0xC1.
|
||||
if (_bRequest == USB_REQUEST_GET_MS_DESCRIPTOR)
|
||||
{
|
||||
switch (_wIndex)
|
||||
{
|
||||
case USB_DESCRIPTOR_MS_COMPAT_ID:
|
||||
descriptor = (u8 *)usbd_otg->desc->ms_cid;
|
||||
desc = (u8 *)usbd_otg->desc->ms_cid;
|
||||
size = usbd_otg->desc->ms_cid->dLength;
|
||||
transmit_data = true;
|
||||
break;
|
||||
case USB_DESCRIPTOR_MS_EXTENDED_PROPERTIES:
|
||||
descriptor = (u8 *)usbd_otg->desc->mx_ext;
|
||||
desc = (u8 *)usbd_otg->desc->mx_ext;
|
||||
size = usbd_otg->desc->mx_ext->dLength;
|
||||
transmit_data = true;
|
||||
break;
|
||||
@@ -1294,7 +1328,7 @@ static int _usbd_handle_ep0_control_transfer()
|
||||
// Transmit data to HOST if any.
|
||||
if (transmit_data)
|
||||
{
|
||||
memcpy(usb_ep0_ctrl_buf, descriptor, size);
|
||||
memcpy(usb_ep0_ctrl_buf, desc, size);
|
||||
|
||||
if (_wLength < size)
|
||||
size = _wLength;
|
||||
@@ -1393,7 +1427,7 @@ int usb_device_enumerate(usb_gadget_type gadget)
|
||||
return _usbd_ep0_initialize();
|
||||
}
|
||||
|
||||
int usbd_handle_ep0_ctrl_setup()
|
||||
int usbd_handle_ep0_ctrl_setup(u32 *data)
|
||||
{
|
||||
// Acknowledge setup request for EP0 and copy its configuration.
|
||||
u32 ep0_setup_req = usbd_otg->regs->endptsetupstat;
|
||||
@@ -1405,6 +1439,15 @@ int usbd_handle_ep0_ctrl_setup()
|
||||
memset(usb_ep0_ctrl_buf, 0, USB_TD_BUFFER_PAGE_SIZE);
|
||||
}
|
||||
|
||||
if (usbd_otg->intr_idle_req)
|
||||
{
|
||||
if (data)
|
||||
*data = usbd_otg->intr_idle_rate;
|
||||
|
||||
usbd_otg->intr_idle_req = false;
|
||||
return USB_RES_OK;
|
||||
}
|
||||
|
||||
// Only return error if bulk reset was requested.
|
||||
if (usbd_otg->bulk_reset_req)
|
||||
{
|
||||
@@ -1487,7 +1530,7 @@ int usb_device_ep1_out_reading_finish(u32 *pending_bytes, u32 sync_timeout)
|
||||
if ((ep_status == USB_EP_STATUS_IDLE) || (ep_status == USB_EP_STATUS_DISABLED))
|
||||
break;
|
||||
|
||||
usbd_handle_ep0_ctrl_setup();
|
||||
usbd_handle_ep0_ctrl_setup(NULL);
|
||||
}
|
||||
while ((ep_status == USB_EP_STATUS_ACTIVE) || (ep_status == USB_EP_STATUS_STALLED));
|
||||
|
||||
@@ -1536,7 +1579,7 @@ int usb_device_ep1_in_writing_finish(u32 *pending_bytes, u32 sync_timeout)
|
||||
if ((ep_status == USB_EP_STATUS_IDLE) || (ep_status == USB_EP_STATUS_DISABLED))
|
||||
break;
|
||||
|
||||
usbd_handle_ep0_ctrl_setup();
|
||||
usbd_handle_ep0_ctrl_setup(NULL);
|
||||
}
|
||||
while ((ep_status == USB_EP_STATUS_ACTIVE) || (ep_status == USB_EP_STATUS_STALLED));
|
||||
|
||||
@@ -1572,7 +1615,7 @@ int usb_device_class_send_max_lun(u8 max_lun)
|
||||
|
||||
while (!usbd_otg->max_lun_set)
|
||||
{
|
||||
usbd_handle_ep0_ctrl_setup();
|
||||
usbd_handle_ep0_ctrl_setup(NULL);
|
||||
if (timer < get_tmr_ms() || btn_read_vol() == (BTN_VOL_UP | BTN_VOL_DOWN))
|
||||
return USB_ERROR_USER_ABORT;
|
||||
}
|
||||
@@ -1580,15 +1623,19 @@ int usb_device_class_send_max_lun(u8 max_lun)
|
||||
return USB_RES_OK;
|
||||
}
|
||||
|
||||
int usb_device_class_send_hid_report()
|
||||
int usb_device_class_send_hid_report(void *rpt_buffer, u32 rpt_size)
|
||||
{
|
||||
// Set buffers.
|
||||
usbd_otg->hid_rpt_buffer = rpt_buffer;
|
||||
usbd_otg->hid_rpt_size = rpt_size;
|
||||
|
||||
// Timeout if get GET_HID_REPORT request doesn't happen in 10s.
|
||||
u32 timer = get_tmr_ms() + 10000;
|
||||
|
||||
// Wait for request and transfer start.
|
||||
while (!usbd_otg->hid_report_sent)
|
||||
{
|
||||
usbd_handle_ep0_ctrl_setup();
|
||||
usbd_handle_ep0_ctrl_setup(NULL);
|
||||
if (timer < get_tmr_ms() || btn_read_vol() == (BTN_VOL_UP | BTN_VOL_DOWN))
|
||||
return USB_ERROR_USER_ABORT;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user