USB-USART improvement: flush buffer, send_break, use callbacks.
This commit is contained in:
@@ -30,14 +30,19 @@ blk (void *arg)
|
||||
#define PRIO_USART 4
|
||||
#define PRIO_CDC2USART 3
|
||||
#define PRIO_USART2CDC 3
|
||||
#define PRIO_CDC 2
|
||||
|
||||
#define STACK_MAIN
|
||||
#define STACK_PROCESS_1
|
||||
#define STACK_PROCESS_2
|
||||
#define STACK_PROCESS_3
|
||||
#define STACK_PROCESS_4
|
||||
#define STACK_PROCESS_5
|
||||
#define STACK_PROCESS_6
|
||||
#include "stack-def.h"
|
||||
#define STACK_ADDR_CDC ((uintptr_t)process1_base)
|
||||
#define STACK_SIZE_CDC (sizeof process1_base)
|
||||
|
||||
#define STACK_ADDR_USART ((uint32_t)process2_base)
|
||||
#define STACK_SIZE_USART (sizeof process2_base)
|
||||
|
||||
@@ -70,6 +75,10 @@ usart_to_cdc_loop (void *arg)
|
||||
|
||||
cdc_wait_connection (cdc_usart->cdc);
|
||||
|
||||
/* Flush USART buffers */
|
||||
usart_read (cdc_usart->dev_no, NULL, 0);
|
||||
usart_write (cdc_usart->dev_no, NULL, 0);
|
||||
|
||||
chopstx_usec_wait (100*1000);
|
||||
|
||||
while (1)
|
||||
@@ -98,6 +107,10 @@ cdc_to_usart_loop (void *arg)
|
||||
|
||||
cdc_wait_connection (cdc_usart->cdc);
|
||||
|
||||
/* Flush USART buffers */
|
||||
usart_read (cdc_usart->dev_no, NULL, 0);
|
||||
usart_write (cdc_usart->dev_no, NULL, 0);
|
||||
|
||||
chopstx_usec_wait (50*1000);
|
||||
|
||||
/* Send ZLP at the beginning. */
|
||||
@@ -138,6 +151,78 @@ ss_notify (uint8_t dev_no, uint16_t state_bits)
|
||||
return cdc_ss_notify (s, state_bits);
|
||||
}
|
||||
|
||||
static void
|
||||
send_break (uint8_t dev_no, uint16_t duration)
|
||||
{
|
||||
(void)duration; /* Not supported by USART. */
|
||||
usart_send_break (dev_no);
|
||||
}
|
||||
|
||||
static void
|
||||
setup_usart_config (uint8_t dev_no, uint32_t bitrate, uint8_t format,
|
||||
uint8_t paritytype, uint8_t databits)
|
||||
{
|
||||
/* Check supported config(s) */
|
||||
uint32_t config_bits;
|
||||
|
||||
if (bitrate == 9600)
|
||||
config_bits = B9600;
|
||||
else if (bitrate == 19200)
|
||||
config_bits = B19200;
|
||||
else if (bitrate == 57600)
|
||||
config_bits = B57600;
|
||||
else if (bitrate == 115200)
|
||||
config_bits = B115200;
|
||||
else
|
||||
{
|
||||
bitrate = 115200;
|
||||
config_bits = B115200;
|
||||
}
|
||||
|
||||
if (format == 0)
|
||||
config_bits |= STOP1B;
|
||||
else if (format == 1)
|
||||
config_bits |= STOP1B5;
|
||||
else if (format == 2)
|
||||
config_bits |= STOP2B;
|
||||
else
|
||||
{
|
||||
format = 0;
|
||||
config_bits |= STOP1B;
|
||||
}
|
||||
|
||||
if (paritytype == 0)
|
||||
config_bits |= 0;
|
||||
else if (paritytype == 1)
|
||||
config_bits |= (PARENB | PARODD);
|
||||
else if (paritytype == 2)
|
||||
config_bits |= PARENB;
|
||||
else
|
||||
{
|
||||
paritytype = 0;
|
||||
config_bits |= 0;
|
||||
}
|
||||
|
||||
if (databits == 7)
|
||||
config_bits |= CS7;
|
||||
else if (databits == 7)
|
||||
config_bits |= CS8;
|
||||
else
|
||||
{
|
||||
databits = 8;
|
||||
config_bits |= CS8;
|
||||
}
|
||||
|
||||
if (databits == 7 && paritytype == 0)
|
||||
{
|
||||
databits = 8;
|
||||
config_bits &= ~MASK_CS;
|
||||
config_bits |= CS8;
|
||||
}
|
||||
|
||||
usart_config (dev_no, config_bits);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main (int argc, const char *argv[])
|
||||
@@ -147,7 +232,8 @@ main (int argc, const char *argv[])
|
||||
|
||||
chopstx_usec_wait (200*1000);
|
||||
|
||||
cdc_init ();
|
||||
cdc_init (PRIO_CDC, STACK_ADDR_CDC, STACK_SIZE_CDC,
|
||||
send_break, setup_usart_config);
|
||||
cdc_wait_configured ();
|
||||
|
||||
usart_init (PRIO_USART, STACK_ADDR_USART, STACK_SIZE_USART, ss_notify);
|
||||
|
||||
Reference in New Issue
Block a user