Skip to content

Commit bdb1bf2

Browse files
committed
tusb_edpt_handler: macroify
1 parent d9a975b commit bdb1bf2

File tree

2 files changed

+38
-31
lines changed

2 files changed

+38
-31
lines changed

src/tusb_edpt_handler.c

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,22 @@ uint8_t _in_ep_addr;
1818
buffer_t USBRequestBuffer;
1919
buffer_t USBResponseBuffer;
2020

21+
#define WR_IDX(x) (x.wptr % DAP_PACKET_COUNT)
22+
#define RD_IDX(x) (x.rptr % DAP_PACKET_COUNT)
23+
24+
#define WR_SLOT_PTR(x) &(x.data[WR_IDX(x)][0])
25+
#define RD_SLOT_PTR(x) &(x.data[RD_IDX(x)][0])
26+
27+
bool buffer_full(buffer_t *buffer)
28+
{
29+
return ((buffer->wptr + 1) % DAP_PACKET_COUNT == buffer->rptr);
30+
}
31+
32+
bool buffer_empty(buffer_t *buffer)
33+
{
34+
return (buffer->wptr == buffer->rptr);
35+
}
36+
2137
void dap_edpt_init(void) {
2238

2339
}
@@ -35,10 +51,10 @@ uint16_t dap_edpt_open(uint8_t __unused rhport, tusb_desc_interface_t const *itf
3551
PICOPROBE_INTERFACE_PROTOCOL == itf_desc->bInterfaceProtocol, 0);
3652

3753
// Initialise circular buffer indices
38-
USBResponseBuffer.packet_wr_idx = 0;
39-
USBResponseBuffer.packet_rd_idx = 0;
40-
USBRequestBuffer.packet_wr_idx = 0;
41-
USBRequestBuffer.packet_rd_idx = 0;
54+
USBResponseBuffer.wptr = 0;
55+
USBResponseBuffer.rptr = 0;
56+
USBRequestBuffer.wptr = 0;
57+
USBRequestBuffer.rptr = 0;
4258

4359
// Initialse full/empty flags
4460
USBResponseBuffer.wasFull = false;
@@ -59,7 +75,7 @@ uint16_t dap_edpt_open(uint8_t __unused rhport, tusb_desc_interface_t const *itf
5975

6076
// The OUT endpoint requires a call to usbd_edpt_xfer to initialise the endpoint, giving tinyUSB a buffer to consume when a transfer occurs at the endpoint
6177
usbd_edpt_open(rhport, edpt_desc);
62-
usbd_edpt_xfer(rhport, ep_addr, &(USBRequestBuffer.data[USBRequestBuffer.packet_wr_idx][0]), DAP_PACKET_SIZE);
78+
usbd_edpt_xfer(rhport, ep_addr, WR_SLOT_PTR(USBRequestBuffer), DAP_PACKET_SIZE);
6379

6480
// Initiliasing the IN endpoint
6581

@@ -89,16 +105,16 @@ bool dap_edpt_xfer_cb(uint8_t __unused rhport, uint8_t ep_addr, xfer_result_t re
89105
{
90106
if(xferred_bytes >= 0u && xferred_bytes <= DAP_PACKET_SIZE)
91107
{
92-
USBResponseBuffer.packet_rd_idx = (USBResponseBuffer.packet_rd_idx + 1) % DAP_PACKET_COUNT;
108+
USBResponseBuffer.rptr++;
93109

94110
// This checks that the buffer was not empty in DAP thread, which means the next buffer was not queued up for the in endpoint callback
95111
// So, queue up the buffer at the new read index, since we expect read to catch up to write at this point.
96112
// It is possible for the read index to be multiple spaces behind the write index (if the USB callbacks are lagging behind dap thread),
97113
// so we account for this by only setting wasEmpty to true if the next callback will empty the buffer
98114
if(!USBResponseBuffer.wasEmpty)
99115
{
100-
usbd_edpt_xfer(rhport, ep_addr, &(USBResponseBuffer.data[USBResponseBuffer.packet_rd_idx][0]), (uint16_t) _resp_len);
101-
USBResponseBuffer.wasEmpty = ((USBResponseBuffer.packet_rd_idx + 1) % DAP_PACKET_COUNT == USBResponseBuffer.packet_wr_idx);
116+
usbd_edpt_xfer(rhport, ep_addr, RD_SLOT_PTR(USBResponseBuffer), (uint16_t) _resp_len);
117+
USBResponseBuffer.wasEmpty = (USBResponseBuffer.rptr + 1) == USBResponseBuffer.wptr;
102118
}
103119

104120
// Wake up DAP thread after processing the callback
@@ -116,8 +132,8 @@ bool dap_edpt_xfer_cb(uint8_t __unused rhport, uint8_t ep_addr, xfer_result_t re
116132
// If full, we set the wasFull flag, which will be checked by dap thread
117133
if(!buffer_full(&USBRequestBuffer))
118134
{
119-
USBRequestBuffer.packet_wr_idx = (USBRequestBuffer.packet_wr_idx + 1) % DAP_PACKET_COUNT;
120-
usbd_edpt_xfer(rhport, ep_addr, &(USBRequestBuffer.data[USBRequestBuffer.packet_wr_idx][0]), DAP_PACKET_SIZE);
135+
USBRequestBuffer.wptr++;
136+
usbd_edpt_xfer(rhport, ep_addr, WR_SLOT_PTR(USBRequestBuffer), DAP_PACKET_SIZE);
121137
USBRequestBuffer.wasFull = false;
122138
}
123139
else {
@@ -141,18 +157,18 @@ void dap_thread(void *ptr)
141157

142158
do
143159
{
144-
while(USBRequestBuffer.packet_rd_idx != USBRequestBuffer.packet_wr_idx)
160+
while(USBRequestBuffer.rptr != USBRequestBuffer.wptr)
145161
{
146162
// Read a single packet from the USB buffer into the DAP Request buffer
147-
memcpy(DAPRequestBuffer, &(USBRequestBuffer.data[USBRequestBuffer.packet_rd_idx]), DAP_PACKET_SIZE);
148-
USBRequestBuffer.packet_rd_idx = (USBRequestBuffer.packet_rd_idx + 1) % DAP_PACKET_COUNT;
163+
memcpy(DAPRequestBuffer, RD_SLOT_PTR(USBRequestBuffer), DAP_PACKET_SIZE);
164+
USBRequestBuffer.rptr++;
149165

150166
// If the buffer was full in the out callback, we need to queue up another buffer for the endpoint to consume, now that we know there is space in the buffer.
151167
if(USBRequestBuffer.wasFull)
152168
{
153169
vTaskSuspendAll(); // Suspend the scheduler to safely update the write index
154-
USBRequestBuffer.packet_wr_idx = (USBRequestBuffer.packet_wr_idx + 1) % DAP_PACKET_COUNT;
155-
usbd_edpt_xfer(_rhport, _out_ep_addr, &(USBRequestBuffer.data[USBRequestBuffer.packet_wr_idx][0]), DAP_PACKET_SIZE);
170+
USBRequestBuffer.wptr++;
171+
usbd_edpt_xfer(_rhport, _out_ep_addr, WR_SLOT_PTR(USBRequestBuffer), DAP_PACKET_SIZE);
156172
USBRequestBuffer.wasFull = false;
157173
xTaskResumeAll();
158174
}
@@ -165,14 +181,14 @@ void dap_thread(void *ptr)
165181

166182
if(buffer_empty(&USBResponseBuffer))
167183
{
168-
memcpy(&(USBResponseBuffer.data[USBResponseBuffer.packet_wr_idx]), DAPResponseBuffer, (uint16_t) _resp_len);
169-
USBResponseBuffer.packet_wr_idx = (USBResponseBuffer.packet_wr_idx + 1) % DAP_PACKET_COUNT;
184+
memcpy(WR_SLOT_PTR(USBResponseBuffer), DAPResponseBuffer, (uint16_t) _resp_len);
185+
USBResponseBuffer.wptr++;
170186

171-
usbd_edpt_xfer(_rhport, _in_ep_addr, &(USBResponseBuffer.data[USBResponseBuffer.packet_rd_idx][0]), (uint16_t) _resp_len);
187+
usbd_edpt_xfer(_rhport, _in_ep_addr, RD_SLOT_PTR(USBResponseBuffer), (uint16_t) _resp_len);
172188
} else {
173189

174-
memcpy(&(USBResponseBuffer.data[USBResponseBuffer.packet_wr_idx]), DAPResponseBuffer, (uint16_t) _resp_len);
175-
USBResponseBuffer.packet_wr_idx = (USBResponseBuffer.packet_wr_idx + 1) % DAP_PACKET_COUNT;
190+
memcpy(WR_SLOT_PTR(USBResponseBuffer), DAPResponseBuffer, (uint16_t) _resp_len);
191+
USBResponseBuffer.wptr++;
176192

177193
// The In callback needs to check this flag to know when to queue up the next buffer.
178194
USBResponseBuffer.wasEmpty = false;
@@ -207,12 +223,3 @@ usbd_class_driver_t const *usbd_app_driver_get_cb(uint8_t *driver_count)
207223
return &_dap_edpt_driver;
208224
}
209225

210-
bool buffer_full(buffer_t *buffer)
211-
{
212-
return ((buffer->packet_wr_idx + 1) % DAP_PACKET_COUNT == buffer->packet_rd_idx);
213-
}
214-
215-
bool buffer_empty(buffer_t *buffer)
216-
{
217-
return (buffer->packet_wr_idx == buffer->packet_rd_idx);
218-
}

src/tusb_edpt_handler.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717

1818
typedef struct {
1919
uint8_t data[DAP_PACKET_COUNT][DAP_PACKET_SIZE];
20-
volatile uint32_t packet_wr_idx;
21-
volatile uint32_t packet_rd_idx;
20+
volatile uint32_t wptr;
21+
volatile uint32_t rptr;
2222
volatile bool wasEmpty;
2323
volatile bool wasFull;
2424
} buffer_t;

0 commit comments

Comments
 (0)