前言
很多同学有疑问为什么要编译SDK,编译SDK看着挺麻烦的,不编译行不行?这个没有标准答案,如果你只想下载别人编译好的固件并且做一些应用层的开发那可以不用编译SDK,那如果你想自己去适配一些驱动,比如在内核中加入CH340驱动,或者点亮一款新的屏幕,又或者你想优化或者定制属于自己的东西,甚至制作一款自己的板子这都离不开SDK编译。SDK编译并不难,大家常见的一般也都是环境问题,跟着教程一步一步来不会有太大问题,如果出现一些特殊问题也欢迎一起交流。
视频教程
【新手必学Linux环境搭建】立创·泰山派RK3566 Linux开发板训练营第一课
环境
win10电脑配置:
虚拟机环境:
跟据VirtualBox编译环境搭建说明文档搭建的环境,如果你的环境不同可能会有其他意想不到的错误,建议新手朋友和我环境保持统一
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 18.04.6 LTS
Release: 18.04
Codename: bionic
2
3
4
5
6
原理图讲解:
Linux SDK
参考:Linux系统编译
下载SDK
Linux系统编译中提供了非repo版本的演示,这里我们就演示repo版本的,很多同学就会有疑问,repo是啥?为什么要用这个版本呢?
repo主要是用来管理git仓库的,有了repo你修改代码就会有记录,但是同样的也会比非repo版本占用空间大上一半资料在网盘:
需要下载的文件:
- 带repo版本的SDK
tspi_linux_sdk_repo_20240131.tar.gz
- 带repo版本的SDK校验文件
tspi_linux_sdk_repo_20240131_md5sum.txt
- buildroot相关库,如果你的网络比较差很有可能编译的时候自动下载失败报错,所以我提供了一个下载好的,直接代替可以避免错误
buildroot_dl_4c7c9df616fb.tar.gz
- buildroot相关库的校验文件
buildroot_dl_4c7c9df616fb_md5sum.txt
选择要下载的文件
直接通过百度网盘下载到我们前面搭建好的samba服务中,这选择浏览
找到你samba映射的盘符,我这里映射到x盘,并且命名为ex_disk_a在这个盘下面我新建了一个名为linux的目录来保存SDK相关文件
最终路径
下载完成
校验
校验的目的是为了防止下载过程中出现的错误,用md5sum 查看下载的SDK的md5值:a30f1d0fdb97ca994a82689fa26ba429
$ md5sum tspi_linux_sdk_repo_20240131.tar.gz
a30f1d0fdb97ca994a82689fa26ba429 tspi_linux_sdk_repo_20240131.tar.gz
2
在看一下我们给的mdk值看这里两个值是否一样,如果一样则正确
$ cat tspi_linux_sdk_repo_20240131_md5sum.txt
a30f1d0fdb97ca994a82689fa26ba429 tspi_linux_sdk_repo_20240131.tar.gz
2
buildroot_dl_4c7c9df616fb.tar.gz
也是和上面一样的操作
解压
在刚刚下载好的目录下运行,注意这个命令跟据电脑配置情况不同耗时不同,几分钟到个把小时不等
$ tar -xvzf tspi_linux_sdk_repo_20240131.tar.gz
sdk解压出来以后是一个.repo文件,.开头的文件会隐藏想要查看需要用ls --all命令
$ ls --all
. buildroot_dl_4c7c9df616fb_md5sum.txt .repo tspi_linux_sdk_repo_20240131.tar.gz
.. buildroot_dl_4c7c9df616fb.tar.gz tspi_linux_sdk_repo_20240131_md5sum.txt 下载前必读.txt
2
3
同步代码
解压完成后只有.repo目录我们还需要通过repo命令把代码同步出来,运行repo命令需要我们ubuntu安装有git和python否则会报错
更新软件包
sudo apt-get update
安装git
sudo apt-get install git -y
安装repo
sudo apt install repo -y
安装python2
sudo apt-get install python2.7
安装python3
sudo apt-get install python3
python版本切换设置,为什么要切换呢因为有时候我们会用python2有时候会用python3
$设置 python2.7
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
$设置 python3.6
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2
2
3
4
切换
sudo update-alternatives --config python
切换到python2.7
$ sudo update-alternatives --config python
There are 2 choices for the alternative python (providing /usr/bin/python).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/bin/python3.6 2 auto mode
1 /usr/bin/python2.7 1 manual mode
2 /usr/bin/python3.6 2 manual mode
Press <enter> to keep the current choice[*], or type selection number: 1
2
3
4
5
6
7
8
9
10
同步
.repo/repo/repo sync -l -j88
同步成功
dl库代替
前面我们有提到如果你的的网路不好buildroot的库可能有下载失败报错的问题,所以我们这里直接提供了下载好的库直接代替即可。
$ tar -xzf buildroot_dl_4c7c9df616fb.tar.gz
查看是否代替成功,注意路径不要错误了
ls buildroot/dl/
安装编译环境
sudo apt-get install 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 ncurses-dev
泰山派板级配置
泰山派SDK板级配置,选3. BoardConfig-rk3566-tspi-v10.mk
./build.sh lunch
编译buildroot系统
选择buildroot 注意每次关闭窗口以后要重新运行
export RK_ROOTFS_SYSTEM=buildroot
运行自动全编译命令,注意:只编译(u-Boot,kernel,Rootfs,Recovery)
编译完成以后需要再执⾏./mkfirmware.sh
进⾏固件打包,与./build.sh updateimg
生成镜像,很多小伙伴出现编译完成但烧录镜像不对都是因为没有执行这两个命令导致的。
./build.sh all
电源选择,选择不对会编译报错,这里大家记住除了VCCIO4和6选1.8V其他都选3V3,如果没有弹电源选择框则需要安装sudo apt install whiptail
后在重新编译。
全编译成功,如果你中途出现了报错请检查虚拟机是否按照教程搭建,环境安装是否有遗漏。如果这些都一致依然出现错误可以联系吴工
进⾏固件打包
./mkfirmware.sh
查看时间如果和你当前时间差不多那么就证明固件打包成功
下载固件,在win10中打开RKDevTool.exe工具,下载配置文件:
Tspi_linux_config.cfg配置文件下载
📌 在 下载中心
->百度网盘
->第06章.【立创·泰山派】系统镜像
->【镜像】Ubuntu
->Tspi_Linux_config.cfg
导入Tspi_linux_config.cfg配置文件,并把路径改成上面文件路径samba路径,接着操作按住泰山派REC按键不松,轻触一下RST按键等待进入Loader模式后松开REC按键,当工具发现一个LOADER设备后点击执行升级,演示如下:
我们上面打包的固件如果要分享给别人非常麻烦烧录的时候还需要加载配置文件,而且还是零散的,所以我们可以把他们打包成一个镜像。注意:执行这么命令前需要保证固件打包的是最新的,否则先./mkfirmware.sh在执行此命令
./build.sh updateimg
成功生成镜像
可以看到目录下比之前多了一个update.img文件,而且看时间也是最新的,之前有小伙伴没有执行上面命令就直接烧录update.img出现不是自己编译的固件情况这里再次强调需要先执行./mkfirmware.sh再执行./build.sh updateimg并且确保时间是最新的。
下载镜像,在win10中打开RKDevTool.exe工具,选择升级固件,并把路径改成上面文件路径samba路径,接着操作按住泰山派REC按键不松,轻触一下RST按键等待进入Loader模式后松开REC按键,当工具发现一个LOADER设备后点击执行升级,演示如下:
下载完成后等待一会HDMI会有视频画面输出,恭喜你至此就成功的编译和下载了buildroot系统
编译debian系统
选择debian 注意每次关闭窗口以后要重新运行
export RK_ROOTFS_SYSTEM=debian
切换到debian下安装编译环境
cd debian
安装编译环境
sudo apt-get install binfmt-support qemu-user-static live-build
sudo dpkg -i ubuntu-build-service/packages/*
运行命令报错不管直接跳过
因为可能有报错情况所以我们现修复一下
sudo apt-get install -f
环境配置完成以后切换回sdk目录
cd ..
运行单独编译debian
./build.sh debian
弹窗提示输入你的root密码输入回车即可
报错,这个问题,我们看报错应该是lb_config中相关配置文件问题,这里可以看到链接都是国外镜像源需要魔法,所以我们把这个链接改成国内镜像源
修改方法,我们之前都是使用vim去修改文件相信对这种方法大家已经很熟悉了,既然我们前面映射了samba那我们就直接在win10打开文件目录修改
我们这里编译64位的所以进入buster-desktop-arm64目录
把下面内容代替下图红框中的位置
--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" \
2
3
4
5
代替后的效果
在重新执行
./build.sh debian
输入root用户密码
恭喜你编译成功,如果你中途出现了报错请检查虚拟机是否按照教程搭建,环境安装是否有遗漏。如果这些都一致依然出现错误可以联系吴工
进⾏固件打包
./mkfirmware.sh
查看时间如果和你当前时间差不多那么就证明固件打包成功
带emmc版本下载固件,在win10中打开RKDevTool.exe工具,下载配置文件:
Tspi_linux_config.cfg配置文件下载
📌 在 下载中心
->百度网盘
->第06章.【立创·泰山派】系统镜像
->【镜像】Ubuntu
->Tspi_Linux_config.cfg
导入Tspi_linux_config.cfg配置文件,并把路径改成上面文件路径samba路径,接着操作按住泰山派REC按键不松,轻触一下RST按键等待进入Loader模式后松开REC按键,当工具发现一个LOADER设备后点击执行升级,演示如下:
我们上面打包的固件如果要分享给别人非常麻烦烧录的时候还需要加载配置文件,而且还是零散的,所以我们可以把他们打包成一个镜像。注意:执行这么命令前需要保证固件打包的是最新的,否则先./mkfirmware.sh在执行此命令
./build.sh updateimg
成功生成镜像,如果你中途出现了报错请检查虚拟机是否按照教程搭建,环境安装是否有遗漏。如果这些都一致依然出现错误可以联系吴工
可以看到目录下比之前多了一个update.img文件,而且看时间也是最新的,之前有小伙伴没有执行上面命令就直接烧录update.img出现不是自己编译的固件情况这里再次强调需要先执行./mkfirmware.sh
在执行./build.sh updateimg
并且确保时间是最新的。
带emmc版本下载镜像,在win10中打开RKDevTool.exe工具,选择升级固件,并把路径改成上面文件路径samba路径,接着操作按住泰山派REC按键不松,轻触一下RST按键等待进入Loader模式后松开REC按键,当工具发现一个LOADER设备后点击执行升级,演示如下:
非emmc版本制作TF镜像 TODO 下载完成等一会就hdmi会输出debian界面,系统的账号和密码都是linaro,看到下面界面那么恭喜你已经成功的编译并下载了debian
编译ubuntu系统
后面会放一个脚本出来,如果着急的同学也可以先联系吴工
单独编译kernel(只适合带emmc版本)
前面我们都是走的全编译,因为需要编译和下载很多东西所以非常慢,而且占用空间也很大,如果你只是单纯的修改一些配置、驱动或者设备树(新手同学可以理解为内核的xml配置文件,后面我们会去讲)单独编译和烧录内核就行这样速度快有利于调试。 编译命令
./build.sh kernel
编译完成
单独烧录boot.img固件,在win10中打开RKDevTool.exe工具,下载配置文件:
Tspi_linux_config.cfg配置文件下载
📌 在 下载中心
->百度网盘
->第06章.【立创·泰山派】系统镜像
->【镜像】Ubuntu
->Tspi_Linux_config.cfg
导入Tspi_linux_config.cfg配置文件,勾选boot选项其他去掉,在把boot选项路径切换到kernel下的boot.img,接着操作按住泰山派REC按键不松,轻触一下RST按键等待进入Loader模式后松开REC按键,当工具发现一个LOADER设备后点击执行升级,演示如下:
Android11 SDK
下载SDK
Android系统编译编译中提供了非repo版本的演示,这里我们就演示repo版本的,很多同学就会有疑问,repo是啥?为什么要用这个版本呢?
repo主要是用来管理git仓库的,有了repo你修改代码就会有记录,但是同样的也会比非repo版本占用空间大上一半资料在网盘:
需要下载的文件:
- 带repo版本的SDK
tspi_android_sdk_repo_20240202.tar.gz
- 带repo版本的SDK校验文件
tspi_android_sdk_repo_20240202_md5sum.txt
选择要下载的文件
直接通过百度网盘下载到我们前面搭建好的samba服务中,这选择浏览找到你samba映射的盘符,我这里映射到x盘,并且命名为ex_disk_a在这个盘下面我新建了一个名为android的目录来保存SDK相关文件
最终路径
下载完成
校验 校验的目的是为了防止下载过程中出现的错误,用md5sum 查看下载的SDK的md5值:16936e9c6074ad753d50655ae53382ed
md5sum tspi_android_sdk_repo_20240202.tar.gz
16936e9c6074ad753d50655ae53382ed tspi_android_sdk_repo_20240202.tar.gz
2
在看一下我们给的mdk值看这里两个值是否一样,如果一样则正确
cat tspi_android_sdk_repo_20240202_md5sum.txt
16936e9c6074ad753d50655ae53382ed tspi_android_sdk_repo_20240202.tar.gz
2
最终效果
解压
在刚刚下载好的目录下运行,注意这个命令跟据电脑配置情况不同耗时不同,几分钟到个把小时不等,解压完成后可以删除tspi_android_sdk_repo_20240202.tar.gz
以减小空间
$ tar -xzf tspi_android_sdk_repo_20240202.tar.gz
sdk解压出来以后是一个.repo文件,.
开头的文件会隐藏想要查看需要用ls --all
命令
同步代码 解压完成后只有.repo目录我们还需要通过repo命令把代码同步出来,运行repo命令需要我们ubuntu安装有git和python否则会报错 更新软件包(前面安装过就不用再安装了)
sudo apt-get update
安装git(前面安装过就不用再安装了)
sudo apt-get install git -y
安装repo(前面安装过就不用再安装了)
sudo apt install repo -y
安装python2(前面安装过就不用再安装了)
sudo apt-get install python2.7
安装python3(前面安装过就不用再安装了)
sudo apt-get install python3
python版本切换设置,为什么要切换呢因为有时候我们会用python2有时候会用python3(前面做过了就不用再重复了)
$设置 python2.7
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7 1
$设置 python3.6
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.6 2
2
3
4
切换
sudo update-alternatives --config python
切换到python3.6
$ sudo update-alternatives --config python
There are 2 choices for the alternative python (providing /usr/bin/python).
Selection Path Priority Status
------------------------------------------------------------
* 0 /usr/bin/python3.6 2 auto mode
1 /usr/bin/python2.7 1 manual mode
2 /usr/bin/python3.6 2 manual mode
Press <enter> to keep the current choice[*], or type selection number: 2
2
3
4
5
6
7
8
9
10
同步
.repo/repo/repo sync -l -j88
同步成功
切换到开发板分支
cd kernel/ && git clean -xdf && cd .. && repo forall -c "git checkout lckfb-tspi-v1.0.0"
命令解析,首先到cd kernel
目录下git clean -xdf
清除掉差异否则会同步失败,这个问题下一版解决,然后cd ..
退回到SDK目录下
repo forall -c "git checkout lckfb-tspi-v1.0.0"
通过repo命令切换到泰山派分支
安装编译环境
sudo apt-get update && sudo apt-get install -y git python make openjdk-8-jdk git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libgl1-mesa-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libxml2-utils xsltproc unzip python bc imagemagick ccache schedtool libssl-dev libncursesw5-dbg libncursesw5-dev libncurses5 libncursesw5 libncursesada5-dev libncurses5-dbg libncurses5-dev libncursesada-doc libncursesada5 libncurses-dev libncurses-gst libncurses5-dev clang
全编译Android11
这个命令会编译boot、kernel、android
cd u-boot && ./make.sh rk3566 && cd ../kernel && make clean && make distclean && make ARCH=arm64 tspi_defconfig rk356x_evb.config android-11.config && make ARCH=arm64 tspi-rk3566-user-v10.img -j16 && cd .. && source build/envsetup.sh && lunch rk3566_tspi-userdebug && make installclean -j16 && make -j16 && ./mkimage.sh
电源选择,选择不对会编译报错,这里大家记住除了VCCIO4和6选1.8V其他都选3V3,如果没有弹电源选择框则需要安装sudo apt install whiptail
后在重新编译。
恭喜你编译成功,我的电脑i7-9700,32G花费4小时26分钟(第一次用时会比较久后面不make clean的话全编译就几分钟),如果你中途出现了报错请检查虚拟机是否按照教程搭建,环境安装是否有遗漏。如果这些都一致依然出现错误可以联系吴工
进⾏固件打包
./mkimage.sh
看一下时间是否和你编译时间接近确保打包成功
$ ls rockdev/Image-rk3566_tspi/ -l
下载固件,在win10中打开RKDevTool.exe工具,下载配置文件:
Tspi_linux_config.cfg配置文件下载
📌 在 下载中心
->百度网盘
->第06章.【立创·泰山派】系统镜像
->【镜像】Android
->Android_All_Config.cfg
导入配置文件,并把路径改成上面文件路径samba路径,接着操作按住泰山派REC按键不松,轻触一下RST按键等待进入Loader模式后松开REC按键,当工具发现一个LOADER设备后点击执行升级,演示如下:
我们上面打包的固件如果要分享给别人非常麻烦烧录的时候还需要加载配置文件,而且还是零散的,所以我们可以把他们打包成一个镜像。注意:执行这么命令前需要保证固件打包的是最新的,否则先./mkimage.sh在执行此命令
./build.sh -u
成功生成镜像
可以看到目录下比之前多了一个update.img文件,而且看时间也是最新的,之前有小伙伴没有执行上面命令就直接烧录update.img出现不是自己编译的固件情况这里再次强调需要先执行 ./mkimage.sh再执行./build.sh -u并且确保时间是最新的。
下载镜像,在win10中打开RKDevTool.exe工具,选择升级固件,并把路径改成上面文件路径samba路径,接着操作按住泰山派REC按键不松,轻触一下RST按键等待进入Loader模式后松开REC按键,当工具发现一个LOADER设备后点击执行升级,演示如下:
下载完成后等待一会HDMI会有视频画面输出,恭喜你至此就成功的编译和下载了android系统
单独编译kernel(只适合带emmc版本)
前面我们都是走的全编译,因为需要编译和下载很多东西所以非常慢,而且占用空间也很大,如果你只是单纯的修改一些配置、驱动或者设备树(新手同学可以理解为内核的xml配置文件,后面我们会去讲)单独编译和烧录内核就行这样速度快有利于调试。
编译命令【执行全编译命令成功之后,编译内核】
make ARCH=arm64 BOOT_IMG=../rockdev/Image-rk3566_tspi/boot.img tspi-rk3566-user-v10.img -j72
编译命令【 没有执行全编译命令,直接编译内核】【进入kernel目录】
make ARCH=arm64 tspi_defconfig rk356x_evb.config android-11.config && make ARCH=arm64 tspi-rk3566-user-v10.img -j$(nproc) && cd .. && source build/envsetup.sh && lunch rk3566_tspi-userdebug && make installclean -j$(nproc) && make -j$(nproc) && ./mkimage.sh
编译完成
单独烧录boot.img固件,在win10中打开RKDevTool.exe工具,下载配置文件:
Android_Tspi_Kernel.cfg配置文件下载
📌 在 下载中心
->百度网盘
->第06章.【立创·泰山派】系统镜像
->【镜像】Android
->Android_Tspi_Kernel.cfg
导入Android_Tspi_Kernel.cfg配置文件,勾选boot选项其他去掉,在把boot选项路径切换到kernel下的boot.img,接着操作按住泰山派REC按键不松,轻触一下RST按键等待进入Loader模式后松开REC按键,当工具发现一个LOADER设备后点击执行升级,演示如下:
单独编译驱模块
适合于Android和linux,前提是你完成了上面的全编译并且烧录成功固件的基础上进行的,我们为了改一个驱动去编译kernel然后在下载时间还是很慢的,如果单纯值修改了驱动我们完全可以直编译驱动模块然后放到开发板中去加载。这里以一个my_touch驱动为列
配置Makefile
驱动中的Makefile如果obj-y就是编译到内核obj-m就是编译到模块,这里一般不会直接写出来都是有由一个config变量来确定,例如我们需要把my_touch驱动编译成模块所以my_touch目录下的Makefile中要改成obj-m
#如果编译成.ko的话就选obj-m,如果编译到内核就obj-y
obj-m += my_touch.o
2
单独编译驱动生成my_touch.ko
kernel$ make ARCH=arm64 -C . M=./drivers/input/touchscreen/my_touch
make
命令用于构建 Linux 内核或内核模块。ARCH=arm64
指定了目标架构为 64 位 ARM 架构-C
. 指定了内核源代码目录为当前目录M=./drivers/input/touchscreen/my_touch/
指定了我们触摸也就是要构建的内核模块所在的相对路径为./drivers/input/touchscreen/my_touch/
。
加载my_touch.ko
通过adb把my_touch.ko push到泰山派里面去
adb root && adb remount && adb push Z:\tspi\Android11_20231007\PublicVersion\kernel\drivers\input\touchscreen\my_touch\my_touch.ko /vendor/lib/modules
adb root
: 这个命令会尝试获取 Android 设备的 root 权限。在有些设备上,访问/vendor/lib/modules
目录需要 root 权限。adb remount
: 这个命令会重新挂载文件系统,通常用于将文件系统从只读模式切换为可读写模式。因为你要往 /vendor/lib/modules 目录写入文件,所以需要将其挂载为可读写。adb push
Z:\tspi\Android11_20231007\PublicVersion\kernel\drivers\input\touchscreen\my_touch\my_touch.ko /vendor/lib/modules:
这个命令的格式是adb push <本地路径> <目标路径>
,它会将本地路径下的文件推送到目标路径。在这里,my_touch.ko
是你要推送的文件,它位于Z:\tspi\Android11_20231007\PublicVersion\kernel\drivers\input\touchscreen\my_touch\
这个本地路径下。它将被推送到 Android 设备的/vendor/lib/modules
目录中。
adb进入shell
安装驱动
rk3566_tspi:/ # insmod /vendor/lib/modules/my_touch.ko
查看驱动是否安装成功
rk3566_tspi:/ # lsmod
Module Size Used by
my_touch 16384 0
bcmdhd 1175552 0
2
3
4