@@ -51,10 +51,6 @@ UDC_BUF_POOL_DEFINE(cdc_acm_ep_pool,
51
51
#define CDC_ACM_RX_FIFO_BUSY 4
52
52
#define CDC_ACM_TX_FIFO_BUSY 5
53
53
54
- static struct k_work_q cdc_acm_work_q ;
55
- static K_KERNEL_STACK_DEFINE (cdc_acm_stack ,
56
- CONFIG_USBD_CDC_ACM_STACK_SIZE ) ;
57
-
58
54
struct cdc_acm_uart_fifo {
59
55
struct ring_buf * rb ;
60
56
bool irq ;
@@ -148,6 +144,24 @@ struct net_buf *cdc_acm_buf_alloc(const uint8_t ep)
148
144
return buf ;
149
145
}
150
146
147
+ #if CONFIG_USBD_CDC_ACM_WORKQUEUE
148
+ static struct k_work_q cdc_acm_work_q ;
149
+ static K_KERNEL_STACK_DEFINE (cdc_acm_stack ,
150
+ CONFIG_USBD_CDC_ACM_STACK_SIZE ) ;
151
+
152
+ static int usbd_cdc_acm_init_wq (void )
153
+ {
154
+ k_work_queue_init (& cdc_acm_work_q );
155
+ k_work_queue_start (& cdc_acm_work_q , cdc_acm_stack ,
156
+ K_KERNEL_STACK_SIZEOF (cdc_acm_stack ),
157
+ CONFIG_SYSTEM_WORKQUEUE_PRIORITY , NULL );
158
+ k_thread_name_set (& cdc_acm_work_q .thread , "cdc_acm_work_q" );
159
+
160
+ return 0 ;
161
+ }
162
+
163
+ SYS_INIT (usbd_cdc_acm_init_wq , POST_KERNEL , CONFIG_KERNEL_INIT_PRIORITY_DEFAULT );
164
+
151
165
static ALWAYS_INLINE int cdc_acm_work_submit (struct k_work * work )
152
166
{
153
167
return k_work_submit_to_queue (& cdc_acm_work_q , work );
@@ -164,6 +178,23 @@ static ALWAYS_INLINE bool check_wq_ctx(const struct device *dev)
164
178
return k_current_get () == k_work_queue_thread_get (& cdc_acm_work_q );
165
179
}
166
180
181
+ #else /* Use system workqueue */
182
+
183
+ static ALWAYS_INLINE int cdc_acm_work_submit (struct k_work * work )
184
+ {
185
+ return k_work_submit (work );
186
+ }
187
+
188
+ static ALWAYS_INLINE int cdc_acm_work_schedule (struct k_work_delayable * work ,
189
+ k_timeout_t delay )
190
+ {
191
+ return k_work_schedule (work , delay );
192
+ }
193
+
194
+ #define check_wq_ctx (dev ) true
195
+
196
+ #endif /* CONFIG_USBD_CDC_ACM_WORKQUEUE */
197
+
167
198
static uint8_t cdc_acm_get_int_in (struct usbd_class_data * const c_data )
168
199
{
169
200
struct usbd_context * uds_ctx = usbd_class_get_ctx (c_data );
@@ -1066,17 +1097,6 @@ static int cdc_acm_config_get(const struct device *dev,
1066
1097
}
1067
1098
#endif /* CONFIG_UART_USE_RUNTIME_CONFIGURE */
1068
1099
1069
- static int usbd_cdc_acm_init_wq (void )
1070
- {
1071
- k_work_queue_init (& cdc_acm_work_q );
1072
- k_work_queue_start (& cdc_acm_work_q , cdc_acm_stack ,
1073
- K_KERNEL_STACK_SIZEOF (cdc_acm_stack ),
1074
- CONFIG_SYSTEM_WORKQUEUE_PRIORITY , NULL );
1075
- k_thread_name_set (& cdc_acm_work_q .thread , "cdc_acm_work_q" );
1076
-
1077
- return 0 ;
1078
- }
1079
-
1080
1100
static int usbd_cdc_acm_preinit (const struct device * dev )
1081
1101
{
1082
1102
struct cdc_acm_uart_data * const data = dev -> data ;
@@ -1329,5 +1349,3 @@ const static struct usb_desc_header *cdc_acm_hs_desc_##n[] = { \
1329
1349
&cdc_acm_uart_api);
1330
1350
1331
1351
DT_INST_FOREACH_STATUS_OKAY (USBD_CDC_ACM_DT_DEVICE_DEFINE );
1332
-
1333
- SYS_INIT (usbd_cdc_acm_init_wq , POST_KERNEL , CONFIG_KERNEL_INIT_PRIORITY_DEFAULT );
0 commit comments