Rockchip平臺(tái) Linux 開發(fā)教程
Linux開發(fā)
Rockchip Linux SDK 軟件包
1.1 簡介
M68 和M66 Rockchip Linux SDK 支持 Buildroot,Yocto和Debian三個(gè)系統(tǒng),內(nèi)核基于 Kernel 4.4引導(dǎo)基于 U-boot v2017.09,目前支持 VPU 硬解碼、GPU 3D、Wayland 顯示等功能。具體功能調(diào)試和接口說明,請(qǐng)閱讀SDK工程目錄docs/下文檔。
1.2 SDK獲取方法 (聯(lián)系BesTom WWW.bestom.net,bestom@bestom.net)
1.2.1SDK更新
.repo/repo/repo sync -c --no-tags 命令同步更新,下載代碼后請(qǐng)使用該命令檢查是否更新。
1.3 SDK適配硬件全自動(dòng)編譯匯總
進(jìn)入工程根目錄執(zhí)行以下命令自動(dòng)完成所有的編譯:
./build.sh all # 只編譯模塊代碼(u-Boot,kernel,Rootfs,Recovery)
# 需要再執(zhí)行./mkfirmware.sh 進(jìn)行固件打包
./build.sh# 在./build.sh all基礎(chǔ)上
# 1. 增加固件打包 ./mkfirmware.sh
# 2. update.img打包
# 3. 復(fù)制rockdev目錄下的固件到IMAGE/***_RELEASE_TEST/IMAGES目錄
# 4. 保存各個(gè)模塊的補(bǔ)丁到IMAGE/***_RELEASE_TEST/PATCHES目錄
# 注:./build.sh 和 ./build.sh allsave 命令?樣
默認(rèn)是 Buildroot,可以通過設(shè)置壞境變量 RK_ROOTFS_SYSTEM 指定 rootfs。RK_ROOTFS_SYSTEM? 前可設(shè)定三個(gè)類型:buildroot、debian、 yocto 。 如需要 debain 可以通過以下命令進(jìn)行生成:
$export RK_ROOTFS_SYSTEM=debian
$./build.sh
2. SDK 開發(fā)環(huán)境搭建
2.1 概述
本節(jié)主要介紹了如何在本地搭建編譯環(huán)境來編譯Rockchip Buildroot Linux SDK源代碼。當(dāng)前SDK只支持在Linux環(huán)境下編譯,并提供Linux下的交叉編譯工具鏈。
一個(gè)典型的嵌入式開發(fā)環(huán)境通常包括Linux 服務(wù)器、Windows PC和目標(biāo)硬件版,典型開發(fā)環(huán)境如下圖所示。
Linux 服務(wù)器上建立交叉編譯環(huán)境,為軟件開發(fā)提供代碼更新下載,代碼交叉編譯服務(wù)。
Windows PC 和 Linux 服務(wù)器共享程序,并安裝Putty或MobaXterm,通過網(wǎng)絡(luò)遠(yuǎn)程登陸到 Linux 服務(wù)器,進(jìn)行交叉編譯,及代碼的開發(fā)調(diào)試。
Windows PC通過串口和 USB 與目標(biāo)硬件板連接,可將編譯后的鏡像文件燒寫到目標(biāo)硬件板,并調(diào)
試系統(tǒng)或應(yīng)用程序。
注:開發(fā)環(huán)境中使用了Windows PC,實(shí)際上很多工作也可以在Linux PC上完成,如使用minicom代替
Putty等,用戶可自行選擇。
2.2 Linux服務(wù)器開發(fā)環(huán)境搭建
Rockchip Linux SDK是在 Ubuntu 18.04 以上系統(tǒng)開發(fā)測(cè)試的。因此,我們推薦使用Ubuntu 18.04以上系統(tǒng)進(jìn)行編譯。其他版本沒有具體測(cè)試,可能需要對(duì)軟件包做相應(yīng)調(diào)整。
除了系統(tǒng)要求外,還有其他軟硬方面的要求。
硬件要求:64位系統(tǒng),硬盤空間大于40G。如果您進(jìn)行多個(gè)構(gòu)建,將需要更大的硬盤空間。
軟件包依賴:除了python 2.7,make 3.8,git 1.7之外,還需要安裝一些額外的軟件包,將在軟件包安裝章節(jié)中列出。
2.2.1 發(fā)布包使用Linux服務(wù)器系統(tǒng)版本
本SDK開發(fā)環(huán)境安裝如下版本Linux 系統(tǒng),SDK默認(rèn)均以此Linux 系統(tǒng)進(jìn)行編譯:
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 網(wǎng)絡(luò)環(huán)境搭建
請(qǐng)用戶自行配置網(wǎng)絡(luò),并安裝nfs,samba,ssh 等網(wǎng)絡(luò)組件。
2.2.3 安裝依賴包
本 SDK 開發(fā)環(huán)境是在 Ubuntu 系統(tǒng)上開發(fā)測(cè)試。我們推薦使用 Ubuntu 18.04 的系統(tǒng)進(jìn)行編譯。其他的Linux 版本可能需要對(duì)軟件包做相應(yīng)調(diào)整。除了系統(tǒng)要求外,還有其他軟硬件方面的要求。
硬件要求:64 位系統(tǒng),硬盤空間大于 40G。如果您進(jìn)行多個(gè)構(gòu)建,將需要更大的硬盤空間。
軟件要求:Ubuntu 18.04 系統(tǒng):
編譯 SDK 環(huán)境搭建所依賴的軟件包安裝命令如下:
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 系統(tǒng)或更高版本開發(fā),若編譯遇到報(bào)錯(cuò),可以視報(bào)錯(cuò)信息,安裝對(duì)應(yīng)的軟件包。
2.2.4 交叉編譯工具鏈介紹
鑒于Rockchip Buildroot SDK目前只在Linux下編譯,我們也僅提供了Linux下的交叉編譯?具鏈。其中U-Boot及Kernel使用的編譯工具鏈預(yù)置目錄在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-
對(duì)應(yīng)版本
gcc version 6.3.1 20170404 (Linaro GCC 6.3-2017.05)
Buildroot編譯工具鏈:
64位系統(tǒng):
buildroot/output/rockchip芯片型號(hào)/host/bin/aarch64-buildroot-linux-gnu-
32位系統(tǒng):
buildroot/output/rockchip芯片型號(hào)/host/usr/arm-linux-gcc
對(duì)應(yīng)版本:
gcc version 9.3.0 (Buildroot 2018.02-rc3-02723-gd3fbc6ae13)
如果需要其他平臺(tái)或版本的?具鏈,需自行編譯。
上述環(huán)境準(zhǔn)備好后,Linux服務(wù)器開發(fā)環(huán)境搭建已完成,可以下載編譯源代碼了。
2.3 Window PC 開發(fā)壞境搭建
2.3.1 開發(fā)工具安裝
請(qǐng)用戶自行安裝 Vim,Notepad++, vsCode等編輯軟件。
2.3.2 Rockchip USB 驅(qū)動(dòng)安裝
開發(fā)調(diào)試階段,需要將設(shè)備切換至 Loader 模式或是 Maskrom 模式,需要安裝 Rockusb 驅(qū)動(dòng)才能正常識(shí)別設(shè)備。
Rockchip USB 驅(qū)動(dòng)安裝助手存放在 tools/windows/DriverAssitant_v5.x.zip。支持
Xp,win7_32,win7_64,win10_32,win10_64 等操作系統(tǒng)。 安裝步驟如下:
2.3.3 Windows 燒錄工具使用
Windows 系統(tǒng)上的的燒錄工具發(fā)布在 tools/windows/RKDevTool/RKDevTool_Release,可用于 Windows 環(huán)境下開發(fā)調(diào)試,固件的燒寫。
2.3.4 目標(biāo)硬件板準(zhǔn)備
請(qǐng)參考SDK 軟件包適用硬件列表SDK軟件包適用硬件列表,選擇對(duì)應(yīng)硬件板子,進(jìn)行后續(xù)的開發(fā)調(diào)試。
對(duì)應(yīng)的硬件使用說明文檔,會(huì)介紹硬件接口,使用說明,及燒錄操作方法。
3. SDK 安裝準(zhǔn)備?作
3.1 簡要介紹
Rockchip Linux SDK 的代碼和相關(guān)文檔被劃分為了若干 git 倉庫分別進(jìn)行版本管理,開發(fā)者可以使用 repo 對(duì)這些 git 倉庫進(jìn)行統(tǒng)一的下載,提交,切換分支等操作。
3.2 安裝 repo
確保主目錄下有?個(gè) bin/ 目錄,并且該目錄包含在路徑中:
mkdir ~/bin
export PATH=~/bin:$PATH
如果可以訪問 google 的地址,下載 Repo 工具,并確保它可執(zhí)行:
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
中國國內(nèi)環(huán)境如果執(zhí)行上述命令后發(fā)現(xiàn)~/bin/repo 為空,此時(shí)可以訪問國內(nèi)的站點(diǎn)來下載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 之前請(qǐng)配置一下自己的 git 信息,否則后面的操作可能會(huì)遇到 hook 檢查的障礙:
git config --global user.name "your name"
git config --global user.email "your mail"
3.4 軟件更新記錄
為方便客戶及開發(fā)者了解到 SDK 更新所覆蓋的修改,解決的問題。SDK 上加入了 ReleaseNote.txt,該文件會(huì)記錄每次更新解決的問題,及是否建議客戶全部更新。請(qǐng)客戶及開發(fā)者更新ReleaseNote 后,查看更新內(nèi)容,并決定是否更新 SDK 代碼。
軟件發(fā)布版本升級(jí)通過工程 xml 進(jìn)行查看當(dāng)前版本,具體方法如下:
.repo/manifests$ ls -l -h 芯片名稱_linux_release.xml
軟件發(fā)布版本升級(jí)更新內(nèi)容通過工程文本可以查看,具體方法如下:
.repo/manifests$ cat */芯片型號(hào)_Linux_SDK_Note.md
或者參考工程目錄:
<SDK>/docs/芯?型號(hào)/芯?型號(hào)_Linux_SDK_Note.md
4. SDK 編譯
本 SDK 開發(fā)環(huán)境是在 Ubuntu 系統(tǒng)上開發(fā)測(cè)試。我們推薦使用 Ubuntu 18.04 的系統(tǒng)進(jìn)行編譯。其他的 Linux 版本可能需要對(duì)軟件包做相應(yīng)調(diào)整。除了系統(tǒng)要求外,還有其他軟硬件方面的要求。
硬件要求:64 位系統(tǒng),硬盤空間大于 40G。如果您進(jìn)行多個(gè)構(gòu)建,將需要更大的硬盤空間。
軟件要求:Ubuntu 18.04 系統(tǒng)。
編譯 SDK 環(huán)境搭建所依賴的軟件包安裝,參考 軟件包安裝。
4.1 U-Boot 編譯
進(jìn)入SDK工程。運(yùn)行如下命令進(jìn)行編譯
<SDK>#./build.sh uboot
或者
<SDK>/U-boot# ./make.sh rk3568
4.2 Kernel 編譯
進(jìn)入工程目錄根目錄執(zhí)行以下命令自動(dòng)完成 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 編譯
進(jìn)入工程根目錄執(zhí)行以下命令自動(dòng)完成 Recovery 的編譯及打包。
<SDK>#./build.sh recovery
編譯后在 Buildroot 目錄 output/rockchip芯片型號(hào)recovery/images 生成 recovery.img。
需要特別注意 recovery.img 是包含 kernel.img,所以每次 Kernel 更改,Recovery 是需要重新打包生成。例如下:
<SDK>$source envsetup.sh rockchip_芯片名稱
<SDK>$make recovery-rebuild
<SDK>$./build.sh recovery
更多編譯說明請(qǐng)參考SDK發(fā)布文檔。
4.4 Buildroot 編譯
4.4.1 Rootfs 編譯
進(jìn)入工程目錄根目錄執(zhí)行以下命令自動(dòng)完成 Rootfs 的編譯及打包:
./build.sh rootfs
編譯后在 Buildroot 目錄 output/rockchip_芯片型號(hào)/images下生成 rootfs.ext4。
4.4.2 模塊編譯
比如 qplayer 模塊,常用相關(guān)編譯命令如下:
編譯 qplayer
SDK$make qplayer
重編 qplayer
SDK$make qplayer-rebuild
刪除 qplayer
SDK$make qplayer-dirclean
或者
SDK$rm -rf /buildroot/output/rockchip_芯片型號(hào)/build/qlayer-1.0
4.5 Debian 編譯
./build.sh debian
或進(jìn)入 debian/ 目錄:
cd debian/
后續(xù)的編譯和 Debian 固件生成請(qǐng)參考當(dāng)前目錄 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
編譯完成會(huì)在 debian/ 目錄下生成:linaro-buster-alip-xxxxx-1.tar.gz(xxxxx 表示生成時(shí)間戳)。
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 是?程?錄路徑,然后重新編譯)
另外如果還有遇到其他編譯異常,先排除使用的編譯系統(tǒng)是 ext2/ext4 的系統(tǒng)類型。
由于編譯 Base Debian 需要訪問國外網(wǎng)站,而國內(nèi)網(wǎng)絡(luò)訪問國外網(wǎng)站時(shí),經(jīng)常出現(xiàn)下載失敗的情況:
Debian 使用 live build,鏡像源改為國內(nèi)可以這樣配置:
32位系統(tǒng):
+++ 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位系統(tǒng):
--- 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 \
如果其他網(wǎng)絡(luò)原因不能下載包,有預(yù)編生成的包分享在百度云網(wǎng)盤,放在當(dāng)前目錄直接執(zhí)行下一步操作。
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
此時(shí)會(huì)生成 linaro-rootfs.img。
4.6 Yocto 編譯
進(jìn)入工程目錄根目錄執(zhí)行以下命令自動(dòng)完成 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, 默認(rèn)用戶名登錄是 root。
Yocto 更多信息請(qǐng)參考 HYPERLINK "https://opensource.rock-chips.com/wiki_Yocto" 。
4.7 全自動(dòng)編譯
完成上述 Kernel/U-Boot/Recovery/Rootfs 各個(gè)部分的編譯后,進(jìn)入工程目錄根目錄執(zhí)行以下命令自動(dòng)完成所有的編譯:
./build.sh all # 只編譯模塊代碼(u-Boot,kernel,Rootfs,Recovery)
# 需要再執(zhí)行./mkfirmware.sh 進(jìn)行固件打包
./build.sh # 在./build.sh all基礎(chǔ)上
# 1. 增加固件打包 ./mkfirmware.sh
# 2. update.img打包
# 3. 復(fù)制rockdev目錄下的固件到IMAGE/***_RELEASE_TEST/IMAGES目錄
# 4. 保存各個(gè)模塊的補(bǔ)丁到IMAGE/***_RELEASE_TEST/PATCHES目錄
# 注:./build.sh 和 ./build.sh allsave 命令?樣
默認(rèn)是 Buildroot ,可以通過設(shè)置壞境變量 RK_ROOTFS_SYSTEM 指定 rootfs 。
比如需要 buildroot 可以通過以下命令進(jìn)行生成:
<SDK>$export RK_ROOTFS_SYSTEM=buildroot
<SDK>$./build.sh
具體參數(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編譯指導(dǎo)
4.8.1編譯
本小節(jié)主要介紹在搭載完編譯及下載好SDK源碼之后如何編譯固件
選擇環(huán)境
<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開發(fā)
本小節(jié)主要介紹如何修改編譯的dts及其他config,在SDK中我們默認(rèn)了DTS的選擇及其他環(huán)境變量的配置。我們可以通過修改默認(rèn)的Boardconfig.mk去修改配置。
<SDK>$vi device/rockchip/rk356x/device/Boardconfig.mk
內(nèi)容如下:
# 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
//如果添加了此項(xiàng)則默認(rèn)編譯debain,則不需要在SDK目錄使用
//export RK_ROOTFS_SYSTEM=debain去重新指定系統(tǒng)
#set flash type support<emmc, nand, spi_nand, spi_nor>
export RK_STORAGE_TYPE=emmc
5. SDK 固件升級(jí)
本章節(jié)主要介紹如何將構(gòu)建完整的鏡像文件(image)燒寫并運(yùn)行在硬件設(shè)備上的流程。
Rockchip 平臺(tái)提供的幾種鏡像燒寫工具介紹如下所示,可以選擇合適的燒寫方式進(jìn)行燒寫。燒寫前,需
安裝最新的 USB 驅(qū)動(dòng),詳見 2.3.2 HYPERLINK \l "書簽3" 。
工具 | 系統(tǒng) | 描述 |
---|---|---|
RKDevTool | Windows | 瑞芯微開發(fā)工具,分立升級(jí)固件及整個(gè) update 升級(jí)固件工具 |
FactoryTool | Windows | 量產(chǎn)升級(jí)工具,支持 USB 一拖多燒錄 |
Linux_Upgrade_tool | Linux | Linux 下開發(fā)的工具,支持固件的升級(jí) |
5.1 燒寫模式介紹
Rockchip 平臺(tái)硬件運(yùn)行的幾種模式如表所示,只有當(dāng)設(shè)備處于 Maskrom,及 Loader模式下,才能夠燒寫固件,或?qū)Π迳瞎碳M(jìn)行更新操作。
模式 | 工具燒錄 | 描述 |
---|---|---|
Maskrom | 支持 | Flash 在未燒錄固件時(shí),芯片會(huì)引導(dǎo)進(jìn)? Maskrom 模式,可以進(jìn)行初次固件的燒寫; 開發(fā)調(diào)試過程中若遇到 Loader 無法正常啟動(dòng)的情況,也可進(jìn)入Maskrom 模式燒寫固件。 |
Loader | 支持 | Loader 模式下,可以進(jìn)行固件的燒寫、升級(jí)。 可以通過工具單獨(dú)燒寫某?個(gè)分區(qū)鏡像文件,方便調(diào)試。 |
Recovery | 不支持 | 系統(tǒng)引導(dǎo) recovery 啟動(dòng),主要作?是升級(jí)、恢復(fù)出廠設(shè)置類操作。 |
Normal Boot | 不支持 | 系統(tǒng)引導(dǎo) rootfs 啟動(dòng),加載 rootfs,大多數(shù)的開發(fā)都是在這個(gè)模式下調(diào)試的。 |
進(jìn)入燒寫模式方式以下幾種方法:
未燒錄過固件,上電,進(jìn)入 Maskrom 模式。
燒錄過固件,按住 recovery 按鍵上電或復(fù)位,系統(tǒng)將進(jìn)入 Loader 固件燒寫模式。
燒錄過固件,按住 Maskrom 按鍵上電或復(fù)位,系統(tǒng)將進(jìn)入 MaskRom 固件燒寫模式。
燒錄過固件,上電或復(fù)位后開發(fā)板正常進(jìn)?系統(tǒng)后,瑞芯微開發(fā)工具上顯示“發(fā)現(xiàn)一個(gè) ADB設(shè)備”或“發(fā)現(xiàn)一個(gè) MSC 設(shè)備”,然后點(diǎn)擊工具上的按鈕“切換”,進(jìn)入 Loader 模式。
燒錄過固件,可在串口或 ADB 命令行模式下,輸入 reboot loader 命令,進(jìn)入 Loader 模式。
5.1.1 Windows 刷機(jī)說明
SDK 提供 Windows 燒寫工具(工具版本需要 V2.84 或以上),工具位于工程根目錄:
tools/
├── windows/RKDevTool
如下圖,編譯生成相應(yīng)的固件后,設(shè)備燒寫需要進(jìn)入 MASKROM 或 BootROM 燒寫模式, 連接好 USB 下載線后,按住按鍵“MASKROM”不放并按下復(fù)位鍵“RST”后松手,就能進(jìn)入MASKROM 模式,加載編譯生成固件的相應(yīng)路徑后,點(diǎn)擊“執(zhí)行”進(jìn)行燒寫,也可以按 “recovery" 按鍵不放并按下復(fù)位鍵 “RST” 后松手進(jìn)入 loader 模式進(jìn)行燒寫,下面是 MASKROM 模式的分區(qū)偏移及燒寫文件。(注意: Windows PC 需要在管理員權(quán)限運(yùn)行工具才可執(zhí)行)
注:燒寫前,需安裝SDK目錄下 USB 驅(qū)動(dòng),驅(qū)動(dòng)詳見:
<SDK>/tools/windows/DriverAssitant_v5.11.zip
5.1.2 Linux 刷機(jī)說明
Linux下的燒寫工具位于 tools/linux目錄下(Linux_Upgrade_Tool 工具版本需要 V1.57 或以上),請(qǐng)確認(rèn)你的板子連接到 MASKROM/loader rockusb。比如編譯生成的固件在 rockdev 目錄下,升級(jí)命令如下:
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
或升級(jí)打包后的完整固件:
sudo ./upgrade_tool uf rockdev/update.img
或在根目錄,機(jī)器在 MASKROM 狀態(tài)運(yùn)行如下升級(jí):
/rkflash.sh
5.1.3 系統(tǒng)分區(qū)說明
默認(rèn)分區(qū)說明 ( 下面是 RK3568 EVB 分區(qū)參考)
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 分區(qū):供 uboot 編譯出來的 uboot.img。
misc 分區(qū):供 misc.img,給 recovery 使用。
boot 分區(qū):供 kernel 編譯出來的 boot.img。
recovery 分區(qū):供 recovery 編譯出的 recovery.img。
backup 分區(qū):預(yù)留,暫時(shí)沒有用,后續(xù)跟 Android 一樣作為 recovery 的 backup 使用。
rootfs 分區(qū):供 buildroot、debian 或 yocto 編出來的 rootfs.img。
oem 分區(qū):給?家使用,存放廠家的 APP 或數(shù)據(jù)。掛載在 /oem 目錄。
userdata 分區(qū):供 APP 臨時(shí)生成文件或給最終用戶使用,掛載在 /userdata 目錄下。
6. SDK 開發(fā)
6.1 U-Boot 開發(fā)
本節(jié)簡單介紹 U-Boot 基本概念和編譯的注意事項(xiàng),幫助客戶了解 RK 平臺(tái) U-Boot 框架,具體 U-Boot 開發(fā)細(xì)節(jié)可參考/docs/Common/U-Boot 目錄下《Rockchip-Developer-Guide-UBoot-*.pdf》。
6.1.1 U-Boot 簡介
Rockchip U-Boot next-dev 分支是 Rockchip 從 U-Boot 官方的 v2017.09 正式版本中切出來進(jìn)行開發(fā)的版本。目前在該平臺(tái)上已經(jīng)支持 RK 所有主流在售芯片。支持的功能主要有:
支持 RK Android 固件啟動(dòng);
支持 Android AOSP 固件啟動(dòng);
支持 Linux Distro 固件啟動(dòng);
支持 Rockchip miniloader 和 SPL/TPL 兩種 Pre-loader 引導(dǎo);
支持 LVDS、EDP、MIPI、HDMI、CVBS、RGB 等顯示設(shè)備;
支持 eMMC、Nand Flash、SPI Nand flash、SPI NOR flash、SD 卡、U 盤等存儲(chǔ)設(shè)備啟動(dòng);
支持 FAT、EXT2、EXT4 文件系統(tǒng);
支持 GPT、RK parameter 分區(qū)表;
支持開機(jī) LOGO、充電動(dòng)畫、低電管理、電源管理;
支持 I2C、PMIC、CHARGE、FUEL GUAGE、USB、GPIO、PWM、GMAC、eMMC、NAND、
Interrupt 等;
支持 Vendor storage 保存用戶的數(shù)據(jù)和配置;
支持 RockUSB 和 Google Fastboot 兩種 USB gadget 燒寫 eMMC;
支持 Mass storage、ethernet、HID 等 USB 設(shè)備;
支持通過硬件狀態(tài)動(dòng)態(tài)選擇 kernel DTB;
6.1.2 版本
RK 的 U-Boot ?共有兩個(gè)版本: v2014舊版本和v2017新版本,內(nèi)部名稱分別為rkdevelop和next-dev。用戶有兩個(gè)方式確認(rèn)當(dāng)前U-Boot是否為v2017版本。
方式1:確認(rèn)根目錄Makefile的版本號(hào)是否為2017。
#
## Chapter-1 SPDX-License-Identifier: GPL-2.0+
#
VERSION = 2017
PATCHLEVEL = 09
SUBLEVEL =
EXTRAVERSION =
NAME =
......
方式2:確認(rèn)開機(jī)第一行正式打印是否為 U-Boot 2017.09。
U-Boot 2017.09-01818-g11818ff-dirty (Nov 14 2019 - 11:11:47 +0800)
......
項(xiàng)目開源:v2017已開源且定期更新到Github: HYPERLINK "https://github.com/rockchip-linux/u-boot"
內(nèi)核版本:v2017要求RK內(nèi)核版本 >= 4.4
6.1.3 平臺(tái)編譯
6.1.3.1 下載rkbin
這是一個(gè)工具包倉庫,用于存放RK不開源的bin、腳本、打包工具。U-Boot 編譯時(shí)會(huì)從該倉庫索引相關(guān)
文件,打包生成loader、trust、uboot固件。rkbin和U-Boot工程必須保持同級(jí)目錄關(guān)系。
6.1.3.2 下載GCC
GCC編譯器使用gcc-linaro-6.3.1,放置于prebuilts目錄之內(nèi)。prebuilts和U-Boot保持同級(jí)目錄關(guān)系。如下:
// 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目錄下有大部分的平臺(tái)defconfig
選擇于我們板子默認(rèn)的deconfig即可:
rk3566.config
rk3568_defconfig
6.1.3.4 編譯
./make.sh [board] // [board]:configs/[board]_defconfig文件。
首次編譯:無論32位或64位平臺(tái),第一次或想重新指定defconfig,則編譯命令必須指定[board]。例如:
./make.sh rk3568 // build for rk3568_defconfig
二次編譯:無論32位或64位平臺(tái),如果要基于當(dāng)前".config"二次編譯,則編譯命令不用指定[board]:
./make.sh
注意:如果編譯時(shí)出現(xiàn)奇怪的問題導(dǎo)致編譯失敗,請(qǐng)嘗試 make distclean 后重新編譯。
固件生成:編譯完成后會(huì)在U-Boot根目錄下打包生成:trust、uboot、loader。
6.1.3.5 啟動(dòng)流程
RK平臺(tái)的U-Boot 啟動(dòng)流程如下,僅列出一些重要步驟:
start.s // 匯編環(huán)境
=> IRQ/FIQ/lowlevel/vbar/errata/cp15/gic // ARM架構(gòu)相關(guān)的lowlevel初始化
=> _main
=> stack // 準(zhǔn)備好C環(huán)境需要的棧
// 【第?階段】C環(huán)境初始化,發(fā)起?系列的函數(shù)調(diào)?
=> board_init_f: init_sequence_f[]
initf_malloc
arch_cpu_init // 【SoC的lowlevel初始化】
serial_init // 串口初始化
dram_init // 【獲取ddr容量信
reserve_mmu // 從ddr末尾開始往低地址reserve內(nèi)存
reserve_video
reserve_uboot
reserve_malloc
reserve_global_data
reserve_fdt
reserve_stacks
dram_init_banksize
sysmem_init
setup_reloc // 確定U-Boot??要reloc的地址
// 匯編環(huán)境
=> relocate_code // 匯編實(shí)現(xiàn)U-Boot代碼的relocation
// 【第?階段】C環(huán)境初始化,發(fā)起?系列的函數(shù)調(diào)?
=> 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 // 【平臺(tái)初始化,最核?部分】
board_debug_uart_init // 串口iomux、clk配置
init_kernel_dtb // 【切到kernel dtb】!
clks_probe // 初始化系統(tǒng)頻率
regulators_enable_boot_on // 初始化系統(tǒng)電源
io_domain_init // io-domain初始化
set_armclk_rate // __weak,ARM提頻(平臺(tái)有需求才實(shí)現(xiàn))
dvfs_init // 寬溫芯?的調(diào)頻調(diào)壓
rk_board_init // __weak,由各個(gè)具體平臺(tái)進(jìn)?實(shí)現(xiàn)
console_init_r
board_late_init // 【平臺(tái)late初始化】
rockchip_set_ethaddr // 設(shè)置mac地址
rockchip_set_serialno // 設(shè)置serialno
setup_boot_mode // 解析"reboot xxx"命令
// 識(shí)別按鍵和loader燒寫模式、recovery
charge_display // U-Boot充電
rockchip_show_logo // 顯?開機(jī)logo
soc_clk_dump // 打印clk tree
rk_board_late_init // __weak,由各個(gè)具體平臺(tái)進(jìn)行實(shí)現(xiàn)
run_main_loop // 【進(jìn)?命令行模式,或執(zhí)行啟動(dòng)命令】
6.1.3.6 快捷鍵
RK平臺(tái)提供串口組合鍵觸發(fā)一些事件用于調(diào)試、燒寫(如果無法觸發(fā),請(qǐng)多嘗試幾次;啟用secure-boot 時(shí)無效)。開機(jī)時(shí)長按:
ctrl+c:進(jìn)入 U-Boot 命令行模式;
ctrl+d:進(jìn)入 loader 燒寫模式;
ctrl+b:進(jìn)入 maskrom 燒寫模式;
ctrl+f:進(jìn)入 fastboot 模式;
ctrl+m:打印 bidram/system 信息;
ctrl+i:使能內(nèi)核 initcall_debug;
ctrl+p:打印 cmdline 信息;
ctrl+s:"Starting kernel..."之后進(jìn)入 U-Boot 命令行;
6.2 Kernel 開發(fā)
本節(jié)簡單介紹內(nèi)核一些常見配置的修改,主要是 dts 的配置,幫助客戶更快更方便的進(jìn)行一些簡單的修改。Kernel 版本以 4.4 作為基準(zhǔn),做相應(yīng)的介紹。
6.2.1 DTS 介紹
6.2.1.1 DTS 概述
早期版本的 Linux Kernel 是直接在板級(jí)配置文件配置板?相關(guān)的信息,如 IOMUX,默認(rèn)拉高/低的GPIO,每個(gè) I2C/SPI 總線下的 client 設(shè)備信息。為了摒棄這種‘hard code' 的方式,Linux引入設(shè)備樹(Device Tree)的概念來描述不同的硬件結(jié)構(gòu)。
Device Tree 數(shù)據(jù)可讀性較高,遵循 DTS 規(guī)范,通常被描述在.dtsi 和.dts 源文件。在內(nèi)核編譯的過程中,被編譯為.dtb 的二進(jìn)制文件。在開機(jī)啟動(dòng)階段,dtb 會(huì)被 bootloader(如 U-Boot)加載到 RAM 的某個(gè)地址空間,并且將該地址作為參數(shù)傳遞給 Kernel space。內(nèi)核解析整個(gè) dtb 文件,提煉每個(gè)設(shè)備信息以初始化。
本文旨在介紹如何新增一個(gè)的板子 dts 配置以及一些常見的 dts 語法說明,關(guān)于更詳細(xì) dts 的語法介紹不在本文范圍內(nèi),如有興趣,請(qǐng)參考: HYPERLINK "https://www.devicetree.org/specifications/" 和 HYPERLINK "https://www.kernel.org/doc/Documentation/devicetree/bindings/"
6.2.1.2 新增一個(gè)產(chǎn)品 DTS
創(chuàng)建 dts 文件
Linux Kernel 目前支持多平臺(tái)使用 dts,RK 平臺(tái)的 dts 文件存放于:
ARM:arch/arm/boot/dts/
ARM64:arch/arm64/boot/dts/rockchip
一般 dts 文件的命名規(guī)則為”soc-board-name.dts”,如 rk3568-evb-ddr4-linux.dts。
soc 指的是芯片型號(hào),board_name 一般是根據(jù)板子絲印來命名。
如果你的板子是一體板,則只需要一個(gè) dts 文件來描述即可。
如果硬件設(shè)計(jì)上是核心板和底板的結(jié)構(gòu),或者產(chǎn)品有多個(gè)產(chǎn)品形態(tài),可以把公用的硬件描述放在 dtsi 文件,而 dts 文件則描述不同的硬件模塊,并且通過 include "xxx.dtsi"將公用的硬件描述包含進(jìn)來。
├──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 的時(shí)候可以直接 make dts-name.img(如 rk3568-evb-ddr4-linux.img),即可生成對(duì)應(yīng)的 boot.img(包含 dtb 數(shù)據(jù))。
dts 語法的幾個(gè)說明
dts 語法可以像 c/c++?樣,通過#include xxx.dtsi 來包含其他公?的 dts 數(shù)據(jù)。dts 文件將繼承包含的 dtsi 文件的所有設(shè)備節(jié)點(diǎn)的屬性和值。如 property 在多個(gè) dts/dtsi 文件被定義,它的值最終為 dts 的定義。所有和芯片相關(guān)的控制器節(jié)點(diǎn)都會(huì)被定義在 soc.dtsi,如需使能該設(shè)備功能,需要在 dts 文件中設(shè)置其 status 為"okay"。關(guān)閉該設(shè)備,需要在 dts 文件中設(shè)置其 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 內(nèi)核模塊開發(fā)文檔
\docs\Common\目錄下分功能模塊發(fā)布了對(duì)應(yīng)的開發(fā)文檔,本節(jié)主要對(duì)這些開發(fā)文檔進(jìn)行一個(gè)歸納索引,大家結(jié)合實(shí)際開發(fā)遇到的問題,參照以下表格閱讀學(xué)習(xí)對(duì)應(yīng)的開發(fā)指南。
模塊功能 | 子目錄 | 對(duì)應(yīng)文檔 |
---|---|---|
音頻 | 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 時(shí)鐘配置 | CRU | Rockchip-Clock-Developer-Guide-RTOS-CN.pdfRockchip_RK3399_Developer_Guide_Linux4.4_Clock_CN.pdf |
JTAG GDB等常用調(diào)試 | 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等頻率電壓調(diào)節(jié) | DVFS | Rockchip_Developer_Guide_CPUFreq_CN.pdfRockchip_Developer_Guide_CPUFreq_EN.pdfRockchip_Developer_Guide_Devfreq_CN.pdfRockchip_Developer_Guide_Devfreq_EN.pdf |
以太網(wǎng) 配置 | 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 電量計(jì)、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 作為編號(hào)區(qū)分,以下為gpio引腳計(jì)算公式:
GPIO pin腳計(jì)算公式:pin = bank * 32 + number
GPIO 小組編號(hào)計(jì)算公式:number = group * 8 + X
所有的 GPIO 都默認(rèn)為輸入(input),可以用作中斷,軟件配置可控為上拉或者下拉,GPIO 的驅(qū)動(dòng)能力軟件可以配置。關(guān)于原理圖上的 GPIO 跟dts里面的 GPIO 的對(duì)應(yīng)關(guān)系,例如 GPIO4c0,那么對(duì)應(yīng)的 dts 里面應(yīng)該是“gpio4 16”。
GPIO的使用應(yīng)主要是否有引腳復(fù)用:
使用IO 命令查看寄存器的值配置在什么狀態(tài)
Io -4 -r 寄存器地址 //寄存器地址及狀態(tài)值需參考RK TRM文檔
使用cat pinmux-pins命令查看復(fù)用情況
cat /sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins
如果在dts存在復(fù)用情況則關(guān)閉對(duì)應(yīng)label
參考文檔:docs\Kernel\Pin-Ctrl\目錄下《Rockchip Pin-Ctrl 開發(fā)指南V1.0-20160725.pdf》
6.2.4UART
M68共10路uart口分別是uart0-uart9。
debug口
支持串口作為控制臺(tái)使用。M68和M66默認(rèn)使用uart2作為調(diào)試串口。
chosen: chosen {
bootargs = "earlycon=uart8250,mmio32,0xfe660000 console=ttyFIQ0 root=PARTUUID=614e0000-0000 rw rootwait";
};//參數(shù)含義 0xfe660000必須對(duì)應(yīng)使用的uart口地址 ttyFIQ0設(shè)備將被注冊(cè)成/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作為調(diào)試串口則此節(jié)點(diǎn)必須關(guān)閉。
};
dts配置:
如果修改之后調(diào)試串口依舊不能使用可修改paremeter.txt,添加調(diào)試串口:
CMDLINE:
console=ttyFIQ0 androidboot.console=ttyFIQ0 //添加控制臺(tái)
串口
dts配置rk3568-evb1-ddr4-v10-linux.dts
&uart3 {
pinctrl-names = "default";
pinctrl-0 = <&uart3m0_xfer>;
status = "okay";
};
串口調(diào)試也要注意是否復(fù)用,及確認(rèn)硬件使用的是uart0m0 還是uart0m1。
參考文檔 /docs/Common/uart/目錄下《Rockchip_Developer_Guide_UART_CN.pdf》
6.2.5i2c
M68有6個(gè)i2c控制器分別為i2c0~i2c5;其中i2c2~i2c5區(qū)分M0和M1具體使用看硬件走線。
通訊嚴(yán)格遵守i2c協(xié)議。一個(gè)i2c可掛載多個(gè)從設(shè)備。I2c有競爭仲裁機(jī)制,理論是可掛載127個(gè)設(shè)備。M68 和M66 i2c0外接PMU(power management unit)RK809.拿到板子及SDK請(qǐng)確認(rèn)電源域是否與硬件原理圖要求一致。
i2c調(diào)試
如果遇到i2c不通的情況,請(qǐng)確認(rèn)i2c地址,i2c電壓,i2c使用M0還是m1等沒有錯(cuò)誤。
可以使用底層命令去測(cè)試設(shè)備是否掛載以及是否正常通訊:
i2cdetect -r -y 3 查看i2c3上掛載的設(shè)備
i2cdump -f -y 3 0x43 查看器件所有寄存器的值,以總線3上0x43 這個(gè)器件為例
i2cget -f -y 3 0x43 0x01 看單個(gè)寄存器地址, 以總線3上0x43 0x01這個(gè)寄存器為例
i2cset -f -y 3 0x43 0x03 0x7f操作寄存器值, 以總線3上0x43 0x03這個(gè)寄存器為例
dts配置rk3568-evb1-ddr4-v10-linux.dts
&i2c4 {
clock-frequency = <400000>; //默認(rèn)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個(gè)HOST控制器集成EHCI/OHCI(usb1.0/usb2.0)2個(gè) HYPERLINK "https://bbs.16rd.com/citiao-jishu-OTG.html" \t "https://bbs.16rd.com/_blank" 控制器集成DWC3/xHCI(usb3.0/usb2.0)
M68底板集成一個(gè)USBHUB IC ,4G USB接口由HUB上引出,如需添加4G模塊,請(qǐng)確認(rèn)HUB狀態(tài)及5V電壓是否正常并在usb驅(qū)動(dòng)添加模組的uid及vid,具體添加4G模組參考對(duì)應(yīng)廠商提供的參考文檔。
具體USB驅(qū)動(dòng)加載以及dts配置請(qǐng)參考文檔:
/docs/Common/usb/目錄下《Rockchip_Developer_Guide_USB_CN.pdf》
6.2.7網(wǎng)口
M68有兩個(gè)百兆網(wǎng)口,都使用的RTL8201F PHYIC。為Ouput模式即MAC提供50M時(shí)鐘給PYH。
調(diào)試過程注意復(fù)用使用cat/sys/kernel/debug/pinctrl/pinctrl-rockchip-pinctrl/pinmux-pins
查看對(duì)應(yīng)接口狀態(tài)是否正確。dts參考配置:
&gmac0 {
phy-mode = "rmii"; //百兆網(wǎng)口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節(jié)點(diǎn)即可
&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>; //背光節(jié)點(diǎn)需要打開
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計(jì)算方法:(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必須關(guān)閉
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)總線,即控制器局域網(wǎng)總線。
dts參考:
&can1 {
assigned-clocks = <&cru 323>;
assigned-clock-rates = <150000000>; //修改can口時(shí)鐘頻率
pinctrl-names = "default";
pinctrl-0 = <&can1m1_pins>;
status = "okay";
};
CAN 通信測(cè)試:
#在收發(fā)端關(guān)閉
can0設(shè)備ip link set can0 down
#在收發(fā)端設(shè)置比特率為250Kbps
ip link set can0 type can bitrate 250000
#在收發(fā)端打開can0設(shè)備
ip link set can0 up
#在接收端執(zhí)行candump,阻塞等待報(bào)文
candump can0
#在發(fā)送端執(zhí)行cansend,發(fā)送報(bào)文
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)動(dòng)態(tài)電壓頻率調(diào)節(jié),是一種實(shí)時(shí)的電壓和頻率調(diào)節(jié)技術(shù)。目前 4.4 內(nèi)核中支持 DVFS 的模塊有 CPU、GPU、DDR。CPUFreq 是內(nèi)核開發(fā)者定義的一套支持動(dòng)態(tài)調(diào)整 CPU 頻率和電壓的框架模型。它能有效的降低 CPU 的功耗,同時(shí)兼顧 CPU 的性能。CPUFreq 通過不同的變頻策略,選擇?個(gè)合適的頻率供CPU使用,目前的內(nèi)核版本提供了以下幾種策略:
interactive:根據(jù) CPU 負(fù)載動(dòng)態(tài)調(diào)頻調(diào)壓;
conservative:保守策略,逐級(jí)調(diào)整頻率和電壓;
ondemand:根據(jù) CPU 負(fù)載動(dòng)態(tài)調(diào)頻調(diào)壓,比 interactive 策略反應(yīng)慢;
userspace:用戶自己設(shè)置電壓和頻率,系統(tǒng)不會(huì)自動(dòng)調(diào)整;
powersave:功耗優(yōu)先,始終將頻率設(shè)置在最低值;
performance:性能優(yōu)先,始終將頻率設(shè)置為最高值;
詳細(xì)的模塊功能及配置,請(qǐng)參考o(jì)cs/Common/DVFS/目錄下文檔。ARM/GPU/DDR 分別有對(duì)應(yīng)的調(diào)試接口,可以通過 ADB 命令進(jìn)?操作,對(duì)應(yīng)的接口目錄如下:
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/
這些目錄下有如下類似節(jié)點(diǎn):
available_frequencies:顯示支持的頻率
available_governors:顯示支持的變頻策略
cur_freq:顯示當(dāng)前頻率
governor:顯示當(dāng)前的變頻策略
max_freq:顯示當(dāng)前最高能跑的頻率
min_freq:顯示當(dāng)前最低能跑的頻率
以M68 M66 GPU 為例進(jìn)行定頻操作,流程如下:查看支持哪些頻率:
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 開發(fā)
6.3.1 簡介
Recovery機(jī)制的開發(fā),類似Android的Recovery功能開發(fā)。主要作用是擦除用戶數(shù)據(jù)和系統(tǒng)升級(jí)。
Linux中Recovery 模式是在設(shè)備上多?個(gè)Recovery分區(qū),該分區(qū)由kernel+resource+ramdisk 組成,主要用于升級(jí)操作。u-boot會(huì)根據(jù)misc分區(qū)存放的字段來判斷將要引導(dǎo)的系統(tǒng)是Normal 系統(tǒng)還是Recovery 系統(tǒng)。由于系統(tǒng)的獨(dú)立性,所以Recovery模式能保證升級(jí)的完整性,即升級(jí)過程被中斷,如異常掉電,升級(jí)仍然能繼續(xù)執(zhí)行。
6.3.2 調(diào)試
常用調(diào)試手段是開啟debug
buildroot/output/rockchip 芯片型號(hào) recovery/target 目錄下創(chuàng)建?個(gè)隱藏文件.rkdebug,
touch .rkdebug
Recovery 模式中升級(jí)的 log 在串口中打印出來。另外一種是通過查看 userdata/recovery/Log 文件
更多Recovery開發(fā)資料,參考文檔/docs/Linux/Recovery/Rockchip_Developer_Guide_Linux_Recovery_CN.pdf
6.4 Buildroot 開發(fā)
M68以及M66已經(jīng)配置好壞境變量,BSP配置和各模塊開發(fā),方便客戶開發(fā)和定制。默認(rèn)使用的config為:<SDK>/buildroot/configs/rockchip_rk3568_defconfig客戶可以通過使用
make ARCH=arm64 menuconfig來對(duì)buildroot進(jìn)行裁剪
6.4.1 環(huán)境變量的設(shè)定
source ./envsetup.sh (config_name)
6.4.2 編譯模塊和系統(tǒng)
選好編譯平臺(tái),接下來就可以編譯每?個(gè)package,它主要是config、build、install三部分組成
make <package>-reconfigure
make <package>-rebuild
make <package>-reinstall
清理包命令如下:
make <package>-dirclean
編譯Buildroot系統(tǒng),直接make即可
Make
6.4.3 開發(fā)相關(guān)模塊
相關(guān)package的開發(fā),可以參考 <SDK>/buildroot/package/*, 其中package/rockchip是Rockchip開發(fā)的 相關(guān)package.
6.4.4 定制相關(guān)模塊
參考/buildroot/configs/rockchip* 配置開關(guān),各模塊可自行定制開發(fā)。
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 開發(fā)
Rockchip提供了對(duì)Debian 10/11的?持,基于X11的顯示架構(gòu)。系統(tǒng)基于Linaro版本。添加一些圖形和視頻加速的支持。它包括libmali、xserver、gstreamer rockchip等package,這些packages通過docker搭建編譯相關(guān)deb包,存放在/debian/packages/*。
Docker搭建編譯deb package參考文檔
<SDK>/docs/Linux/ApplicationNote/Rockchip_Developer_Guide_Debian_Docker_EN.pdf
如果從網(wǎng)絡(luò)中獲取的時(shí)間與實(shí)際時(shí)間不一致,請(qǐng)?jiān)O(shè)置時(shí)區(qū)為中國上海
root#cp /usr/share/zoneinfo/Asia/ShangHai etc/localtime
也可在SDK中修改./debian/binary/etc/localtime設(shè)置時(shí)區(qū)
M68及M66 debian圖形顯示適配方案:X11/Xserver?前搭配是LXDE/XFCE輕量級(jí)桌?環(huán)境,桌?管理器使?lightdm,默認(rèn)桌面環(huán)境為lxde
LXDE桌面環(huán)境提供了一些基礎(chǔ)功能,如,攝像頭預(yù)覽,文件管理器,多媒體播放器,WiFi/BT 連接等。
Debian開發(fā)文檔參考
<SDK>/docs/Linux/ApplicationNote/Rockchip_Developer_Guide_Debian_CN.pdf
6.6 Yocto 開發(fā)
更多資料參考: HYPERLINK "https://opensource.rock-chips.com/wiki_Yocto"
6.7 多媒體開發(fā)
通過gstreamer/rockit來在rockchip平臺(tái)上做multimedia的開發(fā)
vpu_service --> mpp --> gstreamer --> app
vpu_service: 驅(qū)動(dòng)
mpp: rockchip平臺(tái)的視頻編解碼中間件,相關(guān)說明參考mpp?檔
gstreamer: 對(duì)接app的組件
目前rockchip提供的完整solution是基于gstreamer的,使用gstreamer的好處就是可以比較方便的基于pipeline的方式完整播放器,編碼器這些應(yīng)用。
具體資料參考:
/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 開發(fā)
Rockchip Linux平臺(tái)的Graphics,是應(yīng)用DRM和DMA-BUF的ARM Linux平臺(tái)。優(yōu)勢(shì)是,通用的架構(gòu),在基于此架構(gòu)進(jìn)?客制化開發(fā)較容易,可以利用很多現(xiàn)有組件,現(xiàn)有很多基礎(chǔ)開源項(xiàng)目的開發(fā),都開始基于Rockchip平臺(tái)來作為ARM端的適配平臺(tái)。但缺點(diǎn)是,很多人不是很理解這些內(nèi)容,實(shí)際應(yīng)用起來需要一個(gè)學(xué)習(xí)過程。更多資料可以參考Rockchip wiki和下面文檔。
<SDK>/docs/Linux/Graphics/
├── Rockchip_Developer_Guide_Linux_Graphics_CN.pdf
└── Rockchip_Developer_Guide_Linux_Graphics_EN.pdf
6.9 應(yīng)用開發(fā)
SDK常用應(yīng)用有Weston、QT、ROS等應(yīng)用開發(fā),參考/docs/Linux/Graphics/ApplicationNote目錄下文檔
6.10 安全機(jī)制開發(fā)
參考/docs/Linux/Security目錄下文檔
7. SDK 測(cè)試
7.1 Benchmark 測(cè)試
?些常?基準(zhǔn)測(cè)試的參考數(shù)據(jù),該測(cè)試文檔位于:
<SDK>/docs/Linux/Profile/Rockchip_Introduction_Linux_Benchmark_KPI_EN.pdf
7.2 Rockchip 模塊和壓力測(cè)試
提供一些常用模塊功能和壓力測(cè)試的方法,該文檔位于:
<SDK>/docs/Linux/Profile/Rockchip_User_Guide_Linux_Software_Test_CN.pdf
8. 常見問題(FAQ)
8.1 如何確認(rèn)當(dāng)前kernel和u-boot版本?
Linux 4.19對(duì)應(yīng)的kernel版本為:develop-4.19,u-boot為next-dev分支
8.2 Debian相關(guān)問題
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 是工程目錄路徑,然后重新編譯)
另外如果還有遇到其他編譯異常,先排除使用的編譯系統(tǒng)是 ext2/ext4 的系統(tǒng)類型。
8.2.2 下載"Base Debian"失敗問題
由于編譯 Base Debian 需要訪問國外網(wǎng)站,而國內(nèi)網(wǎng)絡(luò)訪問國外網(wǎng)站時(shí),經(jīng)常出現(xiàn)下載失敗的情況:
Debian 使用 live build,鏡像源改為國內(nèi)可以這樣配置:
32位系統(tǒng):
+++ 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位系統(tǒng):
--- 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 \
如果其他網(wǎng)絡(luò)原因不能下載包,有預(yù)編生成的包分享在百度云網(wǎng)盤,放在當(dāng)前目錄直接執(zhí)行下一步操作。
8.2.3 異常操作導(dǎo)致掛載/dev出錯(cuò)問題
比如出現(xiàn)這種 askpass command or cannot use one
引起原因可能是編譯過程頻繁異常操作(CTRL+C),導(dǎo)致上面出錯(cuò)的,可以通過如下方式修復(fù):
sudo -S umount /dev
8.2.4 怎么查看系統(tǒng)相關(guān)信息
如何查看系統(tǒng)Debian版本?
root@linaro-alip:~# cat /etc/debian_version
11.1
如何查看Debian顯示用X11還是Wayland?
在X11系統(tǒng)上:
$ echo $XDG_SESSION_TYPE
x11
在Wayland系統(tǒng)上:
$ echo $XDG_SESSION_TYPE
wayland
如何查看系統(tǒng)分區(qū)情況
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 系統(tǒng)出現(xiàn)ssh.service服務(wù)異常
這是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包編譯不過
會(huì)遇到類似如下報(bào)錯(cuò)
W: Failure trying to run: /sbin/ldconfig
W: See //debootstrap/debootstrap.log for details
主要要求PC的kernel版本是5.10+, 這是舊的QEMU存在的bug. 解決方法主要兩種:
PC自帶的內(nèi)核版本需滿足5.10+的需求。
檢查PC內(nèi)核版本
cat /proc/version
Linux version 5.13.0-39-generic
更新系統(tǒng)的qemu
參考 HYPERLINK "https://launchpad.net/~canonical-server/+archive/ubuntu/server-backports" 。
8.3 Linux視頻相關(guān)問題
8.3.1 播放視頻卡頓,日志出現(xiàn)丟幀錯(cuò)誤,要怎么解決
可以使用 fpsdisplaysink 確認(rèn)最高幀率,如果最高幀率接近期望幀率,可以通過指定sync=false 解決,部分平臺(tái)可以開啟 AFBC??D也可以看下硬件運(yùn)?時(shí)間,echo0x100 >/sys/module/rk_vcodec/parameters/mpp_dev_debug
8.3.2 gst-launch-1.0 進(jìn)?攝像頭視頻預(yù)覽命令
可以使用 v4l2src 插件,如 gst-launch-1.0 v4l2src ! autovideosink
8.3.3 開啟 AFBC 后播放畫?出現(xiàn)抖動(dòng),要怎么解決
畫面抖動(dòng)一般是 ddr 帶寬不足,可以嘗試固定性能模式。另外由于顯示硬件實(shí)現(xiàn)方式,垂直方向上如果有縮放,需要的性能和帶寬會(huì)比較高,容易不足,需要使?其他方式縮放(如rga/gpu)
8.3.4 Gstreamer 框架 buffer 是零拷貝嗎
使用dmabuf 相關(guān)接口進(jìn)行數(shù)據(jù)處理實(shí)現(xiàn)零拷貝
8.3.5 gst-launch-1.0 怎么測(cè)試解碼最高的性能?
設(shè)置性能模式,用官方的 fpsdisplaysink 查看幀率,以及驅(qū)動(dòng)的調(diào)試接口查看驅(qū)動(dòng)幀率
8.3.6 播放時(shí)如果畫面出現(xiàn)抖動(dòng),水波紋,要怎么解決
抖動(dòng)一般都是顯示硬件的性能不足,?部分是 ddr 帶寬不夠,可以用 ddr 性能模式,固定最高頻
8.3.7 Gstreamer怎么快速接入 opengles?
一般是合成上有 gl 插件支持,送顯上由第三?顯示服務(wù)支持,顯示服務(wù)內(nèi)部可以進(jìn)行opengles 合成(如 weston)
8.4顯示相關(guān)問題
8.4.1 如何使視頻送顯到視頻層
drm 有接口,可以查詢到 plane 的 type。具體可以參考 gstreamer 的 kmssink 方式。
8.4.2 wayland 多屏異顯模式如何配置每個(gè)屏幕的位置,比如左右或者上下位置的
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開發(fā)