第六章 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包,命令如下所示:
运行结果如下图所示:
图6.1.2 buildroot的图形化界面
进入图形化界面后,我们可以在这里添加或者删除package包,比如:删除rkwifibt,配置路径如下:
配置如下图所示:
图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的使用命令。命令如下所示:
运行结果如下图所示:
图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源码包(下载好了不会再次下载),命令如下所示:
接着可以使用命令,下载iperf3软件。命令如下所示:
运行结果如下图所示:
图6.2.2.1 下载iperf3的源码
注意图中的下载路径,如果下载路径是从“github”网站下载,有可能下载不了,国内的网络不能访问。下载完成后保存到“buildroot/dl/”目录下。
6.2.3 package提取
“提取”其实就是解压源码包到编译目录下,命令如下所示:
运行结果如下图所示:
图6.2.3.1 提取iperf3源码包
提取成功后,在“buildroot/output/alientek_rv1126/build”目录下生成“iperf-3.6”目录,可以跳转到“iperf-3.6”目录查看是否解压成功。结果如下图所示:
图6.2.3.2 查看iperf3源码
6.2.4 package打补丁
给package包打补丁的命令代码如下所示:
运行结果如下图所示:
图6.2.4 ffmpeg打补丁
如果没有补丁的就会报错,比如上图中的“iperf3”打补丁,就报错了。
6.2.5 depends编译软件包的依赖项
有些package包需要一些依赖包,比如正点原子自定义的Qdesktop软件包,需要依赖QT源码包的编译完成,后才能编译Qdesktop软件包,所以我们需要先把一些依赖项编译。命令如下所示:
运行完成后如下图所示:
图6.2.5.1 iperf3依赖项编译
6.2.6 configure配置
“配置”这里的配置包含了下载、提取、打补丁和编译依赖项,运行命令如下所示:
运行结果如下图所示:
图6.2.6 configure配置
6.2.7 build编译
单独编译package包,命令如下所示:
运行结果如下图所示:
图6.2.7.1 编译package包
6.2.8 列出依赖项
可以单独列出package包,所需要的依赖项,命令如下所示:
make iperf3-show-depends
运行结果如下图所示:
图6.2.8.1 iperf3依赖项
在6.2.5小节里面,编译依赖项有openssl这个软件包,所以这里列出来有这个openssl软件包。
6.2.9 dirclean清除软件包
可以单独清除package包,运行命令如下图所示:
make iperf3-dirclean
运行结果如下图所示:
图6.2.9.1 清除软件包
6.2.10 修改软件版本
本小节教大家如何修改buildroot的软件包里的软件版本,比如笔者需要修改iperf3的版本,运行以下命令跳转到iperf3的配置目录:
运行结果如下图所示:
图6.2.10.1 查看iperf3
上图中有3个重要的文件分别为:Config.in、iperf3.hash和iperf3.mk。Config.in相当于内核的Kconfig,iperf3.hash软件包的校验码,iperf3.mk相对于内核的Makefile。我们打开iperf3.mk文件找到下载文件的下载地址(有时候下载地址在Config.in里,看编写文件的作者),打开如下图所示:
图6.2.10.2 iperf3.mk文件查看
上图可以看出来,有下载地址和iperf3的版本,我们可以先打开此下载链接地址“https://downloads.es.net/pub/iperf/”找到我们需要更新的版本。如下图所示:
图6.2.10.3 iperf3版本查看
图6.2.10.3中最新支持3.9版本,我们就修改iperf3.mk里的3.6改为3.9,修改结果如下图所示:
图6.2.10.4 修改iperf3版本
修改成功后,我们就可以使用6.2.2小节进行下载测试,命令如下所示:
运行结果如下图所示:
图6.2.10.5 下载3.9版本的iperf3
上图已经下载成功了,下载到“buildroot/dl/”目录下,还需要运行以下命令生成源码的hash值,命令如下所示:
运行结果如下图所示:
图6.2.10.6 生成hash值
跳转到“buildroot/package/iperf3/”下,去修改iperf3.hash文件,打开此文件如下图所示:
图6.2.10.7 iperf3.hash内容
把图中6.2.10.7的值替换成图6.2.10.6值,替换结果如下图所示:
图6.2.10.8 替换结果
上图红色框的hash值和图6.2.10.6显示的值是一样的,还需要修改软件的版本号。修改完成后就可以编译源码到文件系统里面。因为我们的3.9版本是没有补丁的所以需要把“buildroot/package/iperf3/”下的两个补丁删除掉。
6.3 添加自己的程序
本章节教大家如何添加自己的程序到buildroot里。
6.3.1添加test.c文件
在源码目录下,创建一个自己的APP文件夹,如下命令:
运行结果如下图所示:
图6.3.1.1 创建mytest
在mytest目录下可以创建自己的APP程序,这里笔者就创建一个test.c的测试代码,示例代码如下所示:
示例代码6.3.1.1 test.c代码
还是在mytest目录下,创建一个编译test.c程序的Makefile,示例代码如下所示:
示例代码6.3.1.2 Makefile代码
创建结果完成如下图所示:
图6.3.1.2 mytest的目录查看
6.3.2 加到menuconfig里
大家在配置buildroot的package包的时候,都需要在图形化配置界面上使能,所以我们的APP也是需要生成一个选项。在SDK包的源码下,打开“buildroot/package/Config.in”文件。跳转到最后一个“endmenu”下添加如下示例代码(注意:必须在此文件的最后一个endmenu前添加)。代码如下所示:
添加结果如下图所示:
图6.3.2.1 添加结果
第2061行,里面使用了source引用了“package/mytest/Config.in”文件,所以我们需要创建此文件,命令如下所示:
mkdir buildroot/package/mytest/
创建目录后(mytest就是在buildroot下package包的名字),我们需要再mytest目录创建“Config.in”文件,内容如下所示:
添加结果如下图所示:
图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代码
此文件就是告诉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。如下图所示:
图6.3.4.1 开启mytest
配置完成后,我们就可以测试我们的mytest能不能编译了,命令如下所示:
make mytest
运行结果如下图所示:
图6.3.4.2 编译mytest
6.4 最简单的添加开机自启
如何把自己的脚本添加到开发板上自启,烧录好文件系统后,在/etc/init.d/目录下就是开发板的自启脚本,创建一个脚本以“S”开头的shell脚本即可运行。比如我们创建一个S99test脚本,代码如下所示:
上述的代码很简单,不会的自己去看shell case使用。系统启动的时候,会调用这个脚本,传入的参数“start”就会运行打印“start test”。系统结束的时候,还是会调用这个脚本,传入的参数“stop”就会运行打印“stop test”。此脚本需要运行所以我们给个执行权限,命令如下所示:
chmod +x S99test
设置完成后,重启开发板即可看到打印信息:
6.4.1 系统启动打印
6.4.2 系统结束打印
可以把脚本放到SDK的镜像里,这样直接烧录就能启动自己的脚本,把脚本拷贝“buildroot/board/rockchip/rv1126_rv1109/fs-overlay-sysv/etc/init.d”目录下即可。例如:S99test拷贝到这个目录下,结果如下图所示:
图6.4.3 自启的脚本添加
添加完成后,重新编译SDK包,我们的脚本就能够自己启动了。
附录A 使用技巧
A1 摄像头的使用技巧
A1.1 查看摄像头的初始化成功
如果想知道摄像头有么有正常的初始化,可以使用此命令进行测试:
运行结果如下图所示:
这里笔者接了两个imx335摄像头,1-001a表示MIPI CSI0初始化成功(靠近按键那个摄像头),5-001a表示MIPI CSI1初始化成功。
A1.2 获取原始的raw数据
- 获取MIPI CSI0的raw数据首先我们需要摄像头能够正常工作,运行以下代码进行获取摄像头的数据(imx335):
-d:指定摄像头的设备节点
--set-fmt-video:指定图像的分辨率,分辨率不能修改,修改后获取图像有问题。
--Pixelformat:指定文件格式,NV12。
--stream-mmap:指定buffer的类型为mmap。
--stream-skip:指定丢弃的前3帧。
--stream-to:指定帧数保存的文件路径。
--stream-count:指定抓取的帧数
--stream-poll:v4l2-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进入下图的配置:
根据摄像头的来确定分辨率,这里打开的是IMX415摄像头,所以分辨率为3840x2160,如果是IMX335摄像头就设置分辨率为2592x1944。其它的红框按照此设置就行。设置完成后,就能大概能看清图片,也可以使用官方的rkisp2x_tuner来获取raw图像在显示。
- 获取MIPI CSI1的raw数据
运行以下代码进行切换摄像头的数据
MIPI CSI1像头的节点为video17,例如MIPI CSI1接上IMX335,所以命令修改为如下:
A1.3 ISP摄像头的节点
运行以下代码打印出摄像头的节点和别名
grep '' /sys/class/video4linux/video*/name
运行结果如下图所示:
上图中总共有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~33为MIPI 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地址,就会弹出以下窗口
用户名和密码都是:admin 登录就会显示摄像头的数据。