XCORE SDK
XCORE Software Development Kit
rtos_usb.h
1 // Copyright 2021 XMOS LIMITED.
2 // This Software is subject to the terms of the XMOS Public Licence: Version 1.
3 
4 #ifndef RTOS_USB_H_
5 #define RTOS_USB_H_
6 
14 #include <xcore/channel.h>
15 #include <xud.h>
16 #include <xud_device.h>
17 
18 #include "rtos_osal.h"
19 #include "rtos_driver_rpc.h"
20 
24 #define RTOS_USB_ENDPOINT_COUNT_MAX 12
25 
26 
32 #define RTOS_USB_OUT_EP 0
33 #define RTOS_USB_IN_EP 1
40 #define RTOS_USB_ISR_CALLBACK_ATTR __attribute__((fptrgroup("rtos_usb_isr_cb_fptr_grp")))
41 
42 typedef enum {
43  rtos_usb_data_packet,
44  rtos_usb_setup_packet,
45  rtos_usb_sof_packet
46 } rtos_usb_packet_type_t;
47 
51 typedef struct rtos_usb_struct rtos_usb_t;
52 
68 typedef void (*rtos_usb_isr_cb_t)(rtos_usb_t *ctx, void *app_data, uint32_t ep_address, size_t xfer_len, rtos_usb_packet_type_t packet_type, XUD_Result_t res);
69 
76 typedef struct {
81  size_t len;
83  uint8_t ep_address;
85  uint8_t dir;
87  uint8_t ep_num;
89  int8_t res;
91 
98  size_t endpoint_count;
99  chanend_t c_ep_out_xud[RTOS_USB_ENDPOINT_COUNT_MAX];
100  chanend_t c_ep_in_xud[RTOS_USB_ENDPOINT_COUNT_MAX];
101  chanend_t c_sof_xud;
102  chanend_t c_sof;
103  int sof_interrupt_enabled;
104 
105  XUD_EpType endpoint_out_type[RTOS_USB_ENDPOINT_COUNT_MAX];
106  XUD_EpType endpoint_in_type[RTOS_USB_ENDPOINT_COUNT_MAX];
107  XUD_PwrConfig power_source;
108  XUD_BusSpeed_t speed;
109 
110  chanend_t c_ep[RTOS_USB_ENDPOINT_COUNT_MAX][2];
111  XUD_ep ep[RTOS_USB_ENDPOINT_COUNT_MAX][2];
112  int reset_received;
113  rtos_osal_thread_t hil_thread;
115  void *isr_app_data;
117 };
118 
131  uint32_t endpoint_addr,
132  unsigned timeout);
133 
144 XUD_Result_t rtos_usb_all_endpoints_ready(rtos_usb_t *ctx,
145  unsigned timeout);
146 
165  uint32_t endpoint_addr,
166  uint8_t *buffer,
167  size_t len);
168 
183 XUD_BusSpeed_t rtos_usb_endpoint_reset(rtos_usb_t *ctx,
184  uint32_t endpoint_addr);
185 
194 static inline XUD_Result_t rtos_usb_device_address_set(rtos_usb_t *ctx,
195  uint32_t addr)
196 {
197  (void) ctx;
198  return XUD_SetDevAddr(addr);
199 }
200 
207 static inline void rtos_usb_endpoint_state_reset(rtos_usb_t *ctx,
208  uint32_t endpoint_addr)
209 {
210  (void) ctx;
211  XUD_ResetEpStateByAddr(endpoint_addr);
212 }
213 
222 static inline void rtos_usb_endpoint_stall_set(rtos_usb_t *ctx,
223  uint32_t endpoint_addr)
224 {
225  (void) ctx;
226  XUD_SetStallByAddr(endpoint_addr);
227 }
228 
235 static inline void rtos_usb_endpoint_stall_clear(rtos_usb_t *ctx,
236  uint32_t endpoint_addr)
237 {
238  (void) ctx;
239  XUD_ClearStallByAddr(endpoint_addr);
240 }
241 
274 void rtos_usb_start(
275  rtos_usb_t *ctx,
276  size_t endpoint_count,
277  XUD_EpType endpoint_out_type[],
278  XUD_EpType endpoint_in_type[],
279  XUD_BusSpeed_t speed,
280  XUD_PwrConfig power_source,
281  unsigned interrupt_core_id,
282  int sof_interrupt_core_id);
283 
308 void rtos_usb_init(
309  rtos_usb_t *ctx,
310  uint32_t io_core_mask,
311  rtos_usb_isr_cb_t isr_cb,
312  void *isr_app_data);
313 
314 
336  uint32_t endpoint_addr,
337  size_t *len,
338  unsigned timeout);
339 
365  rtos_usb_t *ctx,
366  uint32_t io_core_mask);
367 
368 
371 #endif /* RTOS_USB_H_ */
void rtos_usb_simple_init(rtos_usb_t *ctx, uint32_t io_core_mask)
Definition: rtos_usb.c:427
void rtos_usb_start(rtos_usb_t *ctx, size_t endpoint_count, XUD_EpType endpoint_out_type[], XUD_EpType endpoint_in_type[], XUD_BusSpeed_t speed, XUD_PwrConfig power_source, unsigned interrupt_core_id, int sof_interrupt_core_id)
Definition: rtos_usb.c:273
void rtos_usb_init(rtos_usb_t *ctx, uint32_t io_core_mask, rtos_usb_isr_cb_t isr_cb, void *isr_app_data)
Definition: rtos_usb.c:324
XUD_Result_t rtos_usb_endpoint_transfer_start(rtos_usb_t *ctx, uint32_t endpoint_addr, uint8_t *buffer, size_t len)
Definition: rtos_usb.c:199
#define RTOS_USB_ISR_CALLBACK_ATTR
Definition: rtos_usb.h:40
#define RTOS_USB_ENDPOINT_COUNT_MAX
Definition: rtos_usb.h:24
int rtos_usb_endpoint_ready(rtos_usb_t *ctx, uint32_t endpoint_addr, unsigned timeout)
Definition: rtos_usb.c:162
XUD_BusSpeed_t rtos_usb_endpoint_reset(rtos_usb_t *ctx, uint32_t endpoint_addr)
Definition: rtos_usb.c:225
XUD_Result_t rtos_usb_simple_transfer_complete(rtos_usb_t *ctx, uint32_t endpoint_addr, size_t *len, unsigned timeout)
Definition: rtos_usb.c:408
void(* rtos_usb_isr_cb_t)(rtos_usb_t *ctx, void *app_data, uint32_t ep_address, size_t xfer_len, rtos_usb_packet_type_t packet_type, XUD_Result_t res)
Definition: rtos_usb.h:68
XUD_Result_t rtos_usb_all_endpoints_ready(rtos_usb_t *ctx, unsigned timeout)
Definition: rtos_usb.c:182
Definition: rtos_usb.h:76
uint8_t ep_num
Definition: rtos_usb.h:87
size_t len
Definition: rtos_usb.h:81
uint8_t ep_address
Definition: rtos_usb.h:83
uint8_t dir
Definition: rtos_usb.h:85
rtos_usb_t * usb_ctx
Definition: rtos_usb.h:78
int8_t res
Definition: rtos_usb.h:89
Definition: rtos_usb.h:97