NK-R39S2A1

主板框架图

接口定义

插针pin定义

RS485&232 J_LED-IR1 J_GPIO1 SPK1 UART1
1 RS485_A1 1 VCC3_IR 1 GPIO1 1 L_SPK+ 1 UART0_RX_CON
2 RS485_B1 2 IR 2 GPIO3 2 L_SPK- 2 UART0_TX_CON
3 RS485_A2 3 GND 3 GPIO2 3 R_SPK+ 3 VCC3_TTL
4 RS485_B2 4 AD 4 GPIO4 4 R_SPK- 4 GND
5 UART_RX3_232 5 LEDB 5 SPI2_MOSI_CN J_KEY1 J_RS232
6 UART_TX3_232 6 P_LED 6 SPI2_MISO_CN 1 GND 1 UART_RX5_232
7 UART_RX4_232 I2C-TP 7 SPI2_CLK_CN 2 P3V3 2 UART_TX5_232
8 UART_TX4_232 1 GND 8 SPI2_CS_CN 3 POWER_ON_BT 3 VCC5_232
9 GND 2 I2C1_SDA_TP_C 9 VCC5_GPIO 4 Reset 4 GND
10 GND 3 I2C1_SCL_TP_C 10 VCC5_GPIO 5 RECOVER_BUTTON PUSB
debug 4 TP_RST_C 11 GND HOST1 1 USB_VCC5
1 NC 5 TP_INT_C 12 GND 1 HOST1_VCC5 2 USB_D2N
2 UART2_TX_ 6 TP_VDD 2 HOST1_D1N_CON 3 USB_D2P
3 UART2_RX 3 HOST1_D1P_CON 4 GND
4 GND 4 GND

Jump_sel

COM1_SEL COM2_SEL EDP VDD_JU1
1 3 RS232 1 3 RS232 1 3 EDP 1 2 3.3V
2 4 2 4 2 4 3 4 5V
3 5 RS485 3 5 RS485 3 5 LVDS 5 6 12V
4 6 4 6 4 6

硬件特性

硬件资源规格
SOC Rockchip RK3399 (28纳米HKMG制程)
CPU ARM®六核64位处理器,主频高达1.8GHz
基于big.LITTLE大小核架构, 双核Cortex-A72(大核) + 四核Cortex-A53(小核)
GPU ARM® Mali-T860 MP4 四核GPU
支持OpenGL ES1.1/2.0/3.0/3.1, OpenVG1.1, OpenCL, DX11
支持AFBC(帧缓冲压缩)
NPU
ISP
编解码
内存 4GB LPDDR4(2GB/4GB可选配)
存储 16G/32G/64G可选
以太网 2*1000Mpbs ( 可选 )
WIFI 2.4GHz 单频WiFi / 2.4G/5G 双频
视频输出 支持eDP. LVDS1080P. HDMI2.0
视频输入
音频 2*SPK ( 6W 8Ω )
SATA
USB 3*USB2.0 1*USB3.0
电源 DC IN 12~24V
其他
硬件电气特性
高低温环境 -20℃~60℃
静电 满足ESD 等级3 ,接触放电6KV,空气放电8KV
其他 满足EFT GB/T 17626.4-2008等级3

快速上手

系统烧录

Debug串口调试

Android ADB

Linux SSH

1. 在平板断输入命令ifconfig 查看IP地址:

2. 在PC端打开SSH连接工具,如putty等,在此以xshell为例:

如图所示,主机填入平板IP地址,端口号选择22

3. 用户身份验证

用户名为:root
密码为为: 123456

4. 点击连接,提示ssh密钥认证:

Android 使用指南

接口功能测试

UART
LAN
WIFI
4G/5G
Can
GPIO/DIO

1. IO控制节点都在/sys/class/gpio

2. IO对应表如下:

功能 主板丝印 节点名
输入 IO1 gpio92
IO2 gpio133
IO3 gpio68
IO4 gpio69
IO5 gpio33
IO6 gpio40
输出 IO7 gpio74
IO8 gpio73
IO9 gpio75
IO10 gpio76
IO11 gpio8
IO12 gpio131

3. IO控制方法:

以操作IO1为例,节点名为gpio92

  • 根据IO对应表导入gpio节点:
echo 92 >/sys/class/gpio/export
  • 输出低电平:
echo 0 >/sys/class/gpio/gpio92/value
  • 输出高电平:
echo 1 >/sys/class/gpio/gpio92/value
  • 查看输入电平:
cat /sys/class/gpio/gpio92/value
Audio
Mic
USB

连接USB存储设备或者USB键鼠,到主板3个USB2.0口,USB3.0口仅作为OTG使用。

SDCARD
Bluetooth

1.打开设置→已连接的设备→连接偏好设置→点击蓝牙

2.开启蓝牙

3.选择与新设备陪对,找到需要的蓝牙,点击配对即可

WatchDog
Key
LCD

1.LVDS

a)将数据线找准引脚连接,连接背光线,以及连接触控线,注意跳线帽短接位置

可能一开始 LVDS 不会显示内容,需要调整分辨率,调整至 LVDS 所需要的分辨率

b)打开设置,点击显示

c)点击分辨率,输入密码

d)选择 LVDS 屏幕所需要的分辨率

2.eDP

a)将数据线找准引脚连接,以及连接背光线,注意跳线帽短接位置

可能一开始 eDP 不会显示内容,需要调整分辨率,调整至 eDP 所需要的分辨率

b)打开设置,点击显示

c)点击分辨率,输入密码

d)选择 eDP 屏幕所需要的分辨率

PowerManager
RTC

1.在终端输入“date”可查看当前RTC时间

2.输入“date -s + 时间设置格式”,可设置当前时间

3.输入“hwclock -w”,保存时间,重启主板,即可保存

系统基本功能设置

系统性能测试

Android API 使用说明

NodkaAPI入口类

NodkaAPI使用方法:

1、在Application的onCreate中创建NodkaAPI实例

mNodkaAPI = NodkaAPI.nodkaAPICreate(this);

2、在Activity或Fragment中使用API步驟:

private NodkaAPI mNodkaAPI = APIApplication.getApplication().getNodkaAPI();

NodkaAPI接口说明:

1、以devinfo开头的是硬件及系统信息查询类api

2、以display开头的是显示控制类api

3、以gpio开头的是GPIO控制类api

4、以uart开头的是串口控制类api

5、以sysctrl开头的是系统控制类api,包括定时开关机

接口类别 方法名 方法说明
硬件及系统信息查询类 devinfo_getAndroidVersion() 获取Android系统版本信息
devinfo_getAvailMem() 获取可用内存容量
devinfo_getBuildNumber() 获取系统版本号信息
devinfo_getCpuCores() 获取cpu核心数
devinfo_getCPUCurFreqKHz() 获取cpu当前运行主频
devinfo_getCPUMaxFreqKHz() 获取cpu最大主频
devinfo_getCPUMinFreqKHz() 获取cpu最小主频
devinfo_getCPUTemp() 获取cpu温度
devinfo_getDeviceModel() 获取设备型号信息
devinfo_getKernelVersion() 获取内核版本信息
devinfo_getSerialNum() 获取设备SN号
devinfo_getStorageAvailableSize() 获取本机可用存储容量
devinfo_getStorageTotalSize() 获取本机存储容量(不包括系统分区)
devinfo_getTotalMem() 获取内存总容量
显示控制类 display_getNavBar() 获取是否显示导航栏跟状态栏
display_getScreenBrightness() 获取屏幕亮度
display_getScreenRotation() 获取屏幕旋转方向
display_getWindowHeight() 获取屏幕分辨率高度
display_getWindowWidth() 获取屏幕分辨率宽度
display_setNavBar​(Boolean enable) 设置是否显示导航栏跟状态栏
display_setNavBarSlideShow​(Boolean enable) 设置滑动是否会显示导航栏跟状态栏
display_setScreenBrightness​(int screenBrightness) 设置屏幕亮度
display_setScreenRotation​(int rotation) 设置屏幕旋转方向
GPIO控制类 gpio_direction​(int gpioNumber, String direction) 设置GPIO的方向(输入输出),对指定的gpio号进行设置
gpio_export​(int gpioNumber) 导出控制的GPIO引脚,对指定的gpio号进行导出
gpio_read​(int gpioNumber) 读取GPIO的输出电平值,对指定的gpio号进行读取
gpio_unExport​(int gpioNumber) 取消导出控制的GPIO引脚,对指定的gpio号进行取消导出
gpio_write​(int gpioNumber, int value) 设置GPIO的输出电平,对指定的gpio号进行设置
串口控制类 uart_close​(String uartNode) 关闭uart设备,如/dev/ttyXRUSB2
List<String> uart_getAvailableDevices() 获取uart可用的设备节点
uart_IsOpen​(String uartNode) uart设备是否已经打开,如/dev/ttyXRUSB2
uart_open​(String uartNode, int baudrate) 打开uart设备,如/dev/ttyXRUSB2
uart_receive​(String uartNode, UartReceiveDataCallback callback) 接收串口数据,如从/dev/ttyXRUSB2接收数据
uart_send​(String uartNode, byte[] buffer) 发送串口数据,如向/dev/ttyXRUSB2发送数据
uart_stopReceive​(String uartNode) 停止接收数据,调用后,不再有数据回调
系统控制类 sysctrl_cancelReboot() 取消重启设备
sysctrl_cancelShutdown() 取消自动关机
sysctrl_powerOn​(String time, boolean repeat) 设置设备开机时间
sysctrl_reboot​(String time, boolean repeat) 设置重启设备时间
sysctrl_rebootNow() 立即重启设备
sysctrl_shutdown​(String time, boolean repeat) 设置设备关机时间
sysctrl_shutdownNow() 立即关机
sysctrl_installApk(String apkPath) 静默安装应用

Linux 使用指南

接口功能测试

GPIO

1. IO 控制节点都在/sys/class/io_control/

2. IO 对应表如下:

功能 主板丝印 节点名
输入 GPIO1 gpio_ip0
GPIO2 gpio_ip1
GPIO3 gpio_ip2
GPIO4 gpio_ip3
输出 GPIO5 gpio_op0
GPIO6 gpio_op1
GPIO7 gpio_op2
GPIO8 gpio_op3
  • 输出低电平:
echo 0 >/sys/class/io_control/gpio_op0

*输出高电平:

echo 1 >/sys/class/io_control/gpio_op0

*查看输入电平:

cat /sys/class/io_control/gpio_ip0
UART
LAN
WIFI
4G/5G
Can

Not support

GPIO/DIO

1. IO 控制节点都在/sys/class/io_control/

2. IO 对应表如下:

功能 主板丝印 节点名
输入 IO1 gpio_ip0
IO2 gpio_ip1
IO3 gpio_ip2
IO4 gpio_ip3
输出 IO5 gpio_op0
IO6 gpio_op1
IO7 gpio_op2
IO8 gpio_op3

3. IO控制方法:

  • 输出低电平:
echo 0 >/sys/class/io_control/gpio_op0

*输出高电平:

echo 1 >/sys/class/io_control/gpio_op0

*查看输入电平:

cat /sys/class/io_control/gpio_ip0
Audio
Mic
USB
SDCARD
Bluetooth
WatchDog
Key
LCD/Backlight
PowerManager
RTC/Timezone
CPU
Memory
EMMC

Linux 编程指南

GPIO 应用编程

C参考代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
 
 
static char gpio_path[100];
static int gpio_config(const char *attr, const char *val)
{
    char file_path[100];
    int len;
    int fd;
    sprintf(file_path, "%s/%s", gpio_path, attr);
    if (0 > (fd = open(file_path, O_WRONLY))) {
        perror("open error");
        return fd;
    }
    len = strlen(val);
    if (len != write(fd, val, len)) {
        perror("write error");
        close(fd);
        return -1;
    }
    close(fd); //关闭文件
    return 0;
}
 
int main(int argc, char *argv[])
{
    char file_path[100];
    char val;
    int fd;
    /* 校验传参 */
    if (2 != argc) {
        fprintf(stderr, "usage: %s <gpio>\n", argv[0]);
        exit(-1);
    }
    /* 判断指定编号的 GPIO 是否导出 */
    sprintf(gpio_path, "/sys/class/gpio/gpio%s", argv[1]);
    if (access(gpio_path, F_OK)) {//如果目录不存在 则需要导出
        int len;
        if (0 > (fd = open("/sys/class/gpio/export", O_WRONLY))) {
        perror("open error");
        exit(-1);
        }
    len = strlen(argv[1]);
    if (len != write(fd, argv[1], len)) {//导出 gpio
        perror("write error");
        close(fd);
        exit(-1);
        }
    close(fd); //关闭文件
    }
 
    /* 配置为输入模式 */
    if (gpio_config("direction", "in"))
    exit(-1);
    /* 极性设置 */
    if (gpio_config("active_low", "0"))
    exit(-1);
    /* 配置为非中断方式 */
    if (gpio_config("edge", "none"))
    exit(-1);
    /* 读取 GPIO 电平状态 */
    sprintf(file_path, "%s/%s", gpio_path, "value");
    if (0 > (fd = open(file_path, O_RDONLY))) {
        perror("open error");
        exit(-1);
    }
 
    if (0 > read(fd, &val, 1)) {
        perror("read error");
        close(fd);
        exit(-1);
    }
    printf("value: %c\n", val);
    /* 退出程序 */
    close(fd);
    exit(0);
}

交叉编译源码:

aarch64-linux-gnu-gcc -o gpio gpio.c

将编译好的gpio程序使用scp拷贝到 r39s2 主板上,执行测试:

使用方法:

0:./gpio 3

1:./gpio 1

UART 应用编程

系统下操作 UART 的测试串口,以 J_RS232 TX3\RX3 测试为例:

J_RS232 TX3\RX3 设备节点为:

/dev/ttysWK2

C参考UART高低电平输入代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <termios.h>
#include <errno.h>
int set_opt(int,int,int,char,int);
 
void main(){
	int fd,nByte;
	char *uart3 = "/dev/ttyS2";
	char bufferR[2];
	char bufferW[2];	
 
	memset(bufferR, '\0', 2);
	memset(bufferW, '\0', 2);
 
	if((fd=open(uart3,O_RDWR,0777))<0)
	{
		printf("failed\n");
	}
	else{
		printf("success\n");
		set_opt(fd, 115200, 8, 'N', 1); 
 
	}
 
 
	while(1){	
 
			nByte = 0;
 
				memset(bufferR, '\0', 2);
				memset(bufferW, '\0', 2);
 
	         // printf("hello\n");
			  if((nByte = read(fd, bufferR, 1)) == 1){      //MCU串口发送接收都是单字节(单字符)函数
 
 
			    printf("receive:%c\n",bufferR[0]);
 
				bufferW[0] = 'A';
 
				write(fd,bufferW,1);                    //串口发送单字节(单字符)  buffer[0] = data
 
 
				memset(bufferR, '\0', 2);
			    memset(bufferW, '\0', 2);
 
				nByte = 0;
			  }
 
		}
 
	close(fd);
 
}
 
//串口通用初始化函数
int set_opt(int fd,int nSpeed, int nBits, char nEvent, int nStop)
{
	struct termios newtio,oldtio;//定义结构体newtio和oldtio
	//将原串口的数据取到oldtio
	if  ( tcgetattr( fd,&oldtio)  !=  0) { 
		perror("SetupSerial 1");
		return -1;
	}
	//将newio清零和设置c_cflag
	bzero( &newtio, sizeof( newtio ) );
	newtio.c_cflag  |=  CLOCAL | CREAD;//使能接收和忽略控制线
	newtio.c_cflag &= ~CSIZE;
	//设置数据位
	switch( nBits )
	{
		case 7:
			newtio.c_cflag |= CS7;
			break;
		case 8:
			newtio.c_cflag |= CS8;
			break;
	}
	//设置校验位
	switch( nEvent )
	{
		//偶校验
		case 'O':
			newtio.c_cflag |= PARENB;//使能奇偶校验
			newtio.c_cflag |= PARODD;//偶校验
			newtio.c_iflag |= (INPCK | ISTRIP);//输入校验并忽略第八位
			break;
		case 'E': 
			newtio.c_iflag |= (INPCK | ISTRIP);
			newtio.c_cflag |= PARENB;
			newtio.c_cflag &= ~PARODD;//取消偶校验(置零偶校验位),开启奇校验
			break;
		case 'N':  
			newtio.c_cflag &= ~PARENB;//不进行奇偶校验
			break;
	}
	//设置波特率
	switch( nSpeed )
	{
		case 2400:
			cfsetispeed(&newtio, B2400);
			cfsetospeed(&newtio, B2400);
			break;
		case 4800:
			cfsetispeed(&newtio, B4800);
			cfsetospeed(&newtio, B4800);
			break;
		case 9600:
			cfsetispeed(&newtio, B9600);
			cfsetospeed(&newtio, B9600);
			break;
		case 115200:
			cfsetispeed(&newtio, B115200);
			cfsetospeed(&newtio, B115200);
			break;
		case 460800:
			cfsetispeed(&newtio, B460800);
			cfsetospeed(&newtio, B460800);
			break;
		default:
			cfsetispeed(&newtio, B9600);
			cfsetospeed(&newtio, B9600);
			break;
	}
	//设置停止位
	if( nStop == 1 )
		newtio.c_cflag &=  ~CSTOPB;//一位停止位
	else if ( nStop == 2 )
		newtio.c_cflag |=  CSTOPB;//两位停止位
 
	newtio.c_cc[VTIME]  = 0;//不设置读取超时
	newtio.c_cc[VMIN] = 0;//读取最小字符数为0
 
	tcflush(fd,TCIFLUSH);//清空缓冲区
 
	//使配置生效
	if((tcsetattr(fd,TCSANOW,&newtio))!=0)
	{
		perror("com set error");
		return -1;
	}
	//	printf("set done!\n\r");
	return 0;
}

交叉编译源码:

aarch64-linux-gnu-gcc -o uart uart.c

将编译好的程序使用 scp 拷贝到 3399 主板上,执行测试:

KEY 应用编程

参考系统下操作Key的方法,获取到key的设备节点为

/dev/input/event2

C参考代码如下:

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <linux/input.h>
#include <sys/select.h>
#define INPUT_DEVICE "/dev/input/event2"
int main(int argc, char **argv){
	int fd;
	struct input_event event;
	ssize_t bytesRead;
	int ret;
	fd_set readfds;
	if ( 0 > (fd = open(INPUT_DEVICE,O_RDONLY)))
	{
		perror("open error"); 
		return fd; 
	}
	while(1){
		FD_ZERO(&readfds);
		FD_SET(fd,&readfds);
		ret = select(fd + 1, &readfds, NULL, NULL, NULL);
		if (ret == -1){
			fprintf(stderr,"select call on%s : an error ocurred",argv[1]);
		break;
		}	
		if(FD_ISSET(fd,&readfds)){
			bytesRead = read(fd, &event,sizeof(struct input_event));
			if(bytesRead == -1 )
				fprintf(stderr,"bytesRead :%ld : an error ocurred",bytesRead);
			}	
		if(event.type == EV_KEY && (event.value == 0 || event.value == 1))
		{
			printf("key %s\n",(event.value) ? "pressed" : "released");
		}
	}
	close(fd);
	return EXIT_SUCCESS;
}

交叉编译源码:

 
aarch64-linux-gnu-gcc -o key key.c

将编译好的程序使用 scp 拷贝到 r39s2 主板上,执行测试,按动 key 打印如下:

  • 按下按键时显示:key pressed
  • 松开按键时显示:key released

Linux 应用支持

QT交叉编译环境

QT Creator

高清硬解码

Docker

OpenCL

  • 系统已经支持OpenCL,输入命令clinfo即可查看支持详情:

Linux OTA 在线升级

终端输入 ota 进行固件在线升级

打印/导出