use LENGTH instead of sizeof for array indexes
This commit is contained in:
parent
ffee985136
commit
8f8a086eee
|
@ -34,6 +34,7 @@
|
||||||
#include <libopencm3/usb/cdc.h> // USB CDC library
|
#include <libopencm3/usb/cdc.h> // USB CDC library
|
||||||
#include <libopencm3/cm3/sync.h> // synchronisation utilities
|
#include <libopencm3/cm3/sync.h> // synchronisation utilities
|
||||||
|
|
||||||
|
#include "global.h" // global utilities
|
||||||
#include "usb_cdcacm.h" // USB CDC ACM header and definitions
|
#include "usb_cdcacm.h" // USB CDC ACM header and definitions
|
||||||
|
|
||||||
/** @brief USB CDC ACM device descriptor
|
/** @brief USB CDC ACM device descriptor
|
||||||
|
@ -257,17 +258,17 @@ static int cdcacm_control_request(usbd_device *usbd_dev, struct usb_setup_data *
|
||||||
* even though it's optional in the CDC spec, and we don't
|
* even though it's optional in the CDC spec, and we don't
|
||||||
* advertise it in the ACM functional descriptor.
|
* advertise it in the ACM functional descriptor.
|
||||||
*/
|
*/
|
||||||
char local_buf[10];
|
uint8_t reply[10] = {0};
|
||||||
struct usb_cdc_notification *notif = (void *)local_buf;
|
struct usb_cdc_notification *notif = (void *)reply;
|
||||||
/* we echo signals back to host as notification. */
|
/* we echo signals back to host as notification. */
|
||||||
notif->bmRequestType = 0xA1;
|
notif->bmRequestType = 0xA1;
|
||||||
notif->bNotification = USB_CDC_NOTIFY_SERIAL_STATE;
|
notif->bNotification = USB_CDC_NOTIFY_SERIAL_STATE;
|
||||||
notif->wValue = 0;
|
notif->wValue = 0;
|
||||||
notif->wIndex = 0;
|
notif->wIndex = 0;
|
||||||
notif->wLength = 2;
|
notif->wLength = 2;
|
||||||
local_buf[8] = req->wValue & 3;
|
reply[8] = req->wValue & 3;
|
||||||
local_buf[9] = 0;
|
reply[9] = 0;
|
||||||
usbd_ep_write_packet(usbd_dev, 0x83, local_buf, 10);
|
usbd_ep_write_packet(usbd_dev, 0x83, reply, LENGTH(reply));
|
||||||
break;
|
break;
|
||||||
case USB_CDC_REQ_SET_LINE_CODING:
|
case USB_CDC_REQ_SET_LINE_CODING:
|
||||||
// ignore if length is wrong
|
// ignore if length is wrong
|
||||||
|
@ -306,8 +307,8 @@ static void cdcacm_data_rx_cb(usbd_device *usbd_dev, uint8_t ep)
|
||||||
/* receive data */
|
/* receive data */
|
||||||
usb_length = usbd_ep_read_packet(usbd_dev, 0x01, usb_data, sizeof(usb_data));
|
usb_length = usbd_ep_read_packet(usbd_dev, 0x01, usb_data, sizeof(usb_data));
|
||||||
if (usb_length) { // copy received data
|
if (usb_length) { // copy received data
|
||||||
for (uint16_t i=0; i<usb_length && rx_used<sizeof(rx_buffer); i++) { // only until buffer is full
|
for (uint16_t i=0; i<usb_length && rx_used<LENGTH(rx_buffer); i++) { // only until buffer is full
|
||||||
rx_buffer[(rx_i+rx_used)%sizeof(rx_buffer)] = usb_data[i]; // put character in buffer
|
rx_buffer[(rx_i+rx_used)%LENGTH(rx_buffer)] = usb_data[i]; // put character in buffer
|
||||||
rx_used++; // update used buffer
|
rx_used++; // update used buffer
|
||||||
}
|
}
|
||||||
cdcacm_received = rx_used; // update available data
|
cdcacm_received = rx_used; // update available data
|
||||||
|
@ -328,9 +329,9 @@ static void cdcacm_data_tx_cb(usbd_device *usbd_dev, uint8_t ep)
|
||||||
}
|
}
|
||||||
if (mutex_trylock(&tx_lock)) { // try to get lock
|
if (mutex_trylock(&tx_lock)) { // try to get lock
|
||||||
uint8_t usb_length = (tx_used > 64 ? 64 : tx_used); // length of data to be transmitted (respect max packet size)
|
uint8_t usb_length = (tx_used > 64 ? 64 : tx_used); // length of data to be transmitted (respect max packet size)
|
||||||
usb_length = (usb_length > (sizeof(tx_buffer)-tx_i) ? sizeof(tx_buffer)-tx_i : usb_length); // since here we use the source array not as ring buffer, only go up to the end
|
usb_length = (usb_length > (LENGTH(tx_buffer)-tx_i) ? LENGTH(tx_buffer)-tx_i : usb_length); // since here we use the source array not as ring buffer, only go up to the end
|
||||||
while (usb_length != usbd_ep_write_packet(usb_device, 0x82, (void*)(&tx_buffer[tx_i]), usb_length)); // ensure data is written into transmit buffer
|
while (usb_length != usbd_ep_write_packet(usb_device, 0x82, (void*)(&tx_buffer[tx_i]), usb_length)); // ensure data is written into transmit buffer
|
||||||
tx_i = (tx_i+usb_length)%sizeof(tx_buffer); // update location on buffer
|
tx_i = (tx_i+usb_length)%LENGTH(tx_buffer); // update location on buffer
|
||||||
tx_used -= usb_length; // update used size
|
tx_used -= usb_length; // update used size
|
||||||
mutex_unlock(&tx_lock); // release lock
|
mutex_unlock(&tx_lock); // release lock
|
||||||
} else {
|
} else {
|
||||||
|
@ -382,7 +383,7 @@ char cdcacm_getchar(void)
|
||||||
__WFI(); // sleep until interrupt (not sure if it's a good idea here)
|
__WFI(); // sleep until interrupt (not sure if it's a good idea here)
|
||||||
}
|
}
|
||||||
char to_return = rx_buffer[rx_i]; // get the next available character
|
char to_return = rx_buffer[rx_i]; // get the next available character
|
||||||
rx_i = (rx_i+1)%sizeof(rx_buffer); // update used buffer
|
rx_i = (rx_i+1)%LENGTH(rx_buffer); // update used buffer
|
||||||
rx_used--; // update used buffer
|
rx_used--; // update used buffer
|
||||||
cdcacm_received = rx_used; // update available data
|
cdcacm_received = rx_used; // update available data
|
||||||
return to_return;
|
return to_return;
|
||||||
|
@ -394,12 +395,12 @@ void cdcacm_putchar(char c)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mutex_lock(&tx_lock); // get lock to prevent race condition
|
mutex_lock(&tx_lock); // get lock to prevent race condition
|
||||||
if (tx_used<sizeof(tx_buffer)) { // buffer not full
|
if (tx_used<LENGTH(tx_buffer)) { // buffer not full
|
||||||
tx_buffer[(tx_i+tx_used)%sizeof(tx_buffer)] = c; // put character in buffer
|
tx_buffer[(tx_i+tx_used)%LENGTH(tx_buffer)] = c; // put character in buffer
|
||||||
tx_used++; // update used buffer
|
tx_used++; // update used buffer
|
||||||
} else { // buffer full (might be that no terminal is connected to this serial)
|
} else { // buffer full (might be that no terminal is connected to this serial)
|
||||||
tx_i = (tx_i+1)%sizeof(tx_buffer); // shift start
|
tx_i = (tx_i+1)%LENGTH(tx_buffer); // shift start
|
||||||
tx_buffer[(tx_i+tx_used)%sizeof(tx_buffer)] = c; // overwrite old data
|
tx_buffer[(tx_i+tx_used)%LENGTH(tx_buffer)] = c; // overwrite old data
|
||||||
}
|
}
|
||||||
mutex_unlock(&tx_lock); // release lock
|
mutex_unlock(&tx_lock); // release lock
|
||||||
usbd_ep_write_packet(usb_device, 0x82, NULL, 0); // trigger tx callback
|
usbd_ep_write_packet(usb_device, 0x82, NULL, 0); // trigger tx callback
|
||||||
|
|
Loading…
Reference in New Issue