USBUS CDC ACM: disable interrupts when using tsrb
This commit is contained in:
parent
01c3043f6f
commit
6c04cb1a45
@ -126,11 +126,17 @@ static size_t _gen_full_acm_descriptor(usbus_t *usbus, void *arg)
|
|||||||
/* Submit (ACM interface in) */
|
/* Submit (ACM interface in) */
|
||||||
size_t usbus_cdc_acm_submit(usbus_cdcacm_device_t *cdcacm, const uint8_t *buf, size_t len)
|
size_t usbus_cdc_acm_submit(usbus_cdcacm_device_t *cdcacm, const uint8_t *buf, size_t len)
|
||||||
{
|
{
|
||||||
|
size_t n;
|
||||||
|
unsigned old;
|
||||||
if (cdcacm->state != USBUS_CDC_ACM_LINE_STATE_DISCONNECTED) {
|
if (cdcacm->state != USBUS_CDC_ACM_LINE_STATE_DISCONNECTED) {
|
||||||
return tsrb_add(&cdcacm->tsrb, buf, len);
|
old = irq_disable();
|
||||||
|
n = tsrb_add(&cdcacm->tsrb, buf, len);
|
||||||
|
irq_restore(old);
|
||||||
|
return n;
|
||||||
}
|
}
|
||||||
/* stuff as much data as possible into tsrb, discarding the oldest */
|
/* stuff as much data as possible into tsrb, discarding the oldest */
|
||||||
size_t n = tsrb_free(&cdcacm->tsrb);
|
old = irq_disable();
|
||||||
|
n = tsrb_free(&cdcacm->tsrb);
|
||||||
if (len > n) {
|
if (len > n) {
|
||||||
n += tsrb_drop(&cdcacm->tsrb, len - n);
|
n += tsrb_drop(&cdcacm->tsrb, len - n);
|
||||||
buf += len - n;
|
buf += len - n;
|
||||||
@ -139,15 +145,16 @@ size_t usbus_cdc_acm_submit(usbus_cdcacm_device_t *cdcacm, const uint8_t *buf, s
|
|||||||
}
|
}
|
||||||
tsrb_add(&cdcacm->tsrb, buf, n);
|
tsrb_add(&cdcacm->tsrb, buf, n);
|
||||||
/* behave as if everything has been written correctly */
|
/* behave as if everything has been written correctly */
|
||||||
|
irq_restore(old);
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
void usbus_cdc_acm_set_coding_cb(usbus_cdcacm_device_t *cdcacm,
|
void usbus_cdc_acm_set_coding_cb(usbus_cdcacm_device_t *cdcacm,
|
||||||
usbus_cdcacm_coding_cb_t coding_cb)
|
usbus_cdcacm_coding_cb_t coding_cb)
|
||||||
{
|
{
|
||||||
irq_disable();
|
unsigned old = irq_disable();
|
||||||
cdcacm->coding_cb = coding_cb;
|
cdcacm->coding_cb = coding_cb;
|
||||||
irq_enable();
|
irq_restore(old);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* flush event */
|
/* flush event */
|
||||||
@ -286,6 +293,8 @@ static void _handle_in(usbus_cdcacm_device_t *cdcacm,
|
|||||||
(cdcacm->state != USBUS_CDC_ACM_LINE_STATE_DTE)) {
|
(cdcacm->state != USBUS_CDC_ACM_LINE_STATE_DTE)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
/* copy at most USBUS_CDC_ACM_BULK_EP_SIZE chars from input into ep->buf */
|
||||||
|
unsigned old = irq_disable();
|
||||||
while (!tsrb_empty(&cdcacm->tsrb)) {
|
while (!tsrb_empty(&cdcacm->tsrb)) {
|
||||||
int c = tsrb_get_one(&cdcacm->tsrb);
|
int c = tsrb_get_one(&cdcacm->tsrb);
|
||||||
ep->buf[cdcacm->occupied++] = (uint8_t)c;
|
ep->buf[cdcacm->occupied++] = (uint8_t)c;
|
||||||
@ -293,6 +302,7 @@ static void _handle_in(usbus_cdcacm_device_t *cdcacm,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
irq_restore(old);
|
||||||
usbdev_ep_ready(ep, cdcacm->occupied);
|
usbdev_ep_ready(ep, cdcacm->occupied);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user