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_RFCOMM CONFIG_BT_BNEP CONFIG_BT_HIDP CONFIG_BT_HCIUART CONFIG_BT_HCIUART_BCM CONFIG_BT_BCM 配置原则 协议层依赖CONFIG_BT 设备驱动依赖传输层 BCM驱动需两者配合
常见遗漏:很多开发者只开启了 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图

下图完整展示了从源码到可启动镜像的编译流水线:

内核与设备树编译流水线 Linux 6.1 源码 bcm2711_defconfig menuconfig调整 .config 最终配置 make Image make modules make dtbs arch/arm64/boot/Image lib/modules/6.1.76/ bcm2711-rpi-4-b.dtb 提示:使用 make -j$(nproc) 可同时编译所有目标,大幅缩短构建时间

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 时,说明开发环境搭建与内核编译已全部就绪,可以进入下一阶段的驱动开发。