【正点原子Linux连载】第七章 Android SDK开发(上篇) 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

1)实验平台:正点原子ATK-DLRK3568开发板
2)平台购买地址:https://detail.tmall.com/item.htm?id=731866264428
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban

如果用户想对内核源码进行配置,可执行如下命令打开menuconfig图形化配置界面(在内核源码目录下执行):
make ARCH=arm64 rockchip_defconfig android-11.config //加载配置文件
make ARCH=arm64 menuconfig //打开图形化配置界面
运行结果如下所示:
在这里插入图片描述

图6.2.2.1 menuconfig图形化配置界面
通过menuconfig图形化界面,用户可对内核源码进行配置,配置完成后可执行如下命令保存配置:
make ARCH=arm64 savedefconfig
cp defconfig arch/arm64/configs/rockchip_defconfig
保存配置后,接下来我们可以回到SDK根目录下执行build.sh脚本编译内核源码:
cd …/ //回到SDK根目录下(当前处于内核源码目录下)
./build.sh -K //执行build.sh脚本编译内核
make bootimage //打包生成boot.img 生成的镜像文件存放在产品输出目录下

6.2.3 设备树和defconfig配置文件
正点原子ATK-DLRK3568开发板所使用的defconfig配置文件为/arch/arm64/configs/rockchip_defconfig。用户可以根据自己的需求更改该文件、使能或禁用内核模块。
Rockchip平台的所有设备树文件都存放在arch/arm64/boot/dts/rockchip/目录下。对于ATK-DLRK3568开发板来说,有3个顶层设备树文件:rk3568-atk-evb1-ddr4-v10.dts、rk3568-atk-evb1-mipi-dsi-1080p.dts、rk3568-atk-evb1-mipi-dsi-720p.dts。
当然这三个顶层设备树都包含有多个.dtsi设备树,如下所示:
rk3568-atk-evb1-ddr4-v10.dts
rk3568-atk-evb1-ddr4-v10.dtsi
rk3568.dtsi
rk3568-evb.dtsi
rk3568-android.dtsi
rk3568-screen_choose.dtsi
rk3568-lcds.dtsi

rk3568-atk-evb1-mipi-dsi-720p.dts
rk3568-atk-evb1-ddr4-v10.dtsi
rk3568.dtsi
rk3568-evb.dtsi
rk3568-android.dtsi
rk3568-lcds.dtsi

rk3568-atk-evb1-mipi-dsi-1080p.dts
rk3568-atk-evb1-ddr4-v10.dtsi
rk3568.dtsi
rk3568-evb.dtsi
rk3568-android.dtsi
rk3568-lcds.dtsi
rk3568.dtsi:该设备树文件是RK3568平台级设备树文件,与具体开发板硬件无关,纯SoC级别的设备树文件,由RK提供,开发者无需改动该文件!
rk3568-evb.dtsi:板级通用设备树文件,通常被板级设备树文件所包含;
rk3568-android.dtsi:该设备树包含Android部分特有配置信息,如果是Linux平台则使用rk3568-linux.dtsi;
rk3568-atk-evb1-ddr4-v10.dtsi:板级设备树文件,该设备树文件包含板级通用设备树rk3568-evb.dtsi以及RK3568平台级设备树rk3568.dtsi;
rk3568-screen_choose.dtsi:该设备树用于选择需要使能的LCD屏,譬如HDMI、MIPI、LVDS、VGA,支持单显、双显、三显。用户可在该文件中定义ATK_LCD_TYPE_XXX宏(详细内容请看该文件)来使能对应的屏幕,譬如ATK_LCD_TYPE_HDMI宏表示使能HDMI,没定义该宏表示禁用;
rk3568-lcds.dtsi:该设备树实现了ATK_LCD_TYPE_XXX宏控制LCD屏使能的逻辑 ,rk3568-lcds.dtsi设备树会根据用户定义的ATK_LCD_TYPE_XXX宏,使能对应的显示接口模块并使能与该屏相关的外设,譬如触摸屏(只有使能MIPI或LVDS时才会使能触摸屏)、HDMI音频(只有使能HDMI时才会使能HDMI音频)、背光(只有使能MIPI或LVDS时才会使能背光)。

rk3568-atk-evb1-mipi-dsi-720p.dts和rk3568-atk-evb1-mipi-dsi-1080p.dts这两个是正点原子用于编译出厂系统镜像所使用的设备树。因为ATK-DLRK3568开发板出厂系统需要适配两种不同的MIPI屏(正点原子5.5寸720p MIPI屏和1080p MIPI屏),这两种MIPI屏的初始化参数以及时序参数都是不一样的,所以需要分别配置:rk3568-atk-evb1-mipi-dsi-720p.dts包含了720p MIPI屏的参数配置,rk3568-atk-evb1-mipi-dsi-1080p.dts包含了1080p MIPI屏的参数配置。编译出厂系统镜像时,会编译这两个设备树得到两个DTB文件,并将这两个DTB都打包到resource.img中。U-Boot代码会判断用户接入的是720p MIPI屏还是1080p MIPI屏(ADC硬件唯一值,参考6.1.5.1小节),然后从resource.img中读取对应的DTB将其加载到内存中。
rk3568-atk-evb1-ddr4-v10.dts设备树则是提供给客户使用的,用户在编译内核源码时只需编译这个设备树即可!

  1. rk3568-atk-evb1-ddr4-v10.dts
    rk3568-atk-evb1-ddr4-v10.dts是ATK-DLRK3568开发板对应的设备树文件。
    rk3568-atk-evb1-ddr4-v10.dts设备树包含了rk3568-screen_choose.dtsi,用户可自行修改rk3568-screen_choose.dtsi文件来选择需要使能的LCD屏,包括HDMI、MIPI、LVDS以及eDP_VGA。该文件的内容如下所示:
    在这里插入图片描述

图6.2.3.1 rk3568-screen_choose.dtsi设备树
默认情况下,只使能了MIPI屏和HDMI。

如果不使用make.sh脚本,如何通过make命令编译Linux内核,如下所示:
make ARCH=arm64 rockchip_defconfig android-11.config
make ARCH=arm64 Image -j24
make ARCH=arm64 rockchip/rk3568-atk-evb1-ddr4-v10.dtb -j24
第一步执行defconfig配置:make ARCH=arm64 rockchip_defconfig android-11.config
第二步编译内核Image:make ARCH=arm64 Image -j24
第三步编译设备树:make ARCH=arm64 rockchip/rk3568-atk-evb1-ddr4-v10.dtb -j24

执行上述命令编译成功后将会得到内核镜像Image(arch/arm64/boot/Image)以及Kernel DTB(arch/arm64/boot/dts/rockchip/rk3568-atk-evb1-ddr4-v10.dtb)。
执行如下命令将Kernel DTB、logo图片以及电量显示图片全部打包到resource.img中:
cp arch/arm64/boot/dts/rockchip/rk3568-atk-evb1-ddr4-v10.dtb ./
./scripts/resource_tool logo.bmp logo_kernel.bmp rk3568-atk-evb1-ddr4-v10.dtb
cd …/u-boot/
./scripts/pack_resource.sh …/kernel/resource.img
cp resource.img …/kernel/
cd …/kernel/
rm -rf ./rk3568-atk-evb1-ddr4-v10.dtb
在这里插入图片描述

图6.2.3.2 打包resource.img

最后一步,将Kernel DTB、resource.img(包含了Kernel DTB)、内核镜像Image以及ramdisk.img打包成一个boot.img,如下所示:
cd …/
make bootimage -j16
在这里插入图片描述

图6.2.3.3 生成boot.img
首先要回到目录,然后执行“make bootimage -j16”命令。
2. 修改make.sh脚本
打开/make.sh脚本文件,然后对其进行修改,修改之后的内容如下所示:
#!/bin/bash

默认值

RK_ARCH=arm64
RK_DEFCONFIG=“rockchip_defconfig android-11.config”
ADDON_ARGS=
RK_DTS=rk3568-atk-evb1-ddr4-v10
RK_JOBS=24

while [ $# -gt 0 ]; do
case 1 i n a r c h = ∗ ) a r g = 1 in arch=*) arg= 1inarch=)arg={1#=}
if [ -n " a r g " ] ; t h e n R K A R C H = arg" ]; then RK_ARCH= arg"];thenRKARCH=arg
fi
shift 1
;;
defconfig=
)
arg=KaTeX parse error: Expected '}', got '#' at position 3: {1#̲*=} if [ -n …arg" ]; then
RK_DEFCONFIG= a r g f i s h i f t 1 ; ; a d d o n a r g = ∗ ) A D D O N A R G S = arg fi shift 1 ;; addon_arg=*) ADDON_ARGS= argfishift1;;addonarg=)ADDONARGS={1#=}
shift 1
;;
dts=
)
arg=KaTeX parse error: Expected '}', got '#' at position 3: {1#̲*=} if [ -n …arg" ]; then
RK_DTS= a r g f i s h i f t 1 ; ; j o b s = ∗ ) a r g = arg fi shift 1 ;; jobs=*) arg= argfishift1;;jobs=)arg={1#*=}
if [ -n " a r g " ] ; t h e n R K J O B S = arg" ]; then RK_JOBS= arg"];thenRKJOBS=arg
fi
shift 1
;;
*)
shift 1
;;
esac
done

配置

make A D D O N A R G S A R C H = ADDON_ARGS ARCH= ADDONARGSARCH=RK_ARCH $RK_DEFCONFIG

编译

make A D D O N A R G S A R C H = ADDON_ARGS ARCH= ADDONARGSARCH=RK_ARCH R K D T S . i m g − j RK_DTS.img -j RKDTS.imgjRK_JOBS
默认情况下,使用make.sh脚本编译Linux内核、生成的资源镜像resource.img中不会包含rk3568-atk-evb1-ddr4-v10.dtb,所以导致rk3568-atk-evb1-ddr4-v10.dts设备树配置不会生效。
6.2.4 IO电源域
本节内容参考文档:
/RKDocs/common/IO-Domain/Rockchip_Developer_Guide_Linux_IO_DOMAIN_CN.pdf
/RKDocs/common/IO-Domain/Rockchip_RK356X_Introduction_IO_Power_Domains_Configuration.pdf

RK3568一共有10个独立的IO电源域,分别为PMUIO[0:2]和VCCIO[1:7],其中:
PMUIO0、PMUIO1为固定电平电源域,不可配置;
PMUIO2和VCCIO1,VCCIO[3:7]电源域均要求硬件供电电压与软件的配置相匹配:
⑴、当硬件IO电平接1.8V,软件电压配置也要相应配成1.8V;
⑵、当硬件IO电平接3.3V,软件电压配置也要相应配成3.3V;
对于VCCIO2电源域,软件不需要配置,但是其硬件供电电压与FLASH_VOL_SEL状态需保持一致:
⑴、当VCCIO2供电是1.8V,则FLASH_VOL_SEL管脚必须保持为高电平;
⑵、当VCCIO2供电是3.3V,则FLASH_VOL_SEL管脚必须保持为低电平;

如果用户没有按照上述要求进行配置:

当软件配置为1.8V,硬件供电3.3V,会使得IO处于过压状态,长期工作会导致IO损坏;
当软件配置为3.3V,硬件供电1.8V,IO功能会异常。

本小节讲一下如何配置IO电源域,总共分为4步:
第一步:查看硬件原理图并确认每个IO电源域的供电电压;
第二步:修改内核DTS的IO电源域配置节点pmu_io_domains;
第三步:编译内核时,对IO电源域进行确认;
第四步:编译内核后检查IO电源域配置情况;

  1. 查看硬件原理图并确认每个IO电源域的供电电压
    以正点原子ATK-DLRK3568开发板为例,首先找到ATK-DLRK3568开发板硬件原理图,打开核心板原理图,核心板原理图所在路径为:开发板光盘A盘-基础资料02、开发板原理图02、核心板原理图ATK-CLRK3568F V1.2(核心板原理图).pdf。
    根据前面的介绍,10个IO电源域中,PMUIO0和PMUIO1是固定电平电源域,不用配置;对于PMUIO2和VCCIO1以及VCCIO[3:7]这些电源域,均需要用户进行配置。
    在核心板原理图上,搜索“VCCIO1”找到该电源域的供电电压,如下图所示:
    在这里插入图片描述

图6.2.4.1 VCCIO1电源域
从原理图可知,VCCIO1的电源是VCCIO_ACODEC,从核心板原理图上搜索“VCCIO_ACODEC”:
在这里插入图片描述

图6.2.4.2 VCCIO_ACODEC电源
所以由此可知,VCCIO_ACODEC是由RK809的LDO4供电。原理图上标注该电源为3.3V,实际电压是不是3.3V,这个需要看设备树的配置。打开arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi设备树文件,找到rk809配置信息中的vccio_acodec节点:
在这里插入图片描述

图6.2.4.3 vccio_acodec节点
设备树中将VCCIO_ACODEC电源配置为3.3V,所以VCCIO1电源域的供电电压也就是3.3V。
再来找一下PMUIO2电源域,在原理图上搜索“PMUIO2”:
在这里插入图片描述

图6.2.4.4 PMUIO2电源域
从原理图可知,PMUIO2的电源是VCC3V3_PMU,从原理图上搜索“VCC3V3_PMU”:
在这里插入图片描述

图6.2.4.5 VCC3V3_PMU电源
所以由此可知,VCC3V3_PMU是由RK809的LDO6供电。打开arch/arm64/boot/dts/rockchip/rk3568-evb.dtsi设备树文件,找到rk809配置信息中的vcc3v3_pmu节点:
在这里插入图片描述

图6.2.4.6 vcc3v3_pmu节点
设备树中将VCC3V3_PMU电源配置为3.3V,所以PMUIO2电源域的供电电压也就是3.3V。
其它IO电源域的供电电压也是这样去查,这里就不再多说!

重点来讲一下VCCIO2电源域,VCCIO2电源域软件上不需要配置,但是在硬件设计上有个要求:当VCCIO2电源域的供电电压为1.8V时,FLASH_VOL_SEL管脚必须保持为高电平、拉高,当VCCIO2电源域的供电电压为3.3V时,FLASH_VOL_SEL管脚必须保持为低电平、拉低。在原理图上搜索“VCCIO2”:

在这里插入图片描述

图6.2.4.7 VCCIO2电源域
从原理图可知,VCCIO2的电源是VCCIO_FLASH,在原理图上搜索“VCCIO_FLASH”:
在这里插入图片描述

图6.2.4.8 VCCIO_FLASH电源
从原理图可知,VCCIO_FLASH电源来自于VCC_1V8,所以可知,VCCIO_FLASH电源为1.8V;最终可以确定VCCIO2电源域的供电电压为1.8V。既然如此,按照设计要求,FLASH_VOL_SEL管脚就必须保持为高电平、必须拉高,在原理图上找到FLASH_VOL_SEL:
在这里插入图片描述

图6.2.4.9 FLASH_VOL_SEL管脚的电压
从原理图可知,FLASH_VOL_SEL管脚确实被拉高了(PMUIO1为3.3V)、保持在一个高电平状态,满足上面提到的硬件设计要求。
2. 修改内核DTS的IO电源域配置节点pmu_io_domains
从原理图上知道了每个IO电源域的供电电压后,接着就需要去配置设备树。设备树中通过pmu_io_domains节点对IO电源域进行配置,首先找到内核设备树中IO电源域配置节点pmu_io_domains,然后对其进行修改。
pmu_io_domains节点由rk3568.dtsi设备树所定义:
在这里插入图片描述

图6.2.4.10 pmu_io_domains节点的定义
我们不能直接去修改rk3568.dtsi文件,而是通过引用的方式进行修改(&pmu_io_domains),RK默认是在rk3568-evb.dtsi设备树中配置,打开rk3568-evb.dtsi文件,找到如下位置:
在这里插入图片描述

图6.2.4.11 配置pmu_io_domains
这是RK默认的配置信息,它这个是根据RK自己的EVB板硬件设计情况进行配置的,与正点原子ATK-DLRK3568开发板的电源设计存在一些差异,主要就是VCCIO4和VCCIO6:
ATK-DLRK3568开发板VCCIO4电源域的供电电压是1.8V,来自于电源vcc_1v8;而RK官板的供电电压是3.3V。ATK-DLRK3568开发板VCCIO6电源域的供电电压是1.8V,来自于电源vcc_1v8;而RK官板的供电电压是3.3V。
以上就是ATK-DLRK3568开发板与RK官板在IO电源域硬件设计上的一些小小区别。所以对于ATK-DLRK3568开发板来说,需要去修改pmu_io_domains节点。不建议直接在rk3568-evb.dtsi文件进行修改(前面给大家讲过,rk3568-evb.dtsi属于板级通用设备树文件),我们可以在具体的板级配置文件中进行修改,譬如rk3568-atk-evb1-ddr4-v10.dtsi(正点原子已经配置好了):
在这里插入图片描述

图6.2.4.12 配置pmu_io_domains
将VCCIO4的电源配置为vcc_1v8,将VCCIO6的电源配置为vcc_1v8。
这些需要改动的内容,正点原子都已经配置好了,这里只是给大家讲解如何去配置IO电源域。当用户需要做自己的产品、设计自己的硬件时,能够自己去配置这些东西。
3. 编译内核时对IO电源域进行确认
在编译RK内核源码的过程中,会弹出IO-Domains确认对话框,如下图中所示:
在这里插入图片描述

图6.2.4.13 IO-Domains确认对话框
弹出这个对话框的目的是要求开发者再次确认硬件原理图和软件DTS的IO电压是否匹配。虽然设备树中已经配置好了pmu_io_domains节点,但编译内核时会弹出这个对话框,要求你再次确认,说明这个很重要,请务必仔细确认!如果IO电压配置不正确,将会导致芯片IO烧坏。
当你通过这个对话框完成确认之后,下次编译便不会在出现了(选择的电压值与设备树pmu_io_domains节点的配置相同时才会编译通过,否则会编译失败!),如果设备树名字或者设备树中pmu_io_domains节点的配置发生了变化,则下次编译会继续弹出该对话框重新进行确认。
4. 编译内核后检查IO电源域配置情况
当内核编译成功后,会在/arch/arm64/boot/dts/rockchip/目录下生成一个以“.”符号开头(也就是linux系统中的隐藏文件)、以dtb.dts.tmp.domain结尾的文件,如图所示:
在这里插入图片描述

图6.2.4.14 dtb.dts.tmp.domain文件
文件的内容就是IO电压的配置情况(用户通过IO-Domains对话框所选择的结果,进行汇总),如下图所示:
在这里插入图片描述

图6.2.4.15 dtb.dts.tmp.domain文件的内容
如果把这种dtb.dts.tmp.domain文件给删除,那么下次编译内核时又会弹出IO-Domains对话框。
6.2.5 替换logo
包括u-boot阶段logo以及内核阶段logo,这两个logo文件都存在内核源码目录下:
在这里插入图片描述

图6.2.5.1 logo图片文件
默认logo如下所示:
在这里插入图片描述

图6.2.5.2 U-Boot logo
在这里插入图片描述

图6.2.5.3 Kernel logo
如果用户需要将其替换为自己的logo,首先需要将你的U-Boot logo图片重命名为logo.bmp、将你的内核logo图片重命名为logo_kernel.bmp,然后将这两个bmp图片文件拷贝到内核源码目录下,替换内核源码中默认的logo图片。
编译内核时,会将logo.bmp和logo_kernel.bmp打包到resource.img中,然后再把resource.img打包到boot.img。
U-Boot启动的时候会把这两个bmp文件加载到内存中,logo.bmp会在U-Boot阶段开始显示,logo_kernel.bmp在内存中的地址会被U-Boot传给Linux Kernel,在Linux Kernel的DRM驱动初始化阶段显示。
6.3 buildroot开发
Buildroot源码在/buildroot目录下:
在这里插入图片描述

图6.3.1 buildroot工程目录
推荐用户使用buildroot来构建根文件系统,不推荐使用Yocto!
RK已经配置好环境变量,BSP配置以及各模块开发,方便用户基于RK buildroot进行开发、定制。

关于buildroot的介绍以及使用方法,本文档不作说明,可以参考以下文档:
开发板光盘A盘-基础资料10、用户手册03、辅助文档【正点原子】Buildroot用户手册中文版(正点原子翻译)_V1.0.pdf
开发板光盘A盘-基础资料10、用户手册03、辅助文档【正点原子】Buildroot快速使用手册V1.0.pdf

编译RK3568 Linux SDK过程中,需要编译两次buildroot:
编译buildroot得到根文件系统镜像rootfs.img。rootfs.img会烧录到开发板rootfs分区。
编译buildroot得到ramdisk根文件系统镜像(进入recovery模式时挂载ramdisk根文件系统,而rootfs.img则是正常启动系统时挂载的根文件系统,这点要搞清楚!)。ramdisk最终会打包进recovery.img镜像中,recovery.img会烧录到开发板recovery分区。
6.3.1 buildroot目录结构介绍
buildroot源码目录结构如下图所示:

在这里插入图片描述

接下来简单介绍一下buildroot根目录下的文件夹:

在这里插入图片描述

6.3.2 常见编译命令
在buildroot源码根目录下有一个Makefile文件,如下所示:
在这里插入图片描述

这就是buildroot源码工程的Makefile文件,所以我们可以通过make命令编译buildroot,既可以编译整个根文件系统,也可以单独编译指定的package。
①、编译根文件系统
编译之前,先进行配置;进入到buildroot目录下,执行如下命令进行配置(以rk3568平台为例):

source build/envsetup.sh rockchip_rk3568
命令中最后一个参数(rockchip_rk3568)用于指定目标平台的defconfig配置文件(不带_defconfig后缀),所有目标平台的defconfig配置文件都存放在/configs目录下,在该目录下可以找到rk3568的配置文件rockchip_rk3568_defconfig,如下所示:

在这里插入图片描述

配置完成后,直接执行make或“make all”命令编译根文件系统:

make

make all
使用多线程编译(-jN):
make -j12

make all -j12
②、编译package
编译之前,先进行配置。进入到buildroot目录下,执行如下命令进行配置(以rk3568平台为例):
source build/envsetup.sh rockchip_rk3568

配置完成后,执行如下命令编译指定的package:

make <package_name>
参数<package_name>用于指定package的名字,譬如rkwifibt:
make rkwifibt
③、buildroot清除命令
执行如下命令可删除所有构建时生成的文件(包括build、host、staging and target trees、images和toolchain):
make clean
执行如下命令可删除所有构建时生成的文件以及相关配置(彻底清除,相当于删除output目录,而且还会删除dl文件夹,慎用!!!):
make distclean
执行如下命令可删除指定package的构建目录:
make <package_name>-dirclean
6.3.3 编译RK3568根文件系统镜像rootfs.img
本小节介绍编译buildroot得到RK3568平台根文件系统镜像rootfs.img,6.4小节介绍如何通过buildroot编译出ramdisk根文件系统镜像。

编译之前先进行defconfig配置,在buildroot目录下执行如下命令:
source build/envsetup.sh rockchip_rk3568
在这里插入图片描述

图6.3.3.1 执行defconfig配置(1)
在这里插入图片描述

图6.3.3.2 执行defconfig配置(2)
命令中最后一个参数(rockchip_rk3568)用于指定目标平台的defconfig配置文件(不带_defconfig后缀),所有目标平台的defconfig配置文件都存放在/configs目录下,在该目录下可以找到rk3568的配置文件rockchip_rk3568_defconfig,如下所示:
在这里插入图片描述

图6.3.3.3 rockchip_rk3568_defconfig配置文件

接着执行make命令或“make all”命令编译根文件系统:
make -j16
在这里插入图片描述

图6.3.3.4 编译根文件系统
整个编译过程将会持续很长一段时间,需要耐心等待!
编译完成后,如下图所示:
在这里插入图片描述

图6.3.3.5 根文件系统编译成功
编译生成的根文件系统镜像存放在output/rockchip_rk3568/images目录下:
在这里插入图片描述

图6.3.3.6 rootfs镜像
该目录下生成了多个不同格式的根文件系统镜像,RK3568平台上使用的是rootfs.ext4(ext4格式,由SDK板级配置文件中的RK_ROOTFS_TYPE变量决定),rootfs.ext4是一个软链接文件,实际指向的镜像为rootfs.ext2,使用file命令查看rootfs.ext2,如下所示:
在这里插入图片描述

图6.3.3.7 file命令查看rootfs.ext2
可知,rootfs.ext2就是ext4格式根文件系统镜像。将其重命名为rootfs.img,rootfs.img最终会烧录到开发板rootfs分区,作为正常启动系统时挂载的根文件系统。

直接使用make命令进行编译、编译过程会产生大量的输出信息,看起来非常乱,让人感觉不爽!想要在编译过程中过滤掉这些大量无用的输出信息,可以使用下面这条命令进行编译:
utils/brmake -j16
brmake是一个shell脚本,使用该脚本进行编译,可以过滤掉绝大部分不重要的输出信息、保留关键信息,使终端的输出内容变的简洁。
6.3.4 rootfs的配置
在buildroot源码目录下,执行如下命令可对buildroot根文件系统进行配置:
source build/envsetup.sh rockchip_rk3568 //加载buildroot配置文件
make menuconfig //打开menuconfig图形化配置界面
运行结果如下所示:
在这里插入图片描述

图6.3.4.1 menuconfig图形化配置界面
通过menuconfig图形化界面,可对buildroot进行配置,配置完成后可执行如下命令进行保存:
make savedefconfig
接下来我们可以回到SDK根目录下执行build.sh脚本编译buildroot(也可按照6.3.3小节方式进行编译):
cd …/ //回到SDK根目录下(当前处于buildroot源码目录下)
./build.sh buildroot //执行build.sh脚本编译buildroot
6.3.5 output目录介绍
output目录用于存放编译过程中产生的各种文件,包括编译过程生成的中间目标文件、可执行文件、lib库以及最终烧录到开发板的rootfs镜像等。
output目录结构如下所示:
output/
├── rockchip_rk3568
│ ├── build #包含所有构建的软件包,包括buildroot在宿主机上所需的工具以及为目标平台编译的软件包
│ ├── host #包含为Ubuntu主机(宿主机)构建的工具,以及目标工具链
│ ├── images #存放最终编译输出的镜像
│ ├── Makefile
│ ├── staging #一个指向host/目录中目标工具链sysroot的符号链接
│ └── target #根文件系统系统目录,用来创建根文件系统镜像,rootfs.img镜像的内容就是该目录下的内容
6.3.6 package编译
本小节讲一下如何编译指定的软件包(package)。

首先,编译之前先进行配置;这里不再多说。接着执行如下命令编译指定的package:

make <package_name>

utils/brmake <package_name>
参数package_name用于指定package的名字,譬如rkwifibt:
make rkwifibt

utils/brmake rkwifibt

在这里插入图片描述

问题的关键在于,参数package_name如何确定/得知?
其实参数package_name对应的便是buildroot/package/文件夹中的某个目录对应的名字(或某个子目录对应的名字),并且该目录中存在Config.in配置文件(用于定义package配置选项)以及<package_name>.mk文件(Makefile文件,用于定义package的构建逻辑)。譬如:

rkwifibt package/rockchip/rkwifibt/
rknpu package/rockchip/rknpu/
rkupdate package/rockchip/rkupdate/
在这里插入图片描述

参数package_name指的便是Config.in和<package_name>.mk文件所在目录对应的名字。

package(软件包)的构建过程可以分解为:configure(配置)、build(编译)、install(安装),其执行顺序为:配置编译安装,每一步可单独执行,执行如下命令:
make <package_name>-configure #执行配置命令
make <package_name>-build #执行编译命令
make <package_name>-install #执行安装命令
或者
utils/brmake <package_name>-configure #执行配置命令
utils/brmake <package_name>-build #执行编译命令
utils/brmake <package_name>-install #执行安装命令
以rkwifibt为例:
utils/brmake rkwifibt-configure
utils/brmake rkwifibt-build
utils/brmake rkwifibt-install

在这里插入图片描述

与之对应的还有:reconfigure(重新配置)、rebuild(重新编译)、reinstall(重新安装):

make <package_name>-reconfigure #从配置阶段开始,重新启动package的构建过程
make <package_name>-rebuild #从编译阶段开始,重新启动package的构建过程
make <package_name>-reinstall #从安装阶段开始,重新启动package的构建过程
或者
utils/brmake <package_name>-reconfigure #从配置阶段开始,重新启动package的构建过程
utils/brmake <package_name>-rebuild #从编译阶段开始,重新启动package的构建过程
utils/brmake <package_name>-reinstall #从安装阶段开始,重新启动package的构建过程
以rkwifibt为例:
utils/brmake rkwifibt-reconfigure
utils/brmake rkwifibt-rebuild
utils/brmake rkwifibt-reinstall

在这里插入图片描述

如果需要清理package(软件包)构建目录,可以执行如下命令:

make <package_name>-dirclean
以rkwifibt为例:

6.3.7 添加package
下面通过一个简单的例子向用户介绍如何在buildroot/package目录下添加一个自己的package(软件包)。

  1. 开发源码工程
    首先进入/app目录下,在该目录下创建一个名为“mypackage”的文件夹,如下所示:
    在这里插入图片描述

图6.3.7.1 创建mypackage文件夹
在mypackage目录下创建一个.c源文件main.c,以及一个Makefile文件:
在这里插入图片描述

图6.3.7.2 创建源文件和Makefile
大家可以自己在main.c源文件中编写一个简单的测试代码,譬如打印一个“Hello World”,Makefile文件中的内容如下所示:
mypackage: main.o
$(CC) -o mypackage main.o

%.o: %.c
$(CC) -c $< -o $@
目的就是将main.c源文件编译成一个可执行文件mypackage。
2. 添加package
进入/package目录,在该目录下创建一个名为mypackage的目录:
在这里插入图片描述

图6.3.7.3 创建mypackage目录
在mypackage目录下创建两个文件:Config.in和mypackage.mk:
在这里插入图片描述

图6.3.7.4 创建Config.in和mypackage.mk
Config.in文件的内容如下所示:
config BR2_PACKAGE_MYPACKAGE
bool “my package”
help
this configuration is used to enable or disable mypackage.
Config.in文件的语法规则与Linux Kernel、U-Boot中Kconfig文件的语法规则是一样的。
mypackage.mk文件的内容如下所示:
################################################################################

mypackage

################################################################################

给你的软件包定义一个版本号

MYPACKAGE_VERSION = 1.0

你的软件包所在目录

MYPACKAGE_SITE = $(TOPDIR)/…/app/mypackage

获取软件包的方式,local表示从本地获取,有些包可能需要通过网络下载,譬如git仓库中的项目

MYPACKAGE_SITE_METHOD = local

列出在编译软件包之前 需要执行的配置操作

define MYPACKAGE_CONFIGURE_CMDS
endef

列出编译软件包时 需要执行的操作

define MYPACKAGE_BUILD_CMDS
$(MAKE) -C ( @ D ) C C = (@D) CC= (@D)CC=(TARGET_CC)
endef

列出将软件包安装到target目录(/output/rockchip_rk3568/target)时需要执行的操作

define MYPACKAGE_INSTALL_TARGET_CMDS
$(INSTALL) -D -m 0755 $(@D)/mypackage $(TARGET_DIR)/usr/bin/mypackage
endef

表示当前软件包是一个通用型软件包基础结构

$(eval $(generic-package))
注意:该文件中定义了一些变量以及宏,所有的这些变量、宏都以前缀MYPACKAGE_开头,不能乱来,它必须等于Config.in、mypackage.mk文件所在目录(mypackage)对应的名字(小写字母转换为大写)。
上面已经解释了这些变量、宏的作用,除了这些变量、宏之外,还可以在.mk文件中定义很多其它的变量或者宏,每个变量或宏都有自己的意义,详细的使用方法请用户阅读文档:开发板光盘A盘-基础资料10、用户手册03、辅助文档【正点原子】Buildroot用户手册中文版(正点原子翻译)_V1.0.pdf。
$(MAKE):表示make命令;
( @ D ) :表示软件包所在目录,注意这个目录并不是 < S D K > / a p p / m y p a c k a g e 、而是该软件包在 o u t p u t / r o c k c h i p r k 3568 / b u i l d / 目录下对应的文件夹;编译软件包之前, b u i l d r o o t 会将 < S D K > / a p p / m y p a c k a g e 拷贝至 < B u i l d r o o t > / o u t p u t / r o c k c h i p r k 3568 / b u i l d / 目录,并重命名为 m y p a c k a g e − 1.0 ( 1.0 就是版本号)。所以这个“ (@D):表示软件包所在目录,注意这个目录并不是<SDK>/app/mypackage、而是该软件包在output/rockchip_rk3568/build/目录下对应的文件夹;编译软件包之前,buildroot会将<SDK>/app/mypackage拷贝至<Buildroot>/output/rockchip_rk3568/build/目录,并重命名为mypackage-1.0(1.0就是版本号)。所以这个“ (@D):表示软件包所在目录,注意这个目录并不是<SDK>/app/mypackage、而是该软件包在output/rockchiprk3568/build/目录下对应的文件夹;编译软件包之前,buildroot会将<SDK>/app/mypackage拷贝至<Buildroot>/output/rockchiprk3568/build/目录,并重命名为mypackage1.01.0就是版本号)。所以这个(@D)”指的是output/rockchip_rk3568/build/mypackage-1.0这个目录。
$(TOPDIR):表示buildroot顶层目录,也就是/buildroot目录。
$(TARGET_CC):表示交叉编译器,RK平台默认使用buildroot交叉编译器,交叉编译器所在路径为:/output/rockchip_rk3568/host/bin/aarch64-buildroot-linux-gnu-gcc。
$(INSTALL):表示install命令。
$(TARGET_DIR):表示target目录/output/rockchip_rk3568/target。

关于mypackage.mk文件的内容就给大家讲这么多,详情请参考《【正点原子】Buildroot用户手册中文版(正点原子翻译)_V1.0.pdf》文档。
接下来打开package/Config.in文件,将下面这行内容添加到该文件中:

source “package/mypackage/Config.in”
在这里插入图片描述

添加完成后保存退出。
  1. 使能并编译package
    执行“make menuconfig”打开图形化配置界面,找到我们添加的package,然后将其使能:
    Target packages —>
    my package
    在这里插入图片描述

图6.3.7.5 使能mypackage
然后保存配置、退出图形化配置界面。

执行如下命令编译该软件包,如下所示:

make mypackage-rebuild

utils/brmake mypackage-rebuild
在这里插入图片描述

图6.3.7.6 编译mypackage
编译生成一个可执行文件mypackage,其所在路径为:output/rockchip_rk3568/target/usr/bin/mypackage。
在这里插入图片描述

图6.3.7.7 mypackage可执行文件
6.3.8 rootfs定制
用户可针对自己的Linux产品对rootfs进行定制,使得能够在满足产品功能的前提下、尽量减小rootfs 的体积。

  • 26
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值