树莓派设备树覆盖(dtb overlay)

dtb overlay测试

原始的设备树结构:

pi@raspberrypi:~ $ ls /proc/device-tree
'#address-cells'   compatible           leds            reserved-memory   __symbols__
 aliases           cpus                 memory@0        scb               system
 arm-pmu           emmc2bus             memreserve      sd_io_1v8_reg     thermal-zones
 axi               fixedregulator_3v3   model           sd_vcc_reg        timer
 chosen            fixedregulator_5v0   name            serial-number     v3dbus
 clk-108M          gpu                  __overrides__  '#size-cells'
 clocks            interrupt-parent     phy             soc

测试节点设备树:

/dts-v1/;
/plugin/;

/ {
  fragment@0 {
    target-path = "/";
    __overlay__ {
      dt_overlay_test {
        compatible = "led_type_a";
      };
    };
  };
};

将上述设备树编译为dtbo后,进行如下操作:

pi@raspberrypi:/sys/kernel/config/device-tree/overlays $ sudo mkdir test
pi@raspberrypi:/sys/kernel/config/device-tree/overlays $ ls
test
pi@raspberrypi:/sys/kernel/config/device-tree/overlays $ cd test/
pi@raspberrypi:/sys/kernel/config/device-tree/overlays/test $ ls
dtbo  path  status
pi@raspberrypi:/sys/kernel/config/device-tree/overlays/test $ sudo cp ~/work/dt_overlay_test.dtbo ./dtbo
pi@raspberrypi:/sys/kernel/config/device-tree/overlays/test $ cat status
applied

添加测试节点后:

pi@raspberrypi:~/work $ ls /proc/device-tree/                                                 '#address-cells'   compatible           interrupt-parent   phy               soc
 aliases           cpus                 leds               reserved-memory   __symbols__
 arm-pmu           dt_overlay_test      memory@0           scb               system
 axi               emmc2bus             memreserve         sd_io_1v8_reg     thermal-zones
 chosen            fixedregulator_3v3   model              sd_vcc_reg        timer
 clk-108M          fixedregulator_5v0   name               serial-number     v3dbus
 clocks            gpu                  __overrides__     '#size-cells'

树莓派3上用户目前无法正常是使用GPIO中的UART串口(GPIO14&GPIO15;),也就是说用户无论是想用串口来调试树莓派,还是想用GPIO中的串口来连接GPS,蓝牙,XBEE等等串口外设目前都是有问题的。 原因是树莓派CPU内部有两个串口,一个是硬件串口(官方称为PL011 UART),一个是迷你串口(官方成为mini-uart)。在树莓派2B/B+这些老版树莓派上,官方设计时都是将“硬件串口”分配给GPIO中的UART(GPIO14&GPIO15;),因此可以独立调整串口的速率和模式。而树莓派3的设计上,官方在设计时将硬件串口分配给了新增的蓝牙模块上,而将一个没有时钟源,必须由内核提供时钟参考源的“迷你串口”分配给了GPIO的串口,这样以来由于内核的频率本身是变化的,就会导致“迷你串口”的速率不稳定,这样就出现了无法正常使用的情况。 目前解决方法就是,关闭蓝牙对硬件串口的使用,将硬件串口重新恢复给GPIO的串口使用,也就意味着树莓派3的板载蓝牙和串口,现在成了鱼和熊掌,两者无法兼得。 按照一下方法回复恢复硬件串口 : 1、将此文件复制到/boot/overlays/ ~$ sudo cp pi3-miniuart-bt-overlay.dtb /boot/overlays 2、编辑/boot目录下的config.txt文件 ~$ sudo vim /boot/config.txt 3、添加或修改下面内容: dtoverlay=pi3-miniuart-bt-overlay force_turbo=1 4、关闭蓝牙服务 ~$ sudo systemctl disable hciuart 5、重启系统 ~$ sudo reboot
<think>好的,用户遇到了在树莓派5上初始化BCM编号8引脚时出现的“GPIO not allocated”错误,需要寻找解决方案。首先,我需要理解这个错误的原因。树莓派的GPIO引脚可能被其他设备或驱动占用,导致无法分配。特别是在树莓派5上,设备树配置可能有所变化,导致之前的解决方法不再适用。 根据用户提供的引用内容,特别是引用[2],提到了通过设备树覆盖层(device tree overlay)来禁用默认的spidev驱动。这可能是一个关键点,因为某些GPIO引脚可能被SPI或其他接口占用,导致无法访问。用户可能需要检查BCM8引脚是否被其他功能占用,比如SPI或UART。 首先,用户需要确认BCM8引脚在树莓派5上的默认功能。树莓派的GPIO布局在不同型号上可能有所不同,因此查阅树莓派5的官方文档或引脚图是必要的。BCM8对应的是物理引脚24,通常默认功能是GPIO,但可能被其他设备树配置覆盖。 接下来,用户应该检查/boot/config.txt文件,查看是否有启用了可能占用该引脚的设备树覆盖层。例如,spi或i2c的启用可能会占用某些GPIO。引用[2]中的方法是通过创建spidev_disabler.dtbo来禁用默认的spi驱动,用户可能需要类似的操作来释放BCM8。 另外,用户可能需要使用dtoverlay命令来应用自定义的设备树覆盖层,或者调整现有配置。例如,添加dtoverlay=gpio-no-bank-irq可能会解决某些GPIO分配问题,但需要确认是否适用于树莓派5。 此外,用户使用的库(如lgpio)可能需要正确的权限或配置。确保用户有访问GPIO的权限,通常需要将用户加入gpio组,或者使用sudo运行程序。 最后,建议用户使用工具如gpiodetect和gpioinfo来查看GPIO的状态,确认是否有冲突。如果发现被占用,通过设备树覆盖层禁用相关驱动,并重启系统,应该能解决问题。</think>### 树莓派5 BCM 8引脚“GPIO not allocated”错误解决方案 #### 问题原因分析 在树莓派5上,BCM编号8的引脚(物理引脚24)可能因以下原因无法分配: 1. **设备树配置冲突**:默认被其他驱动占用(如SPI、UART等)[^2] 2. **内核驱动抢占**:第三方库或内核模块已占用GPIO 3. **权限问题**:用户未加入`gpio`组或未使用`sudo` --- #### 分步解决方案 **步骤1:确认引脚映射与功能** - 使用命令查看GPIO状态: ```bash gpiodetect # 查看GPIO控制器状态 gpioinfo # 显示所有GPIO引脚分配情况 ``` **步骤2:禁用冲突驱动** - 编辑`/boot/config.txt`文件: ```bash sudo nano /boot/config.txt ``` - 添加以下配置禁用默认占用(示例): ```ini dtparam=spi=off # 禁用SPI总线占用 dtparam=i2c_arm=off # 禁用I2C占用(如相关) ``` **步骤3:创建专用设备树覆盖层** 1. 新建`gpio8-unlock.dts`文件: ```dts /dts-v1/; /plugin/; / { compatible = "brcm,bcm2712"; fragment@0 { target-path = "/"; __overlay__ { gpio8_free: gpio8_free { compatible = "raspberrypi,gpio-free"; gpios = <&gpio 8 0>; status = "okay"; }; }; }; }; ``` 2. 编译并应用覆盖层: ```bash dtc -@ -I dts -O dtb -o gpio8-unlock.dtbo gpio8-unlock.dts sudo cp gpio8-unlock.dtbo /boot/overlays/ ``` 3. 在`config.txt`中激活: ```ini dtoverlay=gpio8-unlock ``` **步骤4:验证GPIO权限** ```bash groups # 确认用户属于gpio组 sudo usermod -aG gpio $USER # 如未加入则执行 ``` **步骤5:使用lgpio库的正确方法** ```python import lgpio # 必须指定Raspberry Pi 5的芯片编号 h = lgpio.gpiochip_open(2) # 树莓派5默认芯片号为2 lgpio.gpio_claim_output(h, 8) # BCM编号8 ``` --- #### 关键验证命令 ```bash dmesg | grep gpio # 查看内核GPIO分配日志 raspi-gpio get 8 # 直接查看引脚状态 ``` ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值