Merge pull request #199 from g-oikonomou/cc253x-cdc-acm-line-state-fix

Improve handling of CDC ACM line state
This commit is contained in:
Adam Dunkels 2013-04-17 07:37:25 -07:00
commit c99b62f628
2 changed files with 12 additions and 13 deletions

View File

@ -201,21 +201,9 @@ do_work(void)
if(events & USB_CDC_ACM_LINE_STATE) {
uint8_t line_state = usb_cdc_acm_get_line_state();
PRINTF("CDC-ACM event 0x%04x, Line State = %u\n", events, line_state);
if(line_state == 0) {
/* CDC-ACM line went down. Stop streaming */
enabled = 0;
} else if(line_state == (USB_CDC_ACM_DTE | USB_CDC_ACM_RTS)) {
if(line_state & USB_CDC_ACM_DTE) {
enabled = 1;
} else {
/*
* During tests on Ubuntu and OS X, line_state never stays == 2
* (USB_CDC_ACM_RTS) for too long. We always see this value when the
* line is in the process of going up or coming down. If it is going
* up, value 3 will enable us shortly. Otherwise, we may as well
* disable already.
*
* All other values: disable
*/
enabled = 0;
}
}

View File

@ -170,6 +170,16 @@ do_work(void)
enabled = 0;
}
events = usb_cdc_acm_get_events();
if(events & USB_CDC_ACM_LINE_STATE) {
uint8_t line_state = usb_cdc_acm_get_line_state();
if(line_state & USB_CDC_ACM_DTE) {
enabled = 1;
} else {
enabled = 0;
}
}
if(!enabled) {
return;
}
@ -254,6 +264,7 @@ PROCESS_THREAD(usb_serial_process, ev, data)
usb_setup();
usb_cdc_acm_setup();
usb_set_global_event_process(&usb_serial_process);
usb_cdc_acm_set_event_process(&usb_serial_process);
usb_set_ep_event_process(EPIN, &usb_serial_process);
usb_set_ep_event_process(EPOUT, &usb_serial_process);