From bd6c5a24f24fc453dfc9d5ba4deaba2608220e71 Mon Sep 17 00:00:00 2001 From: xqsnow Date: Thu, 27 Oct 2016 08:04:20 +0800 Subject: [PATCH 1/4] fix: oled demo can't work well. tested on NanoPi Neo Air --- lib/oled.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/oled.c b/lib/oled.c index b0c9bbd..6b72bc8 100644 --- a/lib/oled.c +++ b/lib/oled.c @@ -256,9 +256,8 @@ EXPORT int OLEDInit(int cmdDatPin, int resetPin) ret = -1; } */ - if (OLEDSetPos(devFD, 0, 0) == -1) { - ret = -1; - } + ret = OLEDSetPos(devFD, 0, 0); + if (ret == 0) { return devFD; } else { From d689382ced2fc58081b20bf790e5c431f05ab5f7 Mon Sep 17 00:00:00 2001 From: xqsnow Date: Sat, 5 Nov 2016 15:07:17 +0800 Subject: [PATCH 2/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=20oled=20=E9=83=A8?= =?UTF-8?q?=E5=88=86=E9=A9=B1=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/includes/libfahw-oled.h | 6 ++-- lib/includes/libfahw.h | 2 +- lib/oled.c | 71 ++++++++++++++++++++++++++++++------- 3 files changed, 64 insertions(+), 15 deletions(-) diff --git a/lib/includes/libfahw-oled.h b/lib/includes/libfahw-oled.h index 3ab8c54..324f998 100644 --- a/lib/includes/libfahw-oled.h +++ b/lib/includes/libfahw-oled.h @@ -4,11 +4,13 @@ #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) #define OLED_WIDTH (132) #define OLED_HEIGHT (64) +#define CURSOR_X_MAX (OLED_WIDTH / 8 - 1) +#define CURSOR_Y_MAX (OLED_HEIGHT / 16 -1) int OLEDDisp8x16Str(int devFD, int x, int y, char ch[]); int OLEDDisp8x16Char(int devFD, int x, int y, char ch); -int OLEDCleanScreen(int devFD); +int OLEDCleanScreen(void); int OLEDInit(int resetPin, int cmdDatPin); void OLEDDeInit(int devFD); - +int oprintf(const char* fmt, ...); #endif diff --git a/lib/includes/libfahw.h b/lib/includes/libfahw.h index b07d9b8..801ecdb 100644 --- a/lib/includes/libfahw.h +++ b/lib/includes/libfahw.h @@ -1,7 +1,7 @@ #ifndef __FRIENDLYARM_HARDWARE_H__ #define __FRIENDLYARM_HARDWARE_H__ -#include "../common.h" +#include "common.h" #include "libfahw-filectl.h" #include "libfahw-gpio.h" #include "libfahw-i2c.h" diff --git a/lib/oled.c b/lib/oled.c index 6b72bc8..6dbccbe 100644 --- a/lib/oled.c +++ b/lib/oled.c @@ -6,6 +6,7 @@ #include "libfahw-gpio.h" #include "common.h" +static int oledFD; static int gCmdDatPin = -1; static int gResetPin = -1; static unsigned char spiMode = 0; @@ -259,6 +260,7 @@ EXPORT int OLEDInit(int cmdDatPin, int resetPin) ret = OLEDSetPos(devFD, 0, 0); if (ret == 0) { + oledFD = devFD; return devFD; } else { unexportGPIOPin(resetPin); @@ -316,23 +318,68 @@ EXPORT int OLEDDisp8x16Str(int devFD, int x, int y, char ch[]) return 0; } -EXPORT int OLEDCleanScreen(int devFD) +EXPORT int OLEDCleanScreen(void) { int x,y; - unsigned char data = 0x00; int ret = 0; - for (y=0; y<8; y++) + for (y=0; y <= CURSOR_Y_MAX; y++) { - // set pos (y, 0) - OLEDWriteCmd(devFD, 0xb0+y); - OLEDWriteCmd(devFD, 0x00); - OLEDWriteCmd(devFD, 0x10); - for (x=0; x Date: Sat, 5 Nov 2016 07:12:44 +0000 Subject: [PATCH 3/4] add a new demo of uart. --- demo/matrix-uart/Makefile | 11 ++ demo/matrix-uart/commtest | Bin 0 -> 13680 bytes demo/matrix-uart/commtest.c | 271 ++++++++++++++++++++++++++++++++++++ 3 files changed, 282 insertions(+) create mode 100644 demo/matrix-uart/Makefile create mode 100644 demo/matrix-uart/commtest create mode 100644 demo/matrix-uart/commtest.c diff --git a/demo/matrix-uart/Makefile b/demo/matrix-uart/Makefile new file mode 100644 index 0000000..3589481 --- /dev/null +++ b/demo/matrix-uart/Makefile @@ -0,0 +1,11 @@ +CC = gcc + +TARGET = commtest +SRC = commtest.c + +$(TARGET):$(SRC) + $(CC) -o $@ $^ -REENTRANT -Wall -lfahw -lm -lpthread + +.PHONY: clean +clean: + rm -f $(TARGET) diff --git a/demo/matrix-uart/commtest b/demo/matrix-uart/commtest new file mode 100644 index 0000000000000000000000000000000000000000..30a42254e5178a8782d01db6079942eb95996e17 GIT binary patch literal 13680 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define FALSE 0 +#define TRUE 1 + +#define PRINTF oprintf + +#include + +int speed_arr[] = {B115200, B576000, B38400, B19200, B9600, B4800, B2400, B1200, B300, + B38400, B19200, B9600, B4800, B2400, B1200, B300, }; +int name_arr[] = {115200, 57600, 38400, 19200, 9600, 4800, 2400, 1200, 300, + 38400, 19200, 9600, 4800, 2400, 1200, 300, }; + +void set_speed(int fd, int speed) +{ + int i; + int status; + struct termios Opt; + tcgetattr(fd, &Opt); + for ( i= 0; i < sizeof(speed_arr) / sizeof(int); i++) + { + if (speed == name_arr[i]) + { + tcflush(fd, TCIOFLUSH); + cfsetispeed(&Opt, speed_arr[i]); + cfsetospeed(&Opt, speed_arr[i]); + status = tcsetattr(fd, TCSANOW, &Opt); + if (status != 0) + perror("tcsetattr fd1"); + return; + } + tcflush(fd,TCIOFLUSH); + } +} + +int set_Parity(int fd,int databits,int stopbits,int parity) +{ + struct termios options; + if ( tcgetattr( fd,&options) != 0) + { + perror("SetupSerial 1"); + return(FALSE); + } + options.c_cflag &= ~CSIZE; + switch (databits) + { + case 7: + options.c_cflag |= CS7; + break; + case 8: + options.c_cflag |= CS8; + break; + default: + fprintf(stderr,"Unsupported data size\n"); + return (FALSE); + } + switch (parity) + { + case 'n': + case 'N': + options.c_cflag &= ~PARENB; /* Clear parity enable */ + options.c_iflag &= ~INPCK; /* Enable parity checking */ + break; + case 'o': + case 'O': + options.c_cflag |= (PARODD | PARENB); + options.c_iflag |= INPCK; + break; + case 'e': + case 'E': + options.c_cflag |= PARENB; /* Enable parity */ + options.c_cflag &= ~PARODD; + options.c_iflag |= INPCK; + break; + case 'S': + case 's': /*as no parity*/ + options.c_cflag &= ~PARENB; + options.c_cflag &= ~CSTOPB; + break; + default: + fprintf(stderr,"Unsupported parity\n"); + return (FALSE); + } + switch (stopbits) + { + case 1: + options.c_cflag &= ~CSTOPB; + break; + case 2: + options.c_cflag |= CSTOPB; + break; + default: + fprintf(stderr,"Unsupported stop bits\n"); + return (FALSE); + } + /* Set input parity option */ + if (parity != 'n') + options.c_iflag |= INPCK; + options.c_cc[VTIME] = 150; // 15 seconds + options.c_cc[VMIN] = 0; + + options.c_lflag = 0; + + tcflush(fd,TCIFLUSH); /* Update the options and do it NOW */ + if (tcsetattr(fd,TCSANOW,&options) != 0) + { + perror("SetupSerial 3"); + return (FALSE); + } + return (TRUE); +} + +int OpenDev(char *Dev) +{ + int fd = open( Dev, O_RDWR | O_NDELAY | O_NOCTTY); //| O_NOCTTY | O_NDELAY + if (-1 == fd) + { + perror("Can't Open Serial Port"); + return -1; + } + else + return fd; + +} + +int SerialOpen(char* dev, int baud, char* opt) +{ + int fd; + int bits; + int stopbits; + char parity; + fd = OpenDev(dev); + if (fd>0) + set_speed(fd,baud); + else + { + printf("Can't Open Serial Port:%s!\n",dev); + exit(0); + } + parity = opt[0]; + bits = opt[1] - '0'; + stopbits = opt[2] - '0'; + + switch(parity){ + case 'N': + case 'O': + case 'E': + case 'n': + case 'o': + case 'e': + case 'S': + case 's': + break; + default: + printf("Parity false\n"); + exit(1); + } + + if((stopbits != 1) && (stopbits != 2)){ + printf("Stopbits false\n"); + exit(1); + } + + if((bits != 7) && (bits != 8)){ + printf("Bits false\n"); + exit(1); + } + + if (set_Parity(fd,8,1,'N')== FALSE) + { + printf("Set Parity Error\n"); + exit(1); + } + return fd; +} + +#define RX_BUF_SIZE 512 +char rx_buf[RX_BUF_SIZE]; +char now_time[8]; +char time_fre = 0; +void *com_rx (void *arg) +{ + int serialfd = (int)arg; + int nread = 0; + int nback = 0; + int timer = 0; + int status = 0; + while(1){ + nread = read(serialfd, rx_buf + nback, RX_BUF_SIZE - nback); + if(nread > 0){ + nback += nread; + } + + if(nread > 0){ + timer = 0; + status = 1; + } + else if(status == 1){ + timer++; + } + + if(status && (timer > 10)){ + rx_buf[nback] = '\0'; + char *p = strstr(rx_buf,"$GNRMC,"); + if(p){ + p += 7; + unsigned char h = (p[0] - 48) * 10 + 40; + now_time[0] = h/10 + 48; + now_time[1] = h%10 + 48; + now_time[2] = '-'; + now_time[3] = p[2]; + now_time[4] = p[3]; + now_time[5] = '-'; + now_time[6] = p[4]; + now_time[7] = p[5]; + now_time[8] = '\0'; + time_fre = 1; + } + status = 0; + timer = 0; + memset(rx_buf,'\0',nback); + nback = 0; + } + usleep(1000); + } +} + +struct oled_cursor{ + int x; + int y; +}; + +extern struct oled_cursor __oled_cursor; + +int main (void) +{ + pthread_t rx_thread; + boardInit(); + int SerialFD = SerialOpen("/dev/ttyS1",115200,"N81"); + OLEDInit(7,11); + OLEDCleanScreen(); + if(SerialFD > 0){ + PRINTF("Serial Opened\n"); + }else{ + PRINTF("Serial Open failed\n"); + + } + + pthread_create(&rx_thread,NULL,com_rx,(void*)SerialFD); + + while(1){ + if(time_fre){ + time_fre = 0; + __oled_cursor.x = 0; + __oled_cursor.y = 1; + PRINTF("Time:%s",now_time); + } + } + + return 0; +} From 4b93d1008614cd988be5c6b09b5fae88a718db42 Mon Sep 17 00:00:00 2001 From: root Date: Sat, 5 Nov 2016 07:35:41 +0000 Subject: [PATCH 4/4] fix a little bug --- demo/matrix-uart/commtest.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/demo/matrix-uart/commtest.c b/demo/matrix-uart/commtest.c index 6b52c19..5d7e274 100644 --- a/demo/matrix-uart/commtest.c +++ b/demo/matrix-uart/commtest.c @@ -214,7 +214,7 @@ void *com_rx (void *arg) char *p = strstr(rx_buf,"$GNRMC,"); if(p){ p += 7; - unsigned char h = (p[0] - 48) * 10 + 40; + unsigned char h = (p[0] - 48) * 10 + p[1] - 40; now_time[0] = h/10 + 48; now_time[1] = h%10 + 48; now_time[2] = '-';