《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​
  95kVyaJuybju 2023年11月13日 24 0

第六章 buildroot使用​

RV1126的文件系统是使用buildroot构建的,本章节基于RV1126开发板教大家如何修改或者编译buildroot软件包和添加自己的软件进入buildroot里。具体的使用方法请看【正点原子】Buildroot用户手册中文版(正点原子翻译)_V1.0.pdf文件。


6.1 buildroot的使用技巧​

学习过buildroot的需要先使能配置文件,就是在buildroot目录下运行“make xxxx_defconfig”,然后就会在本目录下生成“.config”文件,此文件就是buildroot的配置文件。在RV1126上是使用“envsetup.sh”脚本进生成“.config”文件(使用方法请看4.2小节)。运行成功后,此时的终端相对于运行“make xxxx_defconfig”,我们就可以直接使用make命令进行操作buildroot(使用buildroot前,必须使用配置文件)

  • 列出package包Buildroot的编译目标就是package的数量包,所以我们需要知道有多个package包的数量,运行命令如下所示:
    make show-targets
    运行结果如下图所示:

图6.1.1 列出package包数量

图6.1.1中就是RV1126的文件系统需要软件包,数量越多说明文件系统越大,我们就可以添加或者删减软件包来精简文件系统。

  • 删除或者添加package包

使用此命令进行配置package包,命令如下所示:

make menuconfig

运行结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_示例代码


图6.1.2 buildroot的图形化界面

进入图形化界面后,我们可以在这里添加或者删除package包,比如:删除rkwifibt,配置路径如下:

Target packages à​
[*] Rockchip BSP packages à​
[ ] rkwifibt à

配置如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_示例代码_02


图6.1.3 删除rkwifibt包

配置完成后,可以使用“make show-targets”命令查看是否取消rkwifibt成功。如果真的需要取消rkwifibt,运行此命令“make savedefconfig”保存“.config”文件到“buildroot/configs/alientek_rv1126_defconfig”文件里,下次使能配置文件就没有rkwifibt。

有时候我们会出现编译buildroot的编译出错,是因为内存不足,可以先单独编译package包或者增大内存。内存不够的可以修改Ubuntu系统下的swap空间。

6.2 package包的命令使用

6.2.1 package包命令列表

Buildroot提供了可以单独下载配置、补丁和编译package包。运行以下命令列出package的使用命令。命令如下所示:

make help

运行结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_示例代码_03


图6.1.4 package命令使用

从上图6.1.4就是“package”包使用命令。下表如何使用此命令:

命令/目标

说明

例子

<pkg>

编译和构建<pkg>包和<pkg>的依赖项

makerkwifibt

<pkg>-source

下载源码到目录里

make rkwifibt-source

<pkg>-extract

将源码提取到软件包构建目录

make rkwifibt-extract

<pkg>-patch

打补丁到软件包构建目录下

make rkwifibt-patch

<pkg>-depends

编译<pkg>包的依赖项

make rkwifibt-depends

<pkg>-configure

配置编译前的命令(下载、提取、补丁和编译依赖项)

make rkwifibt-configure

<pkg>-build

运行编译命令

make rkwifibt-build

<pkg>-show-depends

列出<pkg>包的依赖项

make rkwifibt-show-depends

<pkg>-show-rdepends

列出<pkg>包作为依赖项的软件包

make rkwifibt-show-rdepends

<pkg>-graph-depends

以PDF的形式生成<pkg>包的依赖项

make rkwifibt-graph-depends

<pkg>-graph-rdepends

以PDF的形式生成<pkg>包为依赖项的软件包

make rkwifibt-graph-rdepends

<pkg>-dirclean

删除整个软件包构建目录

make rkwifibt-dirclean

<pkg>-reconfigure

重新运行配置命令

make rkwifibt-reconfigure

<pkg>-rebuild

重新运行编译命令

make rkwifibt-rebuild

6.2.2 package下载测试

我们首先需要使用“make show-targets”命令列出package包的名字,比如笔者这里测试需要下载iperf3命令,需要在源码目录下,运行以下命令删除iperf3源码包(下载好了不会再次下载),命令如下所示:

rm buildroot/dl/iperf-3.6.tar.gz

接着可以使用命令,下载iperf3软件。命令如下所示:

make iperf3-source

运行结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_示例代码_04


图6.2.2.1 下载iperf3的源码

注意图中的下载路径,如果下载路径是从“github”网站下载,有可能下载不了,国内的网络不能访问。下载完成后保存到“buildroot/dl/”目录下。

6.2.3 package提取

“提取”其实就是解压源码包到编译目录下,命令如下所示:

make iperf3-extract

运行结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_数据_05


图6.2.3.1 提取iperf3源码包

提取成功后,在“buildroot/output/alientek_rv1126/build”目录下生成“iperf-3.6”目录,可以跳转到“iperf-3.6”目录查看是否解压成功。结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_数据_06


图6.2.3.2 查看iperf3源码

6.2.4 package打补丁

给package包打补丁的命令代码如下所示:

make ffmpeg-patch

运行结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_ide_07


图6.2.4 ffmpeg打补丁

如果没有补丁的就会报错,比如上图中的“iperf3”打补丁,就报错了。

6.2.5 depends编译软件包的依赖项

有些package包需要一些依赖包,比如正点原子自定义的Qdesktop软件包,需要依赖QT源码包的编译完成,后才能编译Qdesktop软件包,所以我们需要先把一些依赖项编译。命令如下所示:

make iperf3-depends

运行完成后如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_数据_08


图6.2.5.1 iperf3依赖项编译

6.2.6 configure配置

“配置”这里的配置包含了下载、提取、打补丁和编译依赖项,运行命令如下所示:

make iperf3-configure

运行结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_数据_09


图6.2.6 configure配置

6.2.7 build编译

单独编译package包,命令如下所示:

make iperf3-build

运行结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_数据_10


图6.2.7.1 编译package包

6.2.8 列出依赖项

可以单独列出package包,所需要的依赖项,命令如下所示:

make iperf3-show-depends

运行结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_示例代码_11


图6.2.8.1 iperf3依赖项

在6.2.5小节里面,编译依赖项有openssl这个软件包,所以这里列出来有这个openssl软件包。

6.2.9 dirclean清除软件包

可以单独清除package包,运行命令如下图所示:

make iperf3-dirclean

运行结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_示例代码_12


图6.2.9.1 清除软件包

6.2.10 修改软件版本

本小节教大家如何修改buildroot的软件包里的软件版本,比如笔者需要修改iperf3的版本,运行以下命令跳转到iperf3的配置目录:

cd buildroot/package/iperf3/​
ls

运行结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_ide_13


图6.2.10.1 查看iperf3

上图中有3个重要的文件分别为:Config.in、iperf3.hash和iperf3.mk。Config.in相当于内核的Kconfig,iperf3.hash软件包的校验码,iperf3.mk相对于内核的Makefile。我们打开iperf3.mk文件找到下载文件的下载地址(有时候下载地址在Config.in里,看编写文件的作者),打开如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_数据_14


图6.2.10.2 iperf3.mk文件查看

上图可以看出来,有下载地址和iperf3的版本,我们可以先打开此下载链接地址“​https://downloads.es.net/pub/iperf/​”找到我们需要更新的版本。如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_ide_15


图6.2.10.3 iperf3版本查看

图6.2.10.3中最新支持3.9版本,我们就修改iperf3.mk里的3.6改为3.9,修改结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_ide_16


图6.2.10.4 修改iperf3版本

修改成功后,我们就可以使用6.2.2小节进行下载测试,命令如下所示:

make iperf3-source

运行结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_ide_17


图6.2.10.5 下载3.9版本的iperf3

上图已经下载成功了,下载到“buildroot/dl/”目录下,还需要运行以下命令生成源码的hash值,命令如下所示:

sha256sum buildroot/dl/iperf-3.9.tar.gz

运行结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_ide_18


图6.2.10.6 生成hash值

跳转到“buildroot/package/iperf3/”下,去修改iperf3.hash文件,打开此文件如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_ide_19


图6.2.10.7 iperf3.hash内容

把图中6.2.10.7的值替换成图6.2.10.6值,替换结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_数据_20


图6.2.10.8 替换结果

上图红色框的hash值和图6.2.10.6显示的值是一样的,还需要修改软件的版本号。修改完成后就可以编译源码到文件系统里面。因为我们的3.9版本是没有补丁的所以需要把“buildroot/package/iperf3/”下的两个补丁删除掉。


6.3 添加自己的程序

本章节教大家如何添加自己的程序到buildroot里。

6.3.1添加test.c文件

在源码目录下,创建一个自己的APP文件夹,如下命令:

mkdir app/mytest

运行结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_ide_21


图6.3.1.1 创建mytest

在mytest目录下可以创建自己的APP程序,这里笔者就创建一个test.c的测试代码,示例代码如下所示:

示例代码6.3.1.1 test.c代码

include <stdio.h>​

int main()​
{​
printf("buildroot helloworld\n");​
return 0;​
}

还是在mytest目录下,创建一个编译test.c程序的Makefile,示例代码如下所示:

示例代码6.3.1.2 Makefile代码

Wall -Wno-deprecated​
CFLAGS = $(OPT) $(OTHER)​
INCDIR = -I​
LIBDIR = -L​
LIBS =​
APP=mytest​
SRCS=test.c​

all:​
$(CC) -o $(APP) $(SRCS) $(CFLAGS) $(LIBDIR) $(INCDIR) $(LIBS)​
clean:​
rm $(APP)

创建结果完成如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_ide_22


图6.3.1.2 mytest的目录查看

6.3.2 加到menuconfig里

大家在配置buildroot的package包的时候,都需要在图形化配置界面上使能,所以我们的APP也是需要生成一个选项。在SDK包的源码下,打开“buildroot/package/Config.in”文件。跳转到最后一个“endmenu”下添加如下示例代码(注意:必须在此文件的最后一个endmenu前添加)。代码如下所示:

menu "mytest"​
source "package/mytest/Config.in"​
endmenu

添加结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_数据_23


图6.3.2.1 添加结果

第2061行,里面使用了source引用了“package/mytest/Config.in”文件,所以我们需要创建此文件,命令如下所示:

mkdir buildroot/package/mytest/

创建目录后(mytest就是在buildroot下package包的名字),我们需要再mytest目录创建“Config.in”文件,内容如下所示:

config BR2_PACKAGE_MYTEST​
bool "mytest"​
help​
This is a demo to add MYtest.

添加结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_示例代码_24


图6.3.2.2 Config.in文件

6.3.3 APP的版本和编译规则

在上个小节里面我们已经把APP添加到配置选项中了,此时的buildroot还是不知道如何下载、提取、编译等等,我们需要添加配置文件告诉buildroot如何操作,需要创建“buildroot/package/mytest/mytest.mk”,名字必须为mytest.mk。把以下的示例代码拷贝到mytest.mk里。

示例代码6.3.3.1 mytest.mk代码


1 MYTEST_VERSION:= 1.0.0​
2 MYTEST_SITE:= $(TOPDIR)/../app/mytest​
3 MYTEST_SITE_METHOD:=local​
4 MYTEST_INSTALL_TARGET:=YES​
5 ​
6 define MYTEST_BUILD_CMDS​
7 $(MAKE) CC="$(TARGET_CC)" LD="$(TARGET_LD)" -C $(@D) all​
8 endef​
9 ​
10 define MYTEST_INSTALL_TARGET_CMDS​
11 $(INSTALL) -D -m 0755 $(@D)/mytest $(TARGET_DIR)/bin​
12 endef​
13​
14 define MYTEST_PERMISSIONS​
15 /bin/mytest f 4755 0 0 - - - - -​
16 endef​
17​
18 $(eval $(generic-package))

此文件就是告诉buildroot是如何编译、下载、拷贝等等。大写的宏都是以“MYTEST”开头的,是根据我们package包的名字决定的。

第1行,_VERSION结尾的变量是源码的版本。

第2行,_SITE结尾的变量是源码下载的地址。

第3行,_SITE_METHOD结尾的变量是下载源码方法,local为本地下载。

4行和第10~12行,自动执行安装,把我们的mytest可以运行的文件拷贝bin目录下。

第6行,_BUILD_CMDS结尾的变量会在buildroot框架编译的时候执行,用于给源码的Makefile传递编译选项和链接选项,调用源码的Makefile。

第14~16行,给文件的权限。

第18行,这个函数会把整个.mk文件构建成脚本。

6.3.4 测试APP

前面几个小节里面已经配置好了我们的mytest了,接着需要在menuconfig里面开启mytest。如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_示例代码_25


图6.3.4.1 开启mytest

配置完成后,我们就可以测试我们的mytest能不能编译了,命令如下所示:

make mytest

运行结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_数据_26


图6.3.4.2 编译mytest

6.4 最简单的添加开机自启

如何把自己的脚本添加到开发板上自启,烧录好文件系统后,在/etc/init.d/目录下就是开发板的自启脚本,创建一个脚本以“S”开头的shell脚本即可运行。比如我们创建一个S99test脚本,代码如下所示:

source /etc/profile​
case "$1" in​
start)​
echo "start test"​
;;​
stop)​
echo "stop test"​
;;​
reload|force-reload)​
echo "Reloading test"​
"$0" reload​
;;​
restart)​
"$0" stop​
sleep 1 # Prevent race condition: ensure QDesktop stops before start.​
"$0" start​
;;​
*)​
echo "Usage: $0 {start|stop|restart|reload|force-reload}"​
esac​
exit 0

上述的代码很简单,不会的自己去看shell case使用。系统启动的时候,会调用这个脚本,传入的参数“start”就会运行打印“start test”。系统结束的时候,还是会调用这个脚本,传入的参数“stop”就会运行打印“stop test”。此脚本需要运行所以我们给个执行权限,命令如下所示:

chmod +x S99test

设置完成后,重启开发板即可看到打印信息:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_ide_27


6.4.1 系统启动打印

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_示例代码_28


6.4.2 系统结束打印

可以把脚本放到SDK的镜像里,这样直接烧录就能启动自己的脚本,把脚本拷贝“buildroot/board/rockchip/rv1126_rv1109/fs-overlay-sysv/etc/init.d”目录下即可。例如:S99test拷贝到这个目录下,结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_数据_29


图6.4.3 自启的脚本添加

添加完成后,重新编译SDK包,我们的脚本就能够自己启动了。



附录A 使用技巧

A1 摄像头的使用技巧​

A1.1 查看摄像头的初始化成功​

如果想知道摄像头有么有正常的初始化,可以使用此命令进行测试:

dmesg | grep rockchip-mipi-dphy-rx

运行结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_ide_30

这里笔者接了两个imx335摄像头,1-001a表示MIPI CSI0初始化成功(靠近按键那个摄像头)5-001a表示MIPI CSI1初始化成功。

A1.2 获取原始的raw数据​

  1. 获取MIPI CSI0的raw数据首先我们需要摄像头能够正常工作,运行以下代码进行获取摄像头的数据(imx335)
v4l2-ctl -d /dev/video0 \
--set-fmt-video=width=2592,height=1944,\​
pixelformat=NV12 \
--stream-mmap=3 \
--stream-skip=3 \
--stream-to=/tmp/cif.raw \
--stream-count=1 \
--stream-poll


-d:指定摄像头的设备节点
--set-fmt-video:指定图像的分辨率,分辨率不能修改,修改后获取图像有问题。
--Pixelformat:指定文件格式,NV12
--stream-mmap:指定buffer的类型为mmap。
--stream-skip:指定丢弃的前3帧。
--stream-to:指定帧数保存的文件路径。
--stream-count:指定抓取的帧数
--stream-pollv4l2-ctl采用异步IO
注意:上述的命令是获取IMX335摄像头。下面的命令为IMX415摄像头:
v4l2-ctl -d /dev/video0 \
--set-fmt-video=width=3840,height=2160,\
pixelformat=NV12 \
--stream-mmap=3 \
--stream-skip=3 \
--stream-to=/tmp/cif2.raw \
--stream-count=1 \
--stream-poll
获取后需要安装Vooya软件(版权问题就不提供下载,自己上百度下载)。拷贝raw文件到Windows系统下,用vooya打开此文件,需要设置分辨率,才能看到图像。

按照此路径File à Format进入下图的配置:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_示例代码_31


根据摄像头的来确定分辨率,这里打开的是IMX415摄像头,所以分辨率为3840x2160,如果是IMX335摄像头就设置分辨率为2592x1944。其它的红框按照此设置就行。设置完成后,就能大概能看清图片,也可以使用官方的rkisp2x_tuner来获取raw图像在显示。

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_数据_32


  1. 获取MIPI CSI1的raw数据

运行以下代码进行切换摄像头的数据

media-ctl -d /dev/media2-l '"rkisp-isp-subdev":2->"rkisp-bridge-ispp":0[0]'​
media-ctl -d /dev/media2-l '"rkisp-isp-subdev":2->"rkisp-bridge-ispp":0[0]'

MIPI CSI1像头的节点为video17,例如MIPI CSI1接上IMX335,所以命令修改为如下:

v4l2-ctl -d /dev/video17 \​
--set-fmt-video=width=2592,height=1944,\​
pixelformat=NV12 \​
--stream-mmap=3 \​
--stream-skip=3 \​
--stream-to=/tmp/cif.raw \​
--stream-count=1 \​
--stream-poll

A1.3 ISP摄像头的节点

运行以下代码打印出摄像头的节点和别名

grep '' /sys/class/video4linux/video*/name

运行结果如下图所示:

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_ide_33


上图中总共有44个video的节点,因为我们的MIPI摄像头的数据为RAW,RAW格式是原始的摄像头数据我们是无法使用的,需要经过RV1126的ISP处理后输出RGB或者YUV数据。ISP处理后的摄像头节点有:

Entity name

设备节点

最大的宽度

支持的输出格式

rkispp_m_bypass

video30/38

不支持设置分辨率,不支持缩放

NV12/NV16/YUYV/FBC0/FBC2

rkispp_scale0

video31/39

max width: 3264,最大支持 8 倍缩放

NV12/NV16/YUYV

rkispp_scale1

video32/40

max width: 1280,最大支持 8 倍缩放

NV12/NV16/YUYV

rkispp_scale2

video33/41

max width: 1280,最大支持 8 倍缩放

NV12/NV16/YUYV

每一个MIPI摄像头经过ISP处理后有4个设备节点可以调用,video30~33MIPI CSI0,video38~41为MIPI CSI1

A1.4 IPC的使用

在出厂系统下,首先退出QT的UI界面,开启ISP功能。命令如下所示:

ispserver &

可以使用“startup_app_ipc”命令去开启IPC功能,需要学习一下此命令的参数,

选项

描述

默认值

备注

-I

ISP下的摄像头切换

0

0:MIPI CSI0

1: MIPI CSI1

-h

显示的高

1280

-w

显示的宽

720

-d

设备节点

rkispp_scale2

rkispp_scale0

rkispp_scale1

rkispp_scale2

-W

输入的宽

1280

-H

输入的高

720

-?/--help

显示帮助信息

根据自己的硬件,决定命令的参数,这里笔者是接了720屏幕和CSI0接上了摄像头,所以命令如下所示:

startup_app_ipc -I 0 &

这条命令开启ipc,还是不能通过远程访问摄像头数据,还需要使用下面命令开启远程访问,命令如下所示:

RkLunch.sh

连接网络,使用“ifconfig”获取IP地址,笔者的IP地址为192.168.6.184,打开浏览器输入开发板的IP地址,就会弹出以下窗口

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_ide_34


用户名和密码都是:admin 登录就会显示摄像头的数据。

《DFZU2EG_4EV MPSoC之嵌入式Linux开发指南》 第六章 buildroot使用​_数据_35




【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月13日 0

暂无评论

推荐阅读
95kVyaJuybju