快速入门嵌入式Linux开发,咱们已经一起走过了前两集。这次,我们要更进一步,聊聊如何通过引入现成的开源软件,为固件增加高级功能,比如让你的设备摇身一变成一个无线接入点(AP)。这一节的目标,是带你掌握一套通用的工作流程,学会如何把新功能集成到你的系统里。
新功能的开发流程
给Linux固件添加新功能,听起来高大上,其实跟写普通软件没啥本质区别,无非是多点硬件相关的坑。以下是一个通用的开发流程,简单粗暴但超级实用:
明确功能需求:先想清楚这个功能对用户来说长啥样,系统要干啥。比如,需不需要支持新硬件?出错时咋处理?用户体验要多丝滑? 挑软件和工具:根据需求,选好要用的开源软件包、内核驱动,或者自己写点脚本把它们串起来。 定制化配置:好软件通常功能很全,但你的需求可能只用它的一部分。得把软件配置调到符合你的场景。 测试和调试:把改好的固件烧录到设备上,启动看看效果。行不行?不行就调,调完再试。团队开发可能还会写自动化测试脚本,个人玩家周末搞搞可能就手动测测。 固化改动:确认没问题后,把改动提交到版本控制,方便以后复现。
这套流程适用于任何你想加到固件的功能,无论是搞个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根目录的,别写错。
顺便,咱们启用几个必要的软件包:
dnsmasq和hostapd:在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配置或覆盖目录里。
