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 uint_fast32_t actual_length = be32_to_cpu((__urb)->rep.actual_length);\
115 __vk_usbip_server_trace("done urb%d %s%d %d bytes" VSF_TRACE_CFG_LINEEND,\
116 (__urb)->req.seqnum, \
117 (__urb)->req.direction ? "IN" : "OUT", \
118 (__urb)->req.ep, \
119 actual_length); \
120 if ((__urb)->req.direction && actual_length) { \
121 __vk_usbip_server_trace_buffer((__urb)->dynmem.buffer, actual_length);\
122 } \
123 } while (0)
124
125# define __vk_usbip_server_trace_urb_unlink(__urb) \
126 do { \
127 __vk_usbip_server_trace("unlink urb%d %s%d " VSF_TRACE_CFG_LINEEND, \
128 (__urb)->req.seqnum, \
129 (__urb)->req.direction ? "IN" : "OUT", \
130 (__urb)->req.ep); \
131 } while (0)
132#else
133# define __vk_usbip_server_trace_urb_submit(__urb)
134# define __vk_usbip_server_trace_urb_done(__urb)
135# define __vk_usbip_server_trace_urb_unlink(__urb)
136#endif
137
138/*============================ TYPES =========================================*/
139
140typedef struct vk_usbip_dcd_param_t {
143
144typedef struct vk_usbip_dcd_ep_t {
149
151 struct {
154 bool zlp;
158
160 public_member(
161 vk_usbip_dcd_param_t const * const param;
163
164 private_member(
165 struct {
166 usb_dc_evthandler_t evthandler;
167 void *param;
168 } callback;
169
170 union {
171 struct {
172 vk_usbip_dcd_ep_t ep_out[16];
173 vk_usbip_dcd_ep_t ep_in[16];
174 };
175 vk_usbip_dcd_ep_t ep[32];
176 };
177 struct usb_ctrlrequest_t setup;
178 uint16_t frame_number;
179 uint16_t mframe_number;
180 uint8_t address;
181 bool is_connected;
183};
184
185#if defined(__VSF_USBIP_DCD_CLASS_IMPLEMENT_BACKEND__) \
186 || defined(__VSF_USBIP_DCD_CLASS_IMPLEMENT)
187
188# undef __VSF_USBIP_DCD_CLASS_IMPLEMENT_BACKEND__
189
190enum {
191 VSF_USBIP_SERVER_EVT = VSF_EVT_USER + 0,
192 VSF_USBIP_SERVER_EVT_BACKEND_INIT_DONE = VSF_USBIP_SERVER_EVT + 0,
193 VSF_USBIP_SERVER_EVT_BACKEND_CONNECTED = VSF_USBIP_SERVER_EVT + 1,
194 VSF_USBIP_SERVER_EVT_BACKEND_DISCONNECTED = VSF_USBIP_SERVER_EVT + 2,
195 VSF_USBIP_SERVER_EVT_BACKEND_RECV_DONE = VSF_USBIP_SERVER_EVT + 3,
196 VSF_USBIP_SERVER_EVT_BACKEND_SEND_DONE = VSF_USBIP_SERVER_EVT + 4,
197
198 VSF_USBIP_USBD_EVT = VSF_EVT_USER + 0x10,
199};
200
201typedef struct vk_usbip_rep_ifs_t {
202 uint8_t bInterfaceClass;
203 uint8_t bInterfaceSubClass;
204 uint8_t bInterfaceProtocol;
205 uint8_t padding;
206} VSF_CAL_PACKED vk_usbip_rep_ifs_t;
207
208typedef struct vk_usbip_rep_dev_t {
209 uint32_t busnum;
210 uint32_t devnum;
211 uint32_t speed;
212 uint16_t idVendor;
213 uint16_t idProduct;
214 uint16_t bcdDevice;
215 uint8_t bDeviceClass;
216 uint8_t bDeviceSubClass;
217 uint8_t bDeviceProtocol;
218 uint8_t bConfigurationValue;
219 uint8_t bNumConfigurations;
220 uint8_t bNumInterfaces;
221 vk_usbip_rep_ifs_t ifs[16];
222} VSF_CAL_PACKED vk_usbip_rep_dev_t;
223
224typedef enum vk_usbip_cmd_t {
225 USBIP_CMD_INVALID = 0x00000000,
226 USBIP_CMD_SUBMIT = 0x00000001,
227 USBIP_CMD_UNLINK = 0x00000002,
228 USBIP_RET_SUBMIT = 0x00000003,
229 USBIP_RET_UNLINK = 0x00000004,
230
231 USBIP_REQ_DEVLIST = 0x8005,
232 USBIP_REP_DEVLIST = 0x8005,
233 USBIP_REQ_IMPORT = 0x8003,
234 USBIP_REP_IMPORT = 0x8003,
235} vk_usbip_cmd_t;
236
237typedef struct vk_usbip_op_common_t {
238 uint16_t version_bcd;
239 uint16_t code;
241} VSF_CAL_PACKED vk_usbip_op_common_t;
242
243// OP_REQ_DEVLIST
244typedef struct vk_usbip_req_devlist_t {
245 implement(vk_usbip_op_common_t)
246} VSF_CAL_PACKED vk_usbip_req_devlist_t;
247
248// OP_REP_DEVLIST
249// vk_usbip_rep_devlist_t
250// vk_usbip_rep_dev_t[devnum]
251// vk_usbip_rep_devlist_ifs_t[bNumInterfaces]
252typedef struct vk_usbip_rep_devlist_t {
253 implement(vk_usbip_op_common_t)
254 uint32_t devnum; // number of devices
255} VSF_CAL_PACKED vk_usbip_rep_devlist_t;
256
257// OP_REQ_IMPORT
258typedef struct vk_usbip_req_import_t {
259 implement(vk_usbip_op_common_t)
260 char busid[32];
261} VSF_CAL_PACKED vk_usbip_req_import_t;
262
263// OP_REP_IMPORT
264// vk_usbip_rep_import_t
265// vk_usbip_rep_dev_t
266typedef struct vk_usbip_rep_import_t {
267 implement(vk_usbip_op_common_t)
268} VSF_CAL_PACKED vk_usbip_rep_import_t;
269
270// USBIP_CMD_SUBMIT
271// vk_usbip_req_submit_t
272// data[transfer_length]
273typedef struct vk_usbip_req_submit_t {
274 uint32_t command;
275 uint32_t seqnum;
276 uint32_t devid;
277 uint32_t direction; // 0: OUT, 1: IN
278 uint32_t ep;
279 uint32_t transfer_flags;
280 uint32_t transfer_length;
281 uint32_t start_frame; // for ISO
282 uint32_t number_of_packets; // for ISO
283 uint32_t interval;
284 struct usb_ctrlrequest_t setup;
285} VSF_CAL_PACKED vk_usbip_req_submit_t;
286
287// USBIP_RET_SUBMIT
288// vk_usbip_rep_submit_t
289// data[actual_length]
290typedef struct vk_usbip_rep_submit_t {
291 uint32_t command;
292 uint32_t seqnum;
293 uint32_t devid;
294 uint32_t direction;
295 uint32_t ep;
297 uint32_t actual_length;
298 uint32_t start_frame; // for ISO
299 uint32_t number_of_packets; // for ISO
300 uint32_t error_count;
301} VSF_CAL_PACKED vk_usbip_rep_submit_t;
302
303// USBIP_CMD_UNLINK
304// vk_usbip_req_unlink_t
305// data[unknown]
306typedef struct vk_usbip_req_unlink_t {
307 uint32_t command;
308 uint32_t seqnum;
309 uint32_t devid;
310 uint32_t direction; // 0: OUT, 1: IN
311 uint32_t ep;
312 uint32_t seqnum_to_unlink;
313} VSF_CAL_PACKED vk_usbip_req_unlink_t;
314
315// USBIP_RET_UNLINK
316// vk_usbip_rep_unlink_t
317// data[unknown]
318typedef struct vk_usbip_rep_unlink_t {
319 uint32_t command;
320 uint32_t seqnum;
321 uint32_t devid;
322 uint32_t direction; // 0: OUT, 1: IN
323 uint32_t ep;
325 uint32_t zero[6];
326} VSF_CAL_PACKED vk_usbip_rep_unlink_t;
327
328typedef struct vk_usbip_urb_t {
329 vsf_dlist_node_t urb_node;
330 vsf_dlist_node_t urb_node_ep;
331 vk_usbip_req_submit_t req;
332 union {
333 vk_usbip_rep_submit_t rep;
334 vk_usbip_rep_unlink_t unlink;
335 };
336 vsf_mem_t mem;
337 vsf_mem_t dynmem;
338
339 bool is_unlinked;
340 enum {
341 VSF_USBIP_URB_IDLE = 0,
342 VSF_USBIP_URB_QUEUED,
343 VSF_USBIP_URB_COMITTED,
344 VSF_USBIP_URB_DONE,
345 } state;
346} vk_usbip_urb_t;
347
348typedef struct vk_usbip_server_t {
349 vk_usbip_dcd_t *usbd;
350 vsf_teda_t teda;
351 uint16_t port;
352 vsf_err_t err;
353
354 enum {
355 VSF_USBIP_SERVER_REQ_COMMAND,
356 VSF_USBIP_SERVER_REQ_PARAM,
357 VSF_USBIP_SERVER_REQ_DATA,
358 } req_state;
359 vk_usbip_cmd_t command;
360
361 enum {
362 VSF_USBIP_SERVER_REP_DONE = 0,
363 VSF_USBIP_SERVER_REP_REPLY = 1,
364 VSF_USBIP_SERVER_REP_PARAM = 2,
365 VSF_USBIP_SERVER_REP_DATA = 3,
366
367 // for devlist
368 VSF_USBIP_SERVER_REP_DEVLIST_PATH = 2,
369 VSF_USBIP_SERVER_REP_DEVLIST_BUSID = 3,
370 VSF_USBIP_SERVER_REP_DEVLIST_DEV = 4,
371 VSF_USBIP_SERVER_REP_DEVLIST_CFG = 5,
372
373 // for import
374 VSF_USBIP_SERVER_REP_IMPORT_PATH = VSF_USBIP_SERVER_REP_DEVLIST_PATH,
375 VSF_USBIP_SERVER_REP_IMPORT_BUSID = VSF_USBIP_SERVER_REP_DEVLIST_BUSID,
376 VSF_USBIP_SERVER_REP_IMPORT_DEV = VSF_USBIP_SERVER_REP_DEVLIST_DEV,
377 } rep_state;
378 vk_usbip_cmd_t reply;
379
380 bool is_connected;
381 union {
382 uint32_t cmd32;
383 struct {
384 uint16_t version_bcd;
385 uint16_t cmd16;
387 vk_usbip_req_devlist_t devlist;
388 vk_usbip_req_import_t import;
389 vk_usbip_req_submit_t submit;
390 vk_usbip_req_unlink_t unlink;
391 } req;
392
393 union {
394 vk_usbip_op_common_t common;
395 vk_usbip_rep_devlist_t devlist;
396 vk_usbip_rep_import_t import;
397 vk_usbip_rep_unlink_t unlink;
398 uint8_t buffer[256]; // for path
399 } rep;
400
401 vk_usbip_rep_dev_t dev;
402 vsf_dlist_t urb_list;
403 vk_usbip_urb_t *cur_urb;
404} vk_usbip_server_t;
405#endif
406
407/*============================ GLOBAL VARIABLES ==============================*/
408/*============================ INCLUDES ======================================*/
409/*============================ PROTOTYPES ====================================*/
410
412extern void vk_usbip_usbd_fini(vk_usbip_dcd_t *usbd);
413extern void vk_usbip_usbd_reset(vk_usbip_dcd_t *usbd, usb_dc_cfg_t *cfg);
414
415extern void vk_usbip_usbd_connect(vk_usbip_dcd_t *usbd);
417extern void vk_usbip_usbd_wakeup(vk_usbip_dcd_t *usbd);
418
421
424
425extern void vk_usbip_usbd_get_setup(vk_usbip_dcd_t *usbd, uint8_t *buffer);
426extern void vk_usbip_usbd_status_stage(vk_usbip_dcd_t *usbd, bool is_in);
427
431
435
437
442
445
446extern void vk_usbip_usbd_irq(vk_usbip_dcd_t *usbd);
447
448#undef __VSF_USBIP_DCD_CLASS_IMPLEMENT
449
450#ifdef __cplusplus
451}
452#endif
453
454#endif
455#endif
456/* EOF */
vsf_err_t
Definition __type.h:42
Definition vsf_usbip_dcd.h:159
Definition vsf_eda.h:837
#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:332
Definition vsf_usbip_dcd.h:144
vsf_mem_t mem
Definition vsf_usbip_dcd.h:152
bool zlp
Definition vsf_usbip_dcd.h:154
uint32_t size
Definition vsf_usbip_dcd.h:153
struct vk_usbip_dcd_ep_t::@214 transfer
uint16_t size
Definition vsf_usbip_dcd.h:145
vsf_dlist_t urb_list
Definition vsf_usbip_dcd.h:150
usb_ep_type_t type
Definition vsf_usbip_dcd.h:146
bool is_stalled
Definition vsf_usbip_dcd.h:147
bool pending
Definition vsf_usbip_dcd.h:155
uint8_t ep
Definition vsf_usbip_dcd.h:148
Definition vsf_usbip_dcd.h:140
uint16_t port
Definition vsf_usbip_dcd.h:141
Definition vsf_list.h:888
Definition vsf_list.h:883
Definition vsf_utilities.h:51
#define unlink
Definition unistd.h:116
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:293
void(* usb_dc_evthandler_t)(void *param, usb_evt_t evt, uint_fast8_t value)
Definition vsf_template_usb.h:325
uint8_t status
Definition vsf_tgui.h:144
vsf_err_t vk_usbip_usbd_ep_transaction_enable_out(vk_usbip_dcd_t *usbd, uint_fast8_t ep)
Definition vsf_usbip_dcd.c:762
uint_fast32_t vk_usbip_usbd_ep_get_data_size(vk_usbip_dcd_t *usbd, uint_fast8_t ep)
Definition vsf_usbip_dcd.c:751
vsf_err_t vk_usbip_usbd_init(vk_usbip_dcd_t *usbd, usb_dc_cfg_t *cfg)
Definition vsf_usbip_dcd.c:623
uint_fast16_t vk_usbip_usbd_ep_get_size(vk_usbip_dcd_t *usbd, uint_fast8_t ep)
Definition vsf_usbip_dcd.c:716
void vk_usbip_usbd_connect(vk_usbip_dcd_t *usbd)
Definition vsf_usbip_dcd.c:645
uint_fast8_t vk_usbip_usbd_get_mframe_number(vk_usbip_dcd_t *usbd)
Definition vsf_usbip_dcd.c:680
uint_fast8_t vk_usbip_usbd_get_address(vk_usbip_dcd_t *usbd)
Definition vsf_usbip_dcd.c:670
void vk_usbip_usbd_set_address(vk_usbip_dcd_t *usbd, uint_fast8_t addr)
Definition vsf_usbip_dcd.c:665
void vk_usbip_usbd_wakeup(vk_usbip_dcd_t *usbd)
Definition vsf_usbip_dcd.c:661
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:767
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:789
vsf_err_t vk_usbip_usbd_ep_set_stall(vk_usbip_dcd_t *usbd, uint_fast8_t ep)
Definition vsf_usbip_dcd.c:722
vsf_err_t vk_usbip_usbd_ep_clear_stall(vk_usbip_dcd_t *usbd, uint_fast8_t ep)
Definition vsf_usbip_dcd.c:744
void vk_usbip_usbd_irq(vk_usbip_dcd_t *usbd)
Definition vsf_usbip_dcd.c:803
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:772
void vk_usbip_usbd_get_setup(vk_usbip_dcd_t *usbd, uint8_t *buffer)
Definition vsf_usbip_dcd.c:685
void vk_usbip_usbd_fini(vk_usbip_dcd_t *usbd)
Definition vsf_usbip_dcd.c:634
uint_fast16_t vk_usbip_usbd_get_frame_number(vk_usbip_dcd_t *usbd)
Definition vsf_usbip_dcd.c:675
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:702
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:707
bool vk_usbip_usbd_ep_is_stalled(vk_usbip_dcd_t *usbd, uint_fast8_t ep)
Definition vsf_usbip_dcd.c:738
void vk_usbip_usbd_status_stage(vk_usbip_dcd_t *usbd, bool is_in)
Definition vsf_usbip_dcd.c:690
void vk_usbip_usbd_disconnect(vk_usbip_dcd_t *usbd)
Definition vsf_usbip_dcd.c:653
void vk_usbip_usbd_reset(vk_usbip_dcd_t *usbd, usb_dc_cfg_t *cfg)
Definition vsf_usbip_dcd.c:639
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:777
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:757
Generated from commit: vsfteam/vsf@0c4049f