SDK 开发环境搭建
LubanCat_Gen_SDK是基于Ubuntu LTS 系统开发测试的,在开发过程中,主要是用Ubuntu 20.04版本, 推荐用户使用Ubuntu20.04或Ubuntu22.04,不支持Ubuntu20.04以下版本开发。
硬件配置推荐:64位系统,硬盘空间⼤于80G。如果您进⾏多个构建,将需要更⼤的硬盘空间。
安装SDK依赖的软件包
1 2 3 4 5 6 7 8 9 | # 安装SDK构建所需要的软件包 # 整体复制下面内容到终端中安装 sudo apt-get update && sudo apt-get install git ssh make gcc libssl-dev \ liblz4-tool expect expect-dev 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 \ libgucharmap-2-90-dev bzip2 expat gpgv2 cpp-aarch64-linux-gnu libgmp-dev \ libmpc-dev bc python-is-python3 python3-pip python2 u-boot-tools curl \ python3-pyelftools dpkg-dev |
3.4. 安装repo
repo是google⽤Python脚本写的调⽤git的⼀个脚本,主要是⽤来下载、管理项⽬的软件仓库。
1 2 3 4 5 6 7 | mkdir ~/bin curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo # 如果上面的地址无法访问,可以用下面的: # curl -sSL 'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo chmod a+x ~/bin/repo echo PATH=~/bin:$PATH >> ~/.bashrc source ~/.bashrc |
执行完上面的命令后来验证repo是否安装成功能正常运行。
123456789 10 11 12 13 | repo --version#返回以下信息 #返回的信息根据Ubuntu版本的不同略有差异 <repo not installed> repo launcher version 2.32(from /home/he/bin/repo) git 2.25.1 Python 3.8.10 (default, Nov 14 2022, 12:59:47) [GCC 9.4.0] OS Linux 5.15.0-60-generic (#66~20.04.1-Ubuntu SMP Wed Jan 25 09:41:30 UTC 2023) CPU x86_64 (x86_64) Bug reports: https://bugs.chromium.org/p/gerrit/issues/entry?template=Repo+tool+issue |
3.5. SDK源码获取
LubanCat_Gen_SDK的代码被划分为了若干git仓库分别进行版本管理, 可以使用repo工具对这些git仓库进行统一的下载,提交,切换分支等操作。
运行以下命令,将在当前用户的家目录下创建一个名为LubanCat_SDK的目录,用来放入SDK源码。
1 | mkdir ~/LubanCat_SDK |
3.5.1. 切换Python 3 版本
1 2 | #查看当前Python版本 python -V |
若返回的版本号为Python3版本,则无需再切换Python版本。若为Python2版本或未发现python,则可以用以下方式切换:
1 2 3 4 5 6 7 8 | #查看当前系统安装的Python版本有哪些 ls /usr/bin/python*#将python链接到python3 sudo ln -sf /usr/bin/python3 /usr/bin/python#重新查看默认Python版本 python -V |
此时系统默认Python版本切换为python3
3.5.2. Git配置
设置自己的git信息,以确保后续拉取代码时正常进行,如果不需要提交代码的话可以随意设置用户名和邮箱地址。
1 2 | git config --global user.name "your name" git config --global user.email "your mail" |
3.5.3. SDK在线下载并同步
LubanCat_Gen_SDK源码可以在线获取,源码托管在Github。由于在线下载的方式要从Github拉取大量的仓库, 体积很大,对于不能快速访问Github的用户不建议使用这种方式。
1 2 3 4 5 6 7 8 9 | cd ~/LubanCat_SDK# 拉取LubanCat_Linux_Generic_SDK repo init -u https://github.com/LubanCat/manifests.git -b linux -m lubancat_linux_generic.xml#如果运行以上命令失败,提示:fatal: Cannot get https://gerrit.googlesource.com/git-repo/clone.bundle #则可以在以上命令中添加选项 --repo-url https://mirrors.tuna.tsinghua.edu.cn/git/git-repo.repo/repo/repo sync -c -j4 |
如果同步失败可以重新运行sync命令来同步
3.5.4. SDK离线安装下载
由于Github服务器在国外,拉取这么多的仓库需要很多时间,还可能因为网络不畅通而导致下载失败。 为此,我们将需要使用的仓库整体打包,使用网盘下载的方式,以减少连接Github导致的问题。
3.5.4.1. 下载地址
访问百度网盘资源介绍页面获取SDK源码压缩包: 8-SDK源码压缩包
下载最新日期的LubanCat_Linux_Generic_SDK压缩包即可。
注解
在开发过程中,当SDK源码进入Release版本或有重大Bug时,将会更新源码压缩包。源码压缩包解压到本地后,当有Release版本更新时,可以借助Github更新到最新版本。
3.5.4.2. 解压源码
以下过程以LubanCat_Linux_Generic_SDK进行演示,实际文件名称以自己下载的SDK为准
123456789 10 11 12 13 14 15 16 17 18 19 20 | # 安装tar压缩工具,一般来说系统默认安装了 sudo apt install tar# 在用户家目录创建LubanCat_SDK目录 mkdir ~/LubanCat_SDK# 将下载的SDK源码移动到LubanCat_SDK目录下,xxx为日期 mv LubanCat_Linux_Generic_SDK_xxx.tgz ~/LubanCat_SDK# 进入LubanCat_SDK目录 cd ~/LubanCat_SDK# 解压SDK压缩包 tar -xzvf LubanCat_Linux_Generic_SDK_xxx.tgz# 检出.repo目录下的git仓库 .repo/repo/repo sync -l# 将所有的源码仓库同步到最新版本 .repo/repo/repo sync -c |
如果repo sync -c执行时提示网络连接超时,请检查并能否通畅访问github。 确认可以正常访问github的话,可以重复多次执行repo sync -c命令来进行同步。 若无法访问github,可以忽略同步源码仓库到最新版本这一步骤。
解压完成后checkout到指定的提交。
一般情况下网盘保存的离线源码包已经是最新版本,如果距离离线源码包下载时间不久,可以忽略从Github在线更新这一步。
3.5.5. SDK更新
我们会对LubanCat_Gen_SDK不断更新,并将修改的内容实时同步到Github, 如果需要在本地LubanCat_Gen_SDK同步更新内容,则可以借助repo或git来实现。
3.5.5.1. 使用repo更新整个SDK
使用repo可以将SDK更新到提供的最新版本。
首先要更新.repo/manifests,里面保存了repo的配置文件,记录了仓库的版本信息。
123456789 10 11 12 13 14 | # 进入.repo/manifests目录 cd .repo/manifests# 切换分支到Linux git checkout linux# 拉取最新的manifests git pull#进入SDK根目录 cd ~/LubanCat_SDK# 同步远端仓库 .repo/repo/repo sync -c |
3.5.5.2. 使用Git更新单独的源码仓库
有时只想更新某个仓库,而不是去更新整个SDK。 或者已经对SDK的某些仓库做出了修改,使用repo同步的话就会失败。 此时就需要对单个仓库进行更新了。
注解
不同SDK或板卡使用的分支不同,详细分支支持情况请查看本文档 Linux内核的编译 章节
这里以Kernel-5.10仓库为例
123456789 10 | # 进入kernel-5.10目录下 cd kernel-5.10# 检出到当前提交所在的分支 # 可以查看.repo/manifests/lubancat_linux/lubancat_linux_generic_release.xml # name="kernel-5.10"条目中dest-branch就是要切换的分支 git checkout lbc-develop-5.10# 拉取git仓库 git pull |
3.6. LubanCat_Gen_SDK自动构建
LubanCat_Gen_SDK的构建脚本可以实现自动构建,具体操作方式如下:
以下文档以使用rk3588主芯片的板卡为例,使用其他型号芯片的板卡操作方法类似。
在SDK根目录下,执行以下命令,以选择要构建的板卡主芯片型号和SDK的配置文件。
123456789 10 11 12 13 14 15 16 17 18 19 20 21 | # 选择SDK配置文件 ./build.sh chip1. rk312x 2. rk3528 3. rk3562 4. rk3566_rk3568 5. rk3576 6. rk3588# 输入想要构建的板卡主芯片型号的编号,并确认,这里选择rk3588。 Which would you like? [1]: 5# 选择要构建的根文件系统配置文件 1. rockchip_defconfig 2. LubanCat_rk3588_debian_gnome_defconfig 3. LubanCat_rk3588_debian_lite_defconfig 4. LubanCat_rk3588_ubuntu_gnome_defconfig 5. LubanCat_rk3588_ubuntu_lite_defconfig 6. LubanCat_rk3588_ubuntu_xfce_defconfig Which would you like? [1]: 2 |
注解
芯片型号编号和配置文件编号顺序可能发生变化,以实际为准。
如果在编译完一个主芯片的工程后需要切换编译其他的主芯片,要先用以下命令清理SDK, 防止由缓存或编译环境引起的编译错误。
1 2 3 4 5 | # 清除整个SDK的 ./build.sh cleanall# 选择SDK配置文件 ./build.sh chip |
如果已经选择过了主芯片并且不需要切换主芯片,而是要切换同一主芯片的其他板卡或文件系统类型, 则不需要清理SDK。
1 2 3 4 5 | # 选择SDK配置文件 ./build.sh lunch# 输入想要构建的板卡及文件系统配置文件编号,并确认,这里选择配置文件LubanCat_rk3588_debian_gnome_defconfig。 Which would you like? [0]: 2 |
也可以直接设置SDK配置文件,方法如下
1 2 | # 选择构建LubanCat-RK3588系列板卡debian系统gnome桌面镜像 ./build.sh LubanCat_rk3588_debian_gnome_defconfig |
当选择完配置文件以后,会使用粉色提示字体提示当前配置文件所用的内核版本, 如果配置文件中指定的内核版本与当前使用的内核(kernel目录)版本不一致,则会自动切换内核版本。
123456789 10 11 | # 括号中显示配置文件中指定的内核版本 # 指定使用Kernel-5.10 Using preferred kernel version(5.10) # 指定使用Kernel-6.1 Using preferred kernel version(5.10)# 当配置文件指定的内核版本和SDK中的不一致时自动切换内核版本。 # 将SDK使用的内核切换为5.10 Switching to kernel-5.10 # 将SDK使用的内核切换为6.1 Switching to kernel-6.1 |
选择SDK配置文件以后,还要安装debian根文件系统构建依赖的软件包,操作如下。
1 2 3 4 | # 安装本地软件包 # 如果SDK中debian目录是具体的debian11或者debian12,需要将下面命令中的debian目录路径替换为实际的路径。都有则选择较高版本的安装。 sudo dpkg -i debian/ubuntu-build-service/packages/* sudo apt-get install -f |
注意
由于debian和ubuntu根文件系统不同版本构建所需的依赖包版本不同,当切换了根文件系统版本的选择以后,就需要根据自己所选的根文件系统版本安装不同的依赖包。
如果选择了ubuntu根文件系统的SDK配置文件,就需要安装ubuntu根文件系统构建的依赖软件包,操作如下。
1 2 3 4 | #安装本地软件包 # 如果SDK中ubuntu目录是具体的ubuntu20.04或者ubuntu22.04,需要将下面命令中的ubuntu目录路径替换为实际的路径。都有则选择较高版本的安装。 sudo dpkg -i ubuntu/ubuntu-build-service/packages/* sudo apt-get install -f |
安装过程中可能会报错,这是正常现象,忽略即可。待软件包安装完成后,就可以进行一键构建了。
1 2 | # 一键编译u-Boot,kernel,Rootfs并打包为update.img镜像 ./build.sh |
警告
如果在编译过程中出现如下图所示的提示,请根据对应设备树文件中的&pmu_io_domains节点中的电压值选择, 并注意顺序从pmuio2-supply开始。其中vccio_acodec为3v3、vccio_sd为3v3。
构建好的镜像保存在rockdev/目录下,可以继续使用 ./build.sh release 命令在output-release/目录下进行镜像压缩归档。
3.7. LubanCat_Gen_SDK分步构建
在进行固件开发时,一键构建就显得过于耗时了,每一个改动都要构建整个镜像并重新打包, 这无疑是巨大的时间浪费。此时可以使用SDK单个模块构建的功能。
3.7.1. 选择SDK配置文件
首先,还是要选择SDK的配置文件,如果已经选择过了则这一步可以跳过,这里以LubanCat-RK3588系列板卡的debian系统gnome桌面镜像为例
1 2 | # 选择SDK配置文件 ./build.sh LubanCat_rk3588_debian_gnome_defconfig |
3.7.2. U-Boot构建
1 | ./build.sh uboot |
构建生成的U-boot镜像为u-boot/uboot.img
3.7.3. Kernel构建
extboot分区内核镜像,要先生成内核deb包,然后再编译内核并将生成的deb包打包进extboot分区。
按顺序执行以下命令,将自动完成 kernel 的构建及打包。
1 2 3 | ./build.sh kerneldeb./build.sh extboot |
构建生成的kernel镜像为kernel/extboot.img
3.7.4. rootfs构建
LubanCat主要支持Ubuntu、Debian、OpenWrt这几种rootfs, 不同rootfs的构建过程不同,这里分开说明。
注解
由于OpenWrt系统的构建不使用LubanCat_Gen_SDK,所以不在此处说明,具体构建过程查看LubanCatWRT构建说明
3.7.4.1. Debian
目前提供debian11/debian12的根文件系统构建脚本,Kernel-5.10搭配debian11,Kernel-6.1则搭配debian12。 具体的对应情况在SDK配置文件中已经配置好,用户无需特殊关心。
首先要确保SDK的配置文件与要构建的rootfs一致, 如果当前配置文件与要构建的rootfs不一致,需要先切换配置文件。
1 2 3 4 5 | # 选择SDK配置文件 ./build.sh LubanCat_rk3588_debian_gnome_defconfig# 构建Debian ./build.sh debian |
生成的根文件系统镜像的命名规则是linaro-(SOC型号)-(桌面版本)-rootfs.img,保存在对应的debian11或debian12目录下。
刚刚构建生成的rk3588的rootfs镜像为debian11/linaro-rk3588-gnome-rootfs.img,这个镜像还会被软链接到rockdev/rootfs.img用于系统镜像打包。
注意
为了加速SDK构建效率,只有不存在已经构建好的根文件系统镜像时才会重新编译根文件系统。如果要重新构建根文件系统,需要先手动删除根文件系统镜像文件。以rk3588为例,我们需要删除debian/linaro-rk3588-gnome-rootfs.img后重新构建镜像时才会重新构建Debian根文件系统。
由于从头构建根文件系统会从网络获取很多文件,并且耗费很多时间。不需要自行构建根文件系统的用户可以将发布的系统镜像中的rootfs分区提取出来直接使用。
rootfs分区提取需要使用解包工具,使用方法请查看本文档 完整镜像的解包和打包 章节。
提取出rootfs.img镜像以后,将rootfs.img镜像移动到SDK目录下与配置文件对应的debian11或debian12目录中,并将解包的系统镜像的名称重命名为linaro-(SOC型号)-(桌面版本)-rootfs.img,如linaro-rk3588-gnome-rootfs.img。
注意
rk3566和rk3568共用同一个根文件系统镜像,SOC型号需要设置为rk356x,如linaro-rk356x-xfce-rootfs.img
重命名完成后,重新选择与根文件系统镜像一致的配置文件进行编译
1 2 3 4 5 6 7 8 9 | # 选择SDK配置文件 ./build.sh LubanCat_rk3588_debian_gnome_defconfig# 构建Debian ./build.sh debian# 返回的提示信息:跳过镜像构建,删除rootfs镜像后以便重新构建Debian根文件系统镜像 [ Already Exists IMG, Skip Make Debian Scripts ] [ Delate linaro-rk3588-gnome-rootfs.img To Rebuild Debian IMG ] |
如果返回的信息与文中一致,则使用解包后的根文件系统镜像成功
3.7.4.2. Ubuntu
目前提供20.04/22.04的根文件系统构建脚本,Kernel-5.10搭配Ubuntu20.04,Kernel-6.1则搭配Ubuntu22.04。 具体的对应情况在SDK配置文件中已经配置好,用户无需特殊关心。
首先要确保SDK的配置文件与要构建的rootfs一致, 如果当前配置文件与要构建的rootfs不一致,需要先切换配置文件。
1 2 3 4 5 | # 选择SDK配置文件 ./build.sh LubanCat_rk3588_ubuntu_gnome_defconfig# 构建Ubuntu ./build.sh ubuntu |
生成的根文件系统镜像的命名规则是ubuntu-(SOC型号)-(桌面版本)-rootfs.img,保存在对应的ubuntu20.04或ubuntu22.04目录下。
刚刚构建生成的rk3588的rootfs镜像为ubuntu/ubuntu-rk3588-gnome-rootfs.img,这个镜像还会被软链接到rockdev/rootfs.img用于系统镜像打包。
注意
为了加速SDK构建效率,只有不存在已经构建好的根文件系统镜像时才会重新编译根文件系统。如果要重新构建根文件系统,需要先手动删除根文件系统镜像文件。以rk3588为例,我们需要删除ubuntu20.04/ubuntu-rk3588-gnome-rootfs.img时后重新构建镜像时才会重新构建Debian根文件系统。
由于从头构建根文件系统会从网络获取很多文件,并且耗费很多时间。不需要自行构建根文件系统的用户可以将发布的系统镜像中的rootfs分区提取出来直接使用。
rootfs分区提取需要使用解包工具,使用方法请查看本文档 完整镜像的解包和打包 章节。
提取出rootfs.img镜像以后,将rootfs.img镜像移动到SDK目录下与配置文件对应的ubuntu20.04或ubuntu22.04目录中,并将解包的系统镜像的名称重命名为ubuntu-(SOC型号)-(桌面版本)-rootfs.img,如ubuntu-rk3588-gnome-rootfs.img。
注意
rk3566和rk3568共用同一个根文件系统镜像,SOC型号需要设置为rk356x,如ubuntu-rk356x-xfce-rootfs.img
重命名完成后,重新选择与根文件系统镜像一致的配置文件进行编译
1 2 3 4 5 6 7 8 9 | # 选择SDK配置文件 ./build.sh LubanCat_rk3588_ubuntu_gnome_defconfig# 构建Debian ./build.sh ubuntu# 返回的提示信息:跳过镜像构建,删除rootfs镜像后以便重新构建Ubuntu根文件系统镜像 [ Already Exists IMG, Skip Make Ubuntu Scripts ] [ Delate ubuntu-rk3588-gnome-rootfs.img To Rebuild Ubuntu IMG ] |
如果返回的信息与文中一致,则使用解包后的根文件系统镜像成功
3.7.5. 镜像打包
当u-boot,kernel,Rootfs都构建完成以后,需要再执行 ./build.sh firmware 进行固件打包, 主要是检查分区表文件是否存在,各个分区是否与分区表配置对应,并根据配置文件将所有的文件复制或链接到rockdev/内。
为了方便镜像的发布,还可以将各个分立的分区打包成一个文件,打包好的文件就能用于烧录了。
1 2 3 4 5 | # 固件打包 ./build.sh firmware# 生成update.img ./build.sh updateimg |
以debian系统为例,rockdev/目录下的文件如下所示
rockdev/ | 链接文件 |
boot.img | kernel/boot.img |
MiniLoaderAll.bin | u-boot/rk3588_spl_loader_v1.17.113.bin |
parameter.txt | device/rockchip/.chips/rk3588/parameter.txt |
rootfs.img | debian/linaro-rk3588-gnome-rootfs.img |
uboot.img | u-boot/uboot.img |
3.8. ./build.sh构建脚本
./build.sh 脚本是整个SDK功能的入口,SDK配置文件的选择、修改; 系统各部分配置文件的修改、编译;以及镜像打包等,都离不开./build.sh脚本
可以使用./build.sh help命令查看所有支持的功能。
注意
由于SDK是经二次开发,增删了部分功能,help返回命令中,有些是不生效的,以实际情况为准。
3.8.1. SDK配置文件修改
可以使用./build.sh config命令来修改SDK配置文件
./build.sh savedefconfig命令可以将最小SDK配置文件保存在选择的配置文件里
在SDK配置中,可以对rootfs、loader、kernel、分区表、扩展分区、镜像打包等各部分做详细配置, 不过一般情况下直接使用已经保存好的配置文件即可,修改可能会导致编译失败。
3.8.2. 内核相关命令
使用./build.sh kernel-config或./build.sh kconfig可以直接打开内核配置界面。
当我们退出配置页面后,又会将对内核的修改同步到我们在SDK配置文件中选中的内核配置文件。