documents/docs/RK3568_Android_SDK开发文档/RK3568_Android_SDK开发文档.md
@@ -743,6 +743,464 @@ ## 3.9 AIN 电流电压测试 ### 3.9.1 硬件原理图说明   ### 3.9.2 AIN 电流测试 首先我们需要将ADC采样程序烧录到开发板上的单片机中 连接J6000 TTL下载调试串口 Debug_RXD_CN连接串口的TXD Debug_TXD_CN连接串口的RXD GND相连  **打开FlyMcu.exe烧录工具,选择准备好的.hex 的单片机程序**  **点击开始编程后就开始烧录程序,烧录成功如下图,并且可以看到单片机的LED灯在闪烁绿光**  单片机程序烧录好后,我们需要使能RK3568的UART6,根据原理图可以看到,RK3568和MCU通信串口为UART6,所以需要在设备树中设置UART6设备节点 打开`~/rk3568/sdkv1.4.0_linux5.10/kernel/arch/arm64/boot/dts/rockchip/rk3568-evb1-ddr4-v10-linux.dts` 加入URAT6节点 ``` &uart6{ dma-names = "tx", "rx"; pinctrl-names = "default"; pinctrl-0 = <&uart6m1_xfer>; status = "okay"; }; ``` 重新编译设备树后烧录到开发板中启动开发板,在/dev下看看是否有ttyS6   按照上图连接电路后,用XCOM软件打开单片机的调试串口,配置如下图所示  在RK3568上运行comport程序,此程序可以配置串口的波特率,停止位,数据位,奇偶校验以及指定使用哪个串口设备 源代码在[framwork.git - Gitblit (iot-yun.club)](http://main.iot-yun.club:8088/tree/framwork.git/master/booster) 但是这个代码需要做一定的修改,因为这个程序只能让串口输出字符串数据,但是我们在测试中需要发送十六进制数据给单片机。 此时就需要了解ADC串口协议,RK3568发送读指令给MCU,MCU会响应RK3568返回ADC采样数据  示例如下: 示例: 1、读第0通道电压: AA 55 02 00 30 8C //CRC:0x8C30 AA 55 02 00 EE 0D 99 C0 //0D EE -> 3566mv, CRC:0x0C99 2、读第1路通道电压: AA 55 02 01 F1 4C AA 55 02 01 06 00 47 C5 //00 06 -> 6mv 3、读第2路通道电压: AA 55 02 02 B1 4D AA 55 02 02 06 00 B7 C5 //6mv 4、读第3路通道电压: AA 55 02 03 70 8D AA 55 02 03 06 00 E6 05 //6mv 5、读第0路电流 AA 55 01 00 30 7C AA 55 01 00 95 01 BB 71 //01 95 -> 405 单位0.01mA,即4.05mA, CRC:0x71BB 6、读第1路电流 AA 55 01 01 F1 BC AA 55 01 01 95 01 EA B1 7、读第2路电流 AA 55 01 02 B1 BD AA 55 01 02 95 01 1A B1 8、读第3路电流 AA 55 01 03 70 7D AA 55 01 03 95 01 4B 71 以下AIN电流测试以测试第0路电流为例 在RK3568上输入`./comport -d /dev/ttyS6 -b 115200 -s 8N1N -x` 在XCOM上可以看到MCU的调试信息,旋转电位器旋钮至最左或最右分别测量最小电流和最大电流,量程约为1.22mA~22.79mA(测试其他三路电流时最小电流约为0.006mA)  ### 3.9.3 AIN 电压测试 准备工作和AIN电流测试一样,不再赘述  运行comport程序让rk3568输出读取电压的指令给mcu 同样在XCOM上也能看到MCU的采样调试信息,旋转电位器旋钮至最左或最右分别测量最小电流和最大电流,量程约为0.017V~5.882V  ## 3.10 MIPI DSI 测试 ### 3.10.1 独立TP的屏幕 在rk3568-evb1-ddr4-v10.dtsi中确认一下节点是否打开 ``` &dsi0 { status = "okay"; }; &dsi0_in_vp1 { status = "okay"; }; &dsi1_panel { power-supply = <&vcc3v3_lcd1_n>; }; &route_dsi0 { status = "okay"; connect = <&vp1_out_dsi0>; }; ``` 在rk3568-evb.dtsi中设置屏参,这里的屏参需要根据实际的屏幕手册里给的数据计算得出,不同屏幕参数大不相同 ``` disp_timings0: display-timings { native-mode = <&dsi0_timing0>; dsi0_timing0: timing0 { clock-frequency = <149600000>; hactive = <1920>; vactive = <1080>; hfront-porch = <48>; hsync-len = <32>; hback-porch = <147>; vfront-porch = <3>; vsync-len = <6>; vback-porch = <51>; hsync-active = <0>; vsync-active = <0>; de-active = <0>; pixelclk-active = <1>; }; }; ``` **接线如下图所示**   ### 3.10.2 自带TP的屏幕 在rk3568-evb1-ddr4-v10.dtsi中确认一下节点是否打开 ``` &dsi0 { status = "okay"; }; &dsi0_in_vp1 { status = "okay"; }; &dsi1_panel { power-supply = <&vcc3v3_lcd1_n>; }; &route_dsi0 { status = "okay"; connect = <&vp1_out_dsi0>; }; ``` 在rk3568-evb.dtsi中设置屏参,这里的屏参需要根据实际的屏幕手册里给的数据计算得出,不同屏幕参数大不相同 ``` disp_timings0: display-timings { native-mode = <&dsi0_timing0>; dsi0_timing0: timing0 { clock-frequency = <149600000>; hactive = <1920>; vactive = <1080>; hfront-porch = <48>; hsync-len = <32>; hback-porch = <147>; vfront-porch = <3>; vsync-len = <6>; vback-porch = <51>; hsync-active = <0>; vsync-active = <0>; de-active = <0>; pixelclk-active = <1>; }; }; ``` **接线如下图所示**   ## 3.11 LVDS 测试 首先在rk3568-evb1-ddr4-v10.dts 中添加lvds相关节点 ``` + #include <dt-bindings/display/media-bus-format.h> #include "rk3568-evb1-ddr4-v10.dtsi" #include "rk3568-android.dtsi" + #include <dt-bindings/display/rockchip_vop.h> / { panel-lvds { compatible = "simple-panel"; power-supply = <&vcc3v3_lcd0_n>; enable-delay-ms = <20>; prepare-delay-ms = <20>; unprepare-delay-ms = <20>; disable-delay-ms = <20>; bus-format = <MEDIA_BUS_FMT_RGB888_1X7X4_SPWG>; width-mm = <217>; height-mm = <136>; display-timings { native-mode = <&timing0>; timing0: timing0 { clock-frequency = <73400000>; hactive = <1280>; vactive = <800>; hback-porch = <40>; hfront-porch = <80>; vback-porch = <9>; vfront-porch = <9>; hsync-len = <40>; vsync-len = <5>; hsync-active = <0>; vsync-active = <0>; de-active = <0>; pixelclk-active = <0>; }; }; ports { #address-cells = <1>; #size-cells = <0>; port@0 { reg = <0>; panel_in_lvds: endpoint { remote-endpoint = <&lvds_out_panel>; }; }; }; }; }; &vp0 { cursor-win-id = <ROCKCHIP_VOP2_CLUSTER0>; }; &vp1 { cursor-win-id = <ROCKCHIP_VOP2_CLUSTER1>; }; &lvds { status = "okay"; ports { port@1 { reg = <1>; lvds_out_panel: endpoint { remote-endpoint = <&panel_in_lvds>; }; }; }; }; &lvds_in_vp1 { status = "okay"; }; &route_lvds{ status = "okay"; connect = <&vp1_out_lvds>; }; ``` **因为这个lvds屏幕不支持更改屏幕亮度,所以他不是通过pwm来控制背光的,而是通过gpio控制,只能保证亮屏和灭屏,所以只需要控制gpio电平即可实现**  第一种方法 在rk3568-evb1-ddr4-v10.dtsi更改vcc3v3_lcd0_n ``` &vcc3v3_lcd0_n { gpio = <&gpio0 RK_PC7 GPIO_ACTIVE_LOW>; // enable-active-high; }; ``` 第二种方法 更改panel-lvds节点 ``` panel-lvds { compatible = "simple-panel"; // power-supply = <&vcc3v3_lcd0_n>; enable-gpios = <&gpio0 RK_PC7 GPIO_ACTIVE_LOW>; enable-delay-ms = <20>; prepare-delay-ms = <20>; unprepare-delay-ms = <20>; disable-delay-ms = <20>; bus-format = <MEDIA_BUS_FMT_RGB888_1X7X4_SPWG>; width-mm = <217>; height-mm = <136>; ...... }; ``` 最后由于mipi dsi也用到了vp1这个端口所以禁掉mipi dsi相关节点,mipi_dsi相关节点参考3.10.1,提到的节点全部禁掉就可以了 **接线如下图所示**   ## 3.12 wifi模块测试 **选用联发科的mt7601u的USB wifi模块** 1. 首先获取mt7601u的wifi固件,mt7601u.bin 2. 修改内核使能wifi设备节点 ``` &wireless_wlan { status = "okay"; }; ``` 3. 在内核中使能mt7601的驱动,mt7601的驱动位置在drivers/net/wireless/mediatek/mt7601u 内核make menuconfig配置 ``` Device Drivers --> [*] Network device support ---> [*] Wireless LAN ---> [*] MediaTek devices ---> <*> MediaTek MT7601U (USB) support ``` 4. **重新编译整个sdk** 5. 启动开发板后将wifi模块的bin文件拷贝到/vendor/etc/firewarm下 这个步骤只是第一次测试用的方法,更加完整的方法是将固件放进android镜像中让其自带这个固件 方法如下: 在vendor/rockchip/common/wifi/firmware中添加mt7601.bin固件 可以看到在上一层的wifi.mk中已经明确指出了会将firmware目录下的所有bin文件都拷贝到编译产物中的vendor/etc/firmware下,然后随着andorid的编译系统一起编译生成.img文件,这样的镜像烧录后就会自带我们得mt7601固件。  6. 插入wifi模块可以看到如下信息  通过ifconfig -a 能查看到此时多了一个网卡设备wlan0,这个时候表示wifi模块的驱动加载完成,加载完成后系统会自动的去/vendor/etc/firewarm下找相应的固件。 7. 此时我们就可以在android界面操作wifi按钮打开wifi搜索功能,正常连接wifi了 点击打开wifi之后会出现如下信息,大致的意思就是系统在后台会开启wpa_supplicant的服务用来连接wifi的,并且创建了一个wpa_wlan0的socket设备用于通信,当连接上wifi后,会自动分配一个ip地址。    # 4. ADB调试工具 1. 下载解压platform-tools-latest-windows.zip documents/docs/RK3568_Android_SDK开发文档/images/8e38061a45cded5d0965e8381a90f9e.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240530135607369.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240530140205871.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240530140731254.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240530140856899.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240530141055521.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240530141147705.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240530141259975.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240530142151791.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240530142838339.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240530143956558.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240530144317972.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240628182052917.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240628182336621.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240628183823118.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240628183901996.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240628184602191.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240628185147524.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240628185201219.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240707180653408.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240707181132353.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240707181301122.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240707181315992.png
documents/docs/RK3568_Android_SDK开发文档/images/image-20240707190725803.png
documents/docs/RK3568_Android测试文档/RK3568_Android测试.md
New file @@ -0,0 +1,490 @@ # 一、安装及测试 ## 1. 安装apk软件 通过**adb**安装apk软件: **方法一**: [Android adb启动任意app的几种方式_adb启动某个app的方法-CSDN博客](https://blog.csdn.net/ezconn/article/details/99885715) [彻底解决INSTALL_FAILED_UPDATE_INCOMPATIBLE的安装错误-CSDN博客](https://blog.csdn.net/fromVillageCoolBoy/article/details/134412425) ``` adb root adb install -r apk文件的位置 如:adb install -r E:\lingyun\RK3568\rk3568_app1.0\rk3568.apk 出现:Failure [INSTALL_FAILED_UPDATE_INCOMPATIBLE: Existing package com.example.serial signatures do not match newer version; ignoring!表示系统中已经安装过这个软件,需要把之前的卸载后再重新安装 ``` ``` adb remount adb pull /data/system/packages.xml 拉取了packages.xml后,打开该文件将涉及com.example.serial的地方都删除 adb push packages.xml /data/system adb uninstall com.example.serial adb remount adb install -r -g E:\lingyun\RK3568\rk3568_app1.0\rk3568.apk ```  **方法二**: ``` adb root adb remount adb push ...\rk3568.apk /system/app adb shell chmod 666 /system/app/rk3568.apk adb reboot 重启开启APP adb shell am start -n com.example.serial/.MainActivity ``` com.example.serial是包名  **关闭APP** ``` adb shell am force-stop com.example.serial ``` ## 2. 模块测试 菜单:主要测试5个功能,分别是RS485通信,LED灯、CAN通信、蜂鸣器和ADC采样;点击对应的按钮进入相应的测试页面  ### 2.1 测试RS485通信  RS485通信的页面如上所示,可以根据需要选择不同的波特率、数据位、停止位、校验位和流控制,由于在硬件中已经固定了/dev/ttyS9为RS485通信的串口,因此在串口号的选择中只有/dev/ttyS9。 1. 打开串口 选择完串口的设置后,打开串口,若是由于权限不足则会弹出”添加权限“的提示。 ``` chmod 666 /dev/ttyS9 ```  若是串口打开成功,则会以绿色字体显示”/dev/ttyS9 OPEN +串口设置“(其中校验位和流控制为None时,表示为0),如下所示。  2. 发送数据 在发送数据之前,需先将串口状态转换成”发送模式“,然后在发送框中输入数据,点击”发送“即完成发送数据过程。  3. 接收数据 在接收数据之前,需先将串口状态转换成”接收模式“,在发送端发送数据,然后在APP中点击”接收“按钮,就能接收到发送端发送的数据。**一次发送一次接收**。RS485是半双工通信,因此,当要发送或是接收数据时,要先改变串口的状态。  ### 2.2 测试LED灯 当按下对应的按钮后,相应的灯发生亮灭的变化,其变化同样也会显示在界面中。 例如,红灯亮起时,其上的图标也变成红色,而关闭红灯时,其上的图标变成灰色。同理,黄灯和绿灯也会发生类似的变化。  红灯亮  ### 2.3 测试CAN通信  CAN通信的页面如上所示,可根据需要选择不同的can,设置发送数据帧的ID、DLC、Data。 注:在进行CAN通信前,还需进行以下设置(将can1替换成can0即可操作can0) ``` ip link set can1 down //关闭 can 网络 ip link set can1 up type can bitrate 800000 //设置 can1 的波特率为 800kbps,can 网络波特率最大值为 1mbps ip link set can1 up type can //打开 can 网络 ``` 1. 发送数据 在文本框中输入ID、DLC、Data后,点击”发送“按钮后,即可发送数据,在”发送区“会显示已发送的数据。  2. 接收数据 点击”接收“按钮后,接收到的数据都会显示在”接收区“,和RS485不同,这里是”一直发送一次接收“。  ### 2.4 测试蜂鸣器 这里使用的蜂鸣器是无源蜂鸣器,用于测试pwm功能。通过设置周期和占空比可以让蜂鸣器发声。 若是由于权限问题无法打开PWM,则会弹出”添加export权限“的提示 ``` chmod 777 /sys/class/pwm/pwmchip2/* ```  继续运行出现”添加pwm0权限”的提示 ``` chmod 777 /sys/class/pwm/pwmchip2/pwm0/* ```  如下所示,设置周期为1000000,周期50000,点击”播放“,成功运行出现弹窗提醒  暂停播放  ### 2.5 测试ADC采样 ADC的串口设置和RS485类似,只不过ADC通信中所使用的是十六进制数据。 串口设置:波特率(115200),数据位(8),停止位(1),校验位(None),流控制(None)  打开串口后,在操作设置中选择电流或电压,选择要读取数据的通道。 例如,读取第0通路的电流  读取第0通道的电压  其他通路的操作和上面类似 # 二、各模块接口函数说明 每个模块的功能由四个文件共同组成: 1. xxxActivity.java UI界面的功能实现。位于:\app\src\main\java\com\example\serial\xxxActivity.java 2. xxxControl.java API函数声明。位于:\app\src\main\java\com\example\serial\xxxControl.java 3. xxx_control.cpp API函数实现。位于:\app\src\main\cpp\xxx_control.cpp 4. activity_xxx.xml UI界面设计。位于:\app\src\main\res\layout\activity_xxx.xml ## 1. RS485 ### 1.1 RS485Activity.java \app\src\main\java\com\example\serial\RS485Activity.java 实现RS485通信界面中各个按钮的跳转,数据的获取。 ### 1.2 RS485Control.java \app\src\main\java\com\example\serial\RS485Control.java 1. 打开串口并设置串口的波特率、数据位、校验位、停止位、流控制。 ```java public static native int openSerialPort(String path, long baudRate, int dataBits, int parity, int stopBits, int flowControl, int maxLen); ``` path: 串口地址(/dev/ttyS9),baudRate:串口的波特率,dataBits:数据位,parity:校验位,stopBits:停止位,flowControl:流控制(通常设置为0,表示None)。**成功返回0,失败返回负数, 打开串口的权限不足返回1**。 2. 关闭串口 ```java public static native int closeSerialPort(); ``` 成功返回0,失败返回-1。 3. 发送数据 ```java public static native int sendToPort(String msg, int len); ``` msg:发送的数据,String类型;len:发送数据的长度。成功返回>0,失败返回<0。 4. 接收数据 ```java public static native String recvFromPort(int len, int timeout); ``` len:表示接收数据的长度;timeout:超时时间,单位为ms。**成功返回接收到的数据,失败返回NULL**。 5. 修改串口状态 ```java public static native int changeState(int state); ``` RS485是半双工通信,发送和接收取决于gpiochip4 26引脚的高低电平,设置为低电平发送,高电平接收。成功返回0,失败返回-1. ### 1.3 rs485_control.cpp \app\src\main\cpp\rs485_control.cpp。此文件包含RS485Control.java中函数的实现。 1. 串口结构体: ```C typedef struct comport_s { char devname[12]; unsigned int databit, parity, stopbit, flowctrl; long baudrate; int fd; int frag_size; }comport_t; ``` 2. 获取波特率 ```C static speed_t getBaudRate(int baudRate); ``` 将int类型的波特率转换成speed_t类型。 包含:0、50、75、110、134、150、200、300、600、1200、1800、2400、4800、9600、19200、38400、57600、115200、230400、460800、500000、576000、921600、1000000、1152000、1500000、2000000、2500000、3000000、3500000、4000000;若是baudRate不在这个范围内,则返回-1。 (有关RS485的UI设计位于\app\src\main\res\layout\activity_rs485.xml) ## 2. LED ### 2.1 LedActivity.java 实现按钮的功能 ### 2.2 LedControl.java ```Java public static native int ledCtrl(int which, int status); ``` which:表示要操作的灯的位置,取值为0,1,2;status:表示灯的状态,0表示开灯,1表示关灯。(低电平点亮,高电平关闭)。成功返回0,失败返回一个小于0的负数。 ### 2.3 led_control.cpp ```C enum { LED_R=0, LED_Y, LED_G, LED_MAX, }; typedef struct led_gpio_s { int idx; int gpio; const char *desc; struct gpiod_line *line; }led_gpio_t; ``` 定义结构体,gpio表示引脚编号,如红灯对应的是gpiochip0 18,那么gpio=18;desc:表示对该引脚的描述,可以表示为”red“; ```C led_gpio_t leds[LED_MAX] = { {LED_R, 18, "red", NULL}, {LED_Y, 22, "yellow", NULL}, {LED_G, 20, "green", NULL}, }; ``` 预先定义数组用来存放每个灯所对应的信息。 ## 3. CAN ### 3.1 CanActivity.java UI界面的功能实现 ### 3.2 CanControl.java 1. 发送数据 ```java public static native int sendMessage(String id, String dlc, String data, String ifname); ``` 待发送的CAN帧由id,dlc,data三部分组成,ifname表示can设备的名称(can0或can1)。成功返回0,失败返回小于0的负数。 2. 接收数据 ```java public static native String receiveMessage(String ifname); ``` ifname表示can设备的名称(can0 或can1).成功返回接收到的数据,失败返回NULL。返回的数据格式为”ID=xx DLC=xx Data=xx xx xx xx“。 ### 3.3 can_control.cpp CanControl.java中的函数实现 ## 4. PWM-蜂鸣器 ### 4.1 BuzzerActivity.java UI界面的功能实现 ### 4.2 BuzzerControl.java 1. 打开PWM ```java public native static int pwmOpen(String id); ``` 打开需要操作的pwm设备,例如需要操作的pwm为: /sys/class/pwm/pwmchip2,因此id=”2“,需要操作的是/sys/class/pwm/pwmchip2/pwm0,会先判断pwm0是否存在,不存在就会导入。成功返回0,失败返回小于0的负数,打开设备的权限不足返回1. 2. 配置PWM ```java public native static int pwmConfig(String attr, String val); ``` 以/sys/class/pwm/pwmchip2为例,通过配置/sys/class/pwm/pwmchip2/pwm0的period和duty_cycle可以让该PWM输出不同的方波。attr表示需要配置的文件名(period或duty_cycle),val表示写入该文件的值。打开设备的权限不足返回1,配置的值无效返回2. ### 4.3 buzzer_control.cpp BuzzerControl.java的函数实现 ## 5. ADC采样 ### 5.1 AdcActivity.java UI界面的功能实现 ### 5.2 AdcControl.java 1. 打开串口 ```Java public static native int openComport(String path, long baudRate, int dataBits, int parity, int stopBits, int flowControl); ``` path: 串口(/dev/ttyS6); baudRate: 波特率(115200);dataBits:数据位(8);parity:奇偶校验(0表示None,1表示奇校验,2表示偶校验);stopBits:停止位(1);flowControl:流控制(0表示无,1表示硬件流,2表示软件流)。成功返回0,失败返回小于0的负数,当返回1时表示打开串口的权限不够。 2. 关闭串口 ```Java public static native int closeComport(); ``` 成功返回0,失败返回小于0的负数。 3. 发送数据 ```java public static native int sendToPort(String operate, String channel); ``` 向串口发送数据,operate:操作电流或电压;channel:欲操作的通道。 下图是ADC串口协议,通过添加类型和通道号即可形成完整的读指令报文。  4. 接收数据 ```Java public static native String recvFromPort(int len, int timeout); ``` 从串口读取数据并返回。len:表示读取数据的最大长度;timeout:超时时间(单位:ms)。成功返回读取到的数据,失败返回NULL。 根据接收到的数据即可计算其所对应的电流或电压。 设接收的数据为:AA 55 01 00 95 01 BB 71 //01 95 -> 405 单位0.01mA,即4.05mA,其中AA 55为报文头,01表示电流,00表示通道0,95 01表示通道0的电流值,BB 71表示CRC校验码。由于是低字节先发送,因此在计算电流值时,实际的顺序是 01 95 => 电流 = 0\*16^3 + 1\*16^2 + 9\*16^1 + 5\*16^0 = 405, 单位是0.01mA,最后得到电流值为4.05mA。 ### 5.3 adc_control.cpp ```cpp typedef struct comport_s { char devname[12]; unsigned int databit, parity, stopbit, flowctrl; long baudrate; int fd; int frag_size; }comport_t; ``` 串口配置结构体。 ```cpp static speed_t getBaudRate(int baudRate) ``` 将int类型的波特率转换成可以识别的波特率. ```cpp unsigned short crc_modbus(unsigned char *ptr, int len) ``` 根据十六进制值计算CRC16校验码。ptr:需要计算的十六进制字符数组;len:表示需要计算的字符长度。以读指令为例,设`unsigned char read[6] = {0xAA, 0x55, 0x01, 0x00}`,那么它的CRC校验码为`uint16_t crc = crc_modbus(read, 4)`, 完整的读指令为`read[4] = crc & 0xFF; read[5] = (crc >> 8) & 0xFF`. ```C void calculate(char *result, unsigned char *data, int len) ``` 计算ADC返回结果的数值,result用于存放返回的结果,格式为"电流/电压-通道X=....";data表示ADC串口返回的十六进制结果;len表示data的数据长度。 `openComport`, `closeComport`, `sendToPort`, `recvFromPort`的函数实现。 # 三、项目配置    ndk:`25.1.8937393` CMake:`3.22.1`, `3.18.1` 外部配置:`libgpiod`库。 documents/docs/RK3568_Android测试文档/images/2-Menu.png
documents/docs/RK3568_Android测试文档/images/2.1_RS485_main.png
documents/docs/RK3568_Android测试文档/images/2.1_RS485_open_failed.png
documents/docs/RK3568_Android测试文档/images/2.1_RS485_open_sucess.png
documents/docs/RK3568_Android测试文档/images/2.1_RS485_recv.png
documents/docs/RK3568_Android测试文档/images/2.1_RS485_send.png
documents/docs/RK3568_Android测试文档/images/2.2_red_turn_on.png
documents/docs/RK3568_Android测试文档/images/2.2_turn_off.png
documents/docs/RK3568_Android测试文档/images/2.3_CAN_main.png
documents/docs/RK3568_Android测试文档/images/2.3_CAN_recv.png
documents/docs/RK3568_Android测试文档/images/2.3_CAN_send.png
documents/docs/RK3568_Android测试文档/images/2.4_PWM_play.png
documents/docs/RK3568_Android测试文档/images/2.4_PWM_stop.png
documents/docs/RK3568_Android测试文档/images/2.4_add_export_permission.png
documents/docs/RK3568_Android测试文档/images/2.4_add_pwm0_permission.png
documents/docs/RK3568_Android测试文档/images/2.5_get_current_channel0.png
documents/docs/RK3568_Android测试文档/images/2.5_get_voltage_channel0.png
documents/docs/RK3568_Android测试文档/images/2.5_open_ADC.png
documents/docs/RK3568_Android测试文档/images/3-gradle.png
documents/docs/RK3568_Android测试文档/images/3-minSDK.png
documents/docs/RK3568_Android测试文档/images/3-sdk.png
documents/docs/RK3568_Android测试文档/images/5.3_ADC_protocol.png
documents/docs/RK3568_Android测试文档/images/install_apk_method1.png
documents/docs/RK3568_Android测试文档/images/install_apk_method2.png
documents/docs/RK3568_Linux_SDK开发文档/RK3568_Linux_SDK开发文档.md
@@ -1738,6 +1738,6 @@ 运行comport程序让rk3568输出读取电压的指令给mcu 同样在XCOM上也能看到MCU的采样调试信息,旋转电位器旋钮至最左或最右分别测量最小电流和最大电流,量程约为0.017mV~5.882mV 同样在XCOM上也能看到MCU的采样调试信息,旋转电位器旋钮至最左或最右分别测量最小电流和最大电流,量程约为0.017V~5.882V  documents/docs/RV1106_Linux_SDK开发文档/RV1106_Linux_SDK开发文档.md
New file @@ -0,0 +1,414 @@ # 1. 源码编译烧录 ## 1.1 安装交叉编译环境 ### 安装驱动 1.下载RK驱动助手 DriverAssitant([下载地址](https://wiki.luckfox.com/zh/Luckfox-Pico/Luckfox-Pico-prepare)) 2.打开RK驱动助手 DriverAssitant 安装 USB 驱动程序,此过程无需连接,安装完成后重启电脑。 (注意:win10系统下,是能识别到USB驱动的,但win7上好像识别不到!!!)  ## 1.2 下载获取SDK源码 ### 1.2.1 安装依赖环境 ``` sudo apt update sudo apt-get install -y git ssh make gcc gcc-multilib g++-multilib module-assistant expect g++ gawk texinfo libssl-dev bison flex fakeroot cmake unzip gperf autoconf device-tree-compiler libncurses5-dev pkg-config bc python-is-python3 passwd openssl openssh-server openssh-client vim file cpio rsync ``` ### 1.2.2 获取最新的 SDK ``` git clone https://gitee.com/LuckfoxTECH/luckfox-pico.git ``` SDK目录结构 ``` ├── build.sh -> project/build.sh ---- SDK编译脚本 ├── media --------------------------- 多媒体编解码、ISP等算法相关(可独立SDK编译) ├── sysdrv -------------------------- U-Boot、kernel、rootfs目录(可独立SDK编译) ├── project ------------------------- 参考应用、编译配置以及脚本目录 ├── output -------------------------- SDK编译后镜像文件存放目录 └── tools --------------------------- 烧录镜像打包工具以及烧录工具 ``` ## 1.3 Linux SDK 编译 Buildroot 镜像既支持TF卡启动又支持 SPI NAND FLASH 启动 编译 Buildroot 镜像,使其能够支持 TF 卡启动,请修改对应的板型 BoardConfig-EMMC-Ubuntu-xxx.mk文件中 LF_TARGET_ROOTFS 改为 buildroot,如: ``` export LF_TARGET_ROOTFS=buildroot ``` 这里我们使用SPI NAND FLASH启动 ### 1.3.1 安装交叉编译工具链 ``` cd {SDK_PATH}/tools/linux/toolchain/arm-rockchip830-linux-uclibcgnueabihf/ source env_install_toolchain.sh ``` ### 1.3.2 全部编译镜像 ``` cd luckfox-pico #编译busybox/buildroot ./build.sh lunch ``` 会显示如下: ``` BoardConfig-*.mk naming rules: BoardConfig-"启动介质"-"系统版本"-"硬件版本"-"应用场景".mk BoardConfig-"boot medium"-"system version"-"hardware version"-"applicaton".mk ---------------------------------------------------------------- 0. BoardConfig_IPC/BoardConfig-EMMC-Buildroot-RV1103_Luckfox_Pico-IPC.mk boot medium(启动介质): EMMC system version(系统版本): Buildroot hardware version(硬件版本): RV1103_Luckfox_Pico applicaton(应用场景): IPC ---------------------------------------------------------------- ---------------------------------------------------------------- 1. BoardConfig_IPC/BoardConfig-EMMC-Buildroot-RV1103_Luckfox_Pico_Mini_A-IPC.mk boot medium(启动介质): EMMC system version(系统版本): Buildroot hardware version(硬件版本): RV1103_Luckfox_Pico_Mini_A applicaton(应用场景): IPC ---------------------------------------------------------------- ---------------------------------------------------------------- 。。。。。。 ---------------------------------------------------------------- 8. BoardConfig_IPC/BoardConfig-SPI_NAND-Buildroot-RV1106_Luckfox_Pico_Pro_Max-IP C.mk boot medium(启动介质): SPI_NAND system version(系统版本): Buildroot hardware version(硬件版本): RV1106_Luckfox_Pico_Pro_Max applicaton(应用场景): IPC ---------------------------------------------------------------- Which would you like? [0]: ``` 这里我们输入8,选择BoardConfig_IPC/BoardConfig-SPI_NAND-Buildroot-RV1106_Luckfox_Pico_Pro_Max-IP C.mk 继续在当前目录下输入: ``` ./build.sh ``` ## 1.4 系统镜像烧录 ### 烧录 SPI NAND Flash 1.下载和解压烧录工具([下载地址](https://files.luckfox.com/wiki/Luckfox-Pico/Software/SocToolKit.zip))。 2.开发板就选择 RV1106  3.LuckFox Pico Mini B/Plus/Pro/Max 在 Windows下载固件库方法: ① 按住 BOOT 键后连接电脑后,松开 BOOT 键,瑞芯微刷机工具就会显示 MaskRom 设备。 ② 加载固件的存放目录,重载 env 文件,勾选所有项。 ③ 点击下载。  **注意:在执行①步骤的时候,一定要先按住BOOT键不放,用type-c数据先后,再松开,才会出现Maskrom显示!!!** ## 1.5 ADB登录 ### 1.5.1 安装ADB 1.下载 ADB 安装包,解压即可使用([戳我下载](https://files.luckfox.com/wiki/Luckfox-Pico/Software/adb_fastboot.zip))。 2.右键我的电脑属性—>高级系统设置—>环境变量。  3.系统变量—>编辑—>将adb解压路径新建进去。  4.点击确定保存环境变量。  ### 1.5.2 ADB登录 按下 Win + R 快捷键输入 CMD 打开 Windows 终端,在终端输入 ADB 命令即可查看 ADB 相关信息。  将网线一端连路由器一端连接开发板网口  输入:`adb shell`,进入烧录好的系统  # 2. 摄像头应用测试 Luckfox Pico Max适配的是 SC3336 3MP Camera (A) 摄像头,这款摄像头采用思特威SC3336感光芯片,支持3百万像素。具备高灵敏度,高信噪比低照度的性能,能够呈现更加细腻、色彩更加逼真的夜视全彩成像,更好地适应环境光线变化。当前推流仅适用于 buildroot系统。 ## 2.1 查看摄像头 1.首先连接摄像头,请确保连接正常后开机。系统将自动识别摄像头,注意接线不要接反了。 **LuckFox PicoMax 开发板连接摄像头时,请确保摄像头排线的金属面朝向开发板芯片。**  2.查看摄像头,若成功识别摄像头会生成 rkipc.ini 文件。  3.获取设备的 IP 地址  Luckfox Pico Max 默认 IP 为 172.32.0.93,网口ip为10.230.149.130 ## 2.2 配置RNDIS虚拟网口 1.Windows 安全中心—>防火墙和网络保护—>关闭防火墙。 2.配置 RNDIS 网卡的静态IP,打开设置—>高级网络设置—>更改适配器选项。 3.网卡一般是类似这样的名字Remote NDIS based nternet Sharing Device,右键属性。  4.双击 internet 协议版本(TCP/IPv4),IPV4地址设置为 172.32.0.100,避免和设备冲突。   ## 2.3 使用VLC media player 推流 1. 下载并安装 VLC media player 。 2. 打开 VLC media player 软件,在媒体—>打开网络串流  3. 输入默认的 IP 地址:rtsp://172.32.0.93/live/0 4. 也可以使用 eth0 的 IP地址串流: rtsp://10.230.149.130/live/0 5. 点击播放,即可看到摄像头画面,可以旋转镜头来调焦  ## 2.4 V4L2-utils 工具包安装 V4L2-utils 是一组用于测试和配置 V4L2 设备的实用工具,它们通过命令行界面提供了对 V4L2 接口的访问。Luckfox SDK 的buildroot包中已经包含了 v4l2-utils软件包中的工具,但需要手动开启它,进入到/luckfox-pico/sysdrv/source/buildroot/buildroot-2023.02.6下输入`make menuconfig`,进入buildroot图形化界面菜单选项(**注意:必须先将下载好的源码编译一次才会有/buildroot-2023.02.6**) 在 buildroot 目录添加 V4L2,使用关键字"libv4l2"进行搜索。  根据路径使能V4L2-utils 工具包  **注意libv4l和v4l-utils tools都要选上选上后,一定要保存再退出,继续输入** ``` make ARCH=arm savedefconfig cp .config ./configs/luckfox_pico_defconfig ``` 然后重新编译,编译完成后会在/luckfox-pico/output下生成编译产物 ``` output/ ├── image │ ├── download.bin ---------------- 烧录工具升级通讯的设备端程序,只会下载到板子内存 │ ├── env.img --------------------- 包含分区表和启动参数 │ ├── uboot.img ------------------- uboot镜像 │ ├── idblock.img ----------------- loader镜像 │ ├── boot.img -------------------- kernel镜像 │ ├── rootfs.img ------------------ kernel镜像 │ └── userdata.img ---------------- userdata镜像 └── out ├── app_out --------------------- 参考应用编译后的文件 ├── media_out ------------------- media相关编译后的文件 ├── rootfs_xxx ------------------ 文件系统打包目录 ├── S20linkmount ---------------- 分区挂载脚本 ├── sysdrv_out ------------------ sysdrv编译后的文件 └── userdata -------------------- userdata ``` 将系统镜像烧录到开发板 ## 2.5 v4l2-ctl使用 1.列出摄像头的设备 ``` # v4l2-ctl --list-devices rkisp-statistics (platform: rkisp): /dev/video19 /dev/video20 rkcif-mipi-lvds (platform:rkcif): /dev/media0 rkcif (platform:rkcif-mipi-lvds): /dev/video0 /dev/video1 /dev/video2 /dev/video3 /dev/video4 /dev/video5 /dev/video6 /dev/video7 /dev/video8 /dev/video9 /dev/video10 rkisp_mainpath (platform:rkisp-vir0): /dev/video11 /dev/video12 /dev/video13 /dev/video14 /dev/video15 /dev/video16 /dev/video17 /dev/video18 /dev/media1 ``` - `rkisp_mainpath`:CSI摄像头 2.列出摄像头支持的格式 ``` # v4l2-ctl --device=/dev/video11 --list-formats-ext ioctl: VIDIOC_ENUM_FMT Type: Video Capture Multiplanar [0]: 'UYVY' (UYVY 4:2:2) Size: Stepwise 32x16 - 2304x1296 with step 8/8 [1]: 'NV16' (Y/CbCr 4:2:2) Size: Stepwise 32x16 - 2304x1296 with step 8/8 [2]: 'NV61' (Y/CrCb 4:2:2) Size: Stepwise 32x16 - 2304x1296 with step 8/8 [3]: 'NV21' (Y/CrCb 4:2:0) Size: Stepwise 32x16 - 2304x1296 with step 8/8 [4]: 'NV12' (Y/CbCr 4:2:0) Size: Stepwise 32x16 - 2304x1296 with step 8/8 [5]: 'NM21' (Y/CrCb 4:2:0 (N-C)) Size: Stepwise 32x16 - 2304x1296 with step 8/8 [6]: 'NM12' (Y/CbCr 4:2:0 (N-C)) Size: Stepwise 32x16 - 2304x1296 with step 8/8 ``` 3.显示摄像头参数 ``` # v4l2-ctl --device=/dev/video11 --list-ctrls Image Processing Controls pixel_rate 0x009f0902 (int64) : min=0 max=1000000000 step=1 default=1000000000 value=101250000 flags=read-only, volatile ``` 4.录制视频 ``` #CSI 摄像头(需要先关掉自带的RKIPC) killall rkipc v4l2-ctl --device=/dev/video11 --set-fmt-video=width=640,height=480,pixelformat=NV12 --stream-mmap --stream-to=video50.yuv --stream-count=60 ``` - `-device:`摄像头对应设备文件 - `--set-fmt-video:`指定了宽高及 pxielformat (标识像素格式) - `--stream-mmap:`指定 buffer的类型为 mmap,即由内核分配的物理连续的或经过 iommu 映射的buffer - `--stream-to:`指定帧数据保存的文件路径 - `--stream-count:`指定抓取的帧数,不包括--stream-skip丢弃的数量 5.如果出现“The pixelformat 'UYVY' is invalid” 字样说明摄像头不支持此格式,使用第二步的方法查看摄像头支持的格式 6.看到<<<<<<<<<<<<<<<<<<<<<<<<<< 25.00 fps 说明成功录制视频,可以成功生成video50.yuv视频文件 ``` # killall rkipc # v4l2-ctl --device=/dev/video11 --set-fmt-video=width=640,height=480,pixelforma t=NV12 --stream-mmap --stream-to=video50.yuv --stream-count=60 <<<<<<<<<<<<<<<<<<<<<<<<<< 25.00 fps <<<<<<<<<<<<<<<<<<<<<<<<<< 25.00 fps <<<<<<<< # ls bin lib32 oem run usr data lib64 opt sbin var dev linuxrc proc sys video50.yuv etc media rockchip_test tmp lib mnt root userdata ``` ## 2.6 显示视频 上面抓取的图片或者视频可以拷贝到 Ubuntu 中借助借助工具ffplay查看。`ffplay` 是 FFmpeg 工具包中的一个命令行工具,用于播放音频和视频文件。它基于 FFmpeg 库,支持广泛的音视频格式,能够在命令行中实时播放或预览多媒体内容。 首先我们要让虚拟机和开发板在同一网段下  可以看到笔者的虚拟机ip地址为192.168.10.100,因此我们开发板IP地址  进入root目录,创建一个文件夹与虚拟机的目录进行nfs挂载,将生成的video50.yuv文件拷贝到虚拟机的挂载目录中  1.播放视频 ``` ffplay -video_size 640x480 -pixel_format nv12 -framerate 10 -i video50.yuv ``` - `-video_size size `设置帧尺寸 设置帧尺寸大小 - `-pixel_format format` 设置像素格式 - `-framerate 10`: 设置视频的帧率为 10 帧/秒  2.转换视频格式 ``` ffmpeg -f rawvideo -pixel_format yuyv422 -video_size 640x480 -framerate 30 -i video.yuv -c:v libx264 output.mp4 ```  生成MP4格式,使用mpv命令进行播放 ``` mpv output.mp4 ``` documents/docs/RV1106_Linux_SDK开发文档/images/04bd9043a5a6cb0df91f9a978a0c46fc.jpg
documents/docs/RV1106_Linux_SDK开发文档/images/8{K1WK56Z~B3OZLV@GYW@`M.png
documents/docs/RV1106_Linux_SDK开发文档/images/ADB1.PNG
documents/docs/RV1106_Linux_SDK开发文档/images/ADB2.PNG
documents/docs/RV1106_Linux_SDK开发文档/images/ADB3.PNG
documents/docs/RV1106_Linux_SDK开发文档/images/ADB4.PNG
documents/docs/RV1106_Linux_SDK开发文档/images/ADB5.PNG
documents/docs/RV1106_Linux_SDK开发文档/images/QQ图片20240516130613.png
documents/docs/RV1106_Linux_SDK开发文档/images/QQ图片20240516131612.png
documents/docs/RV1106_Linux_SDK开发文档/images/QQ图片20240516133103.png
documents/docs/RV1106_Linux_SDK开发文档/images/QQ图片20240516141405.png
documents/docs/RV1106_Linux_SDK开发文档/images/QQ图片20240516142351.png
documents/docs/RV1106_Linux_SDK开发文档/images/QQ图片20240516143007.png
documents/docs/RV1106_Linux_SDK开发文档/images/RNDIS(1).PNG
documents/docs/RV1106_Linux_SDK开发文档/images/RNDIS(2).PNG
documents/docs/RV1106_Linux_SDK开发文档/images/V4L2-utils1.PNG
documents/docs/RV1106_Linux_SDK开发文档/images/V4L2-utils2.PNG
documents/docs/RV1106_Linux_SDK开发文档/images/VLC(1).PNG
documents/docs/RV1106_Linux_SDK开发文档/images/image-20240516131851782.png
documents/docs/RV1106_Linux_SDK开发文档/images/image-20240516131940611.png
documents/docs/RV1106_Linux_SDK开发文档/images/image-20240516132341234.png
documents/docs/RV1106_Linux_SDK开发文档/images/image-20240516133115258.png
documents/docs/RV1106_Linux_SDK开发文档/images/image-20240516134210481.png
documents/docs/RV1106_Linux_SDK开发文档/images/image-20240516134357670.png
documents/docs/RV1106_Linux_SDK开发文档/images/image-20240516141419430.png
documents/docs/RV1106_Linux_SDK开发文档/images/image-20240516141747292.png
documents/docs/RV1106_Linux_SDK开发文档/images/image-20240516142817295.png
documents/docs/RV1106_Linux_SDK开发文档/images/image-20240516143012950.png
documents/docs/RV1106_Linux_SDK开发文档/images/分支选择.PNG
documents/docs/RV1106_Linux_SDK开发文档/images/安装驱动.PNG
documents/docs/RV1106_Linux_SDK开发文档/images/开发板ip.PNG
documents/docs/RV1106_Linux_SDK开发文档/images/摄像头ip.PNG
documents/docs/RV1106_Linux_SDK开发文档/images/摄像头连接.PNG
documents/docs/RV1106_Linux_SDK开发文档/images/烧录选择.PNG
documents/docs/RV1106_Linux_SDK开发文档/images/视频播放.PNG