前言
本文档主要介绍基于 AIO-3399J 平台的开发方法。
OS 名称 | 内核版本 | 支持情况 | 维护情况 |
---|---|---|---|
Linux | 4.4 | √ | 主要维护 |
Linux | 4.19 | √ | 维护 |
Android7.1 | √ | × | |
Android7.1 industry | √ | 主要维护 | |
Android8.1 | √ | × | |
Android9.0 | × | × | |
Android10.0 | √ | 主要维护 |
当前版本 | |
---|---|
文档名称 | AIO-3399J 开发手册 |
版本号 | V2.0.6 |
作者 | Firefly Team |
修改日期 | 2022-03-10 |
V2.0.6
更新时间:2022-03-10
更新内容:
《更新固件介绍》进行改版,加入图标方便用户阅读。
加入不同工作模式对比图。
添加不同升级模式之间的对比表格。
对《MaskRom 升级模式》进行重新说明。
不同升级模式的使用场景进行说明等。
添加《导出设备系统》到《更多技术案例》。
修正部分下载链接。
V2.0.5
更新时间:2022-02-01
更新内容:
对《驱动开发》进行补充说明。
补充部分图片。
更新部分下载链接。
Faq: 增加HDMI 4K 解决方案。。
添加了《ubuntu 固件更新日志》。
Linux 支持 kernel-4.19 版本。
V2.0.4
更新时间:2021-12-11
更新内容:
补充部分图片。
更新《屏幕模组》的Android系统编译方法和下载链接。
修正《使用SD卡更新固件》的英文翻译和图片错误。
增加《无线模块》的EC20 GNSS功能。
《摄像头模组》增加CAM-8MS1M 单目摄像头模组。
V2.0.3
更新时间:2021-11-9
更新内容:
新增《前言》,主要描述产品 Wiki 修订记录和 OS 版本。
V2.0.2
更新时间:2021-10-30
Linux 更新内容:
新增《更多 Linux OS 支持》支持更多的系统如 buildroot、yocto和debian等。
新增《更多技术案例》,并添加《OpenSIP搭建)》
V2.0.1
更新时间:2021-10-29
Android 更新内容:
驱动开发->LCD使用: 新增toshiba TC358775XBG 的支持。
修正部分下载链接。
上手教程
如果正在进行 U-Boot 或内核开发,USB 串口适配器( USB 转串口 TTL 适配器的简称)对于检查系统启动日志非常有用,特别是在没有图形桌面显示的情况下。
网店上有许多 USB 转串口的适配器,按芯片来分,有以下几种:
串口 | 最高波特率 | 是否推荐 | 评价 | 购买链接 |
---|---|---|---|---|
CP2104 | 2Mbps | 推荐 | 支持高波特率通信,稳定性好耐用 | 点击购买 |
CH340 | 2Mbps | 不推荐 | firefly和许多客户在实际使用中发现,市面上很多CH340的实际波特率达不到1.5Mbps,这给开发过程造成很多麻烦 | |
PL2303 | 1.2Mbps | 不推荐 | 最高波特率达不到1.5Mbps |
注意: AIO-3399J 默认的波特率是 1500000,有些USB转串口芯片波特率无法达到 1500000,同一芯片的不同系列也可能会有差异,所以在选购之前一定要确认是否支持。
串口转 USB 适配器,有四个引脚:
3.3V 电源(NC),不需要连接
GND,串口的地线,接开发板串口的 GND 针
TXD,串口的输出线,接开发板串口的 TX 针
RXD,串口的输入线,接开发板串口的 RX 针
注意: 如使用其它串口适配器遇到 TX 和 RX 不能输入和输出的问题,可以尝试对调 TX 和 RX 的连接。
AIO-3399J 串口连接图:
AIO-3399J 使用以下串口参数:
波特率:1500000
数据位:8
停止位:1
奇偶校验:无
流控:无
下载驱动并安装:
如果在 Win8 上不能正常使用 PL2303,参考这篇文章, 采用 3.3.5.122 或更老版本的旧驱动即可。
如果在 Windows 系统上安装官网的 CP210X 驱动,使用 PUTTY 或 SecureCRT 等工具设置串口波特率为 1500000,如果出现设置不了或无效的问题,可以下载旧版本驱动。
插入适配器后,系统会提示发现新硬件,并初始化,之后可以在设备管理器找到对应的 COM 口:
Windows 上一般用 putty 或 SecureCRT。其中我们推荐使用 MobaXterm 免费版本。这是一款功能强大的终端软件,在这里介绍一下,MobaXterm 的使用方法与之类似。
到这里下载 MobaXterm:
选择 session 为 Serial。
将 Serial port 修改为在设备管理器中找到的 COM 端口。
设置 Speed (bsp) 为 1500000。
点击 OK 按钮。
在 Ubuntu 上可以有多种选择:
minicom
picocom
kermit
篇幅关系,以下就介绍 minicom 的使用。
把光标移动到“Serial port setup”,按enter进入串口设置界面,再输入前面提示的字母,选择对应的选项,设置成如下:
注意:Hardware Flow Control 和 Software Flow Control 都要设成 No,否则可能导致无法输入。
设置完成后回到上一菜单,选择 Save setup as dfl 即可保存为默认配置,以后将默认使用该配置。
升级固件
AIO-3399J 出厂默认安装Android操作系统,如果用户要运行其他操作系统,需要使用对应的固件烧写到主板。
AIO-3399J 有灵活的启动方式。一般情况下,除非硬件损坏,AIO-3399J 开发板是不会变砖的。
如果在升级过程中出现意外,bootloader 损坏,导致无法重新升级,此时仍可以进入 MaskRom 模式来修复。
AIO-3399J 支持通过以下两种方式升级固件:
使用 AIO-3399J 将主板连接到电脑上,通过升级工具将固件烧写到主板上。
通过升级卡制作工具,将MicroSD卡制作为升级卡,将升级卡插入主板,上电开机,机器自动执行升级。
AIO-3399J 从以下的存储器中加载系统:
eMMC 接口
SDMMC 接口
AIO-3399J 有三种启动模式:
Normal 模式
Loader 模式
MaskRom 模式
Normal 模式就是正常的启动过程,各个组件依次加载,正常进入系统。
在 Loader 模式下,bootloader 会进入升级状态,等待主机命令,用于固件升级等。
MaskRom 模式用于 bootloader 损坏时的系统修复。
一般情况下是不用进入 MaskRom 模式的,只有在 bootloader 校验失败(读取不了 IDB 块,或 bootloader 损坏) 的情况下,BootRom 代码 就会进入此模式。此时 BootRom 代码等待主机通过 USB 接口传送 bootloader 代码,加载并运行之。当板子变砖无法正常启动或升级程序时,也可以手动进入MaskRom 模式.
要强行进入 MaskRom 模式,请参阅《MaskRom 模式》一章。
本文介绍了如何将主机上的固件,通过USB数据线烧录到 AIO-3399J 开发板的存储器中。升级时,需要根据主机操作系统和固件类型来选择合适的升级方式。
AIO-3399J 开发板
固件
主机
良好的双公头USB数据线数据线
固件可以通过编译 SDK 获得,也可以通过资源下载处下载公版固件(统一固件)。固件文件一般有两种:
单个统一固件
统一固件是由分区表、bootloader、uboot、kernel、system等所有文件打包合并成的单个文件。Firefly正式发布的固件都是采用统一固件格式,升级统一固件将会更新主板上所有分区的数据和分区表,并且擦除主板上所有数据。
多个分区镜像
即各个功能独立的文件,如分区表、bootloader、kernel等,在开发阶段生成。独立分区镜像可以只更新指定的分区,而保持其它分区数据不被破坏,在开发过程中会很方便调试。
通过统一固件解包/打包工具,可以把统一固件解包为多个分区镜像,也可以将多个分区镜像合并为一个统一固件。
安装RK USB驱动
下载 Release_DriverAssistant.zip,解压,然后运行里面的 DriverInstall.exe 。为了所有设备都使用更新的驱动,请先选择驱动卸载,然后再选择驱动安装。
下载并运行AndroidTool的RKDevTool.exe
注意:不同固件使用的工具版本可能不同,请根据《使用USB线烧写须知(重要)》下载对应的版本
Linux 下无须安装设备驱动
注意:不同固件使用的工具版本可能不同,请根据《使用USB线烧写须知(重要)》下载对应的版本
下载 Linux_Upgrade_Tool, 并按以下方法安装到系统中,方便调用:
通常我们升级固件的模式有两种,分别是Loader模式和MaskRom模式。烧写固件前,我们需要连接好设备,并让板子进入到可升级模式。
连接设备并通过RECOVERY按键进入Loader升级模式步骤如下:
先断开电源适配器连接
双公头USB数据线连接好设备和主机。
按住设备上的 RECOVERY (恢复)键并保持。
插上电源
大约两秒钟后,松开 RECOVERY 键。
双公头USB数据线 接好后在串口调试终端或adb shell给板子运行以下命令:
如何确定板子是否进入Loader模式,我们可以通过工具去查看
Windows操作系统
通过AndroidTool工具可以看到下方提示Found One LOADER Device
如果有进行“进入Loader模式”的操作,仍旧没有看到烧写工具提示LOADER,此时可以看一下Windows主机是否有提示发现新硬件并配置驱动。打开设备管理器,会见到新设备 Rockusb Device 出现,如下图。如果没有,可返回上一步重新安装驱动。
Linux操作系统
运行upgrade_tool后可以看到连接设备中有个Loader的提示
进入MaskRom模式的方法,请参考《MaskRom模式》
烧写统一固件 update.img 的步骤如下:
1.切换至Upgrade Firmware页。 2.按Firmware按钮,打开要升级的固件文件。升级工具会显示详细的固件信息。 3.按Upgrade按钮开始升级。 4.如果升级失败,可以尝试先按 EraseFlash 按钮来擦除 Flash,然后再升级。一定要根据《使用USB线烧写须知(重要)》进行擦除烧写
不同系统固件的分区可能不相同,请注意以下几点:
使用 Androidtool_2.38 烧写 ubuntu(MBR) 和 Android7.1 固件时使用默认配置即可;
使用 Androidtool_2.58 烧写 ubuntu(GPT) 使用默认配置即可,烧写 Android8.1 固件请先执行以下操作: 切换至下载镜像页面; 右键点击表格,选择导入配置; 选择rk3399-Android81.cfg
使用Androidtool_2.71烧写Android10或Android9固件时使用默认配置即可;
烧写分区映像的步骤如下:
切换至Download Image页。
勾选需要烧录的分区,可以多选。
确保映像文件的路径正确,映像文件的路径可以点Path右边一列的空白单元格来重新选择。
点击Run按钮开始升级,升级结束后设备会自动重启。
如果升级失败,可以尝试先擦除后再升级。一定要根据《使用USB线烧写须知(重要)》的表格进行擦除烧写
Android7.1、Android8.1使用以下方式:
如果因 flash 问题导致升级时出错,可以尝试低级格式化、擦除 nand flash:
如果板子进入不了 Loader 模式,此时可以尝试强行进入 MaskRom 升级模式。操作方法见《MaskRom模式》。
如果烧写过程中出现Download Boot Fail, 或者烧写过程中出错,如下图所示,通常是由于使用的USB线连接不良、劣质线材,或者电脑USB口驱动能力不足导致的,请更换USB线或者电脑USB端口排查。
有关启动模式的介绍,请参阅《介绍》一章
MaskRom 升级模式升级是最基本的固件升级方式,也是设备变砖的最后一条防线。因为 MaskRom 升级模式 涉及硬件操作,如需短路焊盘请谨慎操作,以免观察失误造成其它元件被错误短路。因此在设备可以进入Loader 升级模式的情况下,优先使用Loader 升级模式。
请小心阅读,并谨慎操作!
操作步骤如下:
设备断开所有电源。
拔出 SD 卡。
用双公头USB数据线连接好设备和主机。
用金属镊子接通AIO-3399J上的如下图所示的两个测试点并保持(如下图所示)。
设备插入电源。
稍候片刻,之后松开镊子。
此时设备就会进入 MaskRom 模式。
本文主要介绍了如何将实现使用MicroSD卡,更新主板上的固件。但也仅限于固件小于4G大小的情况下,否则请查看《若固件大于4G的SD升级卡制作教程》。
使用MicroSD更新固件,需要在电脑上,通过做卡工具,将统一固件写入MicroSD卡,目前此操作只支持在Windows操作系统上完成。
AIO-3399J
电脑
MicroSD卡(即TF 卡)
USB读卡器
运行SD_Firmware_Tool.exe
可修改config.ini文件,设置Selected=1则语言为中文,设置Selected=2则语言为英文。
下载需要升级到主板上的统一固件。
将MicroSD插入USB读卡器,再插入到电脑USB口上。
打开SD_Firmware_Tool,选择正确的可移动磁盘设备,勾选固件升级框,点击选择固件选择所要升级的固件。
点击开始创建之后,等待创建结束。
取出MicroSD卡,插入主板的MicroSD卡插槽,对主板上电开机,主板自动开始升级。
升级完成后,取出MicroSD卡,主板自动重启,完成整个更新固件的流程。
AIO-3399J 出厂时默认安装Android7.1(industry)系统。
AIO-3399J 官方可能支持多种系统,因此会有烧写不同系统的固件的场景出现。
每种系统的固件都有对应的烧写工具版本,使用的烧写工具版本不对可能会导致烧写固件失败,尤其需要注意跨系统烧写固件的场景。
本章节主要介绍系统固件与烧写工具版本的对应关系以及跨系统烧写固件注意事项。
系统固件 | 烧写工具 |
---|---|
Android7.1(tvbox) | Windows: AndroidTool v2.38 Linux: upgradetool v1.24 |
Android7.1(industry) | Windows: AndroidTool v2.65 Linux: upgradetool v1.34 |
Android8.1 | Windows: AndroidTool v2.65 Linux: upgradetool v1.34 |
Android10.0 | Windows: AndroidTool v2.65 Linux: upgradetool v1.49 |
Ubuntu | Windows: AndroidTool v2.65 Linux: upgradetool v1.34 |
根据上表下载对应的烧写工具版本:
跨系统烧写固件: 即将要烧写的系统固件和当前已烧写的系统固件不属于同一种系统的固件。
跨系统烧写固件一般需要先擦除,后烧写,且擦除和烧写都需要注意使用对应的烧写工具版本,步骤如下:
使用当前已烧写的系统固件对应的烧写工具版本擦除
使用即将要烧写的系统固件对应的烧写工具版本烧写
以AIO-3399J 出厂时默认烧写Android7.1(industry)固件,客户需要烧写Android10.0固件举例:
根据系统固件与烧写工具版本的对应关系可以知道:
系统固件 | 烧写工具 |
---|---|
Android7.1(industry) | Windows: AndroidTool v2.65 Linux: upgradetool v1.34 |
Android10.0 | Windows: AndroidTool v2.65 Linux: upgradetool v1.49 |
步骤如下:
使用 AndroidTool v2.65 或 upgradetool v1.34 擦除
使用 AndroidTool v2.65 或 upgradetool v1.49 烧写
Linux开发
为了方便用户的使用与开发,官方提供了 Linux 开发的整套 SDK,本章详细的说明 SDK 的具体用法。
以下文件请务必确认安装!
这里使用Ubuntu18.04进行测试(推荐使用ubuntu18.04系统进行开发,或者使用 docker 部署 Ubuntu18.04 容器,否则无法安装好环境包):
由于 Firefly_Linux_SDK 源码包比较大,部分用户电脑不支持4G以上文件或单个文件网络传输较慢, 所以我们采用分卷压缩的方法来打包SDK。用户可以通过如下方式获取 Firefly_Linux_SDK源码包:Firefly_Linux_SDK源码包
下载完成后先验证一下 MD5 码:
确认无误后,就可以解压:
目录:
注意,以下步骤十分重要!!
因为RK3399属于64位处理器,所以在对应Linux Rootfs/arm64文件夹下选择需要的文件系统,本文用rk3399_ubuntu18.04.img.7z进行举例。
把得到的镜像放到 SDK 的指定目录:
选择屏幕
选择摄像头
全自动编译会执行所有编译、打包操作,直接生成 RK 固件。
除此之外,extboot ubuntu 还支持以安装包的形式更新内核,详情查看Ubuntu 使用手册
RAW 固件,是一种能以逐位复制的方式烧写到存储设备的固件,是存储设备的原始映像。不同于 RK 固件,目前仅支持通过 Etcher 工具烧写至 SD 卡启动。
FIRMWARE_VER: 1.0
MACHINE_MODEL: RK3399
MACHINE_ID: 007
MANUFACTURER: RK3399
MAGIC: 0x5041524B
ATAG: 0x00200800
MACHINE: 0xffffffff
CHECK_MASK: 0x80
PWR_HLD: 0,0,A,0,1
TYPE: GPT
CMDLINE: mtdparts=rk29xxnand:0x00002000@0x00004000(uboot),0x00002000@0x00006000(trust),0x00002000@0x00008000(misc),0x00040000@0x0000a000(boot:bootable),0x00040000@0x0004a000(recovery),0x00010000@0x0008a000(backup),0x00c00000@0x0009a000(rootfs),0x00040000@0x00c9a000(oem),-@0x00d1a000(userdata:grow)
uuid:rootfs=614e0000-0000-4b53-8000-1d28000054a9
操作方法见《升级固件》
Firefly Linux 开发指南
SIP(Session Initiation Protocol,会话初始协议)的开发目的是用来帮助提供跨越因特网的高级电话业务。因特网电话(IP电话)正在向一种正式的商业电话模式演进,SIP就是用来确保这种演进实现而需要的NGN(下一代网络)系列协议中重要的一员。支持H.264协议。
本次使用的系统为Ubuntu18.04(若使用ubutu20.04或Debian等可能需稍作修改)
安装所需的环境包
具体操作过程:
启动opensips服务: sudo service mysql restart
Can’t connect to MySQL server on ‘168.168.100.178’ (111) root@jinchengubuntu-VirtualBox:/usr/local/opensips/sbin# ./opensipsdbctl create MySQL password for root: INFO: test server charset mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 2003 (HY000): Can’t connect to MySQL server on ‘168.168.100.178’ (111) mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 2003 (HY000): Can’t connect to MySQL server on ‘168.168.100.178’ (111) WARNING: Failed to get the available and used character sets
注释
注意: 如果使用的是 core-3399 核心板加上 DIY 底板,可能需要修改相应的 GPIO 属性。
在运行脚本之前先确认一下 OV13850 设备是否注册成功,下面是成功的内核日志:
使用v4l2方式预览摄像头:
gst-launch-1.0 v4l2src device=/dev/video0 ! video/x-raw,format=NV12,width=640,height=480, framerate=30/1 ! videoconvert ! kmssink &
运行脚本即可,结果如图所示:
使用v4l2loopback和FFMPEG多路投影
apt-get install -y git libopencv-dev cmake libdrm-dev g librga-dev python-dev
git clone https://github.com/umlaeute/v4l2loopback.git
cd v4l2loopback/
#参考 《安装linux-headers和linux-image》
make install
...
//使用v4l2loopback创建 video10、video11和video12设备
sudo insmod v4l2loopback.ko videonr=10,11,12
#打开读取video0设备,并把图像信息写入到video10中
sudo -u firefly DISPLAY=:0 ./rkisp_demo -c 300 -d /dev/video0 -w 640 -h 480 -D /dev/video10
// 使用ffmpeg拷贝功能将video10中的内容,拷贝到video11和video12设备中
ffmpeg -loglevel quiet -f v4l2 -video_size 640x480 -r 10 -i /dev/video10 -preset fast -codec copy -f v4l2 /dev/video11 -preset fast -codec copy -f v4l2 /dev/video12
// 另起一个终端,使用ffplay工具任意预览video11或video12
ffplay -i /dev/video11
MIPI摄像头是不支持OpenCV中 capture.open(index) 方式读取的,在此提供2中读取摄像头的方法:
这种方式推荐OpenCV的C 版本使用,详细使用参考前面的v4l2预览一节。v4l2_simple_demo是rkisp_demo.cpp的精简版本,详细可参考rkisp_demo.cpp。
不少客户遇到OpenCV的问题多集中在如何获取mipi摄像头的数据。因为OpenCV使用的V4l2协议和Rockchip编写的mipi摄像头驱动协议不同,所以不能直接使用OpenCV的摄像头API。本节讲述如何编译Opencv并添加GStreamer API支持。
OS: Ubuntu18.04 / Debian 10
OpenCV version: 3.4.15
Board: RK3399
3. 安装Opencv所需的环境包
# 安装编译环境、gtk包和相关编解码库
sudo apt install cmake build-essential libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libdc1394-22-dev libjasper-dev
# 注意!如果安装了rknn_toolkit(or lite)则不需要再安装Python-numpy,否则会导致rknn_toolkit(or lite)无法使用
sudo apt install python-numpy
opencv_gst_test.py 代码
import numpy as np
import cv2 as cv
import os
import time
cap = cv.VideoCapture('v4l2src device=/dev/video1 ! video/x-raw, format=NV12, width=640, height=480, framerate=30/1 ! videoconvert ! appsink', cv.CAP_GSTREAMER)
if not cap.isOpened():
print("Cannot capture from camera. Exiting.")
os._exit()
last_time = time.time()
while(True):
ret, frame = cap.read()
this_time = time.time()
print (str((this_time-last_time)*1000) 'ms')
last_time = this_time;
cv.imshow('frame', frame)
if cv.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv.destroyAllWindows()
USB 以太网,主要实现的是将设备的 OTG 接口做外设模式,模拟成一个网络接口,然后主机通过 USB 连接设备并通过设备访问互联网。以下是基于 Firefly-RK3399 板卡进行的具体操作。
操作环境:
Ubuntu 系统的 PC 机
Firefly-RK3399 板卡
在内核目录下,打开内核配置选项菜单:
在设备上:首先打开 IPv4 的转发功能:
网络启动,是用 TFTP 在服务器下载内核、dtb 文件到目标机的内存中,同时可以用 NFS 挂载网络根文件系统到目标机上,实现目标机的无盘启动。以下基于 Firefly-RK3399 板卡作出一个示例,提供用户参考。
准备工作:
Firefly-RK3399 板卡
路由器、网线
安装有 NFS 和 TFTP 的服务器
一份制作好的根文件系统
注:示例中使用的是 Ubuntu 系统的 PC 机作为服务器,通过路由器和网线实现与设备的连接。用户可以根据自己的实际情况作调整,但如果是 PC 机直连设备,请使用交叉网线。请确保服务器和目标机在同一局域网内。
1、在服务器上部署 TFTP 服务:
安装 TFTP 服务:
请先确保目标机网线已插入,接入到服务器的局域网内。
目标机启动进入 U-Boot 命令行模式,设置以下参数:
在开机内核日志中可见:
根文件系统除了可以使用在内部的 eMMC 中的,还可以使用外部存储设备的根文件系统,如 SD 卡,U 盘等。以下是以 SD 卡为例,在 Firefly-RK3399 设备上实现挂载外部存储设备的根文件系统。
把新创建的分区进行格式化。
格式化完成后,使用 dd 命令,将制作好的根文件系统烧写到 SD 卡刚新建的分区中。(根文件系统的定制可以参考:《Ubuntu 根文件系统定制》)
修改完成后编译并烧录至设备中。
SD 卡的根文件系统烧录完成后,插入设备的 TF 卡槽中,开机即可进入到 SD 的根文件系统中。
注意事项:
以下是创建好的目录树:
首先安装需要的包:
接下来创建包仓库,首先创建目录:
建立仓库树:
需要焊接 HDMI_IN 输入接口
默认情况下这个功能是关闭,需要在kernel仓库中执行以下操作:git revert 8998afb927200ad42b27beacc22cf1e86bfca442
测试脚本
test_hdmiin-3399.sh
MLU220-M.2 加速卡采用思元220芯片,芯片基于寒武纪MLUv02架构。加速卡采用标准M.2接口,理论峰值性能为8TOPS,功耗仅为8.25W。可以轻松实现终端设备和边缘段设备的AI赋能方案。
MLU220-M.2加速卡用于离线模型的部署,离线模型在MLU220上运行, 不依赖AI框架,只需要利用CNRT库,即可实现高效的AI推理运算。
如果需要对模型转化、量化、开发、精度调优等需要在配合MLU270在x86 PC上完成,然后生成离线模型,部署到MLU220加速卡上。
多达16个张量核心,借助NOC片上网络提升并行效率
硬件片内数据压缩,提升缓存有效容量和带宽
更全面AI精度支持: INT16, INT8, INT4, FP32, FP16
U盘大小,可以提供8路高清视频的实时智能分析
高效支持多种神经网络
寒武纪Neuware软件栈和BANG语言编程环境,满足全面AI定制化要求
全面支持模型拆分并行,多模型并行,最大化计算效率
开发调试: 基于MLU270板卡,在线模式(使用AI框架),通用性高,可生成离线模型
业务部署: 基于MLU220板卡,离线模式(脱离AI框架),直接加载离线模型,性能更优
Firefly AIO-3399J操作系统使用Firefly定制的Ubuntu18.04. 系统中已经适配了MLU220 离线运行环境。包含以下几个部分:
MLU220-M.2 内核驱动
CNToolKit 运行库
编译工具链
CNStream SDK / Demo。
固件下载地址如下:
AIO-3399J Ubuntu18.04 MLU220固件
选择AIO-3399J-UBUNTU18.04-MLU220-GPT-**.img.7z
固件升级方法参照:
在系统启动完成进入桌面后,可以使用以下命令验证为了验证当前环境是否已经正确配置,如有异常,请与Firefly客服联系。
CNToolKit运行库类组件主要为用户提供部署环境和开发环境中的运行时支持。在MLU220中,只支持边缘端的部署环境。
CNRT
CNRT(Cambricon Neuware Runtime Library,寒武纪运行时库)提供了一套面向MLU(Machine Learning Unit,寒武纪机器学习单元)设备的高级别的接口,用于主机与MLU设备之间的交互。CNRT作为寒武纪软件系统最底层支撑,所有其他的寒武纪软件运行都需要调用CNRT接口。
有关CNRT的详细开发文档,请参见寒武纪官方文档-CNRT
CNCodec
CNCodec(Cambricon Neuware Codec,寒武纪硬件编解码)是一套封装了视频编解码和图片编解码的SDK接口。
CNCodec典型应用场景如:带有CNCodec板卡的主机接收IP Camera传输过来的码流数据,CNCodec接收到码流数据后,将数据输入给VPU(Video Processor Unit,视频处理单元)或JPU(JPEG Processor Unit,JPEG处理单元)进行硬件编解码, 编解码得到的图片数据送给MLU(Machine Learning Unit,寒武纪机器学习单元)进行推理,推理完成后返回推理结果至主机。
有关CNCodec的详细开发文档,请参见寒武纪官方文档-CNCodec
CNDev
CNDev(Cambricon Neuware Device Interface,寒武纪设备接口)是一套支持主机端应用程序获取寒武纪芯片硬件信息的软件接口。 通过CNDev接口,用户可以对设备管理实现定制化需求,比如云服务平台的设备管理、自动化测试平台的设备管理等。
CNDev主要实现了以下功能:
获取设备硬件信息,比如:设备名称、设备利用率、板卡功耗、板卡温度、板卡带宽、风扇转速等。
评测应用程序在寒武纪硬件设备上的开销,比如:内存占用、MLU利用率等。
提供获取设备间拓扑逻辑以及CPU亲和性等相关信息的功能。
有关CNDev的详细开发文档,请参见寒武纪官方文档-CNDev
CNDrv
CNDRV API(Cambricon Driver Application Programming Interface,寒武纪驱动应用程序接口)提供了一套面向MLU(Machine Learning Unit,机器学习单元)设备的接口,用于主机与MLU设备之间的交互。 CNDRV API作为寒武纪软件系统的底层支撑,向下封装了对更底层驱动的操作,向上提供了可以调用的接口,通过该接口实现了上层对底层驱动的操作。 上层框架既可以间接通过CNRT(Cambricon Neuware Runtime Library,寒武纪运行时库)调用CNDRV API进行软件编程,也可以直接调用CNDRV API进行软件编程。
有关CNDrv的详细开发文档,请参见寒武纪官方文档-CNDrv
CNStream是面向寒武纪开发平台的数据流处理SDK。用户可以根据CNStream提供的接口,开发实现自己的组件。还可以通过组件之间的互连,灵活地实现自己的业务需求。CNStream能够大大简化寒武纪深度学习平台提供的推理和其他处理,如视频解码、神经网络图像前处理的集成。也能够在兼顾灵活性的同时,充分发挥寒武纪MLU(Machine Learning Unit 机器学习处理器)的硬件解码和机器学习算法的运算性能。
CNStream 开源项目地址:
https://github.com/cambricon/cnstream
CNStream 详细开发文档:
https://www.cambricon.com/docs/cnstream/developer_guide_html/index.html
https://www.cambricon.com/docs/cnstream/user_guide_html/overview/Overview.html
MLU220-M.2加速卡用于离线模型的部署,如果需要对模型转化、量化、开发、精度调优等需要在配合MLU270在x86 PC上完成。
配合寒武纪人工智能开发平台(Cambricon NeuWare®),用户在x86 PC上,利用MLU270智能加速卡,完成的开发工作,保存生成的离线模型。
然后再将保存生成的离线模型,部署到Firefly AIO-3399J平台上。
更多关于Cambricon NeuWare的文档,请参阅寒武纪官方文档
Android
Android开发
ADB,全称 Android Debug Bridge,是 Android 的命令行调试工具,可以完成多种功能,如跟踪系统日志,上传下载文件,安装应用等。
首先参照安装 RK USB 驱动一节安装好驱动。
然后到 http://www.t-firefly.com/share/index/index/id/6afafdf7c54b8eb95e81156d94e54db5.html 下载 adb.zip,解压到 C:adb 以方便调用。
打开命令行窗口,输入:
列出所有连接设备及其序列号:
如果 TARGET_BUILD_VARIANT 使用的是 userdebug 模式,要获得 root 权限,需要先运行:
前面是 apk 文件,后面则是对应的包名称。
编译 Android 对机器的配置要求较高:
64 位 CPU
16GB 物理内存 交换内存
30GB 空闲的磁盘空间用于构建,源码树另外占用大约 25GB, 如果要编译源码则还需要 150GB 的磁盘空间。
RK官方推荐 Ubuntu 14.04 操作系统,不过该系统比较老且不再维护了,所以这里推荐使用 Ubuntu 16.04或18.04,只需要满足 http://source.android.com/source/building.html 里的软硬件配置即可。
编译环境的初始化可参考 http://source.android.com/source/initializing.html 。
Android7.1 industry 版本在工业和平板和盒子等领域的使用上范围更加广泛,而且性能稳定大批量生产验证过, 该版本也作为我司主要维护版本,适用于我司RK3399系统的所有机型。
Android SDK 源码包比较大,可以去下载页面来获取Android7.1 industry源码包: Android7.1 industry源码包
下载完成后先验证一下 MD5 码:
注意:
该摄像头只支持AIO-3399J标准版,不支持HDMI_IN版本
编译前执行如下命令配置环境变量:
编译完可以用Firefly官方的脚本打包成统一固件,执行如下命令:
根据不同的-l XXX-userdebug参数,打包生成统一固件会存放在不同目录下(rockdev/Image-XXX/): product名XXX_XXX_日期XXX.img
在 Windows 下打包统一固件 update.img 也很简单,将编译生成的文件拷贝到 AndroidTool 的 rockdevImage 目录中,然后运行 rockdev 目录下的 mkupdate.bat 批处理文件即可创建 update.img 并存放到 rockdevImage 目录里。
编译的时候执行 ./mkimage.sh 会重新打包 boot.img 和 system.img, 并将其它相关的映像文件拷贝到目录 rockdev/Image-rk3399_firefly/ 中。以下列出一般固件用到的映像文件:
boot.img :Android 的初始文件映像,负责初始化并加载 system 分区。
kernel.img :内核映像。
misc.img :misc 分区映像,负责启动模式切换和急救模式的参数传递。
parameter.txt :emmc的分区信息
recovery.img :急救模式映像。
resource.img :资源映像,内含开机图片和内核的设备树信息。
system.img :Android 的 system 分区映像,ext4 文件系统格式。
trust.img :休眠唤醒相关的文件
rk3399_loader_v1.08.106.bin :Loader文件
uboot.img :uboot文件
请参照 《升级固件》 一文来烧写分区映像文件。
如果使用的是 Windows 系统,将上述映像文件拷贝到 AndroidTool (Windows 下的固件升级工具)的 rockdevImage 目录中,之后参照升级文档烧写分区映像即可,这样的好处是使用默认配置即可,不用修改文件的路径。
update.img 方便固件的发布,供终端用户升级系统使用。一般开发时使用分区映像比较方便。
注意:
使用升级工具进行industry版固件升级时,如果原有烧录的是tvbox版固件,需要先短路emmc或进行flash擦除。且注意使用相适配升级工具
请参照 烧写须知
由于 SDK 较大,可以去下载页面选择云盘下载 Firefly-RK3399_Android10.0_git_20211222.7z:
注:源码与bundle压缩包均存放在云盘中
下载完成后,在解压前先校验下 MD5 码:
注意:
该摄像头只支持AIO-3399J标准版,不支持HDMI_IN版本
编译前执行如下命令配置环境变量:
编译完可以用Firefly官方的脚本打包成统一固件,执行如下命令:
根据不同的-l XXX-userdebug参数,打包生成统一固件会存放在不同目录下(rockdev/Image-XXX/): product名XXX_XXX_日期XXX.img
在 Windows 下打包统一固件 update.img 也很简单,将编译生成的文件拷贝到 AndroidTool 的 rockdevImage 目录中,然后运行 rockdev 目录下的 mkupdate.bat 批处理文件即可创建 update.img 并存放到 rockdevImage 目录里。
Android10.0的kernel.img和resource.img包含在boot.img中,更新编译kernel后需要在android根目 录下执行./mkimage.sh重新打包boot.img。打包后烧写rockdev下面的boot.img,可以使用如下方法单 独编译kernel。
编译的原理:在kernel目录下将编译生成的 kernel.img 和 resource.img 替换到旧的 boot.img 中, 所以编译的时候需要用 BOOT_IMG=xxx 参数指定boot.img的路径,命令如下:
编译后可以直接烧写kernel目录下的boot.img到机器的boot位置。
boot.img 包含ramdis、kernel、dtb
dtbo.img Device Tree Overlays
kernel.img includekernel,目前无法单独烧写,需要打包到boot.img内烧写
MiniLoaderAll.bin 包含一级loader
misc.img 包含recovery-wipe开机标识信息,烧写后会进行recovery
odm.img 包含android odm,包含在super.img分区内,单独烧写需要用fastboot烧写
parameter.txt 包含分区信息
pcba_small_misc.img 包含pcba开机标识信息,烧写后会进入简易版pcba模式
pcba_whole_misc.img 包含pcba开机标识信息,烧写后会进入完整版pcba模式
recovery.img 包含recovery-ramdis、kernel、dtb
resource.img 包含dtb,kernel和uboot阶段的log及uboot充电logo,目前无法单独烧写,需要打包到boot.img内烧写
super.img 包含odm、vendor、system分区内容
system.img 包含android system,包含在super.img分区内,单独烧写需要同fastboot烧写
trust.img 包含BL31、BL32
uboot.img 包含uboot固件
vbmeta.img 包含avb校验信息,用于AVB校验
vendor.img 包含android vendor,包含在super.img分区内,单独烧写需要同fastboot烧写
update.img 包含以上需要烧写的img文件,可以用于工具直接烧写整个固件包
参考:《升级固件》
注意: 以下内容仅适用于 Android8.1 及以下版本。
定制 Android 固件,有两种方法:
改源码,然后编译生成固件。
在现有固件的基础上进行裁剪。
前一种方法,可以从各个层面去定制 Android,自由度大,但对编译环境和技术要求比较高,参见《编译 Android 固件》一文。 现在介绍后一种方法,分为解包、定制和打包三个阶段。主机操作系统为 Linux,采用的工具为开源软件。
这样,固件就解包成功了,下面开始定制。
其他
RK U-Boot 基于开源的 U-Boot 进行开发,工作模式有启动加载模式和下载模式。启动加载模式是 U-Boot 的正常工作模式,嵌入式产品发布时,U-Boot 都工作在此模式下,主要用于开机时把内存中的内核加载到内存中,启动操作系统;下载模式主要用于将固件下载到闪存,开机时长按 Recovery 键可进入下载模式。本文简单说明 U-Boot 的使用,更多相关文档请看 SDK 下面的 RKDocs/common/uboot/RockChip_Uboot 开发文档 V3.0.pdf。
编译 U-Boot 与编译内核类似,编译前把默认配置写入 .config,执行:
打开烧录工具,板子接好 USB OTG 线,接通电源时按住 Recovery 键,使开发板进入 U-Boot 的下载模式,在烧录工具中选择编译好的 Loader 文件,点击执行即可,如下图:
如果你已经成功烧写你最新编译的 Loader,在开机的串口输出中可以看到类似如下信息:
由于 Firefly 产品主要用于开发,所以我们默认设置开机时有1秒的倒计时,如果这时候在串口输入任意键即可进入 U-Boot 命令行模式。 发布的产品是不需要进入 U-Boot 命令行模式的,如果需要设置U-Boot默认不进入命令行模式的,可以做如下修改:
U-BOOT 作为一级 Loader 模式,那么仅支持 EMMC 存储设备,编译完成后生成的镜像:
驱
驱动开发
AIO-3399J 开发板上的 AD 接口有两种,分别为:温度传感器 (Temperature Sensor)、逐次逼近ADC (Successive Approximation Register)。其中:
TS-ADC(Temperature Sensor):支持两通道,时钟频率必须低于800KHZ
SAR-ADC(Successive Approximation Register):支持六通道单端10位的SAR-ADC,时钟频率必须小于13MHZ。
内核采用工业 I/O 子系统来控制 ADC,该子系统主要为 AD 转换或者 DA 转换的传感器设计。 下面以 SAR-ADC 为例子,介绍 ADC 的基本配置方法。
AIO-3399J SAR-ADC 的 DTS 节点在 kernel/arch/arm64/boot/dts/rockchip/rk3399.dtsi 文件中定义,如下所示:
这里申请的是 SARADC 通道3。
用户驱动可参考 Firefly adc demo:
Android7.1 Industry 与 Android10.0 路径为 kernel/drivers/iio/adc/adc-firefly-demo.c
Android8.1 box 与 Android7.1 box 路径为 kernel/drivers/adc/adc-firefly-demo.c
demo是一个侦测 AIO-3399J 风扇状态的驱动。首先在驱动文件中定义 of_device_id 结构体数组:
注意:
Vref 为标准电压
n 为 AD 转换的位数
Vresult 为用户所需要的采集电压
raw 为 AD 采集的原始数据
例如,标准电压为 1.8V,AD 采集位数为 10 位,AD 采集到的原始数据为 568,则:
驱动需要获取ADC通道来使用时,需要对驱动的加载时间进行控制,必须要在saradc初始化之后。saradc是使用module_platform_driver()进行平台设备驱动注册,最终调用的是module_init()。所以用户的驱动加载函数只需使用比module_init()优先级低的,例如:late_initcall(),就能保证驱动的加载的时间比saradc初始化时间晚,可避免出错。
GPIO, 全称 General-Purpose Input/Output(通用输入输出),是一种软件运行期间能够动态配置和控制的通用引脚。 RK3399 有 5 组 GPIO bank:GPIO0~GPIO4,每组又以 A0~A7, B0~B7, C0~C7, D0~D7 作为编号区分。所有的 GPIO 在上电后的初始状态都是输入模式,可以通过软件设为上拉或下拉,也可以设置为中断脚,驱动强度都是可编程的。 每个 GPIO 口除了通用输入输出功能外,还可能有其它复用功能,例如 GPIO2_A2,可以利用成以下功能:
GPIO2_A2
GIF_D2
每个 GPIO 口的驱动电流、上下拉和重置后的初始状态都不尽相同,详细情况请参考《RK3399 规格书》中的 “Chapter 10 GPIO” 一章。 RK3399 的 GPIO 驱动是在以下 pinctrl 文件中实现的:
其核心是填充 GPIO bank 的方法和参数,并调用 gpiochip_add 注册到内核中。
AIO-3399J 开发板为方便用户开发使用,并没有引出通用的 GPIO 口,但是可以将其他接口用作 GPIO,例如 LED 扩展接口,在不用的情况可以将其当作一般的 GPIO 口使用,其对应引脚如下图:
本文以 TP_RST(GPIO0_B4) 和 LCD_RST(GPIO4_D5) 这两个通用 GPIO 口为例写了一份简单操作 GPIO 口的驱动,在 SDK 的路径为:
以下就以该驱动为例介绍 GPIO 的操作。
首先在 DTS 文件中增加驱动的资源描述:
在 Firefly 的例子程序中还包含了一个中断引脚,GPIO 口的中断使用与 GPIO 的输入输出类似,首先在 DTS 文件中增加驱动的资源描述:
如何定义 GPIO 有哪些功能可以复用,在运行时又如何切换功能呢?以 I2C4 为例作简单的介绍。
查规格表可知,I2C4_SDA 与 I2C4_SCL 的功能定义如下:
另外,像 “1 11”,”1 12” 这样的值是有编码规则的,编码方式与上一小节 “输入输出” 描述的一样,”1 11” 代表 GPIO1_B3,”1 12” 代表 GPIO1_B4。
首先是调用 of_get_gpio 取出设备树中 i2c4 结点的 gpios 属于所定义的两个 gpio:
在复杂的片上系统(SOC)中,设计者一般会将系统的供电分为多个独立的 block,这称作电源域(Power Domain),这样做有很多好处,例如:
在 IO-Domain 的 DTS 节点统一配置电压域,不需要每个驱动都去配置一次,便于管理;
依照的是 Upstream 的做法,以后如果需要 Upstream 比较方便;
IO-Domain 的驱动支持运行过程中动态调整电压域,例如 PMIC 的某个 Regulator 可以 1.8v 和 3.3v 的动态切换,一旦 Regulator 电压发生改变,会通知 IO-Domain 驱动去重新设置电压域。
AIO-3399J 原理图上的 Power Domain Map 表以及配置如下表所示:
通过 RK3399 SDK 的原理图可以看到 bt656-supply 的电压域连接的是 vcc18_dvp, vcc_io 是从 PMIC RK808 的 VLDO1 出来的;
在 DTS 里面可以找到 vcc1v8_dvp, 将 bt656-supply = <&vcc18_dvp>。
其他路的配置也类似,需要注意的是如果这里是其他 PMIC,所用的 Regulator 也不一样,具体以实际电路情况为标准。
GPIO 调试有一个很好用的工具,那就是 IO 指令,AIO-3399J 的 Android 系统默认已经内置了 IO 指令,使用 IO 指令可以实时读取或写入每个 IO 口的状态,这里简单介绍 IO 指令的使用。首先查看 IO 指令的帮助:
使用示例:
查看GPIO1_B3引脚的复用情况
从主控的datasheet查到GPIO1对应寄存器基地址为:0xff320000
从主控的datasheet查到GPIO1B_IOMUX的偏移量为:0x00014
GPIO1_B3的iomux寄存器地址为:基址(Operational Base) 偏移量(offset)=0xff320000 0x00014=0xff320014
用以下指令查看GPIO1_B3的复用情况:
从读取到的信息中可以知道,内核把 GPIO 当前的状态都列出来了,以 GPIO0 组为例,gpio-2(GPIO0_A2) 作为 3G 模块的电源控制脚 (vcc3v3_3g),输出高电平 (out hi)。
A1: 当使用 GPIO request 时候,会将该 PIN 的 MUX 值强制切换为 GPIO,所以使用该 PIN 脚为 GPIO 功能的时候确保该 PIN 脚没有被其他模块所使用。
A2: 如果用 IO 命令读某个 GPIO 的寄存器,读出来的值异常,如 0x00000000 或 0xffffffff 等,请确认该 GPIO 的 CLK 是不是被关了,GPIO 的 CLK 是由 CRU 控制,可以通过读取 datasheet 下面 CRU_CLKGATE_CON* 寄存器来查到 CLK 是否开启,如果没有开启可以用 io 命令设置对应的寄存器,从而打开对应的 CLK,打开 CLK 之后应该就可以读到正确的寄存器值了。
A3: 测量该 PIN 脚的电压不对时,如果排除了外部因素,可以确认下该 PIN 所在的 IO 电压源是否正确,以及 IO-Domain 配置是否正确。
A4: 如果使用该 GPIO 时,不会动态的切换输入输出,建议在开始时就设置好 GPIO 输出方向,后面拉高拉低时使用 gpio_set_value() 接口,而不建议使用 gpio_direction_output(), 因为 gpio_direction_output 接口里面有 mutex 锁,对中断上下文调用会有错误异常,且相比 gpio_set_value,gpio_direction_output 所做事情更多,浪费。
AIO-3399J 开发板上有 9 个片上 I2C 控制器,各个 I2C 的使用情况如下表:
本文主要描述如何在该开发板上配置 I2C。
配置 I2C 可分为两大步骤:
定义和注册 I2C 设备
定义和注册 I2C 驱动
下面以配置 GSL3680 为例。
在注册好 I2C 驱动后,即可进行 I2C 通讯。
A1: 请检查硬件上拉是否给电。
A2: 返回值为 -6 表示为 NACK 错误,即对方设备无应答响应,这种情况一般为外设的问题,常见的有以下几种情况:
I2C 地址错误,解决方法是测量 I2C 波形,确认是否 I2C 设备地址错误;
I2C slave 设备不处于正常工作状态,比如未给电,错误的上电时序等;
时序不符合 I2C slave 设备所要求也会产生 Nack 信号。
A3: 这时需要调用两次 i2c_transfer, I2C read 拆分成两次,修改如下:
AIO-3399J 开发板上使用红外收发传感器 IR (在 mic 接口和喇叭接口之间)实现遥控功能,在 IR 接口处接上红外接收器。本文主要描述在开发板上如何配置红外遥控器。
其配置步骤可分为两个部分:
修改内核驱动:内核空间修改,Linux 和 Android 都要修改这部分的内容。
修改键值映射:用户空间修改(仅限 Android 系统)。
在 Linux 内核中,IR 驱动仅支持 NEC 编码格式。以下是在内核中配置红外遥控的方法。
所涉及到的文件:
在 remotectl_do_something 函数中获取用户码和键值:
将 IR 驱动编译进内核的步骤如下所示:
如下图是通过按红外遥控器按钮,所产生的波形,主要由 head, Control, information, signed free 这四部分组成,具体可以参考 RC6 Protocol。
AIO-3399J开发板外置了两个LCD屏接口,一个是EDP,一个是LVDS,接口对应板子上的位置如下图:
AIO-3399J的SDK有LVDS DSI的DTS文件:kernel/arch/arm64/boot/dts/rockchip/rk3399-firefly-aio-lvds.dts,从该文件中我们可以看到以下语句:
都是高电平有效,具体的引脚配置请参考《GPIO》一节。
AIO-3399J开发板外置了一个背光接口用来控制屏幕背光,如下图所示:
在DTS文件:kernel/arch/arm64/boot/dts/rockchip/rk3399-firefly-core.dtsi中配置了背光信息,如下:
因此使用时需修改DTS文件。
brightness-levels属性:配置背光亮度数组,最大值为255,配置暗区和亮区,并把亮区数组做255的比例调节。比如范例中暗区是255-221,亮区是220-0。 default-brightness-level属性:开机时默认背光亮度,范围为0-255。 具体请参考kernel中的说明文档:kernel/Documentation/devicetree/bindings/leds/backlight/pwm-backlight.txt
与EDP屏不同,LVDS屏的 Timing 写在DTS文件中,在kernel/arch/arm64/boot/dts/rockchip/rk3399-firefly-aio-lvds.dts中可以看到以下语句:
时序属性参考下图:
lvds屏上完电后需要发送初始化指令才能使之工作。初始化指令需要以下工具文档生成,下载TC358764_5_774_5XBG_DSI-LVDS_Tv11p_nm_1280x800.xls
以1280x800单lvds为例: 首先打开TC358764_5_774_5XBG_DSI-LVDS_Tv11p_nm_1280x800.xls
选择页面”Timing Parameters_SYNC_EVENT”,按照LVDS屏的时序填入LVDS timing黄色单元,一般只需填入以下单元即可。
HPW / HBPR / HDISPR / HFPR 分别对应 hsync-len / hback-porch / hactive / hfront-porch
VPW / VBPR / VDISPR / VFPR 分别对应 vhsync-len / vback-porch / vactive / vfront-porch
LVDS timing填入完成后还需配置常规参数
1.根据LVDS屏规格书确认LVDS Link和LVDS output format并选择屏的参数。
2.计算LVDS clock(蓝色单元无法写入,需要黄色单元自动计算得出),需要填入DSI Clock(HOST), Pixel Clock Source, Pixel Clock Divider。计算公式如下:DSI Clock/Pixel Clock Source/Pixel Clock Divider=LVDS Clock
填入上述黄色单元基本上完成配置,接下来选择页面”Source”即可看到转换后的Comment
以上面为例”013C 00030005”,mipi command就应该是”29 02 06 3C 01 05 00 03 00”
29 : packet ID
02 : 2ms delay
06 : 6 bytes
3C 01 : address = 0x013C
00 03 00 05 : data=0x05000300
将页面source所有地址写入数据,即可完成初始化指令panel-init-sequence。
dts在kernel/arch/arm64/boot/dts/rockchip/rk3399-firefly-aio-lvds.dts中可以看到lvds的初始化指令列表:
命令格式以及说明可参考以下附件: Rockchip DRM Panel Porting Guide.pdf
排查屏参数是否超出屏规格书限定周期,排查屏时钟大小。”Timing Parameters_SYNC_EVENT”所有参数变动必须和comment同步调整。
尝试同步调整color mapping或者lvds timing。
NOTE: 页面”How to use”有详细步骤,其他参数说明可以参考文档”页面”菜单。
AIO-3399J 开发板上有 2 个 LED 灯,如下表所示:
可通过使用 LED 设备子系统或者直接操作 GPIO 控制该 LED。
标准的 Linux 专门为 LED 设备定义了 LED 子系统。 在 AIO-3399J 开发板中的两个 LED 均以设备的形式被定义。
Trigger 包含多种方式可以控制 LED,这里就用两个例子来说明。
Simple trigger LED
Complex trigger LED
按名字来是看就是简单的触发方式控制 LED,如下就默认打开黄灯,AIO-3399J 开机后黄灯就亮。
AIO-3399J 开发板分别带有两个 MIPI,MIPI 支持最高 4K 拍照,并支持 1080P 30fps 以上视频录制。此外,开发板还支持 USB 摄像头。
本文以 OV13850/OV5640 摄像头为例,讲解在该开发板上的配置过程。
接口效果图
设置摄像头相关的引脚和时钟,即可完成配置过程。
主要修改的内容如下:
终端下可以直接修改 /system/etc/cam_board.xml 调试各参数并重启生效
无法打开摄像头,首先确定 sensor I2C 是否通信。若不通则可检查 mclk 以及供电是否正常(Power/PowerDown/Reset/Mclk/I2cBus)分别排查
支持列表ː
13Mː OV13850/IMX214-0AQH5
8Mː OV8825/OV8820/OV8858-Z(R1A)/OV8858-R2A
5Mː OV5648/OV5640
2Mː OV2680
详细资料可查询 SDK/RKDocs
AIO-3399J 开发板上有 一个集成于 RK808 上的RTC(Real Time Clock),主要功能有时钟,日历,闹钟,周期性中断,双通道 32KHz 时钟输出。
J2 接上 CR2032 纽扣电池后,可以保证板子掉电后 RTC 可以正常运行。J2 位置如下图:
DTS 配置信息存放于 rk808 节点
打印 RTC 相关的信息:
A1: 检查一下 RTC 电池是否正确接入。
AIO-3399J 开发板上有 4 路 PWM 输出,分别为 PWM0 ~ PWM3,4 路 PWM 分别使用在 EDP 背光、MIPI 背光、VDDLOG 供电、红外 IR。
本章主要描述如何配置 PWM。
pwm_id:需要申请的 PWM 通道数。
min_period:周期时长最小值。
max_period:周期时长最大值。
duty_ns:PWM 的占空比激活的时长,单位 ns。
用户可在其它驱动文件中使用以上步骤生成的 PWM 节点。具体方法如下:
(1)、在要使用 PWM 控制的设备驱动文件中包含以下头文件:
查看注册是否成功,成功则返回接口名和寄存器地址。
dts 配置文件是否打开对应的 PWM。
PWM 所在的 IO 口是否被其他资源占用,可以根据报错的返回值去查看原因。
SPI 是一种高速的,全双工,同步串行通信接口,用于连接微控制器、传感器、存储设备等,AIO-3399J 板子提供了 SPI2 (单片选)接口,具体位置如下图:
SPI 以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少 4 根线,分别是:
SPI 的四种工作模式波形图如下:
下面以 W25Q128FV Flash 模块为例简单介绍 SPI 驱动的编写。
AIO-3399J 与 W25Q128FV 硬件连接可参考下表:
下面是常用的 SPI API 定义:
详细使用说明请参考文档 spidev 。
A1: 确保 SPI 4 个引脚的 IOMUX 配置正确, 确认 TX 送数据时,TX 引脚有正常的波形,CLK 频率正确,CS 信号有拉低,mode 与设备匹配。
RK3399有 12 个 Timers (timer0-timer11),有 12 个 Secure Timers(stimer0~stimer11) 和 2 个 Timers(pmutimer0~pmutimer1), 我们主要用到的是 Timers(timer0-timer11) 时钟频率为 24MHZ ,工作模式有 free-running 和 user-defined count 模式。
其中定义的 Timer0 的寄存器和中断号和时钟等。
其他 Timer 对应的中断号可看如下图片:
2.对应的驱动文件 Kernel/drivers/clocksource/rockchip_timer.c
寄存器如下图片:
AIO-3399J 支持 SPI 桥接/扩展 4 个增强功能串口(UART)的功能,分别为 UART1,UART2,RS232,RS485。每个 UART 都拥有 256 字节的 FIFO 缓冲区,用于数据接收和发送。其中:
UART1,UART2 为 TTL 电平接口,RS232 为 RS232 电平接口,RS485 为 RS485 电平接口
每个子通道 UART 的波特率、字长、校验格式可以独立设置,最高可以提供 2Mbps 的通信速率
每个子通道具备收/发独立的 256 BYTE FIFO,FIFO 的中断可按用户需求进行编程触发点
具备子串口接收 FIFO 超时中断
支持起始位错误检测
AIO-3399J 开发板的串口接口图如下:
配置好串口后,硬件接口对应软件上的节点分别为:
用户可以根据不同的接口使用不同的主机的 USB 转串口适配器向开发板的串口收发数据,例如 RS485 的调试步骤如下:
(1) 连接硬件
将开发板RS485 的A、B、GND 引脚分别和主机串口适配器(USB 转 485 转串口模块)的 A、B、GND 引脚相连。
(2) 打开主机的串口终端
在终端打开 kermit,并设置波特率:
然后在主机的串口终端输入字符串 “Firefly RS485 test…”,设备端即可见到相同的字符串。
配件
注意:默认的 AIO-3399J 主板不带 mipi_dsi 接口,如需要此功能需修改硬件。详情参考 LCD 驱动章节
型号:B080XAN01
尺寸: 7.85 寸
分辨率:1024x768
显示接口: MIPI
面板材料:IPS 面板
可视角度:160°
触摸屏:多点电容触摸
用官网 SDK 编译支持的 7.85 寸屏的固件时需加上补丁(0001-AIO-SDK-mipi-support- 7.85 - MIPI -lcd.patch)后再使用以下命令:
注意: 下图中电压跳线要使用 12V。
型号:HSX101H40C-L28A
尺寸:10.1 寸
分辨率:800x1280
显示接口:LVDS
可视角度:170°
触摸屏:多点电容触摸
品牌:Omnivision
型号:CMK-OV13850
接口:MIPI
像素:1320W
公版固件默认支持 CMK-OV13850 摄像头模组
品牌:SV
ISP:XC7160
Sensor: SC8238
接口: MIPI
像素: 800W(当前仅支持1080P,4K仍在适配中)
公版固件默认支持 CAM-8MS1M 单目摄像头模组。若无法使用单目摄像头 CAM-8MS1M,请更新固件
型号:XC7022(RGB)/XC6130(IR)
接口:MIPI
像素:200W
型号
EC20-C R2.0 Mini PCIe-C
电源电压
3.3V~ 3.6V, 典型值: 3.3V
工作频段
TDD-LTE: B38/B39/B40/B41
FDD-LTE: B1/B3/B8
WCDMA: B1/B8
TD-SCDMA: B34/B39
GSM: 900/1800 MHz
数据传输
TDD-LTE: Max 130Mbps (DL) Max 35Mbps (UL)
FDD-LTE: Max 150Mbps (DL) Max 50Mbps (UL)
DC-HSPA : Max 42Mbps (DL) Max 5.76Mbps (UL)
UMTS: Max 384Kbps (DL) Max 384Kbps (UL)
TD-SCDMA: Max 4.2Mbps (DL) Max 2.2Mbps (UL)
CDMA: Max 3.1Mbps (DL) Max 1.8Mbps (UL)
EDGE: Max 236.8Kbps (DL) Max 236.8Kbps (UL)
GPRS: Max 85.6Kbps (DL) Max 85.6Kbps (UL)
接口连接器
USB:USB 2.0 高速接口, 480Mbps
数字语音:1个数字语音接口 (可选)
USIM:1.8V/3V
网络指示:×2, NET_STATUS 和 NET_MODE
UART:×1 UART
复位:低电平
PWRKEY:低电平
天线接口:×3 (主天线, 分集天线和GNSS天线接口)
ADC:×2
结构尺寸
51.0mm × 30.0mm × 4.9mm
重量
约 10.5g
认证
CCC/ NAL*/ TA
EC20 模组分带GNSS和不带GNSS两种,Firefly官网售卖的EC20 4G模组是不支持GNSS的,后缀为SNNS,支持GNSS功能的EC20 模组一般带有后缀SGNS,公版固件支持GNSS功能,但是默认关闭,使用方法可参考EC20 GNSS功能章节。
型号
EC200T-CN Mini PCIe-D
电源电压
3.4V~ 4.3V, 典型值: 3.8V
工作频段
TDD-LTE: B34/B38/B39/B40/B41
FDD-LTE: B1/B3/B5/B8
WCDMA: B1/B5/B8
GSM: 900/1800 MHz
数据传输
TDD-LTE: Max 120Mbps (DL) Max 3Mbps (UL)
FDD-LTE: Max 150Mbps (DL) Max 50Mbps (UL)
DC-HSDPA: Max 21Mbps (DL)
HSDPA: Max 5.76 Mbps (UL)
WCDMA: Max 384Kbps (DL) Max 384Kbps (UL)
EDGE: Max 236.8Kbps (DL) Max 236.8Kbps (UL)
GPRS: Max 85.6Kbps (DL) Max 85.6Kbps (UL)
接口连接器
USB:USB 2.0 高速接口, 480Mbps
数字语音:1个数字语音接口 (可选)
USIM:1.8V/3V
UART:×1 UART
UART_DTR (睡眠控制)
W_DISABLE# (飞行模式控制)
LED_WWAN# (网络状态指示)
PERST# (模块复位)
RI (主机唤醒)
WAKEUP_IN (睡眠控制,低电平有效)
WAKEUP_OUT (睡眠状态指示)
天线接口:×2 (主天线, 分集天线)
结构尺寸
51.0mm × 30.0mm × 4.9mm
重量
约 10.2g
认证
CCC/SRRC/NAL
公版固件默认支持 EC200 4G 模组 [链接]
VCC (红线)、GND (黑线)、TX (白线)、RX(绿线)
DELINCOMM系列串口波特率配置为9600,公版固件已经默认配置好,使能GPS后即可使用,详情可以参考如何使能GPS和修改串口配置。
注意:GPS功能会占用到 UART2,若需要用 UART2 作为其他用途,需要将GPS先禁止掉
公版新固件默认支持GPS模组, 但需要手动打开。 或直接下载GPS默认启动固件百度云
VCC (白线)、GND (黑线)、TX (蓝线)、RX(绿线)
将模组的VCC、GND、TX、RX分别接到 AIO-3399J UART2(对应节点为/dev/ttysWK2)的3.3V、GND、RX、TX,注意避免接错VCC、GND、TX、RX导致烧坏模组
对于UART的一些定义和说明可以参考Wiki教程《UART 使用》
UBLOX模块串口波特率配置为9600,公版固件已经默认配置好,使能GPS后即可使用,详情可以参考如何使能GPS和修改串口配置。
注意:GPS功能会占用到 UART2,若需要用 UART2 作为其他用途,需要将GPS先禁止掉
公版新固件默认支持GPS模组, 但需要手动打开。 或直接下载GPS默认启动固件百度云
频率范围:1559MHz~1609MHz
极化:RHCP 或 Linear
VSWR:< 2(典型值)
有源天线噪声系数:< 1.5dB
有源天线增益:> 0dB
有源天线内嵌 LNA 增益:< 17dB
EC20模组根据EC20 4G模组套件章节的说明连接,天线接入带有GPS丝印的天线接口。
对于EC20模组,其GNSS 配置的串口节点和波特率分别为/dev/ttyUSB1、115200,使用模组之前需要检查/system/etc/u-blox.conf中SERIAL_DEVICE或者SERIAL_BAUD_RATE的值是否与之匹配,确认匹配则使能GPS后即可使用,使能方法参考如何使能GPS和修改串口配置。
注意:对于EC20模组,使用GNSS功能时,需要注意是否有接入其他的ttyUSB*设备,存在其他ttyUSB时,有可能会使EC20的默认ttyUSB设备号发生变化,导致GNSS功能无法使用
产品:电源适配器
规格:美规/欧规
输入标准:AC110-240V 50/60Hz
输出标准:12V-2A
注意: AIO-3399J 一体机正常工作需要电源 12V/2A,电流低于 2A 可能会因电流过小而异常重启,为了保证开发板的正常工作,请使用电压为 12V,电流为 2A~3A 的电源,推荐使用 Firefly 官网电源配件。
产品:12键红外遥控器
版本:Firefly 定制版
电源:两节7号电池
适配:AIO-3399J
描述:支持 AIO-3399J 开发板的遥控开机功能
AIO-3399J 的 IR 接线位置如下图红框所示:
RK3399 出厂固件默认支持HDMI 4K分辨率输出,对应的UI是2K分辨率拉伸到4K方式, 而部分用户需要的是点对点的4K UI方式,关于4K UI相关问题如下:
1.确认是否一定要4K UI?
如果只是想要4K视频或是4K图片,那可以不需要配置 4K UI,系统默认的视频播放器和图片浏览器可以支持。
2.如何配置4K UI?
把FrameBuffer 配置成4K,然后 HDMI分辨率确保设置成4K,修改方式如下:
android7.1/android8.1
3.配置成 4K UI 之后出现闪屏?
修改方式可以参考[文档] 提取码:1234
Android 系统有很多很强大的功能都需要用到 root 权限,开发者经常在使用的时候遇到权限的问题,那如何在 Firefly 平台上开启系统的 root 权限功能呢?Firefly 已在系统添加启动 root 权限的功能,具体的步骤如下:
有可能是电源电流不够,请使用电压为 12V,电流为 2.5A~3A 的电源。
RK3399K芯片最高主频可达2.016GHz,如果手上的硬件设备使用的是RK3399K芯片,需要支持RK3399K则手动加入下面补丁,以AIO-3399J一体机上支持RK3399K芯片为例:
重新编译烧录固件后查看主频列表:
注意:如果开发板进行了eMMC擦除操作,之前写入的数据也会被清除。
安装RKDevInfoWriteTool
RKDevInfoWriteTool的设置里选中”RPMB”
根据需要在RKDevInfoWriteTool的设置里配置”SN”,”WIFI MAC”,”LAN MAC”,”BT MAC”等
开发板进入loader模式
RKDevInfoWriteTool进行写入或者读取操作
具体操作可以参考RKDevInfoWriteTool安装目录下的《RKDevInfoWriteTool使用指南》PDF文档。
AIO-3399J 提供了丰富的接口,主要包括:
电源接口,
双层 USB3.0 HOST,
USB2.0 x 6,
HDMI,
HDMI-IN,
以太网,
双 LVDS 屏幕接口,
EDP 屏接口,
TP 触摸接口,
屏电压跳线接口,
背光接口,
WIFI 天线,
蓝牙天线,
双 MIPI 摄像头(其中一个和 HDMIIN 复用),
风扇接口,
复位按键,
电源按键,
MIC 接口 (HDMIIN 音频复用),
音频输入输出 (linein,lineout),
3.5mm 耳机接口,
RTC 电源接口,
12V 电源接口,
IR 接口,
TF 卡槽,
SIM 卡卡槽,
扩展按键接口,
I2C,
I2S,
喇叭接口,
USB2.0 HOST,
recovery/reset
按键,
EDP 屏接口,
DVP 摄像头接口,
调试串口,
工业级串口 (RS485, RS232, 2TTL),
M.2PCIE-M.key 接口,
RTC 电源接入口,
MIPI 屏接口(双 LVDS 复用),
MINI-PCIE,
MIPI-CSI。
具体如下图:
Firefly Android 使用手册
FireflyApi
资源下载