VSF Documented
vsf_usbip_dcd.h
Go to the documentation of this file.
1/*****************************************************************************
2 * Copyright(C)2009-2022 by VSF Team *
3 * *
4 * Licensed under the Apache License, Version 2.0 (the "License"); *
5 * you may not use this file except in compliance with the License. *
6 * You may obtain a copy of the License at *
7 * *
8 * http://www.apache.org/licenses/LICENSE-2.0 *
9 * *
10 * Unless required by applicable law or agreed to in writing, software *
11 * distributed under the License is distributed on an "AS IS" BASIS, *
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *
13 * See the License for the specific language governing permissions and *
14 * limitations under the License. *
15 * *
16 ****************************************************************************/
17
18#ifndef __VSF_USBIP_DCD_H__
19#define __VSF_USBIP_DCD_H__
20
21/*============================ INCLUDES ======================================*/
22
24
25#if VSF_USE_USB_DEVICE == ENABLED && VSF_USBD_USE_DCD_USBIP == ENABLED
26
29#include "kernel/vsf_kernel.h"
30
31#if defined(__VSF_USBIP_DCD_CLASS_IMPLEMENT)
32# define __VSF_CLASS_IMPLEMENT__
33#endif
34
35#include "utilities/ooc_class.h"
36
37#ifdef __cplusplus
38extern "C" {
39#endif
40
41/*============================ MACROS ========================================*/
42
43#define VSF_USBIP_DCD_CFG_BACKEND_WIN 1
44#define VSF_USBIP_DCD_CFG_BACKEND_VSFSOCK 2
45#define VSF_USBIP_DCD_CFG_BACKEND_LWIP 3
46
47#ifndef VSF_USBIP_DCD_CFG_BACKEND
48// 1. platform related backend
49// 2. tcpip stack related backend
50// 3. vsf socket backend
51# if defined(__WIN__)
52# define VSF_USBIP_DCD_CFG_BACKEND VSF_USBIP_DCD_CFG_BACKEND_WIN
53# elif VSF_USE_LWIP == ENABLED
54# define VSF_USBIP_DCD_CFG_BACKEND VSF_USBIP_DCD_CFG_BACKEND_LWIP
55# elif VSF_USE_TCPIP == ENABLED
56# define VSF_USBIP_DCD_CFG_BACKEND VSF_USBIP_DCD_CFG_BACKEND_VSFSOCK
57# endif
58#endif
59
60#ifndef VSF_USBIP_DCD_CFG_PATH
61# define VSF_USBIP_DCD_CFG_PATH "/vsf/usbd/0"
62#endif
63
64/*============================ MACROFIED FUNCTIONS ===========================*/
65
66#define vsf_usb_dc_from_usbip_ip(__n, __obj, __drv_name) \
67 __USB_DC_FROM_IP(__n, (__obj), __drv_name, vk_usbip_usbd)
68
69#if VSF_USBIP_SERVER_CFG_DEBUG == ENABLED
70# define __vk_usbip_server_trace(...) \
71 vsf_trace_debug("usbip_server: " __VA_ARGS__)
72# define __vk_usbip_server_trace_buffer(...) \
73 vsf_trace_buffer(VSF_TRACE_DEBUG, __VA_ARGS__, VSF_TRACE_DF_DEFAULT)
74#else
75# define __vk_usbip_server_trace(...)
76# define __vk_usbip_server_trace_buffer(...)
77#endif
78
79#if VSF_USBIP_SERVER_CFG_DEBUG_TRAFFIC == ENABLED
80# define __vk_usbip_server_trace_rx(__buffer, __size) \
81 do { \
82 __vk_usbip_server_trace("recv %d bytes" VSF_TRACE_CFG_LINEEND, __size);\
83 __vk_usbip_server_trace_buffer(__buffer, __size); \
84 } while (0)
85
86# define __vk_usbip_server_trace_tx(__buffer, __size) \
87 do { \
88 __vk_usbip_server_trace("send %d bytes" VSF_TRACE_CFG_LINEEND, __size);\
89 __vk_usbip_server_trace_buffer(__buffer, __size); \
90 } while (0)
91#else
92# define __vk_usbip_server_trace_rx(__buffer, __size)
93# define __vk_usbip_server_trace_tx(__buffer, __size)
94#endif
95
96#if VSF_USBIP_SERVER_CFG_DEBUG_URB == ENABLED
97# define __vk_usbip_server_trace_urb_submit(__urb) \
98 do { \
99 __vk_usbip_server_trace("submit urb%d %s%d %d bytes" VSF_TRACE_CFG_LINEEND,\
100 (__urb)->req.seqnum, \
101 (__urb)->req.direction ? "IN" : "OUT", \
102 (__urb)->req.ep, \
103 (__urb)->req.transfer_length); \
104 if (!(__urb)->req.ep) { \
105 __vk_usbip_server_trace_buffer(&((__urb)->req.setup), 8); \
106 } \
107 if (!(__urb)->req.direction && (__urb)->req.transfer_length) { \
108 __vk_usbip_server_trace_buffer((__urb)->dynmem.buffer, (__urb)->req.transfer_length);\
109 } \
110 } while (0)
111
112# define __vk_usbip_server_trace_urb_done(__urb) \
113 do { \
114 __vk_usbip_server_trace("done urb%d %s%d " VSF_TRACE_CFG_LINEEND, \
115 (__urb)->req.seqnum, \
116 (__urb)->req.direction ? "IN" : "OUT", \
117 (__urb)->req.ep); \
118 uint_fast32_t actual_length = be32_to_cpu((__urb)->rep.actual_length);\
119 if ((__urb)->req.direction && actual_length) { \
120 __vk_usbip_server_trace_buffer((__urb)->dynmem.buffer, actual_length);\
121 } \
122 } while (0)
123
124# define __vk_usbip_server_trace_urb_unlink(__urb) \
125 do { \
126 __vk_usbip_server_trace("unlink urb%d %s%d " VSF_TRACE_CFG_LINEEND, \
127 (__urb)->req.seqnum, \
128 (__urb)->req.direction ? "IN" : "OUT", \
129 (__urb)->req.ep); \
130 } while (0)
131#else
132# define __vk_usbip_server_trace_urb_submit(__urb)
133# define __vk_usbip_server_trace_urb_done(__urb)
134# define __vk_usbip_server_trace_urb_unlink(__urb)
135#endif
136
137/*============================ TYPES =========================================*/
138
139typedef struct vk_usbip_dcd_param_t {
142
143typedef struct vk_usbip_dcd_ep_t {
148
150 struct {
153 bool zlp;
157
159 public_member(
160 vk_usbip_dcd_param_t const * const param;
162
163 private_member(
164 struct {
165 usb_dc_evthandler_t evthandler;
166 void *param;
167 } callback;
168
169 union {
170 struct {
171 vk_usbip_dcd_ep_t ep_out[16];
172 vk_usbip_dcd_ep_t ep_in[16];
173 };
174 vk_usbip_dcd_ep_t ep[32];
175 };
176 struct usb_ctrlrequest_t setup;
177 uint16_t frame_number;
178 uint16_t mframe_number;
179 uint8_t address;
180 bool is_connected;
182};
183
184#if defined(__VSF_USBIP_DCD_CLASS_IMPLEMENT_BACKEND__) \
185 || defined(__VSF_USBIP_DCD_CLASS_IMPLEMENT)
186
187# undef __VSF_USBIP_DCD_CLASS_IMPLEMENT_BACKEND__
188
189enum {
190 VSF_USBIP_SERVER_EVT = VSF_EVT_USER + 0,
191 VSF_USBIP_SERVER_EVT_BACKEND_INIT_DONE = VSF_USBIP_SERVER_EVT + 0,
192 VSF_USBIP_SERVER_EVT_BACKEND_CONNECTED = VSF_USBIP_SERVER_EVT + 1,
193 VSF_USBIP_SERVER_EVT_BACKEND_DISCONNECTED = VSF_USBIP_SERVER_EVT + 2,
194 VSF_USBIP_SERVER_EVT_BACKEND_RECV_DONE = VSF_USBIP_SERVER_EVT + 3,
195 VSF_USBIP_SERVER_EVT_BACKEND_SEND_DONE = VSF_USBIP_SERVER_EVT + 4,
196
197 VSF_USBIP_USBD_EVT = VSF_EVT_USER + 0x10,
198};
199
200typedef struct vk_usbip_rep_ifs_t {
201 uint8_t bInterfaceClass;
202 uint8_t bInterfaceSubClass;
203 uint8_t bInterfaceProtocol;
204 uint8_t padding;
205} VSF_CAL_PACKED vk_usbip_rep_ifs_t;
206
207typedef struct vk_usbip_rep_dev_t {
208 uint32_t busnum;
209 uint32_t devnum;
210 uint32_t speed;
211 uint16_t idVendor;
212 uint16_t idProduct;
213 uint16_t bcdDevice;
214 uint8_t bDeviceClass;
215 uint8_t bDeviceSubClass;
216 uint8_t bDeviceProtocol;
217 uint8_t bConfigurationValue;
218 uint8_t bNumConfigurations;
219 uint8_t bNumInterfaces;
220 vk_usbip_rep_ifs_t ifs[16];
221} VSF_CAL_PACKED vk_usbip_rep_dev_t;
222
223typedef enum vk_usbip_cmd_t {
224 USBIP_CMD_INVALID = 0x00000000,
225 USBIP_CMD_SUBMIT = 0x00000001,
226 USBIP_CMD_UNLINK = 0x00000002,
227 USBIP_RET_SUBMIT = 0x00000003,
228 USBIP_RET_UNLINK = 0x00000004,
229
230 USBIP_REQ_DEVLIST = 0x8005,
231 USBIP_REP_DEVLIST = 0x8005,
232 USBIP_REQ_IMPORT = 0x8003,
233 USBIP_REP_IMPORT = 0x8003,
234} vk_usbip_cmd_t;
235
236typedef struct vk_usbip_op_common_t {
237 uint16_t version_bcd;
238 uint16_t code;
240} VSF_CAL_PACKED vk_usbip_op_common_t;
241
242// OP_REQ_DEVLIST
243typedef struct vk_usbip_req_devlist_t {
244 implement(vk_usbip_op_common_t)
245} VSF_CAL_PACKED vk_usbip_req_devlist_t;
246
247// OP_REP_DEVLIST
248// vk_usbip_rep_devlist_t
249// vk_usbip_rep_dev_t[devnum]
250// vk_usbip_rep_devlist_ifs_t[bNumInterfaces]
251typedef struct vk_usbip_rep_devlist_t {
252 implement(vk_usbip_op_common_t)
253 uint32_t devnum; // number of devices
254} VSF_CAL_PACKED vk_usbip_rep_devlist_t;
255
256// OP_REQ_IMPORT
257typedef struct vk_usbip_req_import_t {
258 implement(vk_usbip_op_common_t)
259 char busid[32];
260} VSF_CAL_PACKED vk_usbip_req_import_t;
261
262// OP_REP_IMPORT
263// vk_usbip_rep_import_t
264// vk_usbip_rep_dev_t
265typedef struct vk_usbip_rep_import_t {
266 implement(vk_usbip_op_common_t)
267} VSF_CAL_PACKED vk_usbip_rep_import_t;
268
269// USBIP_CMD_SUBMIT
270// vk_usbip_req_submit_t
271// data[transfer_length]
272typedef struct vk_usbip_req_submit_t {
273 uint32_t command;
274 uint32_t seqnum;
275 uint32_t devid;
276 uint32_t direction; // 0: OUT, 1: IN
277 uint32_t ep;
278 uint32_t transfer_flags;
279 uint32_t transfer_length;
280 uint32_t start_frame; // for ISO
281 uint32_t number_of_packets; // for ISO
282 uint32_t interval;
283 struct usb_ctrlrequest_t setup;
284} VSF_CAL_PACKED vk_usbip_req_submit_t;
285
286// USBIP_RET_SUBMIT
287// vk_usbip_rep_submit_t
288// data[actual_length]
289typedef struct vk_usbip_rep_submit_t {
290 uint32_t command;
291 uint32_t seqnum;
292 uint32_t devid;
293 uint32_t direction;
294 uint32_t ep;
296 uint32_t actual_length;
297 uint32_t start_frame; // for ISO
298 uint32_t number_of_packets; // for ISO
299 uint32_t error_count;
300} VSF_CAL_PACKED vk_usbip_rep_submit_t;
301
302// USBIP_CMD_UNLINK
303// vk_usbip_req_unlink_t
304// data[unknown]
305typedef struct vk_usbip_req_unlink_t {
306 uint32_t command;
307 uint32_t seqnum;
308 uint32_t devid;
309 uint32_t direction; // 0: OUT, 1: IN
310 uint32_t ep;
311 uint32_t seqnum_to_unlink;
312} VSF_CAL_PACKED vk_usbip_req_unlink_t;
313
314// USBIP_RET_UNLINK
315// vk_usbip_rep_unlink_t
316// data[unknown]
317typedef struct vk_usbip_rep_unlink_t {
318 uint32_t command;
319 uint32_t seqnum;
320 uint32_t devid;
321 uint32_t direction; // 0: OUT, 1: IN
322 uint32_t ep;
324} VSF_CAL_PACKED vk_usbip_rep_unlink_t;
325
326typedef struct vk_usbip_urb_t {
327 vsf_dlist_node_t urb_node;
328 vsf_dlist_node_t urb_node_ep;
329 vk_usbip_req_submit_t req;
330 union {
331 vk_usbip_rep_submit_t rep;
332 vk_usbip_rep_unlink_t unlink;
333 };
334 vsf_mem_t mem;
335 vsf_mem_t dynmem;
336
337 bool is_unlinked;
338 enum {
339 VSF_USBIP_URB_IDLE = 0,
340 VSF_USBIP_URB_QUEUED,
341 VSF_USBIP_URB_COMITTED,
342 VSF_USBIP_URB_DONE,
343 } state;
344} vk_usbip_urb_t;
345
346typedef struct vk_usbip_server_t {
347 vk_usbip_dcd_t *usbd;
348 vsf_teda_t teda;
349 uint16_t port;
350 vsf_err_t err;
351
352 enum {
353 VSF_USBIP_SERVER_REQ_COMMAND,
354 VSF_USBIP_SERVER_REQ_PARAM,
355 VSF_USBIP_SERVER_REQ_DATA,
356 } req_state;
357 vk_usbip_cmd_t command;
358
359 enum {
360 VSF_USBIP_SERVER_REP_DONE = 0,
361 VSF_USBIP_SERVER_REP_REPLY = 1,
362 VSF_USBIP_SERVER_REP_PARAM = 2,
363 VSF_USBIP_SERVER_REP_DATA = 3,
364
365 // for devlist
366 VSF_USBIP_SERVER_REP_DEVLIST_PATH = 2,
367 VSF_USBIP_SERVER_REP_DEVLIST_BUSID = 3,
368 VSF_USBIP_SERVER_REP_DEVLIST_DEV = 4,
369 VSF_USBIP_SERVER_REP_DEVLIST_CFG = 5,
370
371 // for import
372 VSF_USBIP_SERVER_REP_IMPORT_PATH = VSF_USBIP_SERVER_REP_DEVLIST_PATH,
373 VSF_USBIP_SERVER_REP_IMPORT_BUSID = VSF_USBIP_SERVER_REP_DEVLIST_BUSID,
374 VSF_USBIP_SERVER_REP_IMPORT_DEV = VSF_USBIP_SERVER_REP_DEVLIST_DEV,
375 } rep_state;
376 vk_usbip_cmd_t reply;
377
378 bool is_connected;
379 union {
380 uint32_t cmd32;
381 struct {
382 uint16_t version_bcd;
383 uint16_t cmd16;
385 vk_usbip_req_devlist_t devlist;
386 vk_usbip_req_import_t import;
387 vk_usbip_req_submit_t submit;
388 vk_usbip_req_unlink_t unlink;
389 } req;
390
391 union {
392 vk_usbip_op_common_t common;
393 vk_usbip_rep_devlist_t devlist;
394 vk_usbip_rep_import_t import;
395 vk_usbip_rep_unlink_t unlink;
396 uint8_t buffer[256]; // for path
397 } rep;
398
399 vk_usbip_rep_dev_t dev;
400 vsf_dlist_t urb_list;
401 vk_usbip_urb_t *cur_urb;
402} vk_usbip_server_t;
403#endif
404
405/*============================ GLOBAL VARIABLES ==============================*/
406/*============================ INCLUDES ======================================*/
407/*============================ PROTOTYPES ====================================*/
408
410extern void vk_usbip_usbd_fini(vk_usbip_dcd_t *usbd);
411extern void vk_usbip_usbd_reset(vk_usbip_dcd_t *usbd, usb_dc_cfg_t *cfg);
412
413extern void vk_usbip_usbd_connect(vk_usbip_dcd_t *usbd);
415extern void vk_usbip_usbd_wakeup(vk_usbip_dcd_t *usbd);
416
419
422
423extern void vk_usbip_usbd_get_setup(vk_usbip_dcd_t *usbd, uint8_t *buffer);
424extern void vk_usbip_usbd_status_stage(vk_usbip_dcd_t *usbd, bool is_in);
425
429
433
435
440
443
444extern void vk_usbip_usbd_irq(vk_usbip_dcd_t *usbd);
445
446#undef __VSF_USBIP_DCD_CLASS_IMPLEMENT
447
448#ifdef __cplusplus
449}
450#endif
451
452#endif
453#endif
454/* EOF */
vsf_err_t
Definition __type.h:42
Definition vsf_usbip_dcd.h:158
Definition vsf_eda.h:834
#define vsf_class(__name)
Definition ooc_class.h:48
unsigned short uint16_t
Definition stdint.h:7
unsigned char uint_fast8_t
Definition stdint.h:23
unsigned uint32_t
Definition stdint.h:9
unsigned int uint_fast32_t
Definition stdint.h:27
unsigned short uint_fast16_t
Definition stdint.h:25
unsigned char uint8_t
Definition stdint.h:5
Definition usb_common.h:85
Definition vsf_template_usb.h:316
Definition vsf_usbip_dcd.h:143
vsf_mem_t mem
Definition vsf_usbip_dcd.h:151
struct vk_usbip_dcd_ep_t::@199 transfer
bool zlp
Definition vsf_usbip_dcd.h:153
uint32_t size
Definition vsf_usbip_dcd.h:152
uint16_t size
Definition vsf_usbip_dcd.h:144
vsf_dlist_t urb_list
Definition vsf_usbip_dcd.h:149
usb_ep_type_t type
Definition vsf_usbip_dcd.h:145
bool is_stalled
Definition vsf_usbip_dcd.h:146
bool pending
Definition vsf_usbip_dcd.h:154
uint8_t ep
Definition vsf_usbip_dcd.h:147
Definition vsf_usbip_dcd.h:139
uint16_t port
Definition vsf_usbip_dcd.h:140
Definition vsf_list.h:888
Definition vsf_list.h:883
Definition vsf_utilities.h:51
#define unlink
Definition unistd.h:114
vk_av_control_type_t type
Definition vsf_audio.h:170
@ VSF_EVT_USER
Definition vsf_eda.h:621
uint32_t size
Definition vsf_memfs.h:50
uint8_t state
Definition vsf_msg_tree.h:247
struct vk_romfs_header_t VSF_CAL_PACKED
usb_ep_type_t
Definition vsf_template_usb.h:277
void(* usb_dc_evthandler_t)(void *param, usb_evt_t evt, uint_fast8_t value)
Definition vsf_template_usb.h:309
uint8_t status
Definition vsf_tgui.h:122
vsf_err_t vk_usbip_usbd_ep_transaction_enable_out(vk_usbip_dcd_t *usbd, uint_fast8_t ep)
Definition vsf_usbip_dcd.c:735
uint_fast32_t vk_usbip_usbd_ep_get_data_size(vk_usbip_dcd_t *usbd, uint_fast8_t ep)
Definition vsf_usbip_dcd.c:724
vsf_err_t vk_usbip_usbd_init(vk_usbip_dcd_t *usbd, usb_dc_cfg_t *cfg)
Definition vsf_usbip_dcd.c:605
uint_fast16_t vk_usbip_usbd_ep_get_size(vk_usbip_dcd_t *usbd, uint_fast8_t ep)
Definition vsf_usbip_dcd.c:698
void vk_usbip_usbd_connect(vk_usbip_dcd_t *usbd)
Definition vsf_usbip_dcd.c:627
uint_fast8_t vk_usbip_usbd_get_mframe_number(vk_usbip_dcd_t *usbd)
Definition vsf_usbip_dcd.c:662
uint_fast8_t vk_usbip_usbd_get_address(vk_usbip_dcd_t *usbd)
Definition vsf_usbip_dcd.c:652
void vk_usbip_usbd_set_address(vk_usbip_dcd_t *usbd, uint_fast8_t addr)
Definition vsf_usbip_dcd.c:647
void vk_usbip_usbd_wakeup(vk_usbip_dcd_t *usbd)
Definition vsf_usbip_dcd.c:643
vsf_err_t vk_usbip_usbd_ep_transaction_set_data_size(vk_usbip_dcd_t *usbd, uint_fast8_t ep, uint_fast16_t size)
Definition vsf_usbip_dcd.c:740
vsf_err_t vk_usbip_usbd_ep_transfer_send(vk_usbip_dcd_t *usbd, uint_fast8_t ep, uint8_t *buffer, uint_fast32_t size, bool zlp)
Definition vsf_usbip_dcd.c:762
vsf_err_t vk_usbip_usbd_ep_set_stall(vk_usbip_dcd_t *usbd, uint_fast8_t ep)
Definition vsf_usbip_dcd.c:704
vsf_err_t vk_usbip_usbd_ep_clear_stall(vk_usbip_dcd_t *usbd, uint_fast8_t ep)
Definition vsf_usbip_dcd.c:717
void vk_usbip_usbd_irq(vk_usbip_dcd_t *usbd)
Definition vsf_usbip_dcd.c:776
vsf_err_t vk_usbip_usbd_ep_transaction_write_buffer(vk_usbip_dcd_t *usbd, uint_fast8_t ep, uint8_t *buffer, uint_fast16_t size)
Definition vsf_usbip_dcd.c:745
void vk_usbip_usbd_get_setup(vk_usbip_dcd_t *usbd, uint8_t *buffer)
Definition vsf_usbip_dcd.c:667
void vk_usbip_usbd_fini(vk_usbip_dcd_t *usbd)
Definition vsf_usbip_dcd.c:616
uint_fast16_t vk_usbip_usbd_get_frame_number(vk_usbip_dcd_t *usbd)
Definition vsf_usbip_dcd.c:657
uint_fast8_t vk_usbip_usbd_ep_get_feature(vk_usbip_dcd_t *usbd, uint_fast8_t ep, uint_fast8_t feature)
Definition vsf_usbip_dcd.c:684
vsf_err_t vk_usbip_usbd_ep_add(vk_usbip_dcd_t *usbd, uint_fast8_t ep, usb_ep_type_t type, uint_fast16_t size)
Definition vsf_usbip_dcd.c:689
bool vk_usbip_usbd_ep_is_stalled(vk_usbip_dcd_t *usbd, uint_fast8_t ep)
Definition vsf_usbip_dcd.c:711
void vk_usbip_usbd_status_stage(vk_usbip_dcd_t *usbd, bool is_in)
Definition vsf_usbip_dcd.c:672
void vk_usbip_usbd_disconnect(vk_usbip_dcd_t *usbd)
Definition vsf_usbip_dcd.c:635
void vk_usbip_usbd_reset(vk_usbip_dcd_t *usbd, usb_dc_cfg_t *cfg)
Definition vsf_usbip_dcd.c:621
vsf_err_t vk_usbip_usbd_ep_transfer_recv(vk_usbip_dcd_t *usbd, uint_fast8_t ep, uint8_t *buffer, uint_fast32_t size)
Definition vsf_usbip_dcd.c:750
vsf_err_t vk_usbip_usbd_ep_transaction_read_buffer(vk_usbip_dcd_t *usbd, uint_fast8_t ep, uint8_t *buffer, uint_fast16_t size)
Definition vsf_usbip_dcd.c:730