大家好!我是大聪明-PLUS!
在这一系列简短的文章中,我将尝试阐明构建嵌入式 Linux 设备的主题,从组装引导加载程序到为单独开发的外部模块编写驱动程序,并实现所有中间过程的自动化。
上一节讨论了如何创建一个不执行任何有用操作的基本系统,但通过其示例展示了组装此类系统的
方法之一。
本节将讨论一种名为Buildroot的自动化工具、符合现代驱动程序开发趋势的驱动程序的创建,以及第一部分中宣布的功能的实现,该功能涉及根据微笑遥控器的命令将表情符号发送到小圈子中广为人知的顶级聊天网站。
根据上一节的结果,我有一个带有基本系统的开发板,并打算为其添加一些功能。我希望确保编辑任何组件(无论是用户程序、内核驱动程序还是简单的配置设置)都不需要花费大量精力来构建新系统。理想情况下,只需一条命令即可完成。这项任务可以使用构建系统来完成,其中最著名的是Yocto Project、OpenWrt和Buildroot,它们各有优缺点。本文将使用 Buildroot。
Buildroot
正如官方网站所说,Buildroot 是一个简单、有效、易于使用的工具,用于通过交叉编译创建嵌入式系统,Buildroot for Everyone,他们说,是的,在很多方面这都是真的。

检查依赖项后,您可以下载
git` clone `-b` `2021`.02 https://git.buildroot.net/buildroot`
例如,要为大聪明SMARC开发板创建一个最小系统,并且该板有一个现成的配置(而不仅仅是一个),您需要安装此配置并运行构建
cd` buidlroot
`make` beaglebone_defconfig
`make
这样,Buildroot 就会自动下载必要的源代码,构建交叉编译工具链、引导加载程序、Linux 内核、系统实用程序、库------基本上就是上一篇文章中提到的所有内容,甚至更多。可以使用以下命令查看beaglebone_defconfig设置的设置:
make` menuconfig`
列出所有预设配置:
make` list-defconfigs`
显示所有命令的帮助:
make` help`
在这里我不会使用预先安装的配置,而是从头开始创建我自己的配置,然后随着操作的进行,添加所有必要的板设置。
首先,您需要创建一个文件夹,用于存放构建特定电路板所需的所有额外材料。Buildroot 建议使用*/board 文件夹。* 我们将该电路板命名为"smilebrd",从现在起,与该项目相关的所有内容都将位于*/board/smilebrd/ 文件夹中。*
现在是时候为主板设置基本的 Buildroot 设置了,这是目前已知的一切。
make` defconfig
`make` menuconfig`
下面只显示更改的设置,其余保持默认,另外 Buildroot 会自动标记添加组件的依赖关系。
目标平台的架构很明显:ARM,Cortex-A8
`Target options --->
Target Architecture (ARM (little endian))
Target Architecture Variant (cortex-A8)`
程序集,您需要指定执行savedefconfig后将添加到现有配置中的配置名称
`Build options --->
($(CONFIG_DIR)/configs/smilebrd_defconfig) Location to save buildroot config `
我们将使用上一篇文章中描述的工具链gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabih f。您还需要指定一些参数以确保其正确使用。该库将是一个功能齐全的 glibc - 空间允许,并添加了对 C++ 的支持。
`Toolchain --->
Toolchain type (External toolchain)
Toolchain (Custom toolchain)
Toolchain origin (Pre-installed toolchain)
($(HOME)/toolchain/gcc-arm-10.2-2020.11-x86_64-arm-none-linux-gnueabihf) Toolchain path
($(ARCH)-none-linux-gnueabihf) Toolchain prefix
External toolchain gcc version (10.x)
External toolchain kernel headers series (4.20.x)
External toolchain C library (glibc/eglibc)
[*]Toolchain has C++ support?`
您可以将系统名称和欢迎语添加到系统配置中,将 init 子系统更改为systemd ,并将命令 shell 更改为*bash 。*此部分还允许您指定在构建文件系统之前运行的脚本。此脚本用于将 uEnv.txt 文件(已在上一篇文章中讨论)复制到构建目录,以及复制用于自动启动用户应用程序的设置(该应用程序本身将在稍后讨论)。
`System configuration --->
(smile_board) System hostname
(Welcome to smile board) System banner
Init system (systemd)
/bin/sh (bash)
(board/smilebrd/post-build.sh) Custom scripts to run before creating filesystem images`
#!/bin/sh`
`BOARD_DIR="$(dirname $0)"`
`cp` `$BOARD_DIR`/uEnv.txt `$BINARIES_DIR`/uEnv.txt
`cp` `$BOARD_DIR`/smilebrd_serv.service `$TARGET_DIR`/etc/systemd/system/smilebrd_serv.service`
接下来是 Linux 内核配置。与工具链一样,Buildroot 将使用预构建的内核,这意味着 Buildroot 不会自行下载任何内容,而是会从指定 tarball 中的源代码解压并构建所有内容。内核配置略有定制,因为它需要添加为新开发的 Smile Remote 构建新开发的驱动程序的步骤。它还指定了要构建的设备树、构建所需的组件以及 OpenSSL 支持。
`Kernel --->
[*] Linux Kernel
Kernel version (Custom tarball) ---> Custom tarball
(file://$(HOME)/kernel/linux-5.4.92.tar.xz) URL of custom kernel tarball
Kernel configuration (Using a custom (def)config file)
(board/smilebrd/kernel_smilebrd_defconfig) Configuration file path
[*] Build a Device Tree Blob (DTB)
(am335x-boneblack) In-tree Device Tree Source file names
[*] Needs host OpenSSL`
系统中已安装的软件包。您需要TP-LINK TL-WN725N WiFi 适配器的固件。它体积小巧、易于获取、价格低廉,并且功能齐全。它包含一个 Realtek 8188EU 芯片,您需要在配置文件中指定该芯片。您还需要添加 connman来管理 WiFi 连接。我还使用了 wscat 实用程序通过 websocket 与聊天进行交互。它基于 Node.js 运行,因此您需要 Node.js 支持以及包含所需模块的软件包管理器。
`Target packages --->
Hardware handling --->
Firmware --->
[*] linux firmware
Wifi firmware --->
[*] Realtek 81xx
Interpreter languages and scripting --->
[*] nodejs
[*] NPM for the target
(wscat) Additional modules
Networking applications --->
[*] connman
[*] enable WiFi support
[*] enable command line client`
文件系统将采用 ext4 格式,最大容量为 500 MB。该大小仅作为限制,因为在嵌入式系统中,通常所有硬件特性都是预先已知的,因此提前了解分配给根文件系统的内存大小是否超出是有意义的。
`Filesystem images --->
[*] ext2/3/4 root filesystem
ext2/3/4 variant (ext4) ---> ext4
(500M) exact size`
U-Boot 引导加载程序的更多详细信息(包括其位置和配置方法)请参阅上一篇文章。在这里,您还需要指定正在使用的 U-Boot、其位置以及 U-Boot 设置的路径。AM3358 的默认配置即可使用,但出于教学目的,我做了一些细微的更改,取消了 2 秒的启动延迟。以下是uboot_smilebrd_defconfig 和am335x_evm_defconfig之间的区别。您还需要指定辅助引导加载程序的格式和名称。
`Bootloaders --->
[*] U-Boot
Uboot Version (Custom tarball) ---> Custom tarball
(file://$(HOME)/u-boot/u-boot-2021.01.tar.xz) URL of custom U-Boot tarball
U-Boot configuration (Using a custom board (def)config file)--->
(board/smilebrd/uboot_smilebrd_defconfig) Configuration file path
[*] U-Boot needs dtc
U-Boot binary format --->
[*] u-boot.img
[*] Install U-Boot SPL binary image
(MLO) U-Boot SPL/TPL binary image name(s)`
现在剩下的就是保存最终的配置。
make` savedefconfig`
稍后,在构建中添加一个与笑脸遥控器交互的程序。但在运行 Buildroot 构建之前,您需要创建上面提到的 Linux 内核配置 - kernel_smilebrd_defconfig 。此新配置与上一篇文章中使用的默认omap2plus_defconfig不同,它添加了对 WiFi 适配器和笑脸遥控器的支持。虽然 WiFi 适配器驱动程序存在于内核中,但笑脸遥控器驱动程序显然不存在,所以现在是时候解决这个问题了。
好的,接下来的内容我们在第三部分有持续输出。请看下一篇文章。