Rockchip平台 Linux 开发教程
扫描二维码
随时随地手机看文章
Linux开发
Rockchip Linux SDK 软件包
1.1 简介
M68 和M66 Rockchip Linux SDK 支持 Buildroot,Yocto和Debian三个系统,内核基于 Kernel 4.4引导基于 U-boot v2017.09,目前支持 VPU 硬解码、GPU 3D、Wayland 显示等功能。具体功能调试和接口说明,请阅读SDK工程目录docs/下文档。
1.2 SDK获取方法 (联系BesTom WWW.bestom.net,bestom@bestom.net)
1.2.1SDK更新
.repo/repo/repo sync -c --no-tags 命令同步更新,下载代码后请使用该命令检查是否更新。
1.3 SDK适配硬件全自动编译汇总
进入工程根目录执行以下命令自动完成所有的编译:
./build.sh all # 只编译模块代码(u-Boot,kernel,Rootfs,Recovery)
# 需要再执行./mkfirmware.sh 进行固件打包
./build.sh# 在./build.sh all基础上
# 1. 增加固件打包 ./mkfirmware.sh
# 2. update.img打包
# 3. 复制rockdev目录下的固件到IMAGE/***_RELEASE_TEST/IMAGES目录
# 4. 保存各个模块的补丁到IMAGE/***_RELEASE_TEST/PATCHES目录
# 注:./build.sh 和 ./build.sh allsave 命令⼀样
默认是 Buildroot,可以通过设置坏境变量 RK_ROOTFS_SYSTEM 指定 rootfs。RK_ROOTFS_SYSTEM⽬ 前可设定三个类型:buildroot、debian、 yocto 。 如需要 debain 可以通过以下命令进行生成:
$export RK_ROOTFS_SYSTEM=debian
$./build.sh
2. SDK 开发环境搭建
2.1 概述
本节主要介绍了如何在本地搭建编译环境来编译Rockchip Buildroot Linux SDK源代码。当前SDK只支持在Linux环境下编译,并提供Linux下的交叉编译工具链。
一个典型的嵌入式开发环境通常包括Linux 服务器、Windows PC和目标硬件版,典型开发环境如下图所示。
Linux 服务器上建立交叉编译环境,为软件开发提供代码更新下载,代码交叉编译服务。
Windows PC 和 Linux 服务器共享程序,并安装Putty或MobaXterm,通过网络远程登陆到 Linux 服务器,进行交叉编译,及代码的开发调试。
Windows PC通过串口和 USB 与目标硬件板连接,可将编译后的镜像文件烧写到目标硬件板,并调
试系统或应用程序。
注:开发环境中使用了Windows PC,实际上很多工作也可以在Linux PC上完成,如使用minicom代替
Putty等,用户可自行选择。
2.2 Linux服务器开发环境搭建
Rockchip Linux SDK是在 Ubuntu 18.04 以上系统开发测试的。因此,我们推荐使用Ubuntu 18.04以上系统进行编译。其他版本没有具体测试,可能需要对软件包做相应调整。
除了系统要求外,还有其他软硬方面的要求。
硬件要求:64位系统,硬盘空间大于40G。如果您进行多个构建,将需要更大的硬盘空间。
软件包依赖:除了python 2.7,make 3.8,git 1.7之外,还需要安装一些额外的软件包,将在软件包安装章节中列出。
2.2.1 发布包使用Linux服务器系统版本
本SDK开发环境安装如下版本Linux 系统,SDK默认均以此Linux 系统进行编译:
Ubuntu 18.04.4 LTS
Linux version 4.15.0-109-generic (buildd@lgw01-amd64-010) (gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)) #110-Ubuntu SMP Tue Jun 23 02:39:32 UTC 2020
2.2.2 网络环境搭建
请用户自行配置网络,并安装nfs,samba,ssh 等网络组件。
2.2.3 安装依赖包
本 SDK 开发环境是在 Ubuntu 系统上开发测试。我们推荐使用 Ubuntu 18.04 的系统进行编译。其他的Linux 版本可能需要对软件包做相应调整。除了系统要求外,还有其他软硬件方面的要求。
硬件要求:64 位系统,硬盘空间大于 40G。如果您进行多个构建,将需要更大的硬盘空间。
软件要求:Ubuntu 18.04 系统:
编译 SDK 环境搭建所依赖的软件包安装命令如下:
sudo apt-get install repo git ssh make gcc libssl-dev liblz4-tool \
expect g++ patchelf chrpath gawk texinfo chrpath diffstat binfmt-support \
qemu-user-static live-build bison flex fakeroot cmake gcc-multilib g++-multilib unzip \
device-tree-compiler python-pip ncurses-dev pyelftools \
建议使用 Ubuntu18.04 系统或更高版本开发,若编译遇到报错,可以视报错信息,安装对应的软件包。
2.2.4 交叉编译工具链介绍
鉴于Rockchip Buildroot SDK目前只在Linux下编译,我们也仅提供了Linux下的交叉编译⼯具链。其中U-Boot及Kernel使用的编译工具链预置目录在prebuilt/gcc下,buildroot使用该开源软件中编译出来的工具链。
U-Boot 及Kernel编译工具链:
prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-
对应版本
gcc version 6.3.1 20170404 (Linaro GCC 6.3-2017.05)
Buildroot编译工具链:
64位系统:
buildroot/output/rockchip芯片型号/host/bin/aarch64-buildroot-linux-gnu-
32位系统:
buildroot/output/rockchip芯片型号/host/usr/arm-linux-gcc
对应版本:
gcc version 9.3.0 (Buildroot 2018.02-rc3-02723-gd3fbc6ae13)
如果需要其他平台或版本的⼯具链,需自行编译。
上述环境准备好后,Linux服务器开发环境搭建已完成,可以下载编译源代码了。
2.3 Window PC 开发坏境搭建
2.3.1 开发工具安装
请用户自行安装 Vim,Notepad++, vsCode等编辑软件。
2.3.2 Rockchip USB 驱动安装
开发调试阶段,需要将设备切换至 Loader 模式或是 Maskrom 模式,需要安装 Rockusb 驱动才能正常识别设备。
Rockchip USB 驱动安装助手存放在 tools/windows/DriverAssitant_v5.x.zip。支持
Xp,win7_32,win7_64,win10_32,win10_64 等操作系统。 安装步骤如下:
2.3.3 Windows 烧录工具使用
Windows 系统上的的烧录工具发布在 tools/windows/RKDevTool/RKDevTool_Release,可用于 Windows 环境下开发调试,固件的烧写。
2.3.4 目标硬件板准备
请参考SDK 软件包适用硬件列表SDK软件包适用硬件列表,选择对应硬件板子,进行后续的开发调试。
对应的硬件使用说明文档,会介绍硬件接口,使用说明,及烧录操作方法。
3. SDK 安装准备⼯作
3.1 简要介绍
Rockchip Linux SDK 的代码和相关文档被划分为了若干 git 仓库分别进行版本管理,开发者可以使用 repo 对这些 git 仓库进行统一的下载,提交,切换分支等操作。
3.2 安装 repo
确保主目录下有⼀个 bin/ 目录,并且该目录包含在路径中:
mkdir ~/bin
export PATH=~/bin:$PATH
如果可以访问 google 的地址,下载 Repo 工具,并确保它可执行:
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
中国国内环境如果执行上述命令后发现~/bin/repo 为空,此时可以访问国内的站点来下载repo 工具
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo
chmod a+x ~/bin/repo
除以上两种方式外,也可以使用如下命令获取 repo
sudo apt-get install repo
3.3 Git 配置
在使用repo 之前请配置一下自己的 git 信息,否则后面的操作可能会遇到 hook 检查的障碍:
git config --global user.name "your name"
git config --global user.email "your mail"
3.4 软件更新记录
为方便客户及开发者了解到 SDK 更新所覆盖的修改,解决的问题。SDK 上加入了 ReleaseNote.txt,该文件会记录每次更新解决的问题,及是否建议客户全部更新。请客户及开发者更新ReleaseNote 后,查看更新内容,并决定是否更新 SDK 代码。
软件发布版本升级通过工程 xml 进行查看当前版本,具体方法如下:
.repo/manifests$ ls -l -h 芯片名称_linux_release.xml
软件发布版本升级更新内容通过工程文本可以查看,具体方法如下:
.repo/manifests$ cat */芯片型号_Linux_SDK_Note.md
或者参考工程目录:
<SDK>/docs/芯⽚型号/芯⽚型号_Linux_SDK_Note.md
4. SDK 编译
本 SDK 开发环境是在 Ubuntu 系统上开发测试。我们推荐使用 Ubuntu 18.04 的系统进行编译。其他的 Linux 版本可能需要对软件包做相应调整。除了系统要求外,还有其他软硬件方面的要求。
硬件要求:64 位系统,硬盘空间大于 40G。如果您进行多个构建,将需要更大的硬盘空间。
软件要求:Ubuntu 18.04 系统。
编译 SDK 环境搭建所依赖的软件包安装,参考 软件包安装。
4.1 U-Boot 编译
进入SDK工程。运行如下命令进行编译
<SDK>#./build.sh uboot
或者
<SDK>/U-boot# ./make.sh rk3568
4.2 Kernel 编译
进入工程目录根目录执行以下命令自动完成 kernel 的编译及打包。
<SDK>#./build.sh kernel
或者
<SDK>/kernel#make ARCH=arm64 rockchip_linux_defconfig & make ARCH=arm64 rk3568-evb1-ddr4-v10-linux.img -j24
4.3 Recovery 编译
进入工程根目录执行以下命令自动完成 Recovery 的编译及打包。
<SDK>#./build.sh recovery
编译后在 Buildroot 目录 output/rockchip芯片型号recovery/images 生成 recovery.img。
需要特别注意 recovery.img 是包含 kernel.img,所以每次 Kernel 更改,Recovery 是需要重新打包生成。例如下:
<SDK>$source envsetup.sh rockchip_芯片名称
<SDK>$make recovery-rebuild
<SDK>$./build.sh recovery
更多编译说明请参考SDK发布文档。
4.4 Buildroot 编译
4.4.1 Rootfs 编译
进入工程目录根目录执行以下命令自动完成 Rootfs 的编译及打包:
./build.sh rootfs
编译后在 Buildroot 目录 output/rockchip_芯片型号/images下生成 rootfs.ext4。
4.4.2 模块编译
比如 qplayer 模块,常用相关编译命令如下:
编译 qplayer
SDK$make qplayer
重编 qplayer
SDK$make qplayer-rebuild
删除 qplayer
SDK$make qplayer-dirclean
或者
SDK$rm -rf /buildroot/output/rockchip_芯片型号/build/qlayer-1.0
4.5 Debian 编译
./build.sh debian
或进入 debian/ 目录:
cd debian/
后续的编译和 Debian 固件生成请参考当前目录 readme.md。
Building base Debian system
sudo apt-get install binfmt-support qemu-user-static live-build
sudo dpkg -i ubuntu-build-service/packages/*
sudo apt-get install -f
编译 32 位的 Debian:
RELEASE=buster TARGET=desktop ARCH=armhf ./mk-base-debian.sh
或编译 64 位的 Debian:
RELEASE=butser TARGET=desktop ARCH=arm64 ./mk-base-debian.sh
编译完成会在 debian/ 目录下生成:linaro-buster-alip-xxxxx-1.tar.gz(xxxxx 表示生成时间戳)。
FAQ:
上述编译如果遇到如下问题情况:
noexec or nodev issue /usr/share/debootstrap/functions: line 1450:
..../rootfs/ubuntu-build-service/buster-desktop-arm64/chroot/test-dev-null:
Permission denied E: Cannot install into target '/rootfs/ubuntu-build-
service/buster-desktop-arm64/chroot' mounted with noexec or nodev
解决方法:
mount -o remount,exec,dev xxx
(其中xxx 是⼯程⽬录路径,然后重新编译)
另外如果还有遇到其他编译异常,先排除使用的编译系统是 ext2/ext4 的系统类型。
由于编译 Base Debian 需要访问国外网站,而国内网络访问国外网站时,经常出现下载失败的情况:
Debian 使用 live build,镜像源改为国内可以这样配置:
32位系统:
+++ b/ubuntu-build-service/buster-desktop-armhf/configure
@@ -11,6 +11,11 @@ set -e
echo "I: create configuration"
export LB_BOOTSTRAP_INCLUDE="apt-transport-https gnupg"
lb config \
+ --mirror-bootstrap "http://mirrors.163.com/debian" \
+ --mirror-chroot "http://mirrors.163.com/debian" \
+ --mirror-chroot-security "http://mirrors.163.com/debian-security" \
+ --mirror-binary "http://mirrors.163.com/debian" \
+ --mirror-binary-security "http://mirrors.163.com/debian-security" \
--apt-indices false \
--apt-recommends false \
--apt-secure false \
64位系统:
--- a/ubuntu-build-service/buster-desktop-arm64/configure
+++ b/ubuntu-build-service/buster-desktop-arm64/configure
@@ -11,6 +11,11 @@ set -e
echo "I: create configuration"
export LB_BOOTSTRAP_INCLUDE="apt-transport-https gnupg"
lb config \
+ --mirror-bootstrap "http://mirrors.163.com/debian" \
+ --mirror-chroot "http://mirrors.163.com/debian" \
+ --mirror-chroot-security "http://mirrors.163.com/debian-security" \
+ --mirror-binary "http://mirrors.163.com/debian" \
+ --mirror-binary-security "http://mirrors.163.com/debian-security" \
--apt-indices false \
--apt-recommends false \
--apt-secure false \
如果其他网络原因不能下载包,有预编生成的包分享在百度云网盘,放在当前目录直接执行下一步操作。
Building rk-debian rootfs
编译 32位的 Debian:
VERSION=debug ARCH=armhf ./mk-rootfs-buster.sh
或编译 64位的 Debian:
VERSION=debug ARCH=arm64 ./mk-rootfs-buster.sh
Creating the ext4 image(linaro-rootfs.img)
./mk-image.sh
此时会生成 linaro-rootfs.img。
4.6 Yocto 编译
进入工程目录根目录执行以下命令自动完成 Rootfs 的编译及打包:
./build.sh yocto
编译后在 yocto/ build/lastest 目录下生成 rootfs.img。
FAQ:
上面编译如果遇到如下问题情况:
Please use a locale setting which supports UTF-8 (such as LANG=en_US.UTF-8).
Python can't change the filesystem locale after loading so we need a UTF-8 when Python starts or things won't work.
解决方法:
locale-gen en_US.UTF-8
export LANG=en_US.UTF-8 LANGUAGE=en_US.en LC_ALL=en_US.UTF-8
或者参考 HYPERLINK "https://webkul.com/blog/setup-locale-python3" 编译后生成的 image 在 yocto/build/lastest/rootfs.img, 默认用户名登录是 root。
Yocto 更多信息请参考 HYPERLINK "https://opensource.rock-chips.com/wiki_Yocto" 。
4.7 全自动编译
完成上述 Kernel/U-Boot/Recovery/Rootfs 各个部分的编译后,进入工程目录根目录执行以下命令自动完成所有的编译:
./build.sh all # 只编译模块代码(u-Boot,kernel,Rootfs,Recovery)
# 需要再执行./mkfirmware.sh 进行固件打包
./build.sh # 在./build.sh all基础上
# 1. 增加固件打包 ./mkfirmware.sh
# 2. update.img打包
# 3. 复制rockdev目录下的固件到IMAGE/***_RELEASE_TEST/IMAGES目录
# 4. 保存各个模块的补丁到IMAGE/***_RELEASE_TEST/PATCHES目录
# 注:./build.sh 和 ./build.sh allsave 命令⼀样
默认是 Buildroot ,可以通过设置坏境变量 RK_ROOTFS_SYSTEM 指定 rootfs 。
比如需要 buildroot 可以通过以下命令进行生成:
<SDK>$export RK_ROOTFS_SYSTEM=buildroot
<SDK>$./build.sh
具体参数使用情况,可 help 查询,比如:
<SDK>$ ./build.sh --help
Usage: build.sh [OPTIONS]
Available options:
BoardConfig*.mk -switch to specified board config
Uboot -build uboot
spl -build spl
kernel -build kernel
modules -build kernel modules
toolchain -build toolchain
rootfs -build default rootfs, currently build buildroot as default
Buildroot -build buildroot rootfs
ramboot -build ramboot image
multi-npu_boot -build boot image for multi-npu board
yocto -build yocto rootfs
debian -build debian9 stretch rootfs
distro -build debian10 buster rootfs
pcba -build pcba
recovery -build recovery
all -build uboot, kernel, rootfs, recovery image
cleanall -clean uboot, kernel, rootfs, recovery
firmware -pack all the image we need to boot up system
updateimg -pack update image
otapackage -pack ab update otapackage image
save -save images, patches, commands used to debug
allsave -build all & firmware & updateimg & save
Default option is 'allsave'.
4.8M68 SDK编译指导
4.8.1编译
本小节主要介绍在搭载完编译及下载好SDK源码之后如何编译固件
选择环境
<SDK>$source envsetup.sh
<SDK>$lunch
Which would you like? [0]:M68选择68 M66选择66
编译debain 10
<SDK>$export RK_ROOTFS_SYSTEM=debian
编译
<SDK>$./build.sh
4.8.2开发
本小节主要介绍如何修改编译的dts及其他config,在SDK中我们默认了DTS的选择及其他环境变量的配置。我们可以通过修改默认的Boardconfig.mk去修改配置。
<SDK>$vi device/rockchip/rk356x/device/Boardconfig.mk
内容如下:
# Uboot defconfig
export RK_UBOOT_DEFCONFIG=rk3568
# Kernel defconfig
export RK_KERNEL_DEFCONFIG=rockchip_linux_defconfig
# Kernel dts
export RK_KERNEL_DTS=rk3568-evb1-ddr4-v10-linux
# def debain 10
export RK_ROOTFS_SYSTEM=debain
//如果添加了此项则默认编译debain,则不需要在SDK目录使用
//export RK_ROOTFS_SYSTEM=debain去重新指定系统
#set flash type support<emmc, nand, spi_nand, spi_nor>
export RK_STORAGE_TYPE=emmc
5. SDK 固件升级
本章节主要介绍如何将构建完整的镜像文件(image)烧写并运行在硬件设备上的流程。
Rockchip 平台提供的几种镜像烧写工具介绍如下所示,可以选择合适的烧写方式进行烧写。烧写前,需
安装最新的 USB 驱动,详见 2.3.2 HYPERLINK \l "书签3" 。
工具 | 系统 | 描述 |
---|---|---|
RKDevTool | Windows | 瑞芯微开发工具,分立升级固件及整个 update 升级固件工具 |
FactoryTool | Windows | 量产升级工具,支持 USB 一拖多烧录 |
Linux_Upgrade_tool | Linux | Linux 下开发的工具,支持固件的升级 |
5.1 烧写模式介绍
Rockchip 平台硬件运行的几种模式如表所示,只有当设备处于 Maskrom,及 Loader模式下,才能够烧写固件,或对板上固件进行更新操作。
模式 | 工具烧录 | 描述 |
---|---|---|
Maskrom | 支持 | Flash 在未烧录固件时,芯片会引导进⼊ Maskrom 模式,可以进行初次固件的烧写; 开发调试过程中若遇到 Loader 无法正常启动的情况,也可进入Maskrom 模式烧写固件。 |
Loader | 支持 | Loader 模式下,可以进行固件的烧写、升级。 可以通过工具单独烧写某⼀个分区镜像文件,方便调试。 |
Recovery | 不支持 | 系统引导 recovery 启动,主要作⽤是升级、恢复出厂设置类操作。 |
Normal Boot | 不支持 | 系统引导 rootfs 启动,加载 rootfs,大多数的开发都是在这个模式下调试的。 |
进入烧写模式方式以下几种方法:
未烧录过固件,上电,进入 Maskrom 模式。
烧录过固件,按住 recovery 按键上电或复位,系统将进入 Loader 固件烧写模式。
烧录过固件,按住 Maskrom 按键上电或复位,系统将进入 MaskRom 固件烧写模式。
烧录过固件,上电或复位后开发板正常进⼊系统后,瑞芯微开发工具上显示“发现一个 ADB设备”或“发现一个 MSC 设备”,然后点击工具上的按钮“切换”,进入 Loader 模式。
烧录过固件,可在串口或 ADB 命令行模式下,输入 reboot loader 命令,进入 Loader 模式。
5.1.1 Windows 刷机说明
SDK 提供 Windows 烧写工具(工具版本需要 V2.84 或以上),工具位于工程根目录:
tools/
├── windows/RKDevTool
如下图,编译生成相应的固件后,设备烧写需要进入 MASKROM 或 BootROM 烧写模式, 连接好 USB 下载线后,按住按键“MASKROM”不放并按下复位键“RST”后松手,就能进入MASKROM 模式,加载编译生成固件的相应路径后,点击“执行”进行烧写,也可以按 “recovery" 按键不放并按下复位键 “RST” 后松手进入 loader 模式进行烧写,下面是 MASKROM 模式的分区偏移及烧写文件。(注意: Windows PC 需要在管理员权限运行工具才可执行)
注:烧写前,需安装SDK目录下 USB 驱动,驱动详见:
<SDK>/tools/windows/DriverAssitant_v5.11.zip
5.1.2 Linux 刷机说明
Linux下的烧写工具位于 tools/linux目录下(Linux_Upgrade_Tool 工具版本需要 V1.57 或以上),请确认你的板子连接到 MASKROM/loader rockusb。比如编译生成的固件在 rockdev 目录下,升级命令如下:
sudo ./upgrade_tool ul rockdev/MiniLoaderAll.bin
sudo ./upgrade_tool di -p rockdev/parameter.txt
sudo ./upgrade_tool di -u rockdev/uboot.img
sudo ./upgrade_tool di -misc rockdev/misc.img
sudo ./upgrade_tool di -b rockdev/boot.img
sudo ./upgrade_tool di -recovery rockdev/recovery.img
sudo ./upgrade_tool di -oem rockdev/oem.img
sudo ./upgrade_tool di -rootfs rocdev/rootfs.img
sudo ./upgrade_tool di -userdata rockdev/userdata.img
sudo ./upgrade_tool rd
或升级打包后的完整固件:
sudo ./upgrade_tool uf rockdev/update.img
或在根目录,机器在 MASKROM 状态运行如下升级:
/rkflash.sh
5.1.3 系统分区说明
默认分区说明 ( 下面是 RK3568 EVB 分区参考)
Number | Start (sector) | End (sector) | Size | Name |
---|---|---|---|---|
1 | 16384 | 24575 | 4096K | uboot |
2 | 24576 | 32767 | 4096K | misc |
3 | 32768 | 98303 | 32M | boot |
4 | 98304 | 163839 | 32M | recovery |
5 | 163840 | 229375 | 32M | bakcup |
6 | 229376 | 12812287 | 6144M | rootfs |
7 | 12812288 | 13074431 | 128M | oem |
8 | 13074432 | 61071326 | 22.8G | userdata |
uboot 分区:供 uboot 编译出来的 uboot.img。
misc 分区:供 misc.img,给 recovery 使用。
boot 分区:供 kernel 编译出来的 boot.img。
recovery 分区:供 recovery 编译出的 recovery.img。
backup 分区:预留,暂时没有用,后续跟 Android 一样作为 recovery 的 backup 使用。
rootfs 分区:供 buildroot、debian 或 yocto 编出来的 rootfs.img。
oem 分区:给⼚家使用,存放厂家的 APP 或数据。挂载在 /oem 目录。
userdata 分区:供 APP 临时生成文件或给最终用户使用,挂载在 /userdata 目录下。
6. SDK 开发
6.1 U-Boot 开发
本节简单介绍 U-Boot 基本概念和编译的注意事项,帮助客户了解 RK 平台 U-Boot 框架,具体 U-Boot 开发细节可参考/docs/Common/U-Boot 目录下《Rockchip-Developer-Guide-UBoot-*.pdf》。
6.1.1 U-Boot 简介
Rockchip U-Boot next-dev 分支是 Rockchip 从 U-Boot 官方的 v2017.09 正式版本中切出来进行开发的版本。目前在该平台上已经支持 RK 所有主流在售芯片。支持的功能主要有:
支持 RK Android 固件启动;
支持 Android AOSP 固件启动;
支持 Linux Distro 固件启动;
支持 Rockchip miniloader 和 SPL/TPL 两种 Pre-loader 引导;
支持 LVDS、EDP、MIPI、HDMI、CVBS、RGB 等显示设备;
支持 eMMC、Nand Flash、SPI Nand flash、SPI NOR flash、SD 卡、U 盘等存储设备启动;
支持 FAT、EXT2、EXT4 文件系统;
支持 GPT、RK parameter 分区表;
支持开机 LOGO、充电动画、低电管理、电源管理;
支持 I2C、PMIC、CHARGE、FUEL GUAGE、USB、GPIO、PWM、GMAC、eMMC、NAND、
Interrupt 等;
支持 Vendor storage 保存用户的数据和配置;
支持 RockUSB 和 Google Fastboot 两种 USB gadget 烧写 eMMC;
支持 Mass storage、ethernet、HID 等 USB 设备;
支持通过硬件状态动态选择 kernel DTB;
6.1.2 版本
RK 的 U-Boot ⼀共有两个版本: v2014旧版本和v2017新版本,内部名称分别为rkdevelop和next-dev。用户有两个方式确认当前U-Boot是否为v2017版本。
方式1:确认根目录Makefile的版本号是否为2017。
#
## Chapter-1 SPDX-License-Identifier: GPL-2.0+
#
VERSION = 2017
PATCHLEVEL = 09
SUBLEVEL =
EXTRAVERSION =
NAME =
......
方式2:确认开机第一行正式打印是否为 U-Boot 2017.09。
U-Boot 2017.09-01818-g11818ff-dirty (Nov 14 2019 - 11:11:47 +0800)
......
项目开源:v2017已开源且定期更新到Github: HYPERLINK "https://github.com/rockchip-linux/u-boot"
内核版本:v2017要求RK内核版本 >= 4.4
6.1.3 平台编译
6.1.3.1 下载rkbin
这是一个工具包仓库,用于存放RK不开源的bin、脚本、打包工具。U-Boot 编译时会从该仓库索引相关
文件,打包生成loader、trust、uboot固件。rkbin和U-Boot工程必须保持同级目录关系。
6.1.3.2 下载GCC
GCC编译器使用gcc-linaro-6.3.1,放置于prebuilts目录之内。prebuilts和U-Boot保持同级目录关系。如下:
// 32位:
prebuilts/gcc/linux-x86/arm/gcc-linaro-6.3.1-2017.05-x86_64_arm-linux-gnueabihf
// 64位:
prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/
6.1.3.3 选择defconfig
在<SDK>/u-boot/configs目录下有大部分的平台defconfig
选择于我们板子默认的deconfig即可:
rk3566.config
rk3568_defconfig
6.1.3.4 编译
./make.sh [board] // [board]:configs/[board]_defconfig文件。
首次编译:无论32位或64位平台,第一次或想重新指定defconfig,则编译命令必须指定[board]。例如:
./make.sh rk3568 // build for rk3568_defconfig
二次编译:无论32位或64位平台,如果要基于当前".config"二次编译,则编译命令不用指定[board]:
./make.sh
注意:如果编译时出现奇怪的问题导致编译失败,请尝试 make distclean 后重新编译。
固件生成:编译完成后会在U-Boot根目录下打包生成:trust、uboot、loader。
6.1.3.5 启动流程
RK平台的U-Boot 启动流程如下,仅列出一些重要步骤:
start.s // 汇编环境
=> IRQ/FIQ/lowlevel/vbar/errata/cp15/gic // ARM架构相关的lowlevel初始化
=> _main
=> stack // 准备好C环境需要的栈
// 【第⼀阶段】C环境初始化,发起⼀系列的函数调⽤
=> board_init_f: init_sequence_f[]
initf_malloc
arch_cpu_init // 【SoC的lowlevel初始化】
serial_init // 串口初始化
dram_init // 【获取ddr容量信
reserve_mmu // 从ddr末尾开始往低地址reserve内存
reserve_video
reserve_uboot
reserve_malloc
reserve_global_data
reserve_fdt
reserve_stacks
dram_init_banksize
sysmem_init
setup_reloc // 确定U-Boot⾃⾝要reloc的地址
// 汇编环境
=> relocate_code // 汇编实现U-Boot代码的relocation
// 【第⼆阶段】C环境初始化,发起⼀系列的函数调⽤
=> board_init_r: init_sequence_r[]
initr_caches // 使能MMU和I/Dcache
initr_malloc
bidram_initr
sysmem_initr
initr_of_live // 初始化of_live
initr_dm // 初始化dm框架
board_init // 【平台初始化,最核⼼部分】
board_debug_uart_init // 串口iomux、clk配置
init_kernel_dtb // 【切到kernel dtb】!
clks_probe // 初始化系统频率
regulators_enable_boot_on // 初始化系统电源
io_domain_init // io-domain初始化
set_armclk_rate // __weak,ARM提频(平台有需求才实现)
dvfs_init // 宽温芯⽚的调频调压
rk_board_init // __weak,由各个具体平台进⾏实现
console_init_r
board_late_init // 【平台late初始化】
rockchip_set_ethaddr // 设置mac地址
rockchip_set_serialno // 设置serialno
setup_boot_mode // 解析"reboot xxx"命令
// 识别按键和loader烧写模式、recovery
charge_display // U-Boot充电
rockchip_show_logo // 显⽰开机logo
soc_clk_dump // 打印clk tree
rk_board_late_init // __weak,由各个具体平台进行实现
run_main_loop // 【进⼊命令行模式,或执行启动命令】
6.1.3.6 快捷键
RK平台提供串口组合键触发一些事件用于调试、烧写(如果无法触发,请多尝试几次;启用secure-boot 时无效)。开机时长按:
ctrl+c:进入 U-Boot 命令行模式;
ctrl+d:进入 loader 烧写模式;
ctrl+b:进入 maskrom 烧写模式;
ctrl+f:进入 fastboot 模式;
ctrl+m:打印 bidram/system 信息;
ctrl+i:使能内核 initcall_debug;
ctrl+p:打印 cmdline 信息;
ctrl+s:"Starting kernel..."之后进入 U-Boot 命令行;
6.2 Kernel 开发
本节简单介绍内核一些常见配置的修改,主要是 dts 的配置,帮助客户更快更方便的进行一些简单的修改。Kernel 版本以 4.4 作为基准,做相应的介绍。
6.2.1 DTS 介绍
6.2.1.1 DTS 概述
早期版本的 Linux Kernel 是直接在板级配置文件配置板⼦相关的信息,如 IOMUX,默认拉高/低的GPIO,每个 I2C/SPI 总线下的 client 设备信息。为了摒弃这种‘hard code' 的方式,Linux引入设备树(Device Tree)的概念来描述不同的硬件结构。
Device Tree 数据可读性较高,遵循 DTS 规范,通常被描述在.dtsi 和.dts 源文件。在内核编译的过程中,被编译为.dtb 的二进制文件。在开机启动阶段,dtb 会被 bootloader(如 U-Boot)加载到 RAM 的某个地址空间,并且将该地址作为参数传递给 Kernel space。内核解析整个 dtb 文件,提炼每个设备信息以初始化。
本文旨在介绍如何新增一个的板子 dts 配置以及一些常见的 dts 语法说明,关于更详细 dts 的语法介绍不在本文范围内,如有兴趣,请参考: HYPERLINK "https://www.devicetree.org/specifications/" 和 HYPERLINK "https://www.kernel.org/doc/Documentation/devicetree/bindings/"
6.2.1.2 新增一个产品 DTS
创建 dts 文件
Linux Kernel 目前支持多平台使用 dts,RK 平台的 dts 文件存放于:
ARM:arch/arm/boot/dts/
ARM64:arch/arm64/boot/dts/rockchip
一般 dts 文件的命名规则为”soc-board-name.dts”,如 rk3568-evb-ddr4-linux.dts。
soc 指的是芯片型号,board_name 一般是根据板子丝印来命名。
如果你的板子是一体板,则只需要一个 dts 文件来描述即可。
如果硬件设计上是核心板和底板的结构,或者产品有多个产品形态,可以把公用的硬件描述放在 dtsi 文件,而 dts 文件则描述不同的硬件模块,并且通过 include "xxx.dtsi"将公用的硬件描述包含进来。
├──rk3568-evb-ddr4-linux.dts
│├──rk3568-evb.dtsi
│└── rk33568.dtsi
修改 dts 所在目录的 Makefile
--- a/arch/arm64/boot/dts/rockchip/Makefile
+++ b/arch/arm64/boot/dts/rockchip/Makefile
@@ -50,6 +50,7 @@ dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3368-tablet.dtb
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-evb.dtb
dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568.dtb
+dtb-$(CONFIG_ARCH_ROCKCHIP) += rk3568-evb-ddr4-linux.dtb
编译 Kenrel 的时候可以直接 make dts-name.img(如 rk3568-evb-ddr4-linux.img),即可生成对应的 boot.img(包含 dtb 数据)。
dts 语法的几个说明
dts 语法可以像 c/c++⼀样,通过#include xxx.dtsi 来包含其他公⽤的 dts 数据。dts 文件将继承包含的 dtsi 文件的所有设备节点的属性和值。如 property 在多个 dts/dtsi 文件被定义,它的值最终为 dts 的定义。所有和芯片相关的控制器节点都会被定义在 soc.dtsi,如需使能该设备功能,需要在 dts 文件中设置其 status 为"okay"。关闭该设备,需要在 dts 文件中设置其 status 为"disabled"。
/dts-v1/;
#include "rk3399-evb-ind.dtsi"
#include "rk3399-linux.dtsi"
...
&i2s2 {
#sound-dai-cells = <0>;
status = "okay";
};
&hdmi_sound {
status = "okay";
};
6.2.2 内核模块开发文档
\docs\Common\目录下分功能模块发布了对应的开发文档,本节主要对这些开发文档进行一个归纳索引,大家结合实际开发遇到的问题,参照以下表格阅读学习对应的开发指南。
模块功能 | 子目录 | 对应文档 |
---|---|---|
音频 | Audio | Rockchip_Developer_Guide_Audio_CN.pdf |
显示 | DISPLAY | Rockchip_Developer_Guide_HDMI-CEC_CN.pdf Rockchip_Developer_Guide_HDMI_CN.pdf Rockchip_Developer_Guide_HDMI-PHY-PLL_Config_CN.pdf Rockchip_DRM_Display_Driver_Development_Guide_V1.0.pdf rockchip_drm_integration_helper-zh.pdf Rockchip_DRM_Panel_Porting_Guide_V1.6_20190228.pdf Rockchip_DRM_RK628_Porting_Guide_CN.pdf |
USB | USB | Rockchip_Developer_Guide_Linux_USB_Initialization_Log_Analysis_CN.pdf Rockchip_Developer_Guide_Linux_USB_Performance_Analysis_CN.pdf Rockchip_Developer_Guide_USB2_Compliance_Test_CN.pdf Rockchip_Developer_Guide_Linux_USB_PHY_CN.pdf Rockchip_Developer_Guide_USB_CN.pdf Rockchip_Developer_Guide_USB_EN.pdf Rockchip_Developer_Guide_USB_FFS_Test_Demo_CN.pdf Rockchip_Developer_Guide_USB_Gadget_UAC_CN.pdf Rockchip_Developer_Guide_USB_SQ_Test_CN.pdf Rockchip_RK3399_Developer_Guide_USB_DTS_CN.pdf Rockchip_RK356x_Developer_Guide_USB_CN.pdf Rockchip_Trouble_Shooting_Linux4.19_USB_Gadget_UVC_CN.pdf |
I2C | I2C | Rockchip_Developer_Guide_I2C_CN.pdf |
IOMMU | IOMMU | Rockchip_Developer_Guide_Linux_IOMMU_CN.pdf |
MMC | MMC | Rockchip_Developer_Guide_SD_Boot_CN.pdf Rockchip_Developer_Guide_SDMMC_SDIO_eMMC_CN.pdf |
PCIe | PCIe | Rockchip_Developer_Guide_Linux4.4_PCIe_CN.pdf Rockchip_RK356X_Developer_Guide_PCIe_CN.pdf |
GPIO | Pin-Ctrl | Rockchip-Developer-Guide-Linux-Pin-Ctrl-CN.pdf Rockchip_Problem_Shooting_Linux_GPIO_CN.pdf |
电源、 功耗 | Power | Rockchip_Developer_Guide_Power_Analysis_CN.pdf Rockchip_Developer_Guide_Power_Analysis_EN.pdf |
SARADC | SARADC | Rockchip_Developer_Guide_Linux_SARADC_CN.pdf |
温控 | THERMAL | Rockchip_Developer_Guide_Thermal_CN.pdfRockchip_Developer_Guide_Thermal_EN.pdf |
TRUST | TRUST | Rockchip_Developer_Guide_Trust_CN.pdfRockchip_Developer_Guide_Trust_EN.pdfRockchip_RK3308_Developer_Guide_System_Suspend_CN.pdfRockchip_RK3308_Developer_Guide_System_Suspend_EN.pdfRockchip_RK3399_Developer_Guide_System_Suspend_CN.pdf |
U-Boot | U-Boot | Rockchip_Developer_Guide_Linux_AB_System_CN.pdfRockchip_Developer_Guide_UBoot_MMC_Device_Analysis_CN.pdfRockchip_Developer_Guide_UBoot_MTD_Block_Device_Design_CN.pdfRockchip_Developer_Guide_UBoot_Nextdev_CN.pdfRockchip_Introduction_UBoot_rkdevelop_vs_nextdev_CN.pdf |
看门狗 | WATCHDOG | Rockchip_Developer_Guide_Linux_WDT_CN.pdfRockchip_Developer_Guide_Linux_WDT_EN.pdf |
Clock 时钟配置 | CRU | Rockchip-Clock-Developer-Guide-RTOS-CN.pdfRockchip_RK3399_Developer_Guide_Linux4.4_Clock_CN.pdf |
JTAG GDB等常用调试 | DEBUG | Rockchip_Developer_Guide_DS5_CN.pdfRockchip_Developer_Guide_GDB_Over_ADB_CN.pdfRockchip_Developer_Guide_OpenOCD_CN.pdfRockchip_User_Guide_J-Link_CN.pdf |
CPU/GPU等频率电压调节 | DVFS | Rockchip_Developer_Guide_CPUFreq_CN.pdfRockchip_Developer_Guide_CPUFreq_EN.pdfRockchip_Developer_Guide_Devfreq_CN.pdfRockchip_Developer_Guide_Devfreq_EN.pdf |
以太网 配置 | GMAC | Rockchip_Developer_Guide_Linux_GMAC_RGMII_Delayline_CN.pdfRockchip_Developer_Guide_Linux_GMAC_RGMII_Delayline_EN.pdfRockchip_Developer_Guide_Linux_GMAC_CN.pdfRockchip_Developer_Guide_Linux_GMAC_Mode_Configuration_CN.pdfRockchip_Developer_Guide_Linux_MAC_TO_MAC_CN.pdf |
GPIO 电源域 | IO-DOMAIN | Rockchip_Developer_Guide_Linux_IO_DOMAIN_CN.pdf |
PMIC 电量计、DCDC | PMIC | Rockchip_Developer_Guide_Power_Discrete_DCDC_EN.pdfRockchip_RK805_Developer_Guide_CN.pdfRockchip_RK808_Developer_Guide_CN.pdfRockchip_RK809_Developer_Guide_CN.pdfRockchip_RK816_Developer_Guide_CN.pdfRockchip_RK817_Developer_Guide_CN.pdfRockchip_RK818_Developer_Guide_CN.pdfRockchip_RK818_RK816_Developer_Guide_Fuel_Gauge_CN.pdfRockchip_RK818_RK816_Introduction_Fuel_Gauge_Log_CN.pdf |
PWM | PWM | Rockchip_Developer_Guide_Linux_PWM_CN.pdfRockchip_Developer_Guide_Linux_PWM_EN.pdf |
SPI | SPI | Rockchip_Developer_Guide_Linux_SPI_CN.pdfRockchip_Developer_Guide_Linux_SPI_EN.pdf |
串口通信 | UART | Rockchip_Developer_Guide_UART_CN.pdfRockchip_Developer_Guide_UART_EN.pdf |
6.2.3 GPIO
M68和M66 有 5 组 GPIO bank:GPIO0~GPIO4,每组又以 A0~A7, B0~B7, C0~C7, D0~D7 作为编号区分,以下为gpio引脚计算公式:
GPIO pin脚计算公式:pin = bank * 32 + number
GPIO 小组编号计算公式:number = group * 8 + X
所有的 GPIO 都默认为输入(input),可以用作中断,软件配置可控为上拉或者下拉,GPIO 的驱动能力软件可以配置。关于原理图上的 GPIO 跟dts里面的 GPIO 的对应关系,例如 GPIO4c0,那么对应的 dts 里面应该是“gpio4 16”。
GPIO的使用应主要是否有引脚复用:
使用IO 命令查看寄存器的值配置在什么状态
Io -4 -r 寄存器地址 //寄存器地址及状态值需参考RK TRM文档
使用cat pinmux-pins命令查看复用情况
cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins
如果在dts存在复用情况则关闭对应label
参考文档:docs\Kernel\Pin-Ctrl\目录下《Rockchip Pin-Ctrl 开发指南V1.0-20160725.pdf》
6.2.4UART
M68共10路uart口分別是uart0-uart9。
debug口
支持串口作为控制台使用。M68和M66默认使用uart2作为调试串口。
chosen: chosen {
bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rw rootwait";
};//参数含义 0xfe660000必须对应使用的uart口地址 ttyFIQ0设备将被注册成/dev/ttyFIQ0
fiq-debugger {
compatible = "rockchip,fiq-debugger";
rockchip,serial-id = <2>;
rockchip,wake-irq = <0>;
rockchip,irq-mode-enable = <1>;
rockchip,baudrate = <1500000>; //只能使用1500000和115200
interrupts = <0 252 8>;
pinctrl-names = "default";
pinctrl-0 = <&uart2m0_xfer>;
status = "okay";
};
&uart2 {
status = “disabled”; //如果uart2作为调试串口则此节点必须关闭。
};
dts配置:
如果修改之后调试串口依旧不能使用可修改paremeter.txt,添加调试串口:
CMDLINE:
console=ttyFIQ0 androidboot.console=ttyFIQ0 //添加控制台
串口
dts配置rk3568-evb1-ddr4-v10-linux.dts
&uart3 {
pinctrl-names = "default";
pinctrl-0 = <&uart3m0_xfer>;
status = "okay";
};
串口调试也要注意是否复用,及确认硬件使用的是uart0m0 还是uart0m1。
参考文档 /docs/Common/uart/目录下《Rockchip_Developer_Guide_UART_CN.pdf》
6.2.5i2c
M68有6个i2c控制器分别为i2c0~i2c5;其中i2c2~i2c5区分M0和M1具体使用看硬件走线。
通讯严格遵守i2c协议。一个i2c可挂载多个从设备。I2c有竞争仲裁机制,理论是可挂载127个设备。M68 和M66 i2c0外接PMU(power management unit)RK809.拿到板子及SDK请确认电源域是否与硬件原理图要求一致。
i2c调试
如果遇到i2c不通的情况,请确认i2c地址,i2c电压,i2c使用M0还是m1等没有错误。
可以使用底层命令去测试设备是否挂载以及是否正常通讯:
i2cdetect -r -y 3 查看i2c3上挂载的设备
i2cdump -f -y 3 0x43 查看器件所有寄存器的值,以总线3上0x43 这个器件为例
i2cget -f -y 3 0x43 0x01 看单个寄存器地址, 以总线3上0x43 0x01这个寄存器为例
i2cset -f -y 3 0x43 0x03 0x7f操作寄存器值, 以总线3上0x43 0x03这个寄存器为例
dts配置rk3568-evb1-ddr4-v10-linux.dts
&i2c4 {
clock-frequency = <400000>; //默认400000
pinctrl-names = "default";
pinctrl-0 = <&i2c4m0_xfer>;
status = "okay";
gc8034: gc8034@37 {
…………………………
};
};
参考文档 /docs/Common/I2C/目录下《Rockchip_Developer_Guide_I2C_CN.pdf》
6.2.6 USB
M66和M68集成了2个HOST控制器集成EHCI/OHCI(usb1.0/usb2.0)2个 HYPERLINK "https://bbs.16rd.com/citiao-jishu-OTG.html" \t "https://bbs.16rd.com/_blank" 控制器集成DWC3/xHCI(usb3.0/usb2.0)
M68底板集成一个USBHUB IC ,4G USB接口由HUB上引出,如需添加4G模块,请确认HUB状态及5V电压是否正常并在usb驱动添加模组的uid及vid,具体添加4G模组参考对应厂商提供的参考文档。
具体USB驱动加载以及dts配置请参考文档:
/docs/Common/usb/目录下《Rockchip_Developer_Guide_USB_CN.pdf》
6.2.7网口
M68有两个百兆网口,都使用的RTL8201F PHYIC。为Ouput模式即MAC提供50M时钟给PYH。
调试过程注意复用使用cat/sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins
查看对应接口状态是否正确。dts参考配置:
&gmac0 {
phy-mode = "rmii"; //百兆网口rmii 千兆rgmii
clock_in_out = "output"; //output or input
snps,reset-gpio = <&gpio4 20 1>;
snps,reset-active-low;
snps,reset-delays-us = <0 20000 100000>;
assigned-clocks = <&cru 389>, <&cru 386>;
assigned-clock-parents = <&cru 388>;
assigned-clock-rates = <0>, <50000000>;
pinctrl-names = "default";
pinctrl-0 = <&gmac0_miim &gmac0_clkinout &gmac0_rx_bus2 &gmac0_tx_bus2 &gmac0_rx_er>;
phy-handle = <&rmii_phy0>;
status = "okay";
};
&gmac1 {
phy-mode = "rmii";
clock_in_out = "output";
snps,reset-gpio = <&gpio4 26 1>;
snps,reset-active-low;
snps,reset-delays-us = <0 20000 100000>;
assigned-clocks = <&cru 393>, <&cru 390>;
assigned-clock-parents = <&cru 392>;
assigned-clock-rates = <0>, <50000000>;
pinctrl-names = "default";
pinctrl-0 = <&gmac1m1_miim &gmac1m1_clkinout &gmac1m1_rx_bus2 &gmac1m1_tx_bus2 &gmac1m1_rx_er>;
phy-handle = <&rmii_phy1>;
status = "okay";
};
&mdio0 {
rmii_phy0: phy@0 {
compatible = "ethernet-phy-ieee802.3-c22";
reg = <0x0>; //phyaddr 具体看原理图,写0代表广播
};
};
参考文档 /docs/Common/GMAC/目录下《Rockchip_Developer_Guide_Ethernet_CN.pdf》
6.2.8显示
M68显示支持mipi dsi 及edp接口和hdmi。
Hdmi
目前M68已支持HDMI显示,只需打开dts中HDMI节点即可
&hdmi {
status = "okay";
rockchip,phy-table =
<92812500 0x8009 0x0000 0x0270>,
<165000000 0x800b 0x0000 0x026d>,
<185625000 0x800b 0x0000 0x01ed>,
<297000000 0x800b 0x0000 0x01ad>,
<594000000 0x8029 0x0000 0x0088>,
<000000000 0x0000 0x0000 0x0000>;
};
参考文档/docs/Common/display/目录下《Rockchip_Developer_Guide_HDMI_CN.pdf》
Edp
M68支持edp接口dts参考如下:
panel {
compatible = "simple-panel";
backlight = <&backlight>; //背光节点需要打开
enable-gpios = <&gpio0 19 0>;
prepare-delay-ms = <20>;
enable-delay-ms = <20>;
display_timings {
native-mode = <&timing_0>;
timing_0: timing0 {
clock-frequency = <147000000>; //clock-frequency计算方法:(ha+hfp+hs+hbp)*(va+vfp+vs+vbp)*60
hactive = <1920>; //具体屏参由屏厂提供
vactive = <1080>;
hfront-porch = <48>;
hsync-len = <32>;
hback-porch = <212>;
vfront-porch = <6>;
vsync-len = <3>;
vback-porch = <75>;
hsync-active = <0>;
vsync-active = <0>;
de-active = <0>;
pixelclk-active = <0>;
}
}
ports {
panel_in_edp:endpoint{
remote-endpoint = <&edp_out_panel>;
};
};
};
ports {
panel_in_edp:endpoint{
remote-endpoint = <&edp_out_panel>;
}; }; };
&edp {
force-hpd;
status = "okay";
ports{
port@1{
reg = <1>;
edp_out_panel:endpoint{
remote-endpoint = <&panel_in_edp>;
}; }; };};
&edp_phy {
status = "okay";
};
&edp_in_vp1 { //如果使用vop1则vop0必须关闭
status = "okay";
};
&edp_in_vp0 {
status = "disabled";
};
&route_edp{
connect = <&vp1_out_edp>;
status = "okay";
};
MIPI DSI
M68支持MIPI 4lans接口参考dts配置
&dsi1 {
status = "disabled";
dsi1_panel: panel@0 {
status = "okay";
compatible = "simple-panel-dsi";
reg = <0>;
backlight = <&backlight>;
reset-gpios = <&gpio3 RK_PC1 GPIO_ACTIVE_LOW>;
init-delay-ms = <60>;
reset-delay-ms = <60>;
unprepare-delay-ms = <60>;
disable-delay-ms = <60>;
dsi,flags = <(MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_BURST |
MIPI_DSI_MODE_LPM | MIPI_DSI_MODE_EOT_PACKET)>;
dsi,format = <MIPI_DSI_FMT_RGB888>;
dsi,lanes = <4>;
panel-init-sequence = [ //初始化代码具体由屏厂提供
05 1E 01 29
05 78 01 11
];
panel-exit-sequence = [
05 0A 01 28
05 78 01 10
];
disp_timings1: display-timings {
native-mode = <&dsi1_timing0>;
dsi1_timing0: timing0 {
…………//timimg配置具体由屏厂提供
};
};
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
panel_in_dsi1: endpoint {
remote-endpoint = <&dsi1_out_panel>;
};};};
};
ports {
#address-cells = <1>;
#size-cells = <0>;
port@1 {
reg = <1>;
dsi1_out_panel: endpoint {
remote-endpoint = <&panel_in_dsi1>;
};};};
};
&dsi1_in_vp0 {
status = "okay";
};
&video_phy1 {
status = "okay";
};
dsi,format = <MIPI_DSI_FMT_RGB888>;
dsi,lanes = <4>;
panel-init-sequence = [ //初始化代码具体由屏厂提供
05 1E 01 29
05 78 01 11
];
panel-exit-sequence = [
05 0A 01 28
05 78 01 10
];
disp_timings1: display-timings {
native-mode = <&dsi1_timing0>;
dsi1_timing0: timing0 {
…………//timimg配置具体由屏厂提供
};
};
ports {
#address-cells = <1>;
#size-cells = <0>;
port@0 {
reg = <0>;
panel_in_dsi1: endpoint {
remote-endpoint = <&dsi1_out_panel>;
};};};
};
ports {
#address-cells = <1>;
#size-cells = <0>;
port@1 {
reg = <1>;
dsi1_out_panel: endpoint {
remote-endpoint = <&panel_in_dsi1>;
};};};
};
&dsi1_in_vp0 {
status = "okay";
};
&video_phy1 {
status = "okay";
};
6.2.9can
M68引出一路can接口,CAN(Controller Area Network)总线,即控制器局域网总线。
dts参考:
&can1 {
assigned-clocks = <&cru 323>;
assigned-clock-rates = <150000000>; //修改can口时钟频率
pinctrl-names = "default";
pinctrl-0 = <&can1m1_pins>;
status = "okay";
};
CAN 通信测试:
#在收发端关闭
can0设备ip link set can0 down
#在收发端设置比特率为250Kbps
ip link set can0 type can bitrate 250000
#在收发端打开can0设备
ip link set can0 up
#在接收端执行candump,阻塞等待报文
candump can0
#在发送端执行cansend,发送报文
cansend can0 123#123456789
参考文档/docs/Common/display/目录下《Rockchip_Developer_Guide_DRM_Panel_Porting_CN.pdf》
6.2.10 CPU、GPU、DDR 频率修改
DVFS(Dynamic Voltage and Frequency Scaling)动态电压频率调节,是一种实时的电压和频率调节技术。目前 4.4 内核中支持 DVFS 的模块有 CPU、GPU、DDR。CPUFreq 是内核开发者定义的一套支持动态调整 CPU 频率和电压的框架模型。它能有效的降低 CPU 的功耗,同时兼顾 CPU 的性能。CPUFreq 通过不同的变频策略,选择⼀个合适的频率供CPU使用,目前的内核版本提供了以下几种策略:
interactive:根据 CPU 负载动态调频调压;
conservative:保守策略,逐级调整频率和电压;
ondemand:根据 CPU 负载动态调频调压,比 interactive 策略反应慢;
userspace:用户自己设置电压和频率,系统不会自动调整;
powersave:功耗优先,始终将频率设置在最低值;
performance:性能优先,始终将频率设置为最高值;
详细的模块功能及配置,请参考ocs/Common/DVFS/目录下文档。ARM/GPU/DDR 分别有对应的调试接口,可以通过 ADB 命令进⾏操作,对应的接口目录如下:
CPU小核:/sys/devices/system/cpu/cpu0/cpufreq/
CPU大核: /sys/devices/system/cpu/cpu4/cpufreq/
GPU:/sys/class/devfreq/ff9a0000.gpu/
DDR: /sys/class/devfreq/dmc/
这些目录下有如下类似节点:
available_frequencies:显示支持的频率
available_governors:显示支持的变频策略
cur_freq:显示当前频率
governor:显示当前的变频策略
max_freq:显示当前最高能跑的频率
min_freq:显示当前最低能跑的频率
以M68 M66 GPU 为例进行定频操作,流程如下:查看支持哪些频率:
cat sys/class/devfreq/fde60000.gpu/available_frequencies
切换变频策略:
echo userspace > sys/class/devfreq/fde60000.gpu/governor
定频
echo 400000000 > sys/class/devfreq/fde60000.gpu/userspace/set_freq
cat /sys/class/devfreq/ff9a0000.gpu/cur_freq
6.3 Recovery 开发
6.3.1 简介
Recovery机制的开发,类似Android的Recovery功能开发。主要作用是擦除用户数据和系统升级。
Linux中Recovery 模式是在设备上多⼀个Recovery分区,该分区由kernel+resource+ramdisk 组成,主要用于升级操作。u-boot会根据misc分区存放的字段来判断将要引导的系统是Normal 系统还是Recovery 系统。由于系统的独立性,所以Recovery模式能保证升级的完整性,即升级过程被中断,如异常掉电,升级仍然能继续执行。
6.3.2 调试
常用调试手段是开启debug
buildroot/output/rockchip 芯片型号 recovery/target 目录下创建⼀个隐藏文件.rkdebug,
touch .rkdebug
Recovery 模式中升级的 log 在串口中打印出来。另外一种是通过查看 userdata/recovery/Log 文件
更多Recovery开发资料,参考文档/docs/Linux/Recovery/Rockchip_Developer_Guide_Linux_Recovery_CN.pdf
6.4 Buildroot 开发
M68以及M66已经配置好坏境变量,BSP配置和各模块开发,方便客户开发和定制。默认使用的config为:<SDK>/buildroot/configs/rockchip_rk3568_defconfig客户可以通过使用
make ARCH=arm64 menuconfig来对buildroot进行裁剪
6.4.1 环境变量的设定
source ./envsetup.sh (config_name)
6.4.2 编译模块和系统
选好编译平台,接下来就可以编译每⼀个package,它主要是config、build、install三部分组成
make <package>-reconfigure
make <package>-rebuild
make <package>-reinstall
清理包命令如下:
make <package>-dirclean
编译Buildroot系统,直接make即可
Make
6.4.3 开发相关模块
相关package的开发,可以参考 <SDK>/buildroot/package/*, 其中package/rockchip是Rockchip开发的 相关package.
6.4.4 定制相关模块
参考/buildroot/configs/rockchip* 配置开关,各模块可自行定制开发。
buildroot$ tree configs/rockchip/
├── adbd.config
├── arm_a7.config
├── audio.config
├── audio_gst.config
├── base.config
├── base_extra.config
├── benchmark.config
├── bt.config
├── camera.config
├── camera_gst.config
├── chromium.config
├── debug.config
├── demo.config
├── display.config
├── freerdp.config
├── game.config
├── gdb.config
├── gpu.config
├── kernel_4_4.config
├── network.config
├── ntfs.config
...
6.5 Debian 开发
Rockchip提供了对Debian 10/11的⽀持,基于X11的显示架构。系统基于Linaro版本。添加一些图形和视频加速的支持。它包括libmali、xserver、gstreamer rockchip等package,这些packages通过docker搭建编译相关deb包,存放在/debian/packages/*。
Docker搭建编译deb package参考文档
<SDK>/docs/Linux/ApplicationNote/Rockchip_Developer_Guide_Debian_Docker_EN.pdf
如果从网络中获取的时间与实际时间不一致,请设置时区为中国上海
root#cp /usr/share/zoneinfo/Asia/ShangHai etc/localtime
也可在SDK中修改./debian/binary/etc/localtime设置时区
M68及M66 debian图形显示适配方案:X11/Xserver⽬前搭配是LXDE/XFCE轻量级桌⾯环境,桌⾯管理器使⽤lightdm,默认桌面环境为lxde
LXDE桌面环境提供了一些基础功能,如,摄像头预览,文件管理器,多媒体播放器,WiFi/BT 连接等。
Debian开发文档参考
<SDK>/docs/Linux/ApplicationNote/Rockchip_Developer_Guide_Debian_CN.pdf
6.6 Yocto 开发
更多资料参考: HYPERLINK "https://opensource.rock-chips.com/wiki_Yocto"
6.7 多媒体开发
通过gstreamer/rockit来在rockchip平台上做multimedia的开发
vpu_service --> mpp --> gstreamer --> app
vpu_service: 驱动
mpp: rockchip平台的视频编解码中间件,相关说明参考mpp⽂档
gstreamer: 对接app的组件
目前rockchip提供的完整solution是基于gstreamer的,使用gstreamer的好处就是可以比较方便的基于pipeline的方式完整播放器,编码器这些应用。
具体资料参考:
/docs/Linux/Multimedia
├── Rockchip_Developer_Guide_Linux_DLNA_CN.pdf
├── Rockchip_Developer_Guide_Linux_RGA_CN.pdf
├── Rockchip_Developer_Guide_MPP_CN.pdf
└── Rockchip_Developer_Guide_MPP_EN.pdf
6.8 Grahpics 开发
Rockchip Linux平台的Graphics,是应用DRM和DMA-BUF的ARM Linux平台。优势是,通用的架构,在基于此架构进⾏客制化开发较容易,可以利用很多现有组件,现有很多基础开源项目的开发,都开始基于Rockchip平台来作为ARM端的适配平台。但缺点是,很多人不是很理解这些内容,实际应用起来需要一个学习过程。更多资料可以参考Rockchip wiki和下面文档。
<SDK>/docs/Linux/Graphics/
├── Rockchip_Developer_Guide_Linux_Graphics_CN.pdf
└── Rockchip_Developer_Guide_Linux_Graphics_EN.pdf
6.9 应用开发
SDK常用应用有Weston、QT、ROS等应用开发,参考/docs/Linux/Graphics/ApplicationNote目录下文档
6.10 安全机制开发
参考/docs/Linux/Security目录下文档
7. SDK 测试
7.1 Benchmark 测试
⼀些常⽤基准测试的参考数据,该测试文档位于:
<SDK>/docs/Linux/Profile/Rockchip_Introduction_Linux_Benchmark_KPI_EN.pdf
7.2 Rockchip 模块和压力测试
提供一些常用模块功能和压力测试的方法,该文档位于:
<SDK>/docs/Linux/Profile/Rockchip_User_Guide_Linux_Software_Test_CN.pdf
8. 常见问题(FAQ)
8.1 如何确认当前kernel和u-boot版本?
Linux 4.19对应的kernel版本为:develop-4.19,u-boot为next-dev分支
8.2 Debian相关问题
8.2.1 遇到" noexec or nodev"问题
noexec or nodev issue /usr/share/debootstrap/functions: line 1450:
..../rootfs/ubuntu-build-service/buster-desktop-arm64/chroot/test-dev-null:
Permission denied E: Cannot install into target '/rootfs/ubuntu-buildservice/buster-desktop-arm64/chroot' mounted with noexec or nodev
解决方法:
mount -o remount,exec,dev xxx
(其中xxx 是工程目录路径,然后重新编译)
另外如果还有遇到其他编译异常,先排除使用的编译系统是 ext2/ext4 的系统类型。
8.2.2 下载"Base Debian"失败问题
由于编译 Base Debian 需要访问国外网站,而国内网络访问国外网站时,经常出现下载失败的情况:
Debian 使用 live build,镜像源改为国内可以这样配置:
32位系统:
+++ b/ubuntu-build-service/{buster/bullseye}-desktop-armhf/configure
@@ -11,6 +11,11 @@ set -e
echo "I: create configuration"
export LB_BOOTSTRAP_INCLUDE="apt-transport-https gnupg"
lb config \
+ --mirror-bootstrap "http://mirrors.ustc.edu.cn/debian" \
+ --mirror-chroot "http://mirrors.ustc.edu.cn/debian" \
+ --mirror-chroot-security "http://mirrors.ustc.edu.cn/debian-security" \
+ --mirror-binary "http://mirrors.ustc.edu.cn/debian" \
+ --mirror-binary-security "http://mirrors.ustc.edu.cn/debian-security" \
--apt-indices false \
--apt-recommends false \
--apt-secure false \
64位系统:
--- a/ubuntu-build-service/{buster/bullseye}-desktop-arm64/configure
+++ b/ubuntu-build-service/{buster/bullseye}-desktop-arm64/configure
@@ -11,6 +11,11 @@ set -e
echo "I: create configuration"
export LB_BOOTSTRAP_INCLUDE="apt-transport-https gnupg"
lb config \
+ --mirror-bootstrap "http://mirrors.ustc.edu.cn/debian" \
+ --mirror-chroot "http://mirrors.ustc.edu.cn/debian" \
+ --mirror-chroot-security "http://mirrors.ustc.edu.cn/debian-security" \
+ --mirror-binary "http://mirrors.ustc.edu.cn/debian" \
+ --mirror-binary-security "http://mirrors.ustc.edu.cn/debian-security" \
--apt-indices false \
--apt-recommends false \
--apt-secure false \
如果其他网络原因不能下载包,有预编生成的包分享在百度云网盘,放在当前目录直接执行下一步操作。
8.2.3 异常操作导致挂载/dev出错问题
比如出现这种 askpass command or cannot use one
引起原因可能是编译过程频繁异常操作(CTRL+C),导致上面出错的,可以通过如下方式修复:
sudo -S umount /dev
8.2.4 怎么查看系统相关信息
如何查看系统Debian版本?
root@linaro-alip:~# cat /etc/debian_version
11.1
如何查看Debian显示用X11还是Wayland?
在X11系统上:
$ echo $XDG_SESSION_TYPE
x11
在Wayland系统上:
$ echo $XDG_SESSION_TYPE
wayland
如何查看系统分区情况
root@linaro-alip:~# parted -l
Model: MMC BJTD4R (sd/mmc)
Disk /dev/mmcblk0: 31.3GB
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
NumberStartEndSizeFilesystemNameFlags
1 8389kB 12.6MB 4194kB uboot
2 12.6MB 16.8MB 4194kB misc
3 16.8MB 83.9MB 67.1MB boot
4 83.9MB 218MB 134MB recovery
5 218MB 252MB 33.6MB backup
6 252MB 15.3GB 15.0GB ext4 rootfs
7 15.3GB 15.4GB 134MB ext2 oem
8 15.6GB 31.3GB 15.6GB ext2 userdata
8.2.5 系统出现ssh.service服务异常
这是Debian10或早期存在的问题 /etc/rc.local 添加如下:
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# Generate the SSH keys if non-existent
if [ ! -f /etc/ssh/ssh_host_rsa_key ]
then
# else ssh service start in dpkg-reconfigure will fail
systemctl stop ssh.socket||true
dpkg-rec
8.2.6 Debian11 base包编译不过
会遇到类似如下报错
W: Failure trying to run: /sbin/ldconfig
W: See //debootstrap/debootstrap.log for details
主要要求PC的kernel版本是5.10+, 这是旧的QEMU存在的bug. 解决方法主要两种:
PC自带的内核版本需满足5.10+的需求。
检查PC内核版本
cat /proc/version
Linux version 5.13.0-39-generic
更新系统的qemu
参考 HYPERLINK "https://launchpad.net/~canonical-server/+archive/ubuntu/server-backports" 。
8.3 Linux视频相关问题
8.3.1 播放视频卡顿,日志出现丢帧错误,要怎么解决
可以使用 fpsdisplaysink 确认最高帧率,如果最高帧率接近期望帧率,可以通过指定sync=false 解决,部分平台可以开启 AFBC。卡顿也可以看下硬件运⾏时间,echo0x100 >/sys/module/rk_vcodec/parameters/mpp_dev_debug
8.3.2 gst-launch-1.0 进⾏摄像头视频预览命令
可以使用 v4l2src 插件,如 gst-launch-1.0 v4l2src ! autovideosink
8.3.3 开启 AFBC 后播放画⾯出现抖动,要怎么解决
画面抖动一般是 ddr 带宽不足,可以尝试固定性能模式。另外由于显示硬件实现方式,垂直方向上如果有缩放,需要的性能和带宽会比较高,容易不足,需要使⽤其他方式缩放(如rga/gpu)
8.3.4 Gstreamer 框架 buffer 是零拷贝吗
使用dmabuf 相关接口进行数据处理实现零拷贝
8.3.5 gst-launch-1.0 怎么测试解码最高的性能?
设置性能模式,用官方的 fpsdisplaysink 查看帧率,以及驱动的调试接口查看驱动帧率
8.3.6 播放时如果画面出现抖动,水波纹,要怎么解决
抖动一般都是显示硬件的性能不足,⼤部分是 ddr 带宽不够,可以用 ddr 性能模式,固定最高频
8.3.7 Gstreamer怎么快速接入 opengles?
一般是合成上有 gl 插件支持,送显上由第三⽅显示服务支持,显示服务内部可以进行opengles 合成(如 weston)
8.4显示相关问题
8.4.1 如何使视频送显到视频层
drm 有接口,可以查询到 plane 的 type。具体可以参考 gstreamer 的 kmssink 方式。
8.4.2 wayland 多屏异显模式如何配置每个屏幕的位置,比如左右或者上下位置的
weston 异显只支持左右排列,按照屏幕加载顺序,具体可以参考
/docs/Linux/*/Rockchip_Developer_Guide_Buildroot_Weston_CN.pdf 2.9 多屏配置
8.4.3 Debian xserver 版本是多少
Debian10使用 xserver1.20.4,Debian11使用 xserver1.20.11
20221021_63520b2858730__Linux开发