本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。
===== NK-R39S2A1 ===== ==== 主板框架图 ==== {{:pasted:20221214-220552.png}} ==== 接口定义 ==== {{page>:template:R39S2_hw}} === 插针pin定义 === {{page>:template:R39S2p_hw_pin}} === Jump_sel === {{page>:template:R39S2_hw_jump}} ==== 硬件特性 ==== {{page>:template:temp_hwspec}} ==== 快速上手 ==== === 系统烧录 === {{page>:template:temp_burn}} === Debug串口调试 === 1、通过串口进入系统后台,需要利用板子的Debug接口,接口位置和定义如图: {{:arm:rk3399:linux:39s2_debug10.png?600|}} * 接口只需要用到3个引脚,TX、RX、GND 2、需要用到串口小板工具 * A部分需要接入TX、RX、GND * B部分连接电脑USB口 {{:arm:rk3399:android:ser-3.png?600×356|}} 3、硬件部分连接效果图 {{:arm:rk3399:linux:r39sa1_ck.png?600|}} 4、在电脑的设备管理器->端口 中看有没有串口信息 {{:arm:rk3399:android:ser-4.png?600×356|}} 5、打开Xshell新建一个会话,在连接下选择协议为SERIAL,操作如图: {{:arm:rk3399:android:ser-5.png?600×356|}} 6、点击串口,端口号为设备管理器看到的串口号,波特率为:1500000 {{:arm:rk3399:android:ser-6.png?600×356|}} 7、最后点击连接,串口进入后台 {{:arm:rk3399:android:ser-7.png?600×356|}} === Android ADB === {{page>:template:temp_adb}} === Linux SSH === {{page>:template:temp_ssh}} ==== Android 使用指南 ==== === 接口功能测试 === == UART == {{page>:template:temp_android_uart}} == LAN == {{page>:template:temp_android_lan}} == WIFI == {{page>:template:temp_android_wifi}} == 4G/5G == 1.测试4G网络 a)给板子断电,接上4G模块与天线,插入5G电话卡 b)打开设置,点击更多 {{:arm:rk3399:android:lan-2.png?600|}} c)点击4G路由设置 {{:arm:rk3399:android:4g-1.png?600|}} d)开启路由 {{:arm:rk3399:android:4g-2.png?600|}} 状态栏右上角显示该图标,则为开启成功 {{:arm:rk3399:android:4g-3.png?600|}} 2.测试5G网络 a)给板子断电,插入5G电话卡,接上5G模块与一根天线,天线接在模线帽接口 {{:arm:rk3399:linux:r39s2_4g.jpg?600|}} b)打开设置,点击更多 {{:arm:rk3399:android:lan-2.png?600|}} c)点击4G路由设置 {{:arm:rk3399:android:4g-1.png?600|}} d)开启路由 {{:arm:rk3399:android:4g-2.png?600|}} 状态栏右上角显示该图标,则为开启成功 {{:arm:rk3399:android:5g-2.png?600|}} == Can == {{page>:template:temp_android_can}} == GPIO/DIO == {{page>:template:temp_android_gpio}} == Audio == {{page>:template:temp_android_audio}} == Mic == {{page>:template:temp_android_mic}} == USB == {{:arm:rk3399:linux:39s2_usb10.png?600|}} == SDCARD == {{page>:template:temp_android_sdcard}} == Bluetooth == {{page>:template:temp_android_bluetooch}} == WatchDog == {{page>:template:temp_android_watchdog}} == Key == {{page>:template:temp_android_key}} == LCD == {{page>:template:temp_android_lcd}} == PowerManager == {{page>:template:temp_android_pm}} == RTC == {{page>:template:temp_android_rtc}} === 系统基本功能设置 === {{page>:template:temp_android_system}} === 系统性能测试 === {{page>:template:temp_android_perf}} ==== Android API 使用说明 ==== {{page>:template:temp_android_api}} ==== Linux 使用指南 ==== === 接口功能测试 === == GPIO == {{page>:template:temp_linux_gpio11}} == UART == 1. 串口定义参考: * [[:nk-rk3399-v0c#接口定义|主板接口定义]] 2. 串口设备节点系统对应表: ^ 主板丝印 ^ 设备节点 ^ | J_RS232 RX2\TX2 | /dev/ttysWK1 | | J_RS232 RX3\TX3 | /dev/ttysWK2 | | J_RS232 RX4\TX4 | /dev/ttysWK3 | | RS485 | /dev/ttyS3 | | UART | /dev/ttyS4 | 3. CuTecom 测试串口,以/dev/ttysWK2回环测试为例 * 参考步骤1~2短接/dev/ttysWK2的 TX & RX (2~3 pin); * 双击桌面CuteCom图标,打开APP,Device选择测试端口对应的设备节点(见步骤2); * 点击Settings,设置串口参数,如下图所示: {{:arm:rk3399:linux:cutecom_1.png?600|}} * 设置好以后点击Open 打开串口,在input 文本输入框中输入字符,按回车发送数据: {{:arm:rk3399:linux:cutecom_2.png?600|}} 4. 命令行方式测试串口,同样以J_RS232 RX3\TX3回环测试为例 打开终端输入如下指令接收数据: com_recv /dev/ttysWK2 115200 打开另一个终端发送数据: com_send /dev/ttysWK2 115200 测试结果如下: {{:arm:rk3399:linux:r39s2_recv.png?600|}} == LAN == {{page>:template:temp_linux_lan}} == WIFI == {{page>:template:temp_linux_wifi}} == 4G/5G == {{page>:template:temp_linux_4g5g}} == Can == {{page>:template:temp_linux_can}} == GPIO/DIO == 1. IO 控制节点都在/sys/class/io_control/ {{:arm:rk3399:linux:r39s2a1-linux-io.png?600|}} 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 {{page>:template:temp_linux_gpio}} == Audio == {{page>:template:temp_linux_audio}} == Mic == {{page>:template:temp_linux_mic}} == USB == {{page>:template:temp_linux_usb}} == SDCARD == {{page>:template:temp_linux_sdcard}} == Bluetooth == {{page>:template:temp_linux_bluetooch}} == WatchDog == {{page>:template:temp_linux_watchdog}} == Key == {{page>:template:temp_linux_key}} == LCD/Backlight == {{page>:template:temp_linux_lcd}} == PowerManager == {{page>:template:temp_linux_pm}} == RTC/Timezone == {{page>:template:temp_linux_rtc}} == CPU == {{page>:template:temp_linux_cpu}} == Memory == {{page>:template:temp_linux_mem}} == EMMC == {{page>:template:temp_linux_emmc}} ==== Linux 编程指南 ==== === GPIO 应用编程 === C参考代码如下: <code 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]; //设置GPIO方向、高低电平 static int gpio_config(const char *file, const char *value) { char config_path[100]; int len; int fd; sprintf(config_path, "%s/%s", gpio_path, file); if (0 > (fd = open(config_path, O_WRONLY))) { perror("open error"); return fd; } len = strlen(value); if (len != write(fd, value, len)) { perror("write error"); close(fd); return -1; } close(fd); return 0; } //获取GPIO的方向、电平 static int gpio_get(const char *file) { char get_path[100]; char buf[10]={"\0"}; int len; int fd; sprintf(get_path, "%s/%s", gpio_path, file); if (0 > (fd = open(get_path, O_RDWR))) { perror("open error"); return fd; } if ( 0 > read(fd,buf,10)) { perror("read error"); return fd; } printf(" %s : %s",file,buf); close(fd); return 0; } int main(int argc, char *argv[]) { if (4 != argc) { if (3 != argc) { fprintf(stderr, "set gpio out : %s <gpio> <out> <value>\n", argv[0]); fprintf(stderr, "set gpio in : %s <gpio> <in>\n", argv[0]); exit(-1); } } sprintf(gpio_path, "/sys/class/gpio/gpio%s", argv[1]); if (access(gpio_path, F_OK)) { printf("%s inexistence,export %s... \n",gpio_path,argv[1]); int fd; 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)) { perror("write error"); close(fd); exit(-1); } close(fd); } if (gpio_config("direction", argv[2])) exit(-1); if ( 0 == strcmp("out",argv[2] ) && argc == 4 ) { if(gpio_config("value", argv[3])) exit(-1); } printf("gpio_op%s:\n",argv[1]); if (gpio_get("direction")) exit(-1); if (gpio_get("value")) exit(-1); exit(0); } </code> 交叉编译源码: aarch64-linux-gnu-gcc -o a.out gpio.c 将编译好的gpio程序使用scp拷贝到 r39s2 主板上,执行测试: 使用方法: 0:./gpio 1 out 0 1:./gpio 1 out 1 {{:arm:rk3399:linux:r39s2_gpio20.png?600|}} === UART 应用编程 === 系统下操作 UART 的测试串口,以 J_RS232 TX3\RX3 测试为例: J_RS232 TX3\RX3 设备节点为: /dev/ttysWK2 C参考UART高低电平输入代码如下: <code C> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> #include <termios.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #define UART_DEVICE "/dev/ttysWK2" //uart设备文件名称 int main(int argc, char *argv[]) { int fd, res; struct termios oldtio, newtio; char ch; char buf[256] = {0}; //-----------打开uart设备文件------------------ fd = open(UART_DEVICE, O_RDWR|O_NOCTTY);//没有设置O_NONBLOCK。所以这里read和write是堵塞操作 if (fd < 0) { perror(UART_DEVICE); exit(1); } else printf("Open %s successfully\n", UART_DEVICE); //-----------设置操作參数----------------------- tcgetattr(fd, &oldtio);//获取当前操作模式參数 memset(&newtio, 0, sizeof(newtio)); //波特率=115200 数据位=8 使能数据接收 newtio.c_cflag = B115200|CS8|CLOCAL|CREAD; newtio.c_iflag = IGNPAR; tcflush(fd, TCIFLUSH);//清空输入缓冲区和输出缓冲区 tcsetattr(fd, TCSANOW, &newtio);//设置新的操作參数 //------------向urat发送数据------------------- res=write(fd, "Begin Uart tx", 16); while(1) { //从控制台终端获取数据,然后通过uart发送出去,直到接收到!字符 while((ch=getchar()) != '!') { buf[0]=ch; res=write(fd, buf, 1); } buf[0]=ch; buf[1]=' '; res = write(fd, buf, 2); break; } //-------------从uart接收数据------------------- while(1) { res = read(fd, buf, 255);//程序将在这里挂起,直到从uart接收到数据(堵塞操作) if (res == 0) continue; buf[res] = ' '; printf("res = %d, buf = %s\n", res, buf);//将uart接收到的字符打印出来 if (buf[0] == '!')//uart接收到!字符后退出while break; } //------------关闭uart设备文件,恢复原先參数-------- close(fd); printf("Close %s\n", UART_DEVICE); tcsetattr(fd, TCSANOW, &oldtio); //恢复原先的设置 return 0; } } </code> 交叉编译源码: aarch64-linux-gnu-gcc -o a.out uart.c 将编译好的程序使用 scp 拷贝到 3399 主板上,执行测试: {{:arm:rk3399:linux:36s0_uart11.png?600|}} === KEY 应用编程 === 参考系统下操作Key的方法,获取到key的设备节点为 <code> /dev/input/event2 </code> C参考代码如下: <code 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; } </code> 交叉编译源码: <code> aarch64-linux-gnu-gcc -o key1 key.c </code> 将编译好的程序使用 scp 拷贝到 r39s2 主板上,执行测试,按动 key 打印如下: {{:arm:rk3399:linux:key编程.png?600|}} *按下按键时显示:key pressed *松开按键时显示:key released ==== Linux 应用支持 ==== === QT交叉编译环境 === {{page>:template:temp_Linux_qt}} === QT Creator === {{page>:template:temp_Linux_qt_creator}} === 高清硬解码 === {{page>:template:temp_Linux_dec}} === Docker === {{page>:template:temp_Linux_docker}} ===OpenCL=== * 系统已经支持OpenCL,输入命令clinfo即可查看支持详情: {{:arm:rk3399:linux:opencl.png?600|}} ==== Linux OTA 在线升级 ==== {{page>:template:temp_Linux_upgrade}} 终端输入 ota 进行固件在线升级 {{:arm:rk3399:linux:r39x2_ota.c.png?600|}}
您的足迹:
登录
文章
讨论
阅读
显示源文件
修订记录
搜索
导航
首页
Main_En
帮助
联系我们
打印/导出
可打印版本
工具
最近更改
媒体管理器
网站地图
永久链接
引用此文