Open FFBoard
Open source force feedback firmware
rp2040_usb.h
Go to the documentation of this file.
1#ifndef RP2040_COMMON_H_
2#define RP2040_COMMON_H_
3
4#if defined(RP2040_USB_HOST_MODE) && defined(RP2040_USB_DEVICE_MODE)
5#error TinyUSB device and host mode not supported at the same time
6#endif
7
9
10#include "pico.h"
11#include "hardware/structs/usb.h"
12#include "hardware/irq.h"
13#include "hardware/resets.h"
14#include "hardware/timer.h"
15
16#if defined(PICO_RP2040_USB_DEVICE_ENUMERATION_FIX) && !defined(TUD_OPT_RP2040_USB_DEVICE_ENUMERATION_FIX)
17#define TUD_OPT_RP2040_USB_DEVICE_ENUMERATION_FIX PICO_RP2040_USB_DEVICE_ENUMERATION_FIX
18#endif
19
20#if defined(PICO_RP2040_USB_DEVICE_UFRAME_FIX) && !defined(TUD_OPT_RP2040_USB_DEVICE_UFRAME_FIX)
21#define TUD_OPT_RP2040_USB_DEVICE_UFRAME_FIX PICO_RP2040_USB_DEVICE_UFRAME_FIX
22#endif
23
24#if TUD_OPT_RP2040_USB_DEVICE_UFRAME_FIX
25#undef PICO_RP2040_USB_FAST_IRQ
26#define PICO_RP2040_USB_FAST_IRQ 1
27#endif
28
29#ifndef PICO_RP2040_USB_FAST_IRQ
30#define PICO_RP2040_USB_FAST_IRQ 0
31#endif
32
33#if PICO_RP2040_USB_FAST_IRQ
34#define __tusb_irq_path_func(x) __no_inline_not_in_flash_func(x)
35#else
36#define __tusb_irq_path_func(x) x
37#endif
38
39#define usb_hw_set ((usb_hw_t *) hw_set_alias_untyped(usb_hw))
40#define usb_hw_clear ((usb_hw_t *) hw_clear_alias_untyped(usb_hw))
41
42#define pico_info(...) TU_LOG(2, __VA_ARGS__)
43#define pico_trace(...) TU_LOG(3, __VA_ARGS__)
44
45// Hardware information per endpoint
46typedef struct hw_endpoint
47{
48 // Is this a valid struct
50
51 // Transfer direction (i.e. IN is rx for host but tx for device)
52 // allows us to common up transfer functions
53 bool rx;
54
55 uint8_t ep_addr;
56 uint8_t next_pid;
57
58 // Endpoint control register
60
61 // Buffer control register
62 io_rw_32 *buffer_control;
63
64 // Buffer pointer in usb dpram
65 uint8_t *hw_data_buf;
66
67 // User buffer in main memory
68 uint8_t *user_buf;
69
70 // Current transfer information
71 uint16_t remaining_len;
72 uint16_t xferred_len;
73
74 // Data needed from EP descriptor
76
77 // Endpoint is in use
78 bool active;
79
80 // Interrupt, bulk, etc
82
83 // Transfer scheduled but not active
84 uint8_t pending;
85
86#if CFG_TUH_ENABLED
87 // Only needed for host
88 uint8_t dev_addr;
89
90 // If interrupt endpoint
92#endif
93
95
96#if TUD_OPT_RP2040_USB_DEVICE_UFRAME_FIX
97extern volatile uint32_t e15_last_sof;
98#endif
99
100void rp2040_usb_init(void);
101
102void hw_endpoint_xfer_start(struct hw_endpoint *ep, uint8_t *buffer, uint16_t total_len);
106
107TU_ATTR_ALWAYS_INLINE static inline void hw_endpoint_lock_update(__unused struct hw_endpoint * ep, __unused int delta) {
108 // todo add critsec as necessary to prevent issues between worker and IRQ...
109 // note that this is perhaps as simple as disabling IRQs because it would make
110 // sense to have worker and IRQ on same core, however I think using critsec is about equivalent.
111}
112
113void _hw_endpoint_buffer_control_update32(struct hw_endpoint *ep, uint32_t and_mask, uint32_t or_mask);
114
115TU_ATTR_ALWAYS_INLINE static inline uint32_t _hw_endpoint_buffer_control_get_value32 (struct hw_endpoint *ep)
116{
117 return *ep->buffer_control;
118}
119
120TU_ATTR_ALWAYS_INLINE static inline void _hw_endpoint_buffer_control_set_value32 (struct hw_endpoint *ep, uint32_t value)
121{
123}
124
125TU_ATTR_ALWAYS_INLINE static inline void _hw_endpoint_buffer_control_set_mask32 (struct hw_endpoint *ep, uint32_t value)
126{
127 _hw_endpoint_buffer_control_update32(ep, ~value, value);
128}
129
130TU_ATTR_ALWAYS_INLINE static inline void _hw_endpoint_buffer_control_clear_mask32 (struct hw_endpoint *ep, uint32_t value)
131{
133}
134
135static inline uintptr_t hw_data_offset (uint8_t *buf)
136{
137 // Remove usb base from buffer pointer
138 return (uintptr_t) buf ^ (uintptr_t) usb_dpram;
139}
140
141extern const char *ep_dir_string[];
142
143#endif
uint8_t const * buffer
Definition: midi_device.h:100
static TU_ATTR_ALWAYS_INLINE uint32_t _hw_endpoint_buffer_control_get_value32(struct hw_endpoint *ep)
Definition: rp2040_usb.h:115
static TU_ATTR_ALWAYS_INLINE void _hw_endpoint_buffer_control_set_value32(struct hw_endpoint *ep, uint32_t value)
Definition: rp2040_usb.h:120
struct hw_endpoint hw_endpoint_t
void hw_endpoint_start_next_buffer(struct hw_endpoint *ep)
Definition: rp2040_usb.c:155
bool hw_endpoint_xfer_continue(struct hw_endpoint *ep)
Definition: rp2040_usb.c:302
static uintptr_t hw_data_offset(uint8_t *buf)
Definition: rp2040_usb.h:135
const char * ep_dir_string[]
volatile uint32_t e15_last_sof
Definition: rp2040_usb.c:355
void rp2040_usb_init(void)
Definition: rp2040_usb.c:65
static TU_ATTR_ALWAYS_INLINE void hw_endpoint_lock_update(__unused struct hw_endpoint *ep, __unused int delta)
Definition: rp2040_usb.h:107
static TU_ATTR_ALWAYS_INLINE void _hw_endpoint_buffer_control_set_mask32(struct hw_endpoint *ep, uint32_t value)
Definition: rp2040_usb.h:125
void _hw_endpoint_buffer_control_update32(struct hw_endpoint *ep, uint32_t and_mask, uint32_t or_mask)
Definition: rp2040_usb.c:96
static TU_ATTR_ALWAYS_INLINE void _hw_endpoint_buffer_control_clear_mask32(struct hw_endpoint *ep, uint32_t value)
Definition: rp2040_usb.h:130
void hw_endpoint_xfer_start(struct hw_endpoint *ep, uint8_t *buffer, uint16_t total_len)
Definition: rp2040_usb.c:194
void hw_endpoint_reset_transfer(struct hw_endpoint *ep)
Definition: rp2040_usb.c:89
uint16_t remaining_len
Definition: rp2040_usb.h:71
uint8_t pending
Definition: rp2040_usb.h:84
io_rw_32 * endpoint_control
Definition: rp2040_usb.h:59
uint8_t dev_addr
Definition: rp2040_usb.h:88
uint8_t transfer_type
Definition: rp2040_usb.h:81
uint8_t * hw_data_buf
Definition: rp2040_usb.h:65
uint8_t next_pid
Definition: rp2040_usb.h:56
uint16_t xferred_len
Definition: rp2040_usb.h:72
uint16_t wMaxPacketSize
Definition: rp2040_usb.h:75
uint8_t ep_addr
Definition: rp2040_usb.h:55
bool configured
Definition: rp2040_usb.h:49
io_rw_32 * buffer_control
Definition: rp2040_usb.h:62
uint8_t interrupt_num
Definition: rp2040_usb.h:91
uint8_t * user_buf
Definition: rp2040_usb.h:68
bool active
Definition: rp2040_usb.h:78