嵌入式Linux快速入门系统教程(三):用 Buildroot 添加新功能

立芯嵌入式 2025-07-14 10:21

快速入门嵌入式Linux开发,咱们已经一起走过了前两集。这次,我们要更进一步,聊聊如何通过引入现成的开源软件,为固件增加高级功能,比如让你的设备摇身一变成一个无线接入点(AP)。这一节的目标,是带你掌握一套通用的工作流程,学会如何把新功能集成到你的系统里。


新功能的开发流程

给Linux固件添加新功能,听起来高大上,其实跟写普通软件没啥本质区别,无非是多点硬件相关的坑。以下是一个通用的开发流程,简单粗暴但超级实用:

  1. 明确功能需求:先想清楚这个功能对用户来说长啥样,系统要干啥。比如,需不需要支持新硬件?出错时咋处理?用户体验要多丝滑?
  2. 挑软件和工具:根据需求,选好要用的开源软件包、内核驱动,或者自己写点脚本把它们串起来。
  3. 定制化配置:好软件通常功能很全,但你的需求可能只用它的一部分。得把软件配置调到符合你的场景。
  4. 测试和调试:把改好的固件烧录到设备上,启动看看效果。行不行?不行就调,调完再试。团队开发可能还会写自动化测试脚本,个人玩家周末搞搞可能就手动测测。
  5. 固化改动:确认没问题后,把改动提交到版本控制,方便以后复现。

这套流程适用于任何你想加到固件的功能,无论是搞个Web服务器、加个传感器驱动,还是像今天这样,搞个无线AP。


目标:让Raspberry Pi Zero W变身无线AP

咱们的目标是让Raspberry Pi Zero W开机后自动变成一个无线AP,就像家里的Wi-Fi路由器那样。用户啥都不用配,插上电就能用。具体要求:

  • 自动创建Wi-Fi热点,客户端设备能直接连。
  • 通过DHCP给连接的设备分配IP地址。
  • 整个功能全自动,固件烧好后无需手动干预。

为了实现这个功能,咱们需要两个用户态守护进程(hostapd和dnsmasq),外加Wi-Fi芯片的固件支持。听起来复杂?其实不难,跟着我一步步来。

功能拆解

  • hostapd:负责创建和管理Wi-Fi热点。它会跟内核的Wi-Fi接口打交道,设置硬件为AP模式,选择Wi-Fi频道,处理连接/断开事件。为了简单,咱们用2.4GHz的开放热点(不设密码)。
  • dnsmasq:负责给客户端分配IP地址。咱们随便选了个10.33.40.0/24的网段,设备连上后会自动拿到10.33.40.10到10.33.40.200之间的IP地址,租期24小时。
  • 静态IP:Raspberry Pi自己得有个固定IP,咱们给wlan0配上10.33.40.1,方便客户端路由流量。
  • Wi-Fi固件:Raspberry Pi Zero W的Wi-Fi芯片需要固件支持,内核加载驱动时会用上。

这些配置都会直接“烤”进固件镜像,烧录后设备一启动就自动生效,省去手动配置的麻烦。


配置软件

嵌入式开发很多时候就是“拿来主义”,直接用现成的开源软件,配好配置文件就能干活。以下是我们需要的配置文件。

dnsmasq配置

在/etc/dnsmasq.conf里,告诉dnsmasq在wlan0接口上干活,分配10.33.40.10到10.33.40.200的IP地址,子网掩码255.255.255.0:

interface=wlan0
dhcp-range=10.33.40.10,10.33.40.200,255.255.255.0,24h

hostapd配置

在/etc/hostapd.conf里,配置Wi-Fi热点的基本参数。咱们用nl80211驱动(现代Wi-Fi芯片标配),热点名字随便取了个eternalchip,用802.11g模式(比龟速的b模式快多了),选频道6(2.4GHz里常用的频道之一):

interface=wlan0
driver=nl80211
ssid=MasteringEmbeddedLinux
hw_mode=g
channel=6

网络接口配置

Raspberry Pi Zero W没网口,咱们直接改/etc/network/interfaces,把wlan0配成静态IP:

auto wlan0
iface wlan0 inet static
    address 10.33.40.1
    netmask 255.255.255.0

这些配置文件跟Buildroot没啥直接关系,写好后可以先在电脑上用同样的软件测试,迭代起来比在目标板上快多了。


开机脚本

如果你刷过第三篇的固件,登录后跑个ip link,会发现压根没wlan0。这是因为默认固件没加载Wi-Fi驱动。咱们得写个开机脚本,加载Wi-Fi芯片的内核模块(brcmfmac)。另外,Buildroot的hostapd包没自带启动脚本,咱也得补一个。

咱们用的Buildroot配置是传统的init脚本系统(第五篇会详细讲)。简单说,/etc/init.d/里的可执行脚本会按字母顺序启动,习惯上用S加数字开头,比如S02表示早点跑,S90表示晚点跑。咱们需要:

  • S02modules:加载Wi-Fi驱动模块。
  • S90hostapd:启动hostapd守护进程。

模块加载脚本

简单粗暴,直接加载brcmfmac模块:

#!/bin/sh
/sbin/modprobe brcmfmac

hostapd启动脚本

这个稍微复杂点,但其实就是抄了现成的模板,嵌入式开发不就这回事儿嘛:

#!/bin/sh

case$1in
    start)
        printf Starting hostapd: 
        start-stop-daemon -S -x /usr/sbin/hostapd -- -B /etc/hostapd.conf
        [ $? = 0 ] && echo OK || echo FAIL
        ;;
    stop)
        printf Stopping hostapd: 
        start-stop-daemon -K -q -x /usr/sbin/hostapd
        [ $? = 0 ] && echo OK || echo FAIL
        ;;
    restart|reload)
        $0 stop
        $0 start
        ;;
    *)
        echo Usage: $0 {start|stop|restart}
        exit 1
esac

exit 0

集成到Buildroot

配置文件和脚本得跟硬件和固件绑定,不能随便扔到软件包里(软件包得硬件无关)。Buildroot用根文件系统覆盖(rootfs overlay)来处理这种板子专属的配置。简单说,就是把这些文件放到一个特定目录,Buildroot会在编译完软件包后,把它们覆盖到生成的文件系统里。

创建覆盖目录

在Buildroot源码树里创建以下目录:

$ mkdir -p board/raspberrypi/rootfs_overlay/etc/init.d
$ mkdir -p board/raspberrypi/rootfs_overlay/etc/network

然后把前面写的五个文件放进去:

  • etc/dnsmasq.conf
  • etc/hostapd.conf
  • etc/network/interfaces
  • etc/init.d/S02modules
  • etc/init.d/S90hostapd

别忘了给init脚本加可执行权限,不然开机时会报权限拒绝的怪错:

$ chmod +x board/raspberrypi/rootfs_overlay/etc/init.d/*

配置Buildroot

make menuconfig打开配置界面,找到BR2_ROOTFS_OVERLAY(在System configuration里),填上覆盖目录路径:board/raspberrypi/rootfs_overlay。路径是相对Buildroot根目录的,别写错。

顺便,咱们启用几个必要的软件包:

  • dnsmasqhostapd:在Target packages → Networking applications里勾上。
  • Wi-Fi固件:在Target packages → Hardware handling → Firmware里,启用BR2_PACKAGE_RPI_WIFI_FIRMWARE,这是Raspberry Pi Zero W的Wi-Fi芯片固件。

另外,强烈建议在Build Options里启用ccache(编译器缓存)。这玩意儿能大大加速重复编译,简直是嵌入式开发的救命神器。选上后,第一次编译可能慢点,但后面改点配置再编译,20分钟就能搞定(我笔记本实测)。


编译测试

配置好了,跑make重新编译固件。编译完后,检查**output/target/etc/**,确认配置文件都到位了。然后用第三篇的方法烧录固件:

$ sudo dd if=output/images/sdcard.img of=/dev/mmcblkX bs=1M status=progress

插上板子,打开串口控制台,应该能看到dnsmasq和hostapd启动成功的提示:

Starting dnsmasq: OK
Starting hostapd: OK

然后掏出手机或电脑,找Wi-Fi热点,应该能看到MasteringEmbeddedLinux。连上后,检查下IP,应该是10.33.40.x范围内的。如果连不上(比如Android可能因为没网关而拒绝连接),换个设备试试,或者临时关掉设备的网络检查功能。


提交改动

功能跑通了,赶紧把改动固化到Git里!咱们的改动目前只在工作配置里,还没保存到defconfig。运行以下命令更新defconfig:

$ make savedefconfig

然后用Git检查状态,会看到configs/raspberrypi0w_defconfig改动了,**board/raspberrypi/rootfs_overlay/**是新文件:

$ git status

提交改动:

$ git add board/raspberrypi/rootfs_overlay/
$ git add configs/
$ git commit -m "Raspberry Pi Zero W: 添加无线AP功能"

调试技巧

快速调试的办法,是直接在目标板上改配置文件,通过串口手动测试。调好了再把文件拷回Buildroot的覆盖目录。

不过要注意,Buildroot的精髓是可复现性。如果你在板子上改了东西,没同步到源码树,下一轮编译就白干了。所以,养成好习惯:改动一定得回写到Buildroot配置或覆盖目录里。

声明:内容取材于网络,仅代表作者观点,如有内容违规问题,请联系处理。 
嵌入式
Copyright © 2025 成都科技区角科技有限公司
蜀ICP备2025143415号-1
  
川公网安备51015602001305号