Add toolchain and mbtk source
Change-Id: Ie12546301367ea59240bf23d5e184ad7e36e40b3
diff --git a/mbtk/ql_lib/src/ql_uart.c b/mbtk/ql_lib/src/ql_uart.c
new file mode 100755
index 0000000..ee9ce4c
--- /dev/null
+++ b/mbtk/ql_lib/src/ql_uart.c
@@ -0,0 +1,418 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <string.h>
+#include <errno.h>
+#include <termios.h>
+#include <unistd.h>
+
+#include "mbtk_log.h"
+#include "ql/ql_uart.h"
+
+int Ql_UART_Open(const char* port, Enum_BaudRate baudrate, Enum_FlowCtrl flowctrl)
+{
+ int fd;
+ if((fd = open(port, O_RDWR | O_NOCTTY)) < 0)
+ {
+ LOGE("open %s failed - %d", port, errno);
+ return -1;
+ }
+
+ LOGD("Open %s success.", port);
+
+ /* set newtio */
+ struct termios newtio;
+ memset(&newtio, 0, sizeof(newtio));
+ if (tcflush(fd, TCIOFLUSH) < 0) {
+ LOGE("Could not flush uart port");
+ return -1;
+ }
+
+ newtio.c_cc[VTIME] = 0; /* inter-character timer unused */
+ newtio.c_cc[VMIN] = 1; /* blocking read until 5 chars received */
+
+ if(flowctrl == FC_RTSCTS) {
+ newtio.c_cflag |= CRTSCTS;
+ } else if(flowctrl == FC_XONXOFF) {
+ newtio.c_cflag |= (IXON | IXOFF);
+ } else {
+ // newtio.c_cflag |= CRTSCTS;
+ }
+ newtio.c_iflag = IGNPAR;
+ newtio.c_oflag = 0;
+ newtio.c_lflag = 0;
+
+ tcflush(fd, TCIFLUSH);
+
+ switch(baudrate)
+ {
+ case B_300:
+ cfsetospeed(&newtio, B300);
+ cfsetispeed(&newtio, B300);
+ break;
+ case B_600:
+ cfsetospeed(&newtio, B600);
+ cfsetispeed(&newtio, B600);
+ break;
+ case B_1200:
+ cfsetospeed(&newtio, B1200);
+ cfsetispeed(&newtio, B1200);
+ break;
+ case B_2400:
+ cfsetospeed(&newtio, B2400);
+ cfsetispeed(&newtio, B2400);
+ break;
+ case B_4800:
+ cfsetospeed(&newtio, B4800);
+ cfsetispeed(&newtio, B4800);
+ break;
+ case B_9600:
+ cfsetospeed(&newtio, B9600);
+ cfsetispeed(&newtio, B9600);
+ break;
+ case B_19200:
+ cfsetospeed(&newtio, B19200);
+ cfsetispeed(&newtio, B19200);
+ break;
+ case B_38400:
+ cfsetospeed(&newtio, B38400);
+ cfsetispeed(&newtio, B38400);
+ break;
+ case B_57600:
+ cfsetospeed(&newtio, B57600);
+ cfsetispeed(&newtio, B57600);
+ break;
+ case B_115200:
+ cfsetospeed(&newtio, B115200);
+ cfsetispeed(&newtio, B115200);
+ break;
+ case B_230400:
+ cfsetospeed(&newtio, B230400);
+ cfsetispeed(&newtio, B230400);
+ break;
+ case B_460800:
+ cfsetospeed(&newtio, B460800);
+ cfsetispeed(&newtio, B460800);
+ break;
+ case B_921600:
+ cfsetospeed(&newtio, B921600);
+ cfsetispeed(&newtio, B921600);
+ break;
+ case B_3000000:
+ cfsetospeed(&newtio, B3000000);
+ cfsetispeed(&newtio, B3000000);
+ break;
+ case B_4000000:
+ cfsetospeed(&newtio, B4000000);
+ cfsetispeed(&newtio, B4000000);
+ break;
+ default:
+ cfsetospeed(&newtio, B115200);
+ cfsetispeed(&newtio, B115200);
+ break;
+ }
+
+ if (tcsetattr(fd, TCSANOW, &newtio) < 0) {
+ LOGE("Can't set port setting");
+ return -1;
+ }
+ /* Blocking behavior */
+ fcntl(fd, F_SETFL, 0);
+
+ return fd;
+}
+
+int Ql_UART_Read(int fd, char* buf, unsigned int buf_len)
+{
+ return read(fd, buf, buf_len);
+}
+
+
+int Ql_UART_Write(int fd, const char* buf, unsigned int buf_len)
+{
+ return write(fd, buf, buf_len);
+}
+
+
+int Ql_UART_SetDCB(int fd, ST_UARTDCB *dcb)
+{
+ struct termios newtio;
+ memset(&newtio, 0, sizeof(newtio));
+
+ if(tcgetattr(fd, &newtio) != 0)
+ {
+ LOGE("Serial port configuration backup errno");
+ return -1;
+ }
+
+ switch(dcb->baudrate)
+ {
+ case B_300:
+ cfsetospeed(&newtio, B300);
+ cfsetispeed(&newtio, B300);
+ break;
+ case B_600:
+ cfsetospeed(&newtio, B600);
+ cfsetispeed(&newtio, B600);
+ break;
+ case B_1200:
+ cfsetospeed(&newtio, B1200);
+ cfsetispeed(&newtio, B1200);
+ break;
+ case B_2400:
+ cfsetospeed(&newtio, B2400);
+ cfsetispeed(&newtio, B2400);
+ break;
+ case B_4800:
+ cfsetospeed(&newtio, B4800);
+ cfsetispeed(&newtio, B4800);
+ break;
+ case B_9600:
+ cfsetospeed(&newtio, B9600);
+ cfsetispeed(&newtio, B9600);
+ break;
+ case B_19200:
+ cfsetospeed(&newtio, B19200);
+ cfsetispeed(&newtio, B19200);
+ break;
+ case B_38400:
+ cfsetospeed(&newtio, B38400);
+ cfsetispeed(&newtio, B38400);
+ break;
+ case B_57600:
+ cfsetospeed(&newtio, B57600);
+ cfsetispeed(&newtio, B57600);
+ break;
+ case B_115200:
+ cfsetospeed(&newtio, B115200);
+ cfsetispeed(&newtio, B115200);
+ break;
+ case B_230400:
+ cfsetospeed(&newtio, B230400);
+ cfsetispeed(&newtio, B230400);
+ break;
+ case B_460800:
+ cfsetospeed(&newtio, B460800);
+ cfsetispeed(&newtio, B460800);
+ break;
+ case B_921600:
+ cfsetospeed(&newtio, B921600);
+ cfsetispeed(&newtio, B921600);
+ break;
+ case B_3000000:
+ cfsetospeed(&newtio, B3000000);
+ cfsetispeed(&newtio, B3000000);
+ break;
+ case B_4000000:
+ cfsetospeed(&newtio, B4000000);
+ cfsetispeed(&newtio, B4000000);
+ break;
+ default:
+ LOGD("No set speed.");
+ break;
+ }
+
+ switch(dcb->databit)
+ {
+ case DB_CS5:
+ newtio.c_cflag &= ~CSIZE;
+ newtio.c_cflag |= CS5;
+ break;
+ case DB_CS6:
+ newtio.c_cflag &= ~CSIZE;
+ newtio.c_cflag |= CS6;
+ break;
+ case DB_CS7:
+ newtio.c_cflag &= ~CSIZE;
+ newtio.c_cflag |= CS7;
+ break;
+ case DB_CS8:
+ newtio.c_cflag &= ~CSIZE;
+ newtio.c_cflag |= CS8;
+ break;
+ default:
+ LOGD("No set databit.");
+ break;
+ }
+
+ if(dcb->stopbit == SB_2) {
+ newtio.c_cflag |= CSTOPB;
+ } else {
+ newtio.c_cflag &= ~CSTOPB;
+ }
+
+ switch (dcb->parity)
+ {
+ case PB_ODD:// 奇校验
+ newtio.c_cflag |= PARENB;
+ newtio.c_cflag |= PARODD;
+ break;
+ case PB_EVEN:// 偶校验
+ newtio.c_cflag |= PARENB;
+ newtio.c_cflag &= ~PARODD;
+ break;
+ case PB_NONE:// 无奇偶校验
+ newtio.c_cflag &= ~PARENB;
+ break;
+ default:
+ LOGD("No set parity.");
+ break;
+ }
+
+ switch (dcb->flowctrl)
+ {
+ case FC_RTSCTS:
+ newtio.c_cflag |= CRTSCTS;
+ tcflush(fd, TCIFLUSH);
+ break;
+ case FC_XONXOFF:
+ newtio.c_iflag |= (IXON | IXOFF);
+ tcflush(fd, TCIFLUSH);
+ break;
+ case FC_NONE:
+ newtio.c_cflag &= ~CRTSCTS;
+ newtio.c_iflag &= ~(IXON | IXOFF);
+ tcflush(fd, TCIFLUSH);
+ break;
+ default:
+ LOGD("No set flow ctrl.");
+ break;
+ }
+
+ if(tcsetattr(fd, TCSANOW, &newtio) != 0)
+ {
+ LOGE("Serial port configuration backup errno");
+ return -1;
+ }
+
+ return 0;
+}
+
+
+int Ql_UART_GetDCB(int fd, ST_UARTDCB *dcb)
+{
+ struct termios newtio;
+ memset(&newtio, 0, sizeof(newtio));
+
+ if(tcgetattr(fd, &newtio) != 0)
+ {
+ LOGE("Serial port configuration backup errno");
+ return -1;
+ }
+
+ switch(cfgetispeed(&newtio))
+ {
+ case B300:
+ dcb->baudrate = B_300;
+ break;
+ case B600:
+ dcb->baudrate = B_600;
+ break;
+ case B1200:
+ dcb->baudrate = B_1200;
+ break;
+ case B2400:
+ dcb->baudrate = B_2400;
+ break;
+ case B4800:
+ dcb->baudrate = B_4800;
+ break;
+ case B9600:
+ dcb->baudrate = B_9600;
+ break;
+ case B19200:
+ dcb->baudrate = B_19200;
+ break;
+ case B38400:
+ dcb->baudrate = B_38400;
+ break;
+ case B57600:
+ dcb->baudrate = B_57600;
+ break;
+ case B115200:
+ dcb->baudrate = B_115200;
+ break;
+ case B230400:
+ dcb->baudrate = B_230400;
+ break;
+ case B460800:
+ dcb->baudrate = B_460800;
+ break;
+ case B921600:
+ dcb->baudrate = B_921600;
+ break;
+ case B3000000:
+ dcb->baudrate = B_3000000;
+ break;
+ case B4000000:
+ dcb->baudrate = B_4000000;
+ break;
+ default:
+ dcb->baudrate = B_115200;
+ break;
+ }
+
+ switch(newtio.c_cflag & CSIZE)
+ {
+ case CS5:
+ dcb->databit = DB_CS5;
+ break;
+ case CS6:
+ dcb->databit = DB_CS6;
+ break;
+ case CS7:
+ dcb->databit = DB_CS7;
+ break;
+ case CS8:
+ dcb->databit = DB_CS8;
+ break;
+ default:
+ dcb->databit = DB_CS8;
+ break;
+ }
+
+ if(newtio.c_cflag & CSTOPB) {
+ dcb->stopbit = SB_2;
+ } else {
+ dcb->stopbit = SB_1;
+ }
+
+ if(newtio.c_cflag & PARENB) { // 启用了奇偶校验
+ if(newtio.c_cflag & PARODD) {
+ dcb->parity = PB_ODD; // 奇校验
+ } else {
+ dcb->parity = PB_EVEN; // 偶校验
+ }
+ } else {
+ dcb->parity = PB_NONE;
+ }
+
+ if(newtio.c_cflag & CRTSCTS) {
+ dcb->flowctrl = FC_RTSCTS;
+ } else if(newtio.c_iflag & (IXON | IXOFF) == (IXON | IXOFF)){
+ dcb->flowctrl = FC_XONXOFF;
+ } else {
+ dcb->flowctrl = FC_NONE;
+ }
+
+ return 0;
+}
+
+
+int Ql_UART_IoCtl(int fd, unsigned int cmd, void* pValue)
+{
+ return 0;
+}
+
+
+int Ql_UART_Close(int fd)
+{
+ if (fd <= 0)
+ return -1;
+
+ close(fd);
+ return 0;
+}
+