Skip to content

Commit b3eb6f2

Browse files
tmon-nordickartben
authored andcommitted
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ń <[email protected]>
1 parent faeabc6 commit b3eb6f2

File tree

19 files changed

+105
-60
lines changed

19 files changed

+105
-60
lines changed

include/zephyr/usb/usbd.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ extern "C" {
3737
* @{
3838
*/
3939

40+
/* 1 if USB device stack is compiled with High-Speed support */
41+
#define USBD_SUPPORTS_HIGH_SPEED IS_EQ(CONFIG_USBD_MAX_SPEED, 1)
42+
43+
/* Maximum bulk max packet size the stack supports */
44+
#define USBD_MAX_BULK_MPS COND_CODE_1(USBD_SUPPORTS_HIGH_SPEED, (512), (64))
45+
4046
/*
4147
* The USB Unicode bString is encoded in UTF16LE, which means it takes up
4248
* twice the amount of bytes than the same string encoded in ASCII7.

samples/subsys/usb/common/sample_usbd_init.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,8 @@ struct usbd_context *sample_usbd_setup_device(usbd_msg_cb_t msg_cb)
126126
}
127127
/* doc add string descriptor end */
128128

129-
if (usbd_caps_speed(&sample_usbd) == USBD_SPEED_HS) {
129+
if (USBD_SUPPORTS_HIGH_SPEED &&
130+
usbd_caps_speed(&sample_usbd) == USBD_SPEED_HS) {
130131
err = usbd_add_configuration(&sample_usbd, USBD_SPEED_HS,
131132
&sample_hs_config);
132133
if (err) {

subsys/usb/device_next/class/bt_hci.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,13 +68,13 @@ static K_FIFO_DEFINE(bt_hci_tx_queue);
6868

6969
/*
7070
* Transfers through three endpoints proceed in a synchronous manner,
71-
* with maximum packet size of high speed bulk endpoint.
71+
* with maximum packet size of max supported speed bulk endpoint.
7272
*
7373
* REVISE: global (bulk, interrupt, iso) specific pools would be more
7474
* RAM usage efficient.
7575
*/
7676
UDC_BUF_POOL_DEFINE(bt_hci_ep_pool,
77-
3, 512,
77+
3, USBD_MAX_BULK_MPS,
7878
sizeof(struct udc_buf_info), NULL);
7979
/* HCI RX/TX threads */
8080
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)
138138
struct bt_hci_data *data = usbd_class_get_private(c_data);
139139
struct usbd_bt_hci_desc *desc = data->desc;
140140

141-
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
141+
if (USBD_SUPPORTS_HIGH_SPEED &&
142+
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
142143
return desc->if0_hs_in_ep.bEndpointAddress;
143144
}
144145

@@ -151,7 +152,8 @@ static uint8_t bt_hci_get_bulk_out(struct usbd_class_data *const c_data)
151152
struct bt_hci_data *data = usbd_class_get_private(c_data);
152153
struct usbd_bt_hci_desc *desc = data->desc;
153154

154-
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
155+
if (USBD_SUPPORTS_HIGH_SPEED &&
156+
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
155157
return desc->if0_hs_out_ep.bEndpointAddress;
156158
}
157159

@@ -449,7 +451,7 @@ static void *bt_hci_get_desc(struct usbd_class_data *const c_data,
449451
{
450452
struct bt_hci_data *data = usbd_class_get_private(c_data);
451453

452-
if (speed == USBD_SPEED_HS) {
454+
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
453455
return data->hs_desc;
454456
}
455457

subsys/usb/device_next/class/loopback.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ static void *lb_get_desc(struct usbd_class_data *const c_data,
254254
{
255255
struct lb_data *data = usbd_class_get_private(c_data);
256256

257-
if (speed == USBD_SPEED_HS) {
257+
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
258258
return data->hs_desc;
259259
}
260260

subsys/usb/device_next/class/usbd_cdc_acm.c

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ LOG_MODULE_REGISTER(usbd_cdc_acm, CONFIG_USBD_CDC_ACM_LOG_LEVEL);
3636

3737
UDC_BUF_POOL_DEFINE(cdc_acm_ep_pool,
3838
DT_NUM_INST_STATUS_OKAY(DT_DRV_COMPAT) * 2,
39-
512, sizeof(struct udc_buf_info), NULL);
39+
USBD_MAX_BULK_MPS, sizeof(struct udc_buf_info), NULL);
4040

4141
#define CDC_ACM_DEFAULT_LINECODING {sys_cpu_to_le32(115200), 0, 0, 8}
4242
#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)
171171
const struct cdc_acm_uart_config *cfg = dev->config;
172172
struct usbd_cdc_acm_desc *desc = cfg->desc;
173173

174-
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
174+
if (USBD_SUPPORTS_HIGH_SPEED &&
175+
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
175176
return desc->if0_hs_int_ep.bEndpointAddress;
176177
}
177178

@@ -185,7 +186,8 @@ static uint8_t cdc_acm_get_bulk_in(struct usbd_class_data *const c_data)
185186
const struct cdc_acm_uart_config *cfg = dev->config;
186187
struct usbd_cdc_acm_desc *desc = cfg->desc;
187188

188-
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
189+
if (USBD_SUPPORTS_HIGH_SPEED &&
190+
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
189191
return desc->if1_hs_in_ep.bEndpointAddress;
190192
}
191193

@@ -199,7 +201,8 @@ static uint8_t cdc_acm_get_bulk_out(struct usbd_class_data *const c_data)
199201
const struct cdc_acm_uart_config *cfg = dev->config;
200202
struct usbd_cdc_acm_desc *desc = cfg->desc;
201203

202-
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
204+
if (USBD_SUPPORTS_HIGH_SPEED &&
205+
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
203206
return desc->if1_hs_out_ep.bEndpointAddress;
204207
}
205208

@@ -210,7 +213,8 @@ static size_t cdc_acm_get_bulk_mps(struct usbd_class_data *const c_data)
210213
{
211214
struct usbd_context *uds_ctx = usbd_class_get_ctx(c_data);
212215

213-
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
216+
if (USBD_SUPPORTS_HIGH_SPEED &&
217+
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
214218
return 512U;
215219
}
216220

@@ -350,7 +354,7 @@ static void *usbd_cdc_acm_get_desc(struct usbd_class_data *const c_data,
350354
const struct device *dev = usbd_class_get_private(c_data);
351355
const struct cdc_acm_uart_config *cfg = dev->config;
352356

353-
if (speed == USBD_SPEED_HS) {
357+
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
354358
return cfg->hs_desc;
355359
}
356360

subsys/usb/device_next/class/usbd_cdc_ecm.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,8 @@ static uint8_t cdc_ecm_get_int_in(struct usbd_class_data *const c_data)
106106
struct cdc_ecm_eth_data *data = dev->data;
107107
struct usbd_cdc_ecm_desc *desc = data->desc;
108108

109-
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
109+
if (USBD_SUPPORTS_HIGH_SPEED &&
110+
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
110111
return desc->if0_hs_int_ep.bEndpointAddress;
111112
}
112113

@@ -120,7 +121,8 @@ static uint8_t cdc_ecm_get_bulk_in(struct usbd_class_data *const c_data)
120121
struct cdc_ecm_eth_data *data = dev->data;
121122
struct usbd_cdc_ecm_desc *desc = data->desc;
122123

123-
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
124+
if (USBD_SUPPORTS_HIGH_SPEED &&
125+
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
124126
return desc->if1_1_hs_in_ep.bEndpointAddress;
125127
}
126128

@@ -131,7 +133,8 @@ static uint16_t cdc_ecm_get_bulk_in_mps(struct usbd_class_data *const c_data)
131133
{
132134
struct usbd_context *uds_ctx = usbd_class_get_ctx(c_data);
133135

134-
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
136+
if (USBD_SUPPORTS_HIGH_SPEED &&
137+
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
135138
return 512U;
136139
}
137140

@@ -145,7 +148,8 @@ static uint8_t cdc_ecm_get_bulk_out(struct usbd_class_data *const c_data)
145148
struct cdc_ecm_eth_data *data = dev->data;
146149
struct usbd_cdc_ecm_desc *desc = data->desc;
147150

148-
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
151+
if (USBD_SUPPORTS_HIGH_SPEED &&
152+
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
149153
return desc->if1_1_hs_out_ep.bEndpointAddress;
150154
}
151155

@@ -475,7 +479,7 @@ static void *usbd_cdc_ecm_get_desc(struct usbd_class_data *const c_data,
475479
const struct device *dev = usbd_class_get_private(c_data);
476480
struct cdc_ecm_eth_data *const data = dev->data;
477481

478-
if (speed == USBD_SPEED_HS) {
482+
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
479483
return data->hs_desc;
480484
}
481485

subsys/usb/device_next/class/usbd_cdc_ncm.c

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,8 @@ static uint8_t cdc_ncm_get_int_in(struct usbd_class_data *const c_data)
249249
struct cdc_ncm_eth_data *data = dev->data;
250250
struct usbd_cdc_ncm_desc *desc = data->desc;
251251

252-
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
252+
if (USBD_SUPPORTS_HIGH_SPEED &&
253+
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
253254
return desc->if0_hs_int_ep.bEndpointAddress;
254255
}
255256

@@ -263,7 +264,8 @@ static uint8_t cdc_ncm_get_bulk_in(struct usbd_class_data *const c_data)
263264
struct cdc_ncm_eth_data *data = dev->data;
264265
struct usbd_cdc_ncm_desc *desc = data->desc;
265266

266-
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
267+
if (USBD_SUPPORTS_HIGH_SPEED &&
268+
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
267269
return desc->if1_1_hs_in_ep.bEndpointAddress;
268270
}
269271

@@ -274,7 +276,8 @@ static uint16_t cdc_ncm_get_bulk_in_mps(struct usbd_class_data *const c_data)
274276
{
275277
struct usbd_context *uds_ctx = usbd_class_get_ctx(c_data);
276278

277-
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
279+
if (USBD_SUPPORTS_HIGH_SPEED &&
280+
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
278281
return 512U;
279282
}
280283

@@ -288,7 +291,8 @@ static uint8_t cdc_ncm_get_bulk_out(struct usbd_class_data *const c_data)
288291
struct cdc_ncm_eth_data *data = dev->data;
289292
struct usbd_cdc_ncm_desc *desc = data->desc;
290293

291-
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
294+
if (USBD_SUPPORTS_HIGH_SPEED &&
295+
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
292296
return desc->if1_1_hs_out_ep.bEndpointAddress;
293297
}
294298

@@ -1009,7 +1013,7 @@ static void *usbd_cdc_ncm_get_desc(struct usbd_class_data *const c_data,
10091013
const struct device *dev = usbd_class_get_private(c_data);
10101014
struct cdc_ncm_eth_data *const data = dev->data;
10111015

1012-
if (speed == USBD_SPEED_HS) {
1016+
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
10131017
return data->hs_desc;
10141018
}
10151019

subsys/usb/device_next/class/usbd_hid.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ static void *usbd_hid_get_desc(struct usbd_class_data *const c_data,
479479
const struct device *dev = usbd_class_get_private(c_data);
480480
const struct hid_device_config *dcfg = dev->config;
481481

482-
if (speed == USBD_SPEED_HS) {
482+
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
483483
return dcfg->hs_desc;
484484
}
485485

subsys/usb/device_next/class/usbd_midi2.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -344,7 +344,11 @@ static void *usbd_midi_class_get_desc(struct usbd_class_data *const class_data,
344344

345345
LOG_DBG("Get descriptors for %s", dev->name);
346346

347-
return (speed == USBD_SPEED_HS) ? config->hs_descs : config->fs_descs;
347+
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
348+
return config->hs_descs;
349+
}
350+
351+
return config->fs_descs;
348352
}
349353

350354

@@ -382,7 +386,8 @@ static uint8_t usbd_midi_get_bulk_in(struct usbd_class_data *const class_data)
382386
const struct device *dev = usbd_class_get_private(class_data);
383387
const struct usbd_midi_config *cfg = dev->config;
384388

385-
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
389+
if (USBD_SUPPORTS_HIGH_SPEED &&
390+
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
386391
return cfg->desc->if1_1_in_ep_hs.bEndpointAddress;
387392
}
388393

@@ -395,7 +400,8 @@ static uint8_t usbd_midi_get_bulk_out(struct usbd_class_data *const class_data)
395400
const struct device *dev = usbd_class_get_private(class_data);
396401
const struct usbd_midi_config *cfg = dev->config;
397402

398-
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
403+
if (USBD_SUPPORTS_HIGH_SPEED &&
404+
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
399405
return cfg->desc->if1_1_out_ep_hs.bEndpointAddress;
400406
}
401407

subsys/usb/device_next/class/usbd_msc.c

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ struct CSW {
6161
#define MSC_NUM_INSTANCES CONFIG_USBD_MSC_INSTANCES_COUNT
6262

6363
/* Can be 64 if device is not High-Speed capable */
64-
#define MSC_BUF_SIZE 512
64+
#define MSC_BUF_SIZE USBD_MAX_BULK_MPS
6565

6666
UDC_BUF_POOL_DEFINE(msc_ep_pool,
6767
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)
149149
struct msc_bot_ctx *ctx = usbd_class_get_private(c_data);
150150
struct msc_bot_desc *desc = ctx->desc;
151151

152-
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
152+
if (USBD_SUPPORTS_HIGH_SPEED &&
153+
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
153154
return desc->if0_hs_in_ep.bEndpointAddress;
154155
}
155156

@@ -162,7 +163,8 @@ static uint8_t msc_get_bulk_out(struct usbd_class_data *const c_data)
162163
struct msc_bot_ctx *ctx = usbd_class_get_private(c_data);
163164
struct msc_bot_desc *desc = ctx->desc;
164165

165-
if (usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
166+
if (USBD_SUPPORTS_HIGH_SPEED &&
167+
usbd_bus_speed(uds_ctx) == USBD_SPEED_HS) {
166168
return desc->if0_hs_out_ep.bEndpointAddress;
167169
}
168170

@@ -755,7 +757,7 @@ static void *msc_bot_get_desc(struct usbd_class_data *const c_data,
755757
{
756758
struct msc_bot_ctx *ctx = usbd_class_get_private(c_data);
757759

758-
if (speed == USBD_SPEED_HS) {
760+
if (USBD_SUPPORTS_HIGH_SPEED && speed == USBD_SPEED_HS) {
759761
return ctx->hs_desc;
760762
}
761763

0 commit comments

Comments
 (0)