Private
Public Access
2
0

uart: use an unsigned int for baud rate rather than speed_t

uart.c contains a static conversion function that will translate known
baud rates into their speed_t counter parts.  If an unsupported baud
rate is selected, a diagnostic will be emitted via syslog and a
default of B9600 will be chosen.

Signed-off-by: Jon Trulson <jtrulson@ics.com>
Signed-off-by: Brendan Le Foll <brendan.le.foll@intel.com>
This commit is contained in:
Jon Trulson
2015-04-30 14:12:45 -06:00
committed by Thomas Ingleby
parent c30457e434
commit 88f3052d99
3 changed files with 49 additions and 5 deletions

View File

@@ -83,7 +83,7 @@ char* mraa_uart_get_dev_path(mraa_uart_context dev);
* @param baud desired baud rate
* @return mraa_result_t
*/
mraa_result_t mraa_uart_open_dev(mraa_uart_context dev, speed_t baud);
mraa_result_t mraa_uart_open_dev(mraa_uart_context dev, unsigned int baud);
/**
* Close a device previously opened with mraa_uart_open_dev().

View File

@@ -85,7 +85,7 @@ class Uart
* @return mraa_result_t
*/
mraa_result_t
openDevice(speed_t baud)
openDevice(unsigned int baud)
{
return mraa_uart_open_dev(m_uart, baud);
}

View File

@@ -31,6 +31,49 @@
#include "uart.h"
#include "mraa_internal.h"
// This function takes an unsigned int and converts it to a B* speed_t
// that can be used with linux termios.
static speed_t uint2speed(unsigned int speed)
{
switch (speed) {
case 0: return B0; // hangup, not too useful otherwise
case 50: return B50;
case 75: return B75;
case 110: return B110;
case 150: return B150;
case 200: return B200;
case 300: return B300;
case 600: return B600;
case 1200: return B1200;
case 1800: return B1800;
case 2400: return B2400;
case 4800: return B4800;
case 9600: return B9600;
case 19200: return B19200;
case 38400: return B38400;
case 57600: return B57600;
case 115200: return B115200;
case 230400: return B230400;
case 460800: return B460800;
case 500000: return B500000;
case 576000: return B576000;
case 921600: return B921600;
case 1000000: return B1000000;
case 1152000: return B1152000;
case 1500000: return B1500000;
case 2000000: return B2000000;
case 2500000: return B2500000;
case 3000000: return B3000000;
case 3500000: return B3500000;
case 4000000: return B4000000;
}
// if we are here, then an unsupported baudrate was selected.
// Report it via syslog and return B9600, a common default.
syslog(LOG_ERR, "uart: unsupported baud rate, defaulting to 9600.");
return B9600;
}
mraa_uart_context
mraa_uart_init(int index)
{
@@ -112,7 +155,7 @@ mraa_uart_get_dev_path(mraa_uart_context dev)
}
mraa_result_t
mraa_uart_open_dev(mraa_uart_context dev, speed_t baud)
mraa_uart_open_dev(mraa_uart_context dev, unsigned int baud)
{
if (!dev) {
syslog(LOG_ERR, "uart: open: context is NULL");
@@ -144,8 +187,9 @@ mraa_uart_open_dev(mraa_uart_context dev, speed_t baud)
cfmakeraw(&termio);
// set our baud rates
cfsetispeed(&termio, baud);
cfsetospeed(&termio, baud);
speed_t speed = uint2speed(baud);
cfsetispeed(&termio, speed);
cfsetospeed(&termio, speed);
// make it so
if (tcsetattr(dev->fd, TCSAFLUSH, &termio) < 0) {