From 7f3fbae3145de41f2dcd11716ddb3f80b5dcd525 Mon Sep 17 00:00:00 2001 From: "T. van der Zwan" Date: Mon, 23 Dec 2013 11:55:38 +0000 Subject: [PATCH] A test program that writes green/red/blue to ws2812b at 4MHz Former-commit-id: 2fa36165086f5bef99eaca387f6abeed8c4e683c --- test/CMakeLists.txt | 3 + test/TestUartHighSpeed.cpp | 238 +++++++++++++++++++++++++++++++++++++ 2 files changed, 241 insertions(+) create mode 100644 test/TestUartHighSpeed.cpp diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 707d23ee..77316502 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -54,3 +54,6 @@ add_executable(test_rs232highspeed ../libsrc/leddevice/LedRs232Device.cpp) target_link_libraries(test_rs232highspeed serialport) + +add_executable(test_uartHighSpeed TestUartHighSpeed.cpp) +target_link_libraries(test_uartHighSpeed ${QT_LIBRARIES}) diff --git a/test/TestUartHighSpeed.cpp b/test/TestUartHighSpeed.cpp new file mode 100644 index 00000000..c909286a --- /dev/null +++ b/test/TestUartHighSpeed.cpp @@ -0,0 +1,238 @@ + +#include +#include +#include //Used for UART +#include //Used for UART +#include //Used for UART +#include +#include + +#include +#include +#include + +#include + +struct serial_struct { + int type; + int line; + unsigned int port; + int irq; + int flags; + int xmit_fifo_size; + int custom_divisor; + int baud_base; + unsigned short close_delay; + char io_type; + char reserved_char[1]; + int hub6; + unsigned short closing_wait; /* time to wait before closing */ + unsigned short closing_wait2; /* no longer used... */ + unsigned char *iomem_base; + unsigned short iomem_reg_shift; + unsigned int port_high; + unsigned long iomap_base; /* cookie passed into ioremap */ +}; + + +static volatile bool _running; + +void signal_handler(int signum) +{ + _running = false; + +} + +int main() +{ + _running = true; + signal(SIGTERM, &signal_handler); + + //------------------------- + //----- SETUP USART 0 ----- + //------------------------- + //At bootup, pins 8 and 10 are already set to UART0_TXD, UART0_RXD (ie the alt0 function) respectively + int uart0_filestream = -1; + + //OPEN THE UART + //The flags (defined in fcntl.h): + // Access modes (use 1 of these): + // O_RDONLY - Open for reading only. + // O_RDWR - Open for reading and writing. + // O_WRONLY - Open for writing only. + // + // O_NDELAY / O_NONBLOCK (same function) - Enables nonblocking mode. When set read requests on the file can return immediately with a failure status + // if there is no input immediately available (instead of blocking). Likewise, write requests can also return + // immediately with a failure status if the output can't be written immediately. + // + // O_NOCTTY - When set and path identifies a terminal device, open() shall not cause the terminal device to become the controlling terminal for the process. + uart0_filestream = open("/dev/ttyAMA0", O_RDWR | O_NOCTTY | O_NDELAY); //Open in non blocking read/write mode + if (uart0_filestream == -1) + { + //ERROR - CAN'T OPEN SERIAL PORT + printf("Error - Unable to open UART. Ensure it is not in use by another application\n"); + } + + //CONFIGURE THE UART + //The flags (defined in /usr/include/termios.h - see http://pubs.opengroup.org/onlinepubs/007908799/xsh/termios.h.html): + // Baud rate:- B1200, B2400, B4800, B9600, B19200, B38400, B57600, B115200, B230400, B460800, B500000, B576000, B921600, B1000000, B1152000, B1500000, B2000000, B2500000, B3000000, B3500000, B4000000 + // CSIZE:- CS5, CS6, CS7, CS8 + // CLOCAL - Ignore modem status lines + // CREAD - Enable receiver + // IGNPAR = Ignore characters with parity errors + // ICRNL - Map CR to NL on input (Use for ASCII comms where you want to auto correct end of line characters - don't use for bianry comms!) + // PARENB - Parity enable + // PARODD - Odd parity (else even) + struct termios options; + tcgetattr(uart0_filestream, &options); + options.c_cflag = B4000000 | CS8 | CLOCAL | CREAD; //) (*txIt) << " 0 "; + } + std::cout << "]" << std::endl; + + std::cout << "Type 'c' to continue, 'q' or 'x' to quit: "; + while (_running) + { + char c = getchar(); + if (c == 'q' || c == 'x') + { + break; + } + if (c != 'c') + { + continue; + } + + int count = write(uart0_filestream, &tx_buffer[0], (p_tx_buffer - &tx_buffer[0])); //Filestream, bytes to write, number of bytes to write + if (count < 0) + { + std::cerr << "UART TX error" << std::endl; + + //----- CLOSE THE UART ----- + close(uart0_filestream); + return -1; + } + std::cout << "Writing " << count << " bytes to uart" << std::endl; + } + + //----- CLOSE THE UART ----- + close(uart0_filestream); + + std::cout << "Program finished" << std::endl; + + return 0; +}