@@ -18,6 +18,22 @@ uint8_t _in_ep_addr;
1818buffer_t USBRequestBuffer ;
1919buffer_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+
2137void 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
3551PICOPROBE_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
4460USBResponseBuffer .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
6177usbd_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{
90106if (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
98114if (!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
117133if (!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 );
121137USBRequestBuffer .wasFull = false;
122138}
123139else {
@@ -141,18 +157,18 @@ void dap_thread(void *ptr)
141157
142158do
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.
151167if (USBRequestBuffer .wasFull )
152168{
153169vTaskSuspendAll (); // 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 );
156172USBRequestBuffer .wasFull = false;
157173xTaskResumeAll ();
158174}
@@ -165,14 +181,14 @@ void dap_thread(void *ptr)
165181
166182if (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.
178194USBResponseBuffer .wasEmpty = false;
@@ -207,12 +223,3 @@ usbd_class_driver_t const *usbd_app_driver_get_cb(uint8_t *driver_count)
207223return & _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- }
0 commit comments