usb: device_next: Reduce code size on Full-Speed only configuration
Allow compiler optimizations to remove High-Speed handling code. Knowing that maximum operating speed is Full-Speed allows to reduce bulk buffers from 512 to 64 bytes. More RAM optimizations are possible but this commit only gets the low hanging fruits. Signed-off-by: Tomasz Moń <tomasz.mon@nordicsemi.no>
This commit is contained in:
parent
faeabc63c9
commit
b3eb6f2d11
19 changed files with 104 additions and 59 deletions
|
@ -37,6 +37,12 @@ extern "C" {
|
||||||
* @{
|
* @{
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/* 1 if USB device stack is compiled with High-Speed support */
|
||||||
|
#define USBD_SUPPORTS_HIGH_SPEED IS_EQ(CONFIG_USBD_MAX_SPEED, 1)
|
||||||
|
|
||||||
|
/* Maximum bulk max packet size the stack supports */
|
||||||
|
#define USBD_MAX_BULK_MPS COND_CODE_1(USBD_SUPPORTS_HIGH_SPEED, (512), (64))
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The USB Unicode bString is encoded in UTF16LE, which means it takes up
|
* The USB Unicode bString is encoded in UTF16LE, which means it takes up
|
||||||
* twice the amount of bytes than the same string encoded in ASCII7.
|
* twice the amount of bytes than the same string encoded in ASCII7.
|
||||||
|
|
|
@ -126,7 +126,8 @@ struct usbd_context *sample_usbd_setup_device(usbd_msg_cb_t msg_cb)
|
||||||
}
|
}
|
||||||
/* doc add string descriptor end */
|
/* doc add string descriptor end */
|
||||||
|
|
||||||
if (usbd_caps_speed(&sample_usbd) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_caps_speed(&sample_usbd) == USBD_SPEED_HS) {
|
||||||
err = usbd_add_configuration(&sample_usbd, USBD_SPEED_HS,
|
err = usbd_add_configuration(&sample_usbd, USBD_SPEED_HS,
|
||||||
&sample_hs_config);
|
&sample_hs_config);
|
||||||
if (err) {
|
if (err) {
|
||||||
|
|
|
@ -68,13 +68,13 @@ static K_FIFO_DEFINE(bt_hci_tx_queue);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Transfers through three endpoints proceed in a synchronous manner,
|
* Transfers through three endpoints proceed in a synchronous manner,
|
||||||
* with maximum packet size of high speed bulk endpoint.
|
* with maximum packet size of max supported speed bulk endpoint.
|
||||||
*
|
*
|
||||||
* REVISE: global (bulk, interrupt, iso) specific pools would be more
|
* REVISE: global (bulk, interrupt, iso) specific pools would be more
|
||||||
* RAM usage efficient.
|
* RAM usage efficient.
|
||||||
*/
|
*/
|
||||||
UDC_BUF_POOL_DEFINE(bt_hci_ep_pool,
|
UDC_BUF_POOL_DEFINE(bt_hci_ep_pool,
|
||||||
3, 512,
|
3, USBD_MAX_BULK_MPS,
|
||||||
sizeof(struct udc_buf_info), NULL);
|
sizeof(struct udc_buf_info), NULL);
|
||||||
/* HCI RX/TX threads */
|
/* HCI RX/TX threads */
|
||||||
static K_KERNEL_STACK_DEFINE(rx_thread_stack, CONFIG_BT_HCI_TX_STACK_SIZE);
|
static K_KERNEL_STACK_DEFINE(rx_thread_stack, CONFIG_BT_HCI_TX_STACK_SIZE);
|
||||||
|
@ -138,7 +138,8 @@ static uint8_t bt_hci_get_bulk_in(struct usbd_class_data *const c_data)
|
||||||
struct bt_hci_data *data = usbd_class_get_private(c_data);
|
struct bt_hci_data *data = usbd_class_get_private(c_data);
|
||||||
struct usbd_bt_hci_desc *desc = data->desc;
|
struct usbd_bt_hci_desc *desc = data->desc;
|
||||||
|
|
||||||
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
||||||
return desc->if0_hs_in_ep.bEndpointAddress;
|
return desc->if0_hs_in_ep.bEndpointAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -151,7 +152,8 @@ static uint8_t bt_hci_get_bulk_out(struct usbd_class_data *const c_data)
|
||||||
struct bt_hci_data *data = usbd_class_get_private(c_data);
|
struct bt_hci_data *data = usbd_class_get_private(c_data);
|
||||||
struct usbd_bt_hci_desc *desc = data->desc;
|
struct usbd_bt_hci_desc *desc = data->desc;
|
||||||
|
|
||||||
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
||||||
return desc->if0_hs_out_ep.bEndpointAddress;
|
return desc->if0_hs_out_ep.bEndpointAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -449,7 +451,7 @@ static void *bt_hci_get_desc(struct usbd_class_data *const c_data,
|
||||||
{
|
{
|
||||||
struct bt_hci_data *data = usbd_class_get_private(c_data);
|
struct bt_hci_data *data = usbd_class_get_private(c_data);
|
||||||
|
|
||||||
if (speed == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
|
||||||
return data->hs_desc;
|
return data->hs_desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -254,7 +254,7 @@ static void *lb_get_desc(struct usbd_class_data *const c_data,
|
||||||
{
|
{
|
||||||
struct lb_data *data = usbd_class_get_private(c_data);
|
struct lb_data *data = usbd_class_get_private(c_data);
|
||||||
|
|
||||||
if (speed == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
|
||||||
return data->hs_desc;
|
return data->hs_desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ LOG_MODULE_REGISTER(usbd_cdc_acm, CONFIG_USBD_CDC_ACM_LOG_LEVEL);
|
||||||
|
|
||||||
UDC_BUF_POOL_DEFINE(cdc_acm_ep_pool,
|
UDC_BUF_POOL_DEFINE(cdc_acm_ep_pool,
|
||||||
DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT) * 2,
|
DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT) * 2,
|
||||||
512, sizeof(struct udc_buf_info), NULL);
|
USBD_MAX_BULK_MPS, sizeof(struct udc_buf_info), NULL);
|
||||||
|
|
||||||
#define CDC_ACM_DEFAULT_LINECODING {sys_cpu_to_le32(115200), 0, 0, 8}
|
#define CDC_ACM_DEFAULT_LINECODING {sys_cpu_to_le32(115200), 0, 0, 8}
|
||||||
#define CDC_ACM_DEFAULT_INT_EP_MPS 16
|
#define CDC_ACM_DEFAULT_INT_EP_MPS 16
|
||||||
|
@ -171,7 +171,8 @@ static uint8_t cdc_acm_get_int_in(struct usbd_class_data *const c_data)
|
||||||
const struct cdc_acm_uart_config *cfg = dev->config;
|
const struct cdc_acm_uart_config *cfg = dev->config;
|
||||||
struct usbd_cdc_acm_desc *desc = cfg->desc;
|
struct usbd_cdc_acm_desc *desc = cfg->desc;
|
||||||
|
|
||||||
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
||||||
return desc->if0_hs_int_ep.bEndpointAddress;
|
return desc->if0_hs_int_ep.bEndpointAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,7 +186,8 @@ static uint8_t cdc_acm_get_bulk_in(struct usbd_class_data *const c_data)
|
||||||
const struct cdc_acm_uart_config *cfg = dev->config;
|
const struct cdc_acm_uart_config *cfg = dev->config;
|
||||||
struct usbd_cdc_acm_desc *desc = cfg->desc;
|
struct usbd_cdc_acm_desc *desc = cfg->desc;
|
||||||
|
|
||||||
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
||||||
return desc->if1_hs_in_ep.bEndpointAddress;
|
return desc->if1_hs_in_ep.bEndpointAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -199,7 +201,8 @@ static uint8_t cdc_acm_get_bulk_out(struct usbd_class_data *const c_data)
|
||||||
const struct cdc_acm_uart_config *cfg = dev->config;
|
const struct cdc_acm_uart_config *cfg = dev->config;
|
||||||
struct usbd_cdc_acm_desc *desc = cfg->desc;
|
struct usbd_cdc_acm_desc *desc = cfg->desc;
|
||||||
|
|
||||||
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
||||||
return desc->if1_hs_out_ep.bEndpointAddress;
|
return desc->if1_hs_out_ep.bEndpointAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,7 +213,8 @@ static size_t cdc_acm_get_bulk_mps(struct usbd_class_data *const c_data)
|
||||||
{
|
{
|
||||||
struct usbd_context *uds_ctx = usbd_class_get_ctx(c_data);
|
struct usbd_context *uds_ctx = usbd_class_get_ctx(c_data);
|
||||||
|
|
||||||
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
||||||
return 512U;
|
return 512U;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -350,7 +354,7 @@ static void *usbd_cdc_acm_get_desc(struct usbd_class_data *const c_data,
|
||||||
const struct device *dev = usbd_class_get_private(c_data);
|
const struct device *dev = usbd_class_get_private(c_data);
|
||||||
const struct cdc_acm_uart_config *cfg = dev->config;
|
const struct cdc_acm_uart_config *cfg = dev->config;
|
||||||
|
|
||||||
if (speed == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
|
||||||
return cfg->hs_desc;
|
return cfg->hs_desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -106,7 +106,8 @@ static uint8_t cdc_ecm_get_int_in(struct usbd_class_data *const c_data)
|
||||||
struct cdc_ecm_eth_data *data = dev->data;
|
struct cdc_ecm_eth_data *data = dev->data;
|
||||||
struct usbd_cdc_ecm_desc *desc = data->desc;
|
struct usbd_cdc_ecm_desc *desc = data->desc;
|
||||||
|
|
||||||
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
||||||
return desc->if0_hs_int_ep.bEndpointAddress;
|
return desc->if0_hs_int_ep.bEndpointAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,7 +121,8 @@ static uint8_t cdc_ecm_get_bulk_in(struct usbd_class_data *const c_data)
|
||||||
struct cdc_ecm_eth_data *data = dev->data;
|
struct cdc_ecm_eth_data *data = dev->data;
|
||||||
struct usbd_cdc_ecm_desc *desc = data->desc;
|
struct usbd_cdc_ecm_desc *desc = data->desc;
|
||||||
|
|
||||||
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
||||||
return desc->if1_1_hs_in_ep.bEndpointAddress;
|
return desc->if1_1_hs_in_ep.bEndpointAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -131,7 +133,8 @@ static uint16_t cdc_ecm_get_bulk_in_mps(struct usbd_class_data *const c_data)
|
||||||
{
|
{
|
||||||
struct usbd_context *uds_ctx = usbd_class_get_ctx(c_data);
|
struct usbd_context *uds_ctx = usbd_class_get_ctx(c_data);
|
||||||
|
|
||||||
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
||||||
return 512U;
|
return 512U;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,7 +148,8 @@ static uint8_t cdc_ecm_get_bulk_out(struct usbd_class_data *const c_data)
|
||||||
struct cdc_ecm_eth_data *data = dev->data;
|
struct cdc_ecm_eth_data *data = dev->data;
|
||||||
struct usbd_cdc_ecm_desc *desc = data->desc;
|
struct usbd_cdc_ecm_desc *desc = data->desc;
|
||||||
|
|
||||||
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
||||||
return desc->if1_1_hs_out_ep.bEndpointAddress;
|
return desc->if1_1_hs_out_ep.bEndpointAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -475,7 +479,7 @@ static void *usbd_cdc_ecm_get_desc(struct usbd_class_data *const c_data,
|
||||||
const struct device *dev = usbd_class_get_private(c_data);
|
const struct device *dev = usbd_class_get_private(c_data);
|
||||||
struct cdc_ecm_eth_data *const data = dev->data;
|
struct cdc_ecm_eth_data *const data = dev->data;
|
||||||
|
|
||||||
if (speed == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
|
||||||
return data->hs_desc;
|
return data->hs_desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -249,7 +249,8 @@ static uint8_t cdc_ncm_get_int_in(struct usbd_class_data *const c_data)
|
||||||
struct cdc_ncm_eth_data *data = dev->data;
|
struct cdc_ncm_eth_data *data = dev->data;
|
||||||
struct usbd_cdc_ncm_desc *desc = data->desc;
|
struct usbd_cdc_ncm_desc *desc = data->desc;
|
||||||
|
|
||||||
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
||||||
return desc->if0_hs_int_ep.bEndpointAddress;
|
return desc->if0_hs_int_ep.bEndpointAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -263,7 +264,8 @@ static uint8_t cdc_ncm_get_bulk_in(struct usbd_class_data *const c_data)
|
||||||
struct cdc_ncm_eth_data *data = dev->data;
|
struct cdc_ncm_eth_data *data = dev->data;
|
||||||
struct usbd_cdc_ncm_desc *desc = data->desc;
|
struct usbd_cdc_ncm_desc *desc = data->desc;
|
||||||
|
|
||||||
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
||||||
return desc->if1_1_hs_in_ep.bEndpointAddress;
|
return desc->if1_1_hs_in_ep.bEndpointAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -274,7 +276,8 @@ static uint16_t cdc_ncm_get_bulk_in_mps(struct usbd_class_data *const c_data)
|
||||||
{
|
{
|
||||||
struct usbd_context *uds_ctx = usbd_class_get_ctx(c_data);
|
struct usbd_context *uds_ctx = usbd_class_get_ctx(c_data);
|
||||||
|
|
||||||
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
||||||
return 512U;
|
return 512U;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -288,7 +291,8 @@ static uint8_t cdc_ncm_get_bulk_out(struct usbd_class_data *const c_data)
|
||||||
struct cdc_ncm_eth_data *data = dev->data;
|
struct cdc_ncm_eth_data *data = dev->data;
|
||||||
struct usbd_cdc_ncm_desc *desc = data->desc;
|
struct usbd_cdc_ncm_desc *desc = data->desc;
|
||||||
|
|
||||||
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
||||||
return desc->if1_1_hs_out_ep.bEndpointAddress;
|
return desc->if1_1_hs_out_ep.bEndpointAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1009,7 +1013,7 @@ static void *usbd_cdc_ncm_get_desc(struct usbd_class_data *const c_data,
|
||||||
const struct device *dev = usbd_class_get_private(c_data);
|
const struct device *dev = usbd_class_get_private(c_data);
|
||||||
struct cdc_ncm_eth_data *const data = dev->data;
|
struct cdc_ncm_eth_data *const data = dev->data;
|
||||||
|
|
||||||
if (speed == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
|
||||||
return data->hs_desc;
|
return data->hs_desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -479,7 +479,7 @@ static void *usbd_hid_get_desc(struct usbd_class_data *const c_data,
|
||||||
const struct device *dev = usbd_class_get_private(c_data);
|
const struct device *dev = usbd_class_get_private(c_data);
|
||||||
const struct hid_device_config *dcfg = dev->config;
|
const struct hid_device_config *dcfg = dev->config;
|
||||||
|
|
||||||
if (speed == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
|
||||||
return dcfg->hs_desc;
|
return dcfg->hs_desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -344,7 +344,11 @@ static void *usbd_midi_class_get_desc(struct usbd_class_data *const class_data,
|
||||||
|
|
||||||
LOG_DBG("Get descriptors for %s", dev->name);
|
LOG_DBG("Get descriptors for %s", dev->name);
|
||||||
|
|
||||||
return (speed == USBD_SPEED_HS) ? config->hs_descs : config->fs_descs;
|
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
|
||||||
|
return config->hs_descs;
|
||||||
|
}
|
||||||
|
|
||||||
|
return config->fs_descs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -382,7 +386,8 @@ static uint8_t usbd_midi_get_bulk_in(struct usbd_class_data *const class_data)
|
||||||
const struct device *dev = usbd_class_get_private(class_data);
|
const struct device *dev = usbd_class_get_private(class_data);
|
||||||
const struct usbd_midi_config *cfg = dev->config;
|
const struct usbd_midi_config *cfg = dev->config;
|
||||||
|
|
||||||
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
||||||
return cfg->desc->if1_1_in_ep_hs.bEndpointAddress;
|
return cfg->desc->if1_1_in_ep_hs.bEndpointAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -395,7 +400,8 @@ static uint8_t usbd_midi_get_bulk_out(struct usbd_class_data *const class_data)
|
||||||
const struct device *dev = usbd_class_get_private(class_data);
|
const struct device *dev = usbd_class_get_private(class_data);
|
||||||
const struct usbd_midi_config *cfg = dev->config;
|
const struct usbd_midi_config *cfg = dev->config;
|
||||||
|
|
||||||
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
||||||
return cfg->desc->if1_1_out_ep_hs.bEndpointAddress;
|
return cfg->desc->if1_1_out_ep_hs.bEndpointAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,7 @@ struct CSW {
|
||||||
#define MSC_NUM_INSTANCES CONFIG_USBD_MSC_INSTANCES_COUNT
|
#define MSC_NUM_INSTANCES CONFIG_USBD_MSC_INSTANCES_COUNT
|
||||||
|
|
||||||
/* Can be 64 if device is not High-Speed capable */
|
/* Can be 64 if device is not High-Speed capable */
|
||||||
#define MSC_BUF_SIZE 512
|
#define MSC_BUF_SIZE USBD_MAX_BULK_MPS
|
||||||
|
|
||||||
UDC_BUF_POOL_DEFINE(msc_ep_pool,
|
UDC_BUF_POOL_DEFINE(msc_ep_pool,
|
||||||
MSC_NUM_INSTANCES * 2, MSC_BUF_SIZE,
|
MSC_NUM_INSTANCES * 2, MSC_BUF_SIZE,
|
||||||
|
@ -149,7 +149,8 @@ static uint8_t msc_get_bulk_in(struct usbd_class_data *const c_data)
|
||||||
struct msc_bot_ctx *ctx = usbd_class_get_private(c_data);
|
struct msc_bot_ctx *ctx = usbd_class_get_private(c_data);
|
||||||
struct msc_bot_desc *desc = ctx->desc;
|
struct msc_bot_desc *desc = ctx->desc;
|
||||||
|
|
||||||
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
||||||
return desc->if0_hs_in_ep.bEndpointAddress;
|
return desc->if0_hs_in_ep.bEndpointAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,7 +163,8 @@ static uint8_t msc_get_bulk_out(struct usbd_class_data *const c_data)
|
||||||
struct msc_bot_ctx *ctx = usbd_class_get_private(c_data);
|
struct msc_bot_ctx *ctx = usbd_class_get_private(c_data);
|
||||||
struct msc_bot_desc *desc = ctx->desc;
|
struct msc_bot_desc *desc = ctx->desc;
|
||||||
|
|
||||||
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
|
||||||
return desc->if0_hs_out_ep.bEndpointAddress;
|
return desc->if0_hs_out_ep.bEndpointAddress;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -755,7 +757,7 @@ static void *msc_bot_get_desc(struct usbd_class_data *const c_data,
|
||||||
{
|
{
|
||||||
struct msc_bot_ctx *ctx = usbd_class_get_private(c_data);
|
struct msc_bot_ctx *ctx = usbd_class_get_private(c_data);
|
||||||
|
|
||||||
if (speed == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
|
||||||
return ctx->hs_desc;
|
return ctx->hs_desc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -890,7 +890,7 @@ static void *uac2_get_desc(struct usbd_class_data *const c_data,
|
||||||
struct device *dev = usbd_class_get_private(c_data);
|
struct device *dev = usbd_class_get_private(c_data);
|
||||||
const struct uac2_cfg *cfg = dev->config;
|
const struct uac2_cfg *cfg = dev->config;
|
||||||
|
|
||||||
if (speed == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
|
||||||
return cfg->hs_descriptors;
|
return cfg->hs_descriptors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -472,9 +472,11 @@ static int sreq_get_desc_cfg(struct usbd_context *const uds_ctx,
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the other-speed-configuration-descriptor is requested and the
|
* If the other-speed-configuration-descriptor is requested and the
|
||||||
* controller does not support high speed, respond with an error.
|
* controller (or stack) does not support high speed, respond with
|
||||||
|
* an error.
|
||||||
*/
|
*/
|
||||||
if (other_cfg && usbd_caps_speed(uds_ctx) != USBD_SPEED_HS) {
|
if (other_cfg && !(USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
(usbd_caps_speed(uds_ctx) == USBD_SPEED_HS))) {
|
||||||
errno = -ENOTSUP;
|
errno = -ENOTSUP;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -691,7 +693,8 @@ static int sreq_get_dev_qualifier(struct usbd_context *const uds_ctx,
|
||||||
* If the Device Qualifier descriptor is requested and the controller
|
* If the Device Qualifier descriptor is requested and the controller
|
||||||
* does not support high speed, respond with an error.
|
* does not support high speed, respond with an error.
|
||||||
*/
|
*/
|
||||||
if (usbd_caps_speed(uds_ctx) != USBD_SPEED_HS) {
|
if (!USBD_SUPPORTS_HIGH_SPEED ||
|
||||||
|
usbd_caps_speed(uds_ctx) != USBD_SPEED_HS) {
|
||||||
errno = -ENOTSUP;
|
errno = -ENOTSUP;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -215,7 +215,7 @@ usbd_class_node_get(const char *name, const enum usbd_speed speed)
|
||||||
return c_nd;
|
return c_nd;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (speed == USBD_SPEED_HS) {
|
} else if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
|
||||||
STRUCT_SECTION_FOREACH_ALTERNATE(usbd_class_hs,
|
STRUCT_SECTION_FOREACH_ALTERNATE(usbd_class_hs,
|
||||||
usbd_class_node, c_nd) {
|
usbd_class_node, c_nd) {
|
||||||
if (strcmp(name, c_nd->c_data->name) == 0) {
|
if (strcmp(name, c_nd->c_data->name) == 0) {
|
||||||
|
@ -358,7 +358,7 @@ int usbd_register_all_classes(struct usbd_context *const uds_ctx,
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (speed == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
|
||||||
STRUCT_SECTION_FOREACH_ALTERNATE(usbd_class_hs, usbd_class_node, c_nd) {
|
STRUCT_SECTION_FOREACH_ALTERNATE(usbd_class_hs, usbd_class_node, c_nd) {
|
||||||
if (blocklist != NULL && is_blocklisted(c_nd, blocklist)) {
|
if (blocklist != NULL && is_blocklisted(c_nd, blocklist)) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -430,7 +430,7 @@ int usbd_unregister_class(struct usbd_context *const uds_ctx,
|
||||||
/* TODO: The use of atomic here does not make this code thread safe.
|
/* TODO: The use of atomic here does not make this code thread safe.
|
||||||
* The atomic should be changed to something else.
|
* The atomic should be changed to something else.
|
||||||
*/
|
*/
|
||||||
if (speed == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
|
||||||
STRUCT_SECTION_FOREACH_ALTERNATE(usbd_class_hs,
|
STRUCT_SECTION_FOREACH_ALTERNATE(usbd_class_hs,
|
||||||
usbd_class_node, i) {
|
usbd_class_node, i) {
|
||||||
if ((i->c_data == c_nd->c_data) &&
|
if ((i->c_data == c_nd->c_data) &&
|
||||||
|
@ -470,7 +470,7 @@ int usbd_unregister_all_classes(struct usbd_context *const uds_ctx,
|
||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
if (speed == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
|
||||||
STRUCT_SECTION_FOREACH_ALTERNATE(usbd_class_hs, usbd_class_node, c_nd) {
|
STRUCT_SECTION_FOREACH_ALTERNATE(usbd_class_hs, usbd_class_node, c_nd) {
|
||||||
ret = usbd_unregister_class(uds_ctx, c_nd->c_data->name,
|
ret = usbd_unregister_class(uds_ctx, c_nd->c_data->name,
|
||||||
speed, cfg);
|
speed, cfg);
|
||||||
|
|
|
@ -266,6 +266,12 @@ int usbd_add_configuration(struct usbd_context *const uds_ctx,
|
||||||
goto add_configuration_exit;
|
goto add_configuration_exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (speed == USBD_SPEED_HS && !USBD_SUPPORTS_HIGH_SPEED) {
|
||||||
|
LOG_ERR("Stack was compiled without High-Speed support");
|
||||||
|
ret = -ENOTSUP;
|
||||||
|
goto add_configuration_exit;
|
||||||
|
}
|
||||||
|
|
||||||
if (speed == USBD_SPEED_HS &&
|
if (speed == USBD_SPEED_HS &&
|
||||||
usbd_caps_speed(uds_ctx) == USBD_SPEED_FS) {
|
usbd_caps_speed(uds_ctx) == USBD_SPEED_FS) {
|
||||||
LOG_ERR("Controller doesn't support HS");
|
LOG_ERR("Controller doesn't support HS");
|
||||||
|
|
|
@ -228,12 +228,14 @@ int usbd_device_shutdown_core(struct usbd_context *const uds_ctx)
|
||||||
struct usbd_config_node *cfg_nd;
|
struct usbd_config_node *cfg_nd;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
SYS_SLIST_FOR_EACH_CONTAINER(&uds_ctx->hs_configs, cfg_nd, node) {
|
if (USBD_SUPPORTS_HIGH_SPEED) {
|
||||||
uint8_t cfg_value = usbd_config_get_value(cfg_nd);
|
SYS_SLIST_FOR_EACH_CONTAINER(&uds_ctx->hs_configs, cfg_nd, node) {
|
||||||
|
uint8_t cfg_value = usbd_config_get_value(cfg_nd);
|
||||||
|
|
||||||
ret = usbd_class_remove_all(uds_ctx, USBD_SPEED_HS, cfg_value);
|
ret = usbd_class_remove_all(uds_ctx, USBD_SPEED_HS, cfg_value);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
LOG_ERR("Failed to cleanup registered classes, %d", ret);
|
LOG_ERR("Failed to cleanup registered classes, %d", ret);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ static inline uint8_t usbd_get_num_configs(const struct usbd_context *const uds_
|
||||||
|
|
||||||
if (speed == USBD_SPEED_FS) {
|
if (speed == USBD_SPEED_FS) {
|
||||||
desc = uds_ctx->fs_desc;
|
desc = uds_ctx->fs_desc;
|
||||||
} else if (speed == USBD_SPEED_HS) {
|
} else if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
|
||||||
desc = uds_ctx->hs_desc;
|
desc = uds_ctx->hs_desc;
|
||||||
} else {
|
} else {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -70,7 +70,7 @@ static inline void usbd_set_num_configs(struct usbd_context *const uds_ctx,
|
||||||
|
|
||||||
if (speed == USBD_SPEED_FS) {
|
if (speed == USBD_SPEED_FS) {
|
||||||
desc = uds_ctx->fs_desc;
|
desc = uds_ctx->fs_desc;
|
||||||
} else if (speed == USBD_SPEED_HS) {
|
} else if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
|
||||||
desc = uds_ctx->hs_desc;
|
desc = uds_ctx->hs_desc;
|
||||||
} else {
|
} else {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -281,18 +281,20 @@ int usbd_init_configurations(struct usbd_context *const uds_ctx)
|
||||||
|
|
||||||
usbd_init_update_fs_mps0(uds_ctx);
|
usbd_init_update_fs_mps0(uds_ctx);
|
||||||
|
|
||||||
SYS_SLIST_FOR_EACH_CONTAINER(&uds_ctx->hs_configs, cfg_nd, node) {
|
if (USBD_SUPPORTS_HIGH_SPEED) {
|
||||||
int ret;
|
SYS_SLIST_FOR_EACH_CONTAINER(&uds_ctx->hs_configs, cfg_nd, node) {
|
||||||
|
int ret;
|
||||||
|
|
||||||
ret = init_configuration(uds_ctx, USBD_SPEED_HS, cfg_nd);
|
ret = init_configuration(uds_ctx, USBD_SPEED_HS, cfg_nd);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
LOG_ERR("Failed to init HS configuration %u",
|
LOG_ERR("Failed to init HS configuration %u",
|
||||||
usbd_config_get_value(cfg_nd));
|
usbd_config_get_value(cfg_nd));
|
||||||
return ret;
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
LOG_INF("HS bNumConfigurations %u",
|
||||||
|
usbd_get_num_configs(uds_ctx, USBD_SPEED_HS));
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG_INF("HS bNumConfigurations %u",
|
|
||||||
usbd_get_num_configs(uds_ctx, USBD_SPEED_HS));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SYS_SLIST_FOR_EACH_CONTAINER(&uds_ctx->fs_configs, cfg_nd, node) {
|
SYS_SLIST_FOR_EACH_CONTAINER(&uds_ctx->fs_configs, cfg_nd, node) {
|
||||||
|
|
|
@ -147,7 +147,8 @@ static int register_classes(const struct shell *sh)
|
||||||
shell_print(sh, "dev: register FS %s", c_nd->c_data->name);
|
shell_print(sh, "dev: register FS %s", c_nd->c_data->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (usbd_caps_speed(my_uds_ctx) != USBD_SPEED_HS) {
|
if (!USBD_SUPPORTS_HIGH_SPEED ||
|
||||||
|
usbd_caps_speed(my_uds_ctx) != USBD_SPEED_HS) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -136,7 +136,8 @@ static void *usb_test_enable(void)
|
||||||
err = usbd_add_descriptor(&test_usbd, &test_sn);
|
err = usbd_add_descriptor(&test_usbd, &test_sn);
|
||||||
zassert_equal(err, 0, "Failed to initialize descriptor (%d)", err);
|
zassert_equal(err, 0, "Failed to initialize descriptor (%d)", err);
|
||||||
|
|
||||||
if (usbd_caps_speed(&test_usbd) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_caps_speed(&test_usbd) == USBD_SPEED_HS) {
|
||||||
err = usbd_add_configuration(&test_usbd, USBD_SPEED_HS, &test_hs_config);
|
err = usbd_add_configuration(&test_usbd, USBD_SPEED_HS, &test_hs_config);
|
||||||
zassert_equal(err, 0, "Failed to add configuration (%d)");
|
zassert_equal(err, 0, "Failed to add configuration (%d)");
|
||||||
}
|
}
|
||||||
|
@ -144,7 +145,8 @@ static void *usb_test_enable(void)
|
||||||
err = usbd_add_configuration(&test_usbd, USBD_SPEED_FS, &test_fs_config);
|
err = usbd_add_configuration(&test_usbd, USBD_SPEED_FS, &test_fs_config);
|
||||||
zassert_equal(err, 0, "Failed to add configuration (%d)");
|
zassert_equal(err, 0, "Failed to add configuration (%d)");
|
||||||
|
|
||||||
if (usbd_caps_speed(&test_usbd) == USBD_SPEED_HS) {
|
if (USBD_SUPPORTS_HIGH_SPEED &&
|
||||||
|
usbd_caps_speed(&test_usbd) == USBD_SPEED_HS) {
|
||||||
err = usbd_register_all_classes(&test_usbd, USBD_SPEED_HS, 1, NULL);
|
err = usbd_register_all_classes(&test_usbd, USBD_SPEED_HS, 1, NULL);
|
||||||
zassert_equal(err, 0, "Failed to unregister all instances(%d)");
|
zassert_equal(err, 0, "Failed to unregister all instances(%d)");
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue