当前位置:首页 > 物联网 > 嵌入式 liunx 安卓 教程连载
[导读]M68 和M66 Rockchip Linux SDK 支持 Buildroot,Yocto和Debian三个系统,内核基于 Kernel 4.4引导基于 U-boot v2017.09,目前支持 VPU 硬解码、GPU 3D、Wayland 显示等功能。具体功能调试和接口说明,

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开发

声明:该篇文章为本站原创,未经授权不予转载,侵权必究。
换一批
延伸阅读

9月2日消息,不造车的华为或将催生出更大的独角兽公司,随着阿维塔和赛力斯的入局,华为引望愈发显得引人瞩目。

关键字: 阿维塔 塞力斯 华为

加利福尼亚州圣克拉拉县2024年8月30日 /美通社/ -- 数字化转型技术解决方案公司Trianz今天宣布,该公司与Amazon Web Services (AWS)签订了...

关键字: AWS AN BSP 数字化

伦敦2024年8月29日 /美通社/ -- 英国汽车技术公司SODA.Auto推出其旗舰产品SODA V,这是全球首款涵盖汽车工程师从创意到认证的所有需求的工具,可用于创建软件定义汽车。 SODA V工具的开发耗时1.5...

关键字: 汽车 人工智能 智能驱动 BSP

北京2024年8月28日 /美通社/ -- 越来越多用户希望企业业务能7×24不间断运行,同时企业却面临越来越多业务中断的风险,如企业系统复杂性的增加,频繁的功能更新和发布等。如何确保业务连续性,提升韧性,成...

关键字: 亚马逊 解密 控制平面 BSP

8月30日消息,据媒体报道,腾讯和网易近期正在缩减他们对日本游戏市场的投资。

关键字: 腾讯 编码器 CPU

8月28日消息,今天上午,2024中国国际大数据产业博览会开幕式在贵阳举行,华为董事、质量流程IT总裁陶景文发表了演讲。

关键字: 华为 12nm EDA 半导体

8月28日消息,在2024中国国际大数据产业博览会上,华为常务董事、华为云CEO张平安发表演讲称,数字世界的话语权最终是由生态的繁荣决定的。

关键字: 华为 12nm 手机 卫星通信

要点: 有效应对环境变化,经营业绩稳中有升 落实提质增效举措,毛利润率延续升势 战略布局成效显著,战新业务引领增长 以科技创新为引领,提升企业核心竞争力 坚持高质量发展策略,塑强核心竞争优势...

关键字: 通信 BSP 电信运营商 数字经济

北京2024年8月27日 /美通社/ -- 8月21日,由中央广播电视总台与中国电影电视技术学会联合牵头组建的NVI技术创新联盟在BIRTV2024超高清全产业链发展研讨会上宣布正式成立。 活动现场 NVI技术创新联...

关键字: VI 传输协议 音频 BSP

北京2024年8月27日 /美通社/ -- 在8月23日举办的2024年长三角生态绿色一体化发展示范区联合招商会上,软通动力信息技术(集团)股份有限公司(以下简称"软通动力")与长三角投资(上海)有限...

关键字: BSP 信息技术
关闭