RV1126&RV1109 buildroot 增加串口屏测试

一、运行效果:

[root@ROCKEMD:/]# dwuart
Usage: dwuart /dev/ttyS* data 
+-------data--------+
|   c    -  clear   |
|   t    -  rockemd |
|   q    -  qr      |
+-------------------+
[root@ROCKEMD:/]# dwuart /dev/ttyS3 c
[root@ROCKEMD:/]# dwuart /dev/ttyS3 t
[root@ROCKEMD:/]# dwuart /dev/ttyS3 q

串口屏显示文字与二维码效果:

二、上代码补丁

From 14476e8c31f4957ab6e0cdae506d85badd1fc031 Mon Sep 17 00:00:00 2001
From: rockemd <rockemd2020@163.com>
Date: Wed, 4 Nov 2020 14:09:55 +0800
Subject: [PATCH] add dwuart

---
 .../configs/rockchip_rockemd_rv1109_emmc_defconfig |   1 +
 buildroot/package/rockchip/Config.in               |   1 +
 buildroot/package/rockchip/app-dwuart/Config.in    |   4 +
 .../package/rockchip/app-dwuart/app-dwuart.mk      |  26 +++
 external/dwuart/Makefile                           |  11 ++
 external/dwuart/README.md                          |   1 +
 external/dwuart/dwuart.c                           | 134 +++++++++++++++
 external/dwuart/uartconfig.c                       | 186 +++++++++++++++++++++
 external/dwuart/uartconfig.h                       |  23 +++
 11 files changed, 387 insertions(+)
 create mode 100755 buildroot/package/rockchip/app-dwuart/Config.in
 create mode 100755 buildroot/package/rockchip/app-dwuart/app-dwuart.mk
 create mode 100755 external/dwuart/Makefile
 create mode 100755 external/dwuart/README.md
 create mode 100755 external/dwuart/dwuart.c
 create mode 100755 external/dwuart/uartconfig.c
 create mode 100755 external/dwuart/uartconfig.h

diff --git a/buildroot/configs/rockchip_rockemd_rv1109_emmc_defconfig b/buildroot/configs/rockchip_rockemd_rv1109_emmc_defconfig
index 864f5dd..97b50c5 100755
--- a/buildroot/configs/rockchip_rockemd_rv1109_emmc_defconfig
+++ b/buildroot/configs/rockchip_rockemd_rv1109_emmc_defconfig
@@ -88,4 +88,5 @@ BR2_PACKAGE_NGINX_DEBUG=y
 BR2_PACKAGE_NGINX_RTMP=y
 # BR2_PACKAGE_NTP_NTPD is not set
+BR2_PACKAGE_APP_DWUART=y
diff --git a/buildroot/package/rockchip/Config.in b/buildroot/package/rockchip/Config.in
index 983eb52..b109824 100755
--- a/buildroot/package/rockchip/Config.in
+++ b/buildroot/package/rockchip/Config.in
@@ -249,5 +249,6 @@ source "package/rockchip/rksl/Config.in"
 source "package/rockchip/pcba_adb_test/Config.in"
 source "package/rockchip/camera_factory_test_server/Config.in"
+source "package/rockchip/app-dwuart/Config.in"
 source "package/rockchip/thunderboot/Config.in"
 endif
diff --git a/buildroot/package/rockchip/app-dwuart/Config.in b/buildroot/package/rockchip/app-dwuart/Config.in
new file mode 100755
index 0000000..d1d5485
--- /dev/null
+++ b/buildroot/package/rockchip/app-dwuart/Config.in
@@ -0,0 +1,4 @@
+config BR2_PACKAGE_APP_DWUART
+	bool "dwuart"
+	help
+	  rockemd dwuart demo
diff --git a/buildroot/package/rockchip/app-dwuart/app-dwuart.mk b/buildroot/package/rockchip/app-dwuart/app-dwuart.mk
new file mode 100755
index 0000000..39322ad
--- /dev/null
+++ b/buildroot/package/rockchip/app-dwuart/app-dwuart.mk
@@ -0,0 +1,26 @@
+#############################################################
+#
+# DWUART
+#
+#############################################################
+ifeq ($(BR2_PACKAGE_APP_DWUART), y)
+APP_DWUART_VERSION = 1.0.0
+APP_DWUART_SITE_METHOD:=local
+APP_DWUART_SITE=$(TOPDIR)/../external/dwuart
+APP_DWUART_INSTALL_TARGET:=YES
+
+define APP_DWUART_BUILD_CMDS
+    $(MAKE) CC="$(TARGET_CC)" LD="$(TARGET_LD)" -C $(@D) all
+endef
+
+define APP_DWUART_INSTALL_TARGET_CMDS
+    $(INSTALL) -D -m 0755 $(@D)/dwuart $(TARGET_DIR)/bin
+endef
+
+define APP_DWUART_PERMISSIONS
+    /bin/dwuart f 4755 0 0 - - - - -
+endef
+
+$(eval $(generic-package))
+
+endif
diff --git a/external/dwuart/Makefile b/external/dwuart/Makefile
new file mode 100755
index 0000000..3f4006f
--- /dev/null
+++ b/external/dwuart/Makefile
@@ -0,0 +1,11 @@
+all: dwuart
+
+dwuart: dwuart.o uartconfig.o
+	$(CC) -o dwuart dwuart.o uartconfig.o
+
+clean:
+	rm -rf *.o
+	rm -rf dwuart
+
+install:
+	$(INSTALL) -D -m 0755 dwuart $(TARGET_DIR)/bin
diff --git a/external/dwuart/README.md b/external/dwuart/README.md
new file mode 100755
index 0000000..656f52d
--- /dev/null
+++ b/external/dwuart/README.md
@@ -0,0 +1 @@
+git clone https://github.com/simonqin09/uarttest


diff --git a/external/dwuart/dwuart.c b/external/dwuart/dwuart.c
new file mode 100755
index 0000000..f851630
--- /dev/null
+++ b/external/dwuart/dwuart.c
@@ -0,0 +1,134 @@
+#include "uartconfig.h"
+
+int main(int argc, char **argv)
+{
+	/*
+	clear
+		AA 01 
+		00 00 
+		CC 33 C3 3C 	
+		
+	text 
+		AA 11 
+		41 
+		FF FF 
+		00 00 
+		00 20 00 80 
+		72 6F 63 6B 65 6D 64 		//rockemd
+		CC 33 C3 3C 	
+	
+	
+	QR
+		AA 21 
+		00 08 00 08 
+		04 
+		68 74 74 70 3A 2F 2F 77 77 77 2E 72 6F 63 6B 65 6D 64 2E 63 6F 6D 2F 	//http://www.rockemd.com/
+		CC 33 C3 3C  	
+	*/
+
+	int fd,len,ch;
+	char data_send[1024];
+	char data_read[1024];
+	unsigned char clear[MAX_DATA_SIZE] = "AA010000CC33C33C";
+	unsigned char rockemd[MAX_DATA_SIZE] = "AA1141FFFF000000200080726F636B656D64CC33C33C";
+	unsigned char qr[MAX_DATA_SIZE] = "AA210008000804687474703A2F2F7777772E726F636B656D642E636F6D2FCC33C33C";
+	int in_data_len = MAX_DATA_SIZE;
+	unsigned char out_data0[MAX_DATA_SIZE] = {0};
+	int out_data_len = MAX_DATA_SIZE;
+	int i;
+
+	/* check required parameters(corresponding uart port device) for main application*/
+	if(argc != 3){
+		printf("Usage: %s /dev/ttyS* data \n",argv[0]);
+		printf("+-------data--------+\n");
+		printf("|   c    -  clear   |\n");
+		printf("|   t    -  rockemd |\n");
+		printf("|   q    -  qr      |\n");
+		printf("+-------------------+\n");
+		return -1;
+	}
+	/* open and config uart port, only bandrate can be set here ---
+	--- the orther need to be modified in uart_config in uartconfig.c file */
+	fd = uart_open(argv[1]);
+
+	/* predefined baud rate list:
+	B921600,B460800,B230400,B115200,B57600,B38400,B19200,B9600,B4800,B2400,B1200*/
+	ch = uart_config(fd, B115200);	//B115200
+	if(ch == -1)
+	{
+		printf("uart setup error!");
+		return -1;
+	}
+	/*Sending data part*/
+	//len = sprintf(data_send,"this is a test program\r\n");
+	//================================================
+	
+	switch(argv[2][0])
+	{
+		case 'c':
+		{
+			in_data_len = strlen(clear);
+			string2hex(clear, in_data_len, out_data0, &out_data_len);
+			//for (i = 0; i < out_data_len; i++) {
+			//	printf("0x%02X ", out_data0[i]);
+			//}
+			//printf("\n");
+			if(out_data_len != -1)
+			{
+				ch = uart_send(fd,out_data0,out_data_len);
+				if(ch == -1)
+				{
+					printf("send error\n");
+					uart_close(fd);
+					return -1;
+				}
+			}
+			break;
+		}
+		case 't':
+		{
+			in_data_len = strlen(rockemd);
+			string2hex(rockemd, in_data_len, out_data0, &out_data_len);
+			//for (i = 0; i < out_data_len; i++) {
+			//	printf("0x%02X ", out_data0[i]);
+			//}
+			//printf("\n");
+			if(out_data_len != -1)
+			{
+				ch = uart_send(fd,out_data0,out_data_len);
+				if(ch == -1)
+				{
+					printf("send error\n");
+					uart_close(fd);
+					return -1;
+				}
+			}
+			break;
+		}
+		case 'q':
+		{
+			in_data_len = strlen(qr);
+			string2hex(qr, in_data_len, out_data0, &out_data_len);
+			//for (i = 0; i < out_data_len; i++) {
+			//	printf("0x%02X ", out_data0[i]);
+			//}
+			//printf("\n");
+			if(out_data_len != -1)
+			{
+				ch = uart_send(fd,out_data0,out_data_len);
+				if(ch == -1)
+				{
+					printf("send error\n");
+					uart_close(fd);
+					return -1;
+				}
+			}
+			break;
+		}
+        default :
+            printf("Invalid grade\n" );	
+	}			
+	uart_close(fd);
+	return 0;
+}
diff --git a/external/dwuart/uartconfig.c b/external/dwuart/uartconfig.c
new file mode 100755
index 0000000..0fe630c
--- /dev/null
+++ b/external/dwuart/uartconfig.c
@@ -0,0 +1,186 @@
+#include "uartconfig.h"
+
+int uart_open(char* port)
+{
+	int fd_temp;
+	int flags = O_RDWR | O_NOCTTY | O_NONBLOCK;
+	fd_temp = open(port, flags);
+	if(fd_temp < 0)
+		{
+			perror("Can't open Serial Port");
+			return(-1);
+		}
+    return fd_temp;
+}
+
+void uart_close(int fd)
+{
+	close(fd);
+}
+
+int uart_config(int fd, int bandrate)
+{
+	struct termios tty;
+
+	if(tcgetattr(fd, &tty) != 0)
+		{
+			perror("failed setup Serial");
+			return(-1);
+		}
+
+	/*config bandrate*/
+	cfsetispeed(&tty,bandrate);
+	cfsetospeed(&tty,bandrate);
+
+	/*config data bits = 8*/
+	tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8;
+
+	/*config parity = none*/
+	tty.c_cflag &= ~PARENB;
+
+	/*config stop bits = 1*/
+	tty.c_cflag &= ~CSTOPB;
+
+	/* config flow control = none*/
+	tty.c_cflag &= ~CRTSCTS;
+
+	/*config control mode*/
+	tty.c_cflag |= CLOCAL;
+	tty.c_cflag |= CREAD;
+
+    /* config RAW data mode input and output*/
+	tty.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);  /*Input*/
+	tty.c_oflag &= ~OPOST;   /*Output*/
+
+	/*config wait time and minimal receive characters*/
+	tty.c_cc[VTIME] = 100; /* wait time 100*(1/10)s */
+	tty.c_cc[VMIN] = 1; /* minimal receive characters = 1 */
+
+	/*data overrun processing*/
+	tcflush(fd,TCIFLUSH);
+
+	/* active above configuration*/
+	if (tcsetattr(fd, TCSANOW, &tty) != 0)
+	{
+		fprintf (stderr, "error %d from tcsetattr", errno);
+		return -1;
+	}
+    return(1);
+}
+
+int uart_send(int fd, char *buf_send, int buf_len)
+{
+	int len;
+	len = write(fd,buf_send,buf_len);
+	if(len == buf_len)
+	{
+		//printf("send successflly\n");
+		return len;
+	}
+	else
+	{
+		tcflush(fd,TCOFLUSH);
+		printf("send error\n");
+		return -1;
+	}
+}
+
+int uart_read(int fd, char *buf_read, int buf_len)
+{
+	int len,fs_sel;
+	fd_set fs_read;
+	struct timeval time;
+
+	FD_ZERO(&fs_read);
+	FD_SET(fd,&fs_read);
+
+	time.tv_sec = 10;
+	time.tv_usec = 0;
+
+	fs_sel = select(fd+1,&fs_read,NULL,NULL,&time);
+	if(fs_sel)
+	{
+	   len = read(fd,buf_read,buf_len);
+	   return len;
+	}
+	else
+	{
+	    return -1;
+	}
+}
+
+int uart_485(int fd)
+{
+	struct serial_rs485 rs485conf;
+
+	/* Enable RS485 mode: */
+	rs485conf.flags |= SER_RS485_ENABLED;
+
+	/* Set logical level for RTS pin equal to 0 when sending: */
+	rs485conf.flags |= SER_RS485_RTS_ON_SEND;
+	/* or, set logical level for RTS pin equal to 1 when sending: */
+	//rs485conf.flags &= ~(SER_RS485_RTS_ON_SEND);
+
+	/* Set logical level for RTS pin equal to 0 after sending: */
+	//rs485conf.flags |= SER_RS485_RTS_AFTER_SEND;
+	/* or, set logical level for RTS pin equal to 1 after sending: */
+	rs485conf.flags &= ~(SER_RS485_RTS_AFTER_SEND);
+
+	/* Set rts delay before send, if needed:(in microseconds) */
+	rs485conf.delay_rts_before_send = 100;
+
+	/* Set rts delay after send, if needed: (in microseconds) */
+	rs485conf.delay_rts_after_send = 100;
+
+	/* Set this flag if you want to receive data even whilst sending data */
+	rs485conf.flags |= SER_RS485_RX_DURING_TX;
+
+	if (ioctl(fd, TIOCSRS485, &rs485conf) < 0) {
+		printf("Error: TIOCSRS485 ioctl not supported.\n");
+		return -1;
+	}
+	else
+		return 1;
+}
+
+int string2hex(unsigned char *in_data, int in_data_len, unsigned char *out_data, int *out_data_len)
+{
+    int i;
+    int loop_count;
+    int convert_point = 0;
+    int mem_point = 0;
+    unsigned char convert_result;
+    unsigned char temp[3] = {0}; /* Why is 3 */
+	
+	/* Check the validity of the parameters */
+    if (in_data == NULL || in_data_len <= 0 || out_data == NULL || out_data_len == NULL || (in_data_len % 2) != 0) {
+        printf("invalid parameters\n");
+        return -1;
+    }
+
+	/* Determine whether it exceeds the hexadecimal range 0 ~ F */
+    for (i = 0; i < in_data_len; i++) {
+        if ((in_data[i] < '0') || (in_data[i] > 'f') || ((in_data[i] > '9') &&(in_data[i] < 'A'))) {
+            printf("out of range\n");
+            return -1;
+        }
+    }
+
+    loop_count = in_data_len / 2;
+    memset(out_data, 0x00, *out_data_len);
+    *out_data_len = 0;
+
+    for (i = 0; i < loop_count; i++) {
+        memset(temp, 0x00, sizeof(temp));
+        memcpy(temp, in_data + convert_point, 2);
+        convert_point += 2;
+
+        convert_result = strtoul(temp, NULL, 16);
+
+        memcpy(out_data + mem_point, &convert_result, sizeof(unsigned char));
+        mem_point += sizeof(unsigned char);
+        *out_data_len += sizeof(unsigned char);
+    }
+
+    return 0;
+}
diff --git a/external/dwuart/uartconfig.h b/external/dwuart/uartconfig.h
new file mode 100755
index 0000000..5e5a66e
--- /dev/null
+++ b/external/dwuart/uartconfig.h
@@ -0,0 +1,23 @@
+#include <termios.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include <string.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <linux/serial.h>
+#include <asm-generic/ioctls.h> /* TIOCGRS485 + TIOCSRS485 ioctl definitions */
+
+#define TIOCGRS485      0x542E
+#define TIOCSRS485      0x542F
+
+#define MAX_DATA_SIZE 255
+
+int uart_open(char* port);
+void uart_close(int fd);
+int uart_config(int fd, int bandrate);
+int uart_send(int fd, char *buf_send, int buf_len);
+int uart_read(int fd, char *buf_read, int buf_len);
+int uart_485(int fd);
+int string2hex(unsigned char *in_data, int in_data_len, unsigned char *out_data, int *out_data_len);
+
-- 
2.7.4

三、编译

cd buildroot/
source build/envsetup.sh 
make app-dwuart-rebuild

 

技术交流群: 微信号

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值