ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

BSP 调试#01:点亮 LED

BSP 调试#01:点亮 LED 调试前调试前需要大概了解下面几点知识1Linux系统在 Linux 系统中绝大多数硬件设备都拥有成熟的驱动框架驱动工程师基于这些框架开发适配特定硬件板卡的驱动程序从而建立硬件与 Linux 内核之间的通信桥梁内核则通过统一的文件系统接口将硬件功能抽象为设备文件最终用户只需通过操作对应的设备文件即可实现对底层硬件的控制。2驱动匹配规则将一个 LED 驱动跑起来首先要将 driver 与 device 成功配对而目前主流都的匹配规则是“dts 兼容属性匹配”匹配优先级最高。**匹配逻辑**比较 “设备的 compatible 属性” 与 “驱动的 of_match_table 表”若字符串完全一致则匹配。至于什么是 driver什么是 device这一块可以去了解 Linux 驱动的发展过程从一.c 文件一驱动到总线设备驱动模式再到设备树的引入那些大牛是真大牛我们只是站在这些巨人肩膀上的 Linux 使用者是的只是 Linux 用户。3点亮 LED 的两种方式第1种sysfs 方式控制 gpio第2种leds-gpio 驱动控制 LED。硬件设计LED 采用 PB7 引脚作为 GPIO 控制端低电平有效即输入低电平时点亮。软件配置驱动路径linux-5.15/drivers/leds/leds-gpio.cdts 配置leds: leds { compatible gpio-leds; status okay; work_led: led0 { gpios pio PB7 GPIO_ACTIVE_HIGH; linux,default-trigger heartbeat; }; };内核配置#打开GPIOS驱动 CONFIG_LEDS_GPIOy CONFIG_LEDS_TRIGGERSy CONFIG_NEW_LEDSy #打开触发器相关驱动 CONFIG_LEDS_TRIGGERSy CONFIG_LEDS_TRIGGER_TIMERy CONFIG_LEDS_TRIGGER_HEARTBEATy调试过程sysfs方式调试查看根文件系统是否有/sys/class/gpio目录没有的话需要在内核配置开启。开启内核配置CONFIG_GPIO_SYSFSy**【问题描述】**遇到 GPIO 引脚无法正常导出问题报错 log 看下面。**【问题分析】**该错误表明在尝试为GPIO pin PB7 分配到两个不同的设备导致冲突。具体来说错误信息中提到了 pin PB7 已经被设备7112000.i2s0_plat请求并且无法为 2000000.pinctrl 的第 39 个引脚再次请求。【问题解决】解决这个问题需要确认设备树或者其他配置文件确保每个 GPIO pin 只被一个设备所请求并且没有复用以避免引脚冲突。功能验证1驱动方式控制评估底板提供1个用户可编程指示灯(User)通过PB7引脚连接执行如下命令可控制LED亮灭。echo0/sys/class/leds/user-led0/brightness //控制LED亮echo1/sys/class/leds/user-led0/brightness //控制LED灭2sysfs方式控制计算公式PB7 1*32 7 39 控制LED步骤如下echo39/sys/class/gpio/export //导出echoout/sys/class/gpio/gpio39/direction //设置方向cat/sys/class/gpio/gpio39/direction //查看方向echo1/sys/class/gpio/gpio39/value //设置值cat/sys/class/gpio/gpio39/value //查看值echo39/sys/class/gpio/unexport //取消导出调试总结1查看 GPIO 使用情况cat/sys/kernel/debug/gpio2LED 触发器类型Linux 内核有触发器相关驱动用来控制 LED 的状态通常被用作系统信号灯用于判断系统是否处于正常工作状态。通过 cat trigger 可以查看所有可用触发器类型而当前使用的触发器类型会以[ ]符号括起。当前使用的触发器类型为 timer 类型。如没有以上的触发类型则可以通过 makeconfig 配置内核开启目标触发类型比如 Timer、Heartbeat 等触发类型。**进阶建议**可以自行深入阅读 gpio-led 驱动代码。完
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进