beaglebone black debian 系统内核更新 方法

本文介绍了一种在 BeagleBone Black 的 Debian 系统上更新内核的方法。通过简单的步骤,用户可以获取到最新的内核版本,以便支持更多的功能模块并修复已知的问题。

可以参考 :http://elinux.org/Beagleboard:BeagleBoneBlack_Debian

Kernel Upgrade

We can't ship support for everything on release day, so we push out new kernels as fixes, support for new capes, etc are posted on the beagleboard.org mainline list.

cd /opt/scripts/tools/
git pull
sudo ./update_kernel.sh
sudo reboot

好处:可以更新到外国开发者的最新内核   

BeagleBone Black (BBB) 的 Debian 12 系统上安装 `librobotcontrol` 库时遇到“找不到 PWM 驱动模块”是一个典型问题,其根源通常在于**内核版本更新导致的内核头文件或设备树覆盖缺失**,以及**库版本与当前系统的兼容性问题**。核心解决方案是**确保系统内核头文件、设备树编译器(dtc)以及必要的设备树覆盖(Overlay)已正确安装并启用**。 ### **问题根源分析** 1. **内核版本不匹配**:Debian 12 搭载较新的 Linux 内核(如 6.x)。传统的 `librobotcontrol` 库(例如 1.0.4 版本)及其附带的 PWM 设备树覆盖(`BB-PWMn`)是为较旧的内核(如 4.x)编写的。新内核的设备树(DTB)结构和编译流程可能已发生变化,导致旧覆盖文件无法直接应用。 2. **设备树覆盖未正确编译或应用**:PWM 功能需要通过加载特定的设备树覆盖(Device Tree Overlay)来启用,例如 `BB-PWM0`、`BB-PWM1`、`BB-PWM2`。如果覆盖文件缺失、未编译,或编译后未正确部署到 `/lib/firmware` 目录,系统将无法识别对应的 PWM 设备。 3. **库依赖关系不满足**:`librobotcontrol` 的编译和运行依赖于特定的头文件和库,如果未安装完整开发工具链或特定版本的内核头文件,构建过程会失败或在运行时找不到模块符号。 ### **完整解决方案步骤** 以下是系统性的解决步骤。请按照顺序操作,并在每个步骤后验证问题是否已解决。 #### **步骤 1:安装基础开发工具和内核头文件** 首先,确保系统拥有完整的编译环境和与当前运行内核匹配的头文件。 ```bash sudo apt update sudo apt upgrade # 安装基础编译工具链、CMake、Git 和设备树编译器(dtc),这是编译设备树覆盖的关键 [ref_1] sudo apt install -y build-essential cmake git device-tree-compiler # 安装与当前运行内核完全匹配的内核头文件,这是编译任何内核模块(包括设备树覆盖)所必需的 sudo apt install -y linux-headers-$(uname -r) ``` #### **步骤 2:获取并安装 librobotcontrol** 建议从官方仓库获取最新代码,这可能已包含对较新内核的适配。 ```bash # 克隆 librobotcontrol 的 GitHub 仓库 git clone https://github.com/StrawsonDesign/librobotcontrol.git cd librobotcontrol # 创建并进入构建目录 mkdir build && cd build # 使用 CMake 配置项目。确保指定正确的安装前缀,并启用库的安装 cmake .. -DCMAKE_INSTALL_PREFIX=/usr # 编译库 make # 安装库文件、头文件以及关键的设备树覆盖源文件到系统目录 sudo make install ``` *关键点*:`sudo make install` 会将编译好的库(如 `librc.so`)、头文件以及 **.dts** 格式的设备树覆盖源文件(位于 `/usr/share/librobotcontrol/overlays/`)安装到系统 [ref_1]。 #### **步骤 3:编译并启用 PWM 设备树覆盖** 这是解决“找不到 PWM 驱动模块”问题的核心步骤。你需要将 `.dts` 源文件编译为内核可以加载的 `.dtbo` 文件。 ```bash # 切换到设备树覆盖源文件目录 cd /usr/share/librobotcontrol/overlays/ # 列出所有可用的覆盖,确保存在 BB-PWM0, BB-PWM1, BB-PWM2 等文件 ls BB-PWM*.dts # 编译 PWM 设备树覆盖。例如,编译并启用 PWM0 (P9_22) # 使用设备树编译器将 .dts 源文件编译为 .dtbo 二进制文件 sudo dtc -O dtb -o BB-PWM0-00A0.dtbo -b 0 -@ BB-PWM0-00A0.dts # 将编译好的 .dtbo 文件复制到 `/lib/firmware` 目录,这是内核查找覆盖的标准位置 sudo cp BB-PWM0-00A0.dtbo /lib/firmware/ # 对其他需要的 PWM 覆盖(如 BB-PWM1, BB-PWM2)重复上述 dtc 和 cp 命令 # 例如: sudo dtc -O dtb -o BB-PWM1-00A0.dtbo -b 0 -@ BB-PWM1-00A0.dts sudo cp BB-PWM1-00A0.dtbo /lib/firmware/ sudo dtc -O dtb -o BB-PWM2-00A0.dtbo -b 0 -@ BB-PWM2-00A0.dts sudo cp BB-PWM2-00A0.dtbo /lib/firmware/ ``` #### **步骤 4:加载设备树覆盖并验证** 有多种方法加载覆盖。最简单的方法是通过操作 `/sys/devices/platform/bone_capemgr/slots`(如果该接口存在)或在 `/boot/uEnv.txt` 中配置自动加载。对于较新内核,使用 `config-pin` 工具或直接操作 `/sys/class/pwm/` 可能更直接。 **方法 A:通过 Cape Manager 加载(适用于较旧内核机制)** ```bash # 检查 Cape Manager 的 slots 文件是否存在 ls /sys/devices/platform/bone_capemgr/ # 如果存在,通过 echo 覆盖名到 slots 文件来加载它 echo BB-PWM0 | sudo tee /sys/devices/platform/bone_capemgr/slots # 检查 slots 文件内容,确认覆盖已加载 cat /sys/devices/platform/bone_capemgr/slots ``` **方法 B:使用 config-pin 工具(推荐,更通用)** `librobotcontrol` 库包含了强大的 `config-pin` 工具,用于引脚复用。 ```bash # 使用 config-pin 将引脚(例如 P9_22)设置为 pwm 模式 # 这会自动处理底层设备树覆盖的加载和引脚复用配置 sudo config-pin P9_22 pwm # 验证 PWM 设备是否出现 ls /sys/class/pwm/ ``` 如果成功,你应该在 `/sys/class/pwm/` 目录下看到类似 `pwmchip0` 的设备,并且其子目录 `pwm0` 等可用。 #### **步骤 5:验证 PWM 功能并排查权限** 1. **验证设备节点**: ```bash # 检查 PWM sysfs 接口是否存在 ls -la /sys/class/pwm/pwmchip*/pwm0/ # 尝试导出 PWM 通道(以 pwmchip0 的 pwm0 为例) echo 0 | sudo tee /sys/class/pwm/pwmchip0/export # 如果成功,会生成 /sys/class/pwm/pwmchip0/pwm0/ 目录,可在此设置周期、占空比等 ``` 2. **权限问题**:确保你的用户账户在 `gpio` 和 `pwm` 组中,以便非 root 用户访问硬件。 ```bash # 将当前用户添加到必要的组 [ref_1] sudo usermod -a -G gpio,pwm $USER # 注意:需要重新登录或启动新会话,组更改才会生效 ``` ### **具体应用场景与测试示例** 假设你需要控制连接在 **P9_22**(对应 PWM0)引脚上的伺服电机。在完成上述所有配置后,可以按以下步骤测试: ```bash # 1. 设置引脚为 PWM 模式 sudo config-pin P9_22 pwm # 2. 导出 PWM0 通道。首先确认 pwmchip 编号,通常 PWM0 在 pwmchip0 上。 # 查看可用的 pwmchip ls /sys/class/pwm/ # 假设为 pwmchip0,导出其 0 号通道(即 PWM0) echo 0 | sudo tee /sys/class/pwm/pwmchip0/export # 3. 设置 PWM 参数。伺服电机通常需要 50Hz (20ms周期) 的信号。 # 设置周期为 20,000,000 纳秒 (20ms) echo 20000000 | sudo tee /sys/class/pwm/pwmchip0/pwm0/period # 设置占空比为 1,500,000 纳秒 (1.5ms,对应中立位置) echo 1500000 | sudo tee /sys/class/pwm/pwmchip0/pwm0/duty_cycle # 4. 启用 PWM 输出 echo 1 | sudo tee /sys/class/pwm/pwmchip0/pwm0/enable ``` 此时,连接到 P9_22 的伺服电机应转动到中立位置。你可以通过修改 `duty_cycle` 的值(范围在 0 到 `period` 值之间)来控制电机角度。 ### **核心要点总结** | 问题环节 | 关键操作 | 预期结果/检查点 | | :--- | :--- | :--- | | **开发环境** | 安装 `build-essential`, `linux-headers`, `device-tree-compiler` | 具备完整的编译能力 | | **库安装** | 从 Git 克隆、CMake 配置、`make install` | 库文件和 `.dts` 覆盖源文件正确安装 | | **PWM 覆盖** | 使用 `dtc` 编译 `.dts` 为 `.dtbo`,并复制到 `/lib/firmware` | `/lib/firmware/` 下存在 `BB-PWMx-00A0.dtbo` 文件 | | **加载覆盖** | 使用 `config-pin P9_22 pwm` 或操作 `bone_capemgr/slots` | `ls /sys/class/pwm/` 显示 pwmchip 设备 | | **权限与验证** | 用户加入 `gpio`, `pwm` 组;通过 `echo` 操作 sysfs | 可非 root 用户控制 PWM 通道,并能设置周期和占空比 | 如果按照以上步骤操作后问题依然存在,请检查 BeagleBone Black 的板载 eMMC 或 SD 卡中的 `/boot/uEnv.txt` 文件,确保没有禁用了 Cape Manager 或设备树覆盖功能的相关配置。对于 Debian 12,有时需要明确启用旧版的 cape 管理器或确认新的引脚控制框架(如 `libgpiod`)的配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值