本文约3400字,今天在排查wifi外设功能不通问题时,发现这一款产品中wifi和sd与之前产品在针对sdio和sd上做了反向调整,为解决主控休眠后sd卡不漏电所做的特殊处理,这样导致dts的配置也得跟着做特殊处理,于是搜集整理了硬件上哪些情况(频率较高)会倒逼DT配置做特殊的修改,一起来学习吧。
我建了一个Linux BSP学习交流群,想学BSP或者已经是BSP开发者可私信我,加入群,一起交流学习,共同进步。
关注公众号, 即可获得与Linux相关的电子书籍以及常用开发工具,文末有文档清单。
硬件原理图、PCB、器件、走线、电气特性、兼容性等问题,都会倒逼设备树做非常规配置。很多外设调不通,不是 DT 语法错,而是没适配硬件隐性缺陷。本文按外设大类 + 典型硬件问题分类,说明故障现象、底层原因、对应的设备树特殊修改方案,覆盖常用到的SDIO/WiFi、I2C、UART、GPIO、SPI 等场景。
正常设备树只需要配置:
reginterruptsstatus硬件异常场景下,需要额外增加时序、延时、电平、阻抗、补偿、 workaround、引脚兜底、电源控制等非标属性,这是区分 “标准 DT” 和 “硬件适配 DT” 的核心。
现象驱动 probe 失败,时灵时不灵;SDIO/WiFi 枚举概率性失败;上电立即扫描不到设备,延时一段时间后正常。
硬件根因电源轨上电慢,外设内核还未稳定,主控就发起通信;缺少储能电容,上电有电压抖动;主控与外设上电顺序颠倒。
设备树特殊修改增加上电延时、下电延时、电源使能 GPIO、硬复位时序。
以 AX615 SDIO-WiFi 为例:
&sdio { status = "okay"; // 硬件上电不稳:增加电源使能后延时(硬件电容不足必加) post-power-on-delay-ms = <30>; // 部分模组需要下电延时 post-power-off-delay-ms = <10>;};现象反复报 card detect error;误插拔、随机断连。
设备树特殊修改屏蔽卡检测、强制标记为板载不可移除设备:
&sdio { non-removable; // 硬件无CD检测脚,强制非热插拔 broken-cd; // CD引脚硬件异常,禁用卡检测逻辑 disable-wp; // 写保护引脚悬空/硬件错误,关闭WP检测};现象高速模式通信报错、CRC 错误、丢包;低速正常,拉高频率就离线;WiFi 吞吐量低、频繁断流。
硬件根因走线过长、串扰、阻抗不匹配、未做等长、缺少匹配电阻。
设备树特殊修改降频(最直接方案);增加信号延时、相位偏移、输入采样延时(SDHC/SDIO 专用)。
现象外设时钟漂移、通信异常、驱动报时钟未就绪。
设备树特殊修改强制使用内部时钟、固定时钟源、关闭外部时钟检测:
// I2C/UART 外部晶振缺失,强制使用内部总线时钟&sdio{ clock-frequency = <5000000>; // 降频降低时钟要求};现象中断丢失、数据收不到;系统频繁假中断、CPU 占用高;WiFi SDIO 数据卡死,dmesg 无中断日志。
硬件根因中断脚外部无上拉电阻,电平不定;原理图中断触发方式(电平/边沿)和硬件不匹配;中断线串扰导致误触发。
设备树特殊修改修改中断触发方式;开启中断防抖;关闭多余中断、屏蔽中断检测。
// 原硬件设计为电平触发,实际引脚串扰,改为上升沿触发interrupts = <GIC_SPI 7 IRQ_TYPE_EDGE_RISING>;// GPIO中断引脚无外部电阻,开启内部防抖(硬件无防抖电路)&gpio0 { input-debounce = <1>;};现象多个外设同时异常,中断互相干扰。
DT 修改:更换中断号、禁用不必要中断。
I2C 是硬件问题重灾区,几乎全部需要 DT 时序补偿。
现象I2C 应答超时、设备扫描不到、读写不稳定。
设备树特殊修改调整 SDA/SCL 保持时间、下降沿时间(时序补偿):
&i2c0 { // 硬件总线容性大、走线长,增大保持时间 i2c-sda-hold-time-ns = <2000>; i2c-scl-falling-time-ns = <200>; i2c-sda-falling-time-ns = <400>; // 硬件速度上不去,强制100K标准模式 clock-frequency = <100000>;};现象I2C 总线卡死,后续所有 I2C 设备无法通信。
DT 修改:开启轮询模式,关闭硬件中断:
&i2c0 { poll_mode = <1>; // 硬件I2C控制器有bug/总线易死锁,改用轮询};现象完全无法通信,扫描不到设备。
DT 修改:部分驱动支持引脚交换;若无,则只能在 Pinmux 层交换引脚配置。
现象SPI 无法选中从设备,读写全 FF。
设备树特殊修改重新指定 CS-GPIO、修改有效电平:
&spi3 { // 硬件CS引脚变更 / 原引脚损坏,临时换GPIO做片选 cs-gpios = <&gpio0 18 GPIO_ACTIVE_HIGH>; };现象Flash 读写错误、识别 ID 失败。
DT 修改:增加采样延时:
spi_flash@0 { rx-sample-delay-ns = <4>; // 硬件信号偏移,增加接收采样延时};现象引脚电平随机、按键误触发、复位不稳定。
设备树特殊修改部分平台 DT 支持配置引脚上下拉;某些平台通过 Pinmux 属性补充硬件缺失的上下拉:
// 硬件无外部上拉,设备树配置内部上拉axera_pinmux_scl = <0x2302000 0x0C 16 0 6>;现象设备反复唤醒、无法休眠。
DT 修改:配置唤醒 GPIO 极性、防抖、屏蔽多余唤醒源。
现象USB 只能工作在主机或从机一种模式,无法自动识别。
DT 修改:强制固定 USB 模式,关闭自动检测:
&usb2 { dr_mode = "host"; // 硬件ID脚异常,强制为主机模式 // dr_mode = "otg"; // 强制为设备模式};现象网口协商失败、只能 10M 不能 100M、指示灯异常。
DT 修改:强制网口速率、双工、修改 PHY 指示灯极性:
ð0 { phy-mode = "rmii"; // 硬件LED电路极性相反,DT翻转电平 ephy,led-link-polarity = <1>;};这类属于芯片 / IP 硬件固有问题,是原厂 BSP 最常见的 DT workaround。
wdt0: watchdog@2120000 { // 一系列时钟、复位偏移配置,用于规避硬件IP复位bug arst = <0x4C 0x50 22>; prst = <0x4C 0x50 21>;};broken-cdnon-removable | |
post-power-on-delay-ms | |
bus-width = <1> 单线模式验证 | |
sd-uhs-xxx 系列属性,关闭 UHS |
&sd { bus-width = <4>; // 硬件不支持UHS,全部关闭 // sd-uhs-sdr12; // sd-uhs-sdr25; // sd-uhs-sdr50; disable-wp; broken-cd;};遇到外设不通,按这个顺序判断是不是硬件导致需要改 DT:
status=okaycompatible 匹配 → 排除纯 DT 语法问题 | ||
max-frequency、PHY 延时、采样延时 | ||
broken-cd、non-removable、改中断/CS-GPIO | ||
✅ 标准硬件:只保留 reg/interrupts/status,不额外加延时、补偿✅ 已知硬件缺陷:DT 内加注释,写明「适配 XX 版本 PCB / 硬件问题」✅ 优先硬件整改:设备树补偿只是临时 workaround,量产优先改原理图/PCB✅ 分层适配:硬件差异放到 板级 DTS/DT Overlay,不要动芯片级 dtsi
本文内容基于 AX615 + WiFi/SDIO 等实战场景整理。
往期文章(欢迎订阅技术分享栏目全部文章):

这里是女程序员的笔记本
15年+嵌入式软件工程师兼二胎宝妈
分享读书心得、工作经验,自我成长和生活方式。
希望我的文字能对你有所帮助