前言
手上的一块Firefly-RK3288开发板,看了下Firefly提供的SDK,压缩包就有15个多G,直接吓退。还好最近看到了韦东山老师提供的教学资料。记下学习步骤及遇到的问题解决办法。
1、开发环境
资料提供的有百问网制作的 ubuntu18.04 虚拟机镜像。但自己已经有搭好的ubuntu18.04.6虚拟机环境,就没用提供的。
2、文件上传到虚拟机环境
可以通过共享文件夹,也可以通过 FileZilla 工具上传。共享文件夹或者FileZilla 实现网上很多教程,不再累述。
将资料光盘中的(07_bsp_sdk/100ask_firefly-rk3288)整个文件夹里的4个压缩文件上传到 ubuntu 系统下/home/owen/workspace/RK3288文件夹下。
3、配置交叉编译工具链
3.1、解压ToolChain
进入/home/owen/workspace/RK3288文件夹下,解压ToolChain.tar.gz
tar -zxvf ToolChain.tar.gz
得到ToolChain文件夹。
3.2、设置交叉编译工具
设置交叉编译工具主要是设置 PATH, ARCH 和 CROSS_COMPILE 三个环境变量。设置这 3 个环境变量有多种方法:
3.2.1、永久生效
修改用户配置文件, 修改如下:
gedit ~/.bashrc
在行尾添加或修改:
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
export PATH=$PATH:/home/owen/workspace/RK3288/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
3.2.2、临时生效
直接在当前终端执行,执行完“export”命令后,该设置只对当前终端有效:
export PATH=$PATH:/home/owen/workspace/RK3288/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-
3.2.3、手动指定
先设置 PATH 环境变量,然后在 make 编译时指定 ARCH 架构 CROSS_COMPILE 交叉编译工具链:
export PATH=$PATH:/home/owen/workspace/RK3288/ToolChain/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-
3.3、测试交叉编译工具链
4、编译 bootloader
使用版本为 uboot2017.09,韦东山老师提供的源码针对板子进行过修改。
4.1、解压u-boot源码
/home/owen/workspace/RK3288文件夹下,终端执行:
tar -zxvf uboot2017.09.tar.gz
得到uboot2017.09文件夹。
4.2、编译uboot镜像
不同的开发板对应不同的配置文件,配置文件位于 uboot2017.09文件夹下的 configs/ 目录,uboot 的编译过程:
cd uboot2017.09
make distclean
make 100ask_firefly-rk3288_defconfig
尴尬的是uboot2017.09文件夹下找不到"100ask_firefly-rk3288_defconfig"文件,只能使用“firefly-rk3288_defconfig”来配置。编译后烧录,此配置的uboot也可以用。
make firefly-rk3288_defconfig
make
./make.sh trust
./make.sh uboot
./make.sh loader
生成的供 firefly-rk3288 启动 uboot 的镜像文件如下:
ls -lh trust.img uboot.img idbloader.img
4.2、烧写uboot镜像
通过 dd 命令烧写 uboot 镜像文件,把SD卡连接到虚拟机,连接前后,使用lsblk命名来获取SD卡挂载的设备节点,如下:
SD卡连接前,
SD卡连接后,
由此可知,SD卡设备节点为/dev/sdc
使用 dd 命令烧写 img 镜像文件,如下:
sudo dd if=idbloader.img of=/dev/sdc seek=64
sudo dd if=uboot.img of=/dev/sdc seek=16384
sudo dd if=trust.img of=/dev/sdc seek=24576
烧录完成后,插卡到开发板上,从 SD 卡启动。
5、编译 linux kernel
5.1、解压kernel源码
/home/owen/workspace/RK3288文件夹下,终端执行:
tar -zxvf linux-4.4.tar.gz
5.2、编译内核镜像
不同的开发板对应不同的配置文件,配置文件位内核源码 arch/arm/configs/目录。
kernel 的编译过程:
cd linux-4.4
make mrproper
make 100ask_firefly-rk3288_defconfig
make zImage
make dtbs
编译完成后,在 arch/arm/boot 目录下生成 zImage 文件, 在 arch/arm/boot/dts 目录下生成设备树的二进制 rk3288-firefly.dtb 文件。
5.3、编译内核模块并安装
编译内核模块
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- modules
安装内核模块到 nfs 根文件系统,待用。
sudo make ARCH=arm INSTALL_MOD_PATH=/media/rootfs modules_install
6、构建根文件系统
6.1、解压buildroot源码
/home/owen/workspace/RK3288文件夹下,终端执行:
tar -zxvf buildroot2018.02.tar.gz
6.2、配置文件说明
此源码应该也是韦东山老师针对板子进行过修改。
配置文件为buildroot2018.02/configs/100ask_firefly-rk3288_defconfig
6.3、编译系统
owen@ubuntu:~/workspace/RK3288$ cd buildroot2018.02
owen@ubuntu:~/workspace/RK3288/buildroot2018.02$ make clean
owen@ubuntu:~/workspace/RK3288/buildroot2018.02$ make 100ask_firefly-rk3288_defconfig
生成的.config文件如下:
RK3288给的文档是基于ARM® Cortex™-A17架构,此处配置给的是Cortex-A15。查看《firefly_rk3288_defconfig》给的也是Cortex-A15。查了下网上两个架构对比:
也都是基于ARMv7-A指令集。不深究了,就这样吧。
继续menuconfig配置
owen@ubuntu:~/workspace/RK3288/buildroot2018.02$ make menuconfig
注意:第一次配置全默认,也会编译Linux 内核和 uboot。但是韦东山老师提供的git链接无法下载uboot和kernel,导致后面的编译报错如下:
>>> host-uboot-tools 2018.01 Installing to host directory
/usr/bin/install -m 0755 -D /home/owen/workspace/RK3288/buildroot2018.02/output/build/host-uboot-tools-2018.01/tools/mkimage /home/owen/workspace/RK3288/buildroot2018.02/output/host/bin/mkimage
/usr/bin/install -m 0755 -D /home/owen/workspace/RK3288/buildroot2018.02/output/build/host-uboot-tools-2018.01/tools/mkenvimage /home/owen/workspace/RK3288/buildroot2018.02/output/host/bin/mkenvimage
/usr/bin/install -m 0755 -D /home/owen/workspace/RK3288/buildroot2018.02/output/build/host-uboot-tools-2018.01/tools/dumpimage /home/owen/workspace/RK3288/buildroot2018.02/output/host/bin/dumpimage
>>> linux master Downloading
Doing shallow clone
Cloning into 'linux-master'...
fatal: unable to access 'https://git.dev.tencent.com/weidongshan/100ask_firefly-rk3288_kernel.git/': Failed to connect to git.dev.tencent.com port 443: Connection timed out
Shallow clone failed, falling back to doing a full clone
Doing full clone
Cloning into 'linux-master'...
fatal: unable to access 'https://git.dev.tencent.com/weidongshan/100ask_firefly-rk3288_kernel.git/': Failed to connect to git.dev.tencent.com port 443: Connection timed out
--2023-04-12 21:21:34-- http://sources.buildroot.net/linux-master.tar.gz
Resolving sources.buildroot.net (sources.buildroot.net)... 104.26.0.37, 104.26.1.37, 172.67.72.56, ...
Connecting to sources.buildroot.net (sources.buildroot.net)|104.26.0.37|:80... connected.
HTTP request sent, awaiting response... 404 Not Found
2023-04-12 21:21:36 ERROR 404: Not Found.
package/pkg-generic.mk:159: recipe for target '/home/owen/workspace/RK3288/buildroot2018.02/output/build/linux-master/.stamp_downloaded' failed
make[1]: *** [/home/owen/workspace/RK3288/buildroot2018.02/output/build/linux-master/.stamp_downloaded] Error 1
Makefile:79: recipe for target '_all' failed
make: *** [_all] Error 2
因此,menuconfig配置,禁止编译 Linux 内核和 uboot。这两项前面已经单独编译。
进入Kernel
选中上图“Linux Kernel”,键盘按下“N”建,禁止编译linux内核。
返回,进入Bootloaders,
选中上图“U-Boot”,键盘按下“N”建,禁止编译Uboot。
退出保存
编译 buildroot
owen@ubuntu:~/workspace/RK3288/buildroot2018.02$ make -j4
等待编译完成。
因为没有编译 Linux 内核和 uboot,提示的没有uboot.img等信息不管他。
6.4、镜像文件
编译成功后文件输出路径为 output/images
至此,三大块都已编译完成。
先到这里,继续学习。