3. 开发环境搭建:交叉编译工具链安装、Linux内核源码获取与配置、menuconfig中蓝牙相关选项配置、编译内核与设备树
嵌入式Linux蓝牙驱动的开发与调试,离不开一套完整、可复现的交叉编译环境。本章将引导你从零搭建基于ARM64(AArch64)的开发环境,涵盖工具链安装、内核源码管理、蓝牙子系统配置、内核与设备树编译等核心环节。所有操作均以Ubuntu 22.04 LTS主机系统为例,目标平台为树莓派4B(BCM2711)。
环境概览:主机系统 Ubuntu 22.04 LTS x86_64;目标架构 ARM64 (aarch64);目标板 树莓派4B (BCM2711);内核版本 Linux 6.1 LTS。
3.1 交叉编译工具链安装
交叉编译工具链是嵌入式开发的基石。它运行在x86_64主机上,却能生成ARM64架构的可执行代码。我们选择由ARM官方维护的GNU AArch64裸机/ Linux工具链,也可使用发行版包管理器安装。
3.1.1 安装方式对比
| 安装方式 | 命令/来源 | 适用场景 | 注意事项 |
|---|---|---|---|
| apt包管理器 | sudo apt install gcc-aarch64-linux-gnu |
快速开始、通用开发 | 版本可能滞后于上游 |
| ARM官方预编译包 | 从 developer.arm.com 下载 |
需要最新特性或特定版本 | 需手动配置PATH |
| crosstool-NG自编译 | 源码构建 | 深度定制、生产环境 | 编译耗时较长 |
3.1.2 使用apt安装(推荐)
# 更新包索引
sudo apt update
# 安装交叉编译器、binutils和glibc
sudo apt install -y \
gcc-aarch64-linux-gnu \
binutils-aarch64-linux-gnu \
g++-aarch64-linux-gnu
# 验证安装
aarch64-linux-gnu-gcc --version
# 输出示例:aarch64-linux-gnu-gcc (Ubuntu 11.3.0-1ubuntu1~22.04) 11.3.0
3.1.3 设置环境变量
为简化后续编译命令,建议将交叉编译器的前缀导出为环境变量:
export CROSS_COMPILE=aarch64-linux-gnu-
export ARCH=arm64
# 可将上述两行追加到 ~/.bashrc 中永久生效
echo 'export CROSS_COMPILE=aarch64-linux-gnu-' >> ~/.bashrc
echo 'export ARCH=arm64' >> ~/.bashrc
关键点:
CROSS_COMPILE 变量必须包含尾部的短横线 -,内核构建系统会自动拼接 gcc、ld、objcopy 等工具名。
3.2 Linux内核源码获取与配置
我们使用Linux内核的长期支持版本(LTS)6.1,该版本对树莓派4B的蓝牙控制器(BCM43455/BCM4345C0)有完善的驱动支持。
3.2.1 获取内核源码
# 方式一:从kernel.org下载稳定版tarball
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.76.tar.xz
tar -xf linux-6.1.76.tar.xz
cd linux-6.1.76
# 方式二:使用git克隆(推荐,便于后续打补丁和版本切换)
git clone --depth 1 --branch v6.1.76 \
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git \
linux-6.1.76
cd linux-6.1.76
3.2.2 生成默认配置
树莓派4B使用BCM2711 SoC,内核源码中已包含其默认配置:
# 使用树莓派4的默认配置
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig
# 该配置位于 arch/arm64/configs/bcm2711_defconfig
# 执行后会在源码根目录生成 .config 文件
3.3 menuconfig中蓝牙相关选项配置
在默认配置基础上,我们需要确认或手动启用蓝牙子系统及HCI UART驱动。使用 make menuconfig 进入图形化配置界面。
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- menuconfig
3.3.1 蓝牙核心选项路径
按下 / 键可搜索关键字,以下为必须启用的选项及其路径:
| 配置项 | 路径 | 推荐值 | 说明 |
|---|---|---|---|
CONFIG_BT |
Networking support → Bluetooth subsystem support | <*> 编译进内核 | 蓝牙协议栈核心 |
CONFIG_BT_RFCOMM |
Bluetooth subsystem support → RFCOMM protocol | <*> | 串口仿真,SPP服务必需 |
CONFIG_BT_BNEP |
Bluetooth subsystem support → BNEP protocol | <*> | 网络封装,PAN服务必需 |
CONFIG_BT_HIDP |
Bluetooth subsystem support → HIDP protocol | <*> | HID设备支持 |
CONFIG_BT_HCIUART |
Bluetooth subsystem support → HCI UART driver | <*> | UART传输层驱动 |
CONFIG_BT_HCIUART_BCM |
HCI UART driver → Broadcom protocol support | <*> | BCM43455专用协议 |
CONFIG_BT_BCM |
Bluetooth subsystem support → Broadcom Bluetooth driver | <*> | BCM芯片设备驱动 |
3.3.2 蓝牙配置关系SVG图
下图展示了蓝牙子系统各模块之间的依赖与数据流关系:
常见遗漏:很多开发者只开启了
CONFIG_BT 和 CONFIG_BT_HCIUART,却忘记启用 CONFIG_BT_HCIUART_BCM 和 CONFIG_BT_BCM,导致内核无法识别树莓派4B的蓝牙控制器。请务必检查这两项是否已设置为 <*>。
3.4 编译内核与设备树
配置完成后,即可开始编译内核镜像、模块以及设备树二进制文件(DTB)。
3.4.1 编译内核镜像
# 使用所有CPU核心并行编译,-jN 中N建议设为CPU核心数+1
make -j$(nproc) ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- Image
# 编译后的内核镜像位于 arch/arm64/boot/Image
ls -lh arch/arm64/boot/Image
# 输出示例:-rw-r--r-- 1 user user 28M Mar 15 10:30 arch/arm64/boot/Image
3.4.2 编译内核模块
# 编译所有模块
make -j$(nproc) ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- modules
# 安装模块到指定目录(用于后续打包到根文件系统)
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- \
INSTALL_MOD_PATH=../modules_install modules_install
# 查看模块安装目录结构
ls ../modules_install/lib/modules/
# 输出示例:6.1.76-v8+
3.4.3 编译设备树
设备树描述了硬件拓扑,树莓派4B的设备树源文件位于 arch/arm64/boot/dts/broadcom/:
# 编译所有设备树
make -j$(nproc) ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- dtbs
# 树莓派4B对应的DTB文件
ls -lh arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dtb
# 输出示例:-rw-r--r-- 1 user user 62K Mar 15 10:35 bcm2711-rpi-4-b.dtb
3.4.4 编译产物清单
| 产物 | 路径 | 说明 |
|---|---|---|
| 内核镜像 | arch/arm64/boot/Image |
压缩后的内核二进制,约28MB |
| 设备树 | arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dtb |
树莓派4B硬件描述 |
| 内核模块 | INSTALL_MOD_PATH/lib/modules/6.1.76-v8+/ |
可加载内核模块集合 |
| 配置文件 | .config |
当前编译使用的内核配置 |
3.5 编译流程总览SVG图
下图完整展示了从源码到可启动镜像的编译流水线:
3.6 验证编译结果
编译完成后,建议执行以下快速验证:
# 1. 检查内核镜像是否为ARM64 ELF格式
file arch/arm64/boot/Image
# 输出应包含:ELF 64-bit LSB executable, ARM aarch64
# 2. 检查设备树是否包含蓝牙节点
dtc -I dtb -O dts arch/arm64/boot/dts/broadcom/bcm2711-rpi-4-b.dtb \
| grep -A 10 "bluetooth"
# 应输出类似:
# bluetooth {
# compatible = "brcm,bcm43438-bt";
# ...
# };
# 3. 检查蓝牙模块是否已编译
find ../modules_install/lib/modules/ -name "*bluetooth*"
# 应列出 bluetooth.ko, hci_uart.ko, btbcm.ko 等文件
成功标志:当
file 命令确认镜像为ARM64格式,设备树包含蓝牙节点,且模块目录中存在 bluetooth.ko、hci_uart.ko、btbcm.ko 时,说明开发环境搭建与内核编译已全部就绪,可以进入下一阶段的驱动开发。