Fix usb-cdc.c in USART example.

This commit is contained in:
NIIBE Yutaka
2017-12-16 16:03:37 +09:00
parent 530ddcfeda
commit bf1ac08e6c

View File

@@ -30,7 +30,8 @@ struct cdc {
uint8_t endp3; uint8_t endp3;
chopstx_mutex_t mtx; chopstx_mutex_t mtx;
chopstx_cond_t cnd; chopstx_cond_t cnd_rx;
chopstx_cond_t cnd_tx;
uint8_t input[BUFSIZE]; uint8_t input[BUFSIZE];
uint32_t input_len : 7; uint32_t input_len : 7;
uint32_t flag_connected : 1; uint32_t flag_connected : 1;
@@ -349,7 +350,7 @@ usb_ctrl_write_finish (struct usb_dev *dev)
/* Open/close the connection. */ /* Open/close the connection. */
chopstx_mutex_lock (&s->mtx); chopstx_mutex_lock (&s->mtx);
s->flag_connected = ((arg->value & CDC_CTRL_DTR) != 0); s->flag_connected = ((arg->value & CDC_CTRL_DTR) != 0);
chopstx_cond_signal (&s->cnd); chopstx_cond_broadcast (&s->cnd_rx);
chopstx_mutex_unlock (&s->mtx); chopstx_mutex_unlock (&s->mtx);
} }
@@ -523,7 +524,7 @@ usb_set_configuration (struct usb_dev *dev)
struct cdc *s = &cdc_table[i]; struct cdc *s = &cdc_table[i];
chopstx_mutex_lock (&s->mtx); chopstx_mutex_lock (&s->mtx);
chopstx_cond_signal (&s->cnd); chopstx_cond_signal (&s->cnd_rx);
chopstx_mutex_unlock (&s->mtx); chopstx_mutex_unlock (&s->mtx);
} }
} }
@@ -541,7 +542,7 @@ usb_set_configuration (struct usb_dev *dev)
struct cdc *s = &cdc_table[i]; struct cdc *s = &cdc_table[i];
chopstx_mutex_lock (&s->mtx); chopstx_mutex_lock (&s->mtx);
chopstx_cond_signal (&s->cnd); chopstx_cond_signal (&s->cnd_rx);
chopstx_mutex_unlock (&s->mtx); chopstx_mutex_unlock (&s->mtx);
} }
} }
@@ -609,7 +610,7 @@ usb_tx_done (uint8_t ep_num, uint16_t len)
if (s->flag_output_ready == 0) if (s->flag_output_ready == 0)
{ {
s->flag_output_ready = 1; s->flag_output_ready = 1;
chopstx_cond_signal (&s->cnd); chopstx_cond_signal (&s->cnd_tx);
} }
chopstx_mutex_unlock (&s->mtx); chopstx_mutex_unlock (&s->mtx);
} }
@@ -630,7 +631,7 @@ usb_rx_ready (uint8_t ep_num, uint16_t len)
usb_lld_rxcpy (s->input, ep_num, 0, len); usb_lld_rxcpy (s->input, ep_num, 0, len);
s->flag_input_avail = 1; s->flag_input_avail = 1;
s->input_len = len; s->input_len = len;
chopstx_cond_signal (&s->cnd); chopstx_cond_signal (&s->cnd_rx);
} }
} }
@@ -649,7 +650,8 @@ cdc_init (void)
struct cdc *s = &cdc_table[i]; struct cdc *s = &cdc_table[i];
chopstx_mutex_init (&s->mtx); chopstx_mutex_init (&s->mtx);
chopstx_cond_init (&s->cnd); chopstx_cond_init (&s->cnd_tx);
chopstx_cond_init (&s->cnd_rx);
s->input_len = 0; s->input_len = 0;
s->flag_connected = 0; s->flag_connected = 0;
s->flag_output_ready = 1; s->flag_output_ready = 1;
@@ -770,7 +772,7 @@ cdc_main (void *arg)
{ {
struct cdc *s = &cdc_table[0]; struct cdc *s = &cdc_table[0];
chopstx_mutex_lock (&s->mtx); chopstx_mutex_lock (&s->mtx);
chopstx_cond_signal (&s->cnd); chopstx_cond_signal (&s->cnd_rx);
chopstx_mutex_unlock (&s->mtx); chopstx_mutex_unlock (&s->mtx);
} }
continue; continue;
@@ -837,7 +839,7 @@ cdc_wait_configured (void)
chopstx_mutex_lock (&s->mtx); chopstx_mutex_lock (&s->mtx);
while (device_state != USB_DEVICE_STATE_CONFIGURED) while (device_state != USB_DEVICE_STATE_CONFIGURED)
chopstx_cond_wait (&s->cnd, &s->mtx); chopstx_cond_wait (&s->cnd_rx, &s->mtx);
chopstx_mutex_unlock (&s->mtx); chopstx_mutex_unlock (&s->mtx);
} }
@@ -847,7 +849,7 @@ cdc_wait_connection (struct cdc *s)
{ {
chopstx_mutex_lock (&s->mtx); chopstx_mutex_lock (&s->mtx);
while (s->flag_connected == 0) while (s->flag_connected == 0)
chopstx_cond_wait (&s->cnd, &s->mtx); chopstx_cond_wait (&s->cnd_rx, &s->mtx);
s->flag_output_ready = 1; s->flag_output_ready = 1;
s->flag_input_avail = 0; s->flag_input_avail = 0;
s->input_len = 0; s->input_len = 0;
@@ -881,7 +883,7 @@ cdc_send (struct cdc *s, const char *buf, int len)
{ {
chopstx_mutex_lock (&s->mtx); chopstx_mutex_lock (&s->mtx);
while ((r = check_tx (s)) == 0) while ((r = check_tx (s)) == 0)
chopstx_cond_wait (&s->cnd, &s->mtx); chopstx_cond_wait (&s->cnd_tx, &s->mtx);
if (r > 0) if (r > 0)
{ {
usb_lld_txcpy (p, s->endp1, 0, count); usb_lld_txcpy (p, s->endp1, 0, count);
@@ -933,7 +935,7 @@ cdc_recv (struct cdc *s, char *buf, uint32_t *timeout)
poll_desc.type = CHOPSTX_POLL_COND; poll_desc.type = CHOPSTX_POLL_COND;
poll_desc.ready = 0; poll_desc.ready = 0;
poll_desc.cond = &s->cnd; poll_desc.cond = &s->cnd_rx;
poll_desc.mutex = &s->mtx; poll_desc.mutex = &s->mtx;
poll_desc.check = check_rx; poll_desc.check = check_rx;
poll_desc.arg = s; poll_desc.arg = s;