linux驱动之LED实验(基于系统自带leds-gpio.c驱动)

概述

上一章(Linux驱动学习之设备树)中编写的设备树LED驱动,都是配置LED灯的GPIO寄存器,驱动方式和裸机没有区别。Linux是一个庞大而完善的系统,尤其是驱动框架,像GPIO这种最基本的驱动不可能采用“原始”的裸机驱动方式,否则就相当你买了一辆车,结果每天推着车去上班。

基础知识

Linux内核提供了pinctrl和gpio子系统用于GPIO驱动,可以在leds-gpio.c中可以看到相关功能的使用。
(一)pinctrl子系统
pinctrl子系统用于对设备树中相关pin属性的实现,工作内容如下:
① 获取设备树中的pin信息。
② 根据获取到的pin信息来设置pin的复用功能。
③ 根据获取到的pin信息来设置pin的电气特性,比如上/下拉、速度、驱动能力等。
(二)gpio子系统
gpio子系统用于初始化GPIO并且提供相应的API函数,比如设置输入输出、读取GPIO的值等。gpio_direction_output、gpio_free等等,在gpio.h中。

leds-gpio驱动解析

(一)leds的设备树
leds-gpio驱动会以设备树的形式加载到内核中,在设备树配置文件.dts中可以查看到leds设备树节点信息。如下:

leds {
	compatible = "gpio-leds";
	d2 {
		label = "d2";
		gpios = <&pioE 25 GPIO_ACTIVE_LOW>;	/* PE25, conflicts with A25, RXD2 */
		linux,default-trigger = "heartbeat";
	};
}; 
leds {
	d4 {
		label = "d4";
		gpios = <&pioE 24 GPIO_ACTIVE_HIGH>;
	};
};
pioE: gpio@fffffa00 {   
			compatible = "atmel,at91sam9x5-gpio", "atmel,at91rm9200-gpio";
			reg = <0xfffffa00 0x100>;
			interrupts = <10 IRQ_TYPE_LEVEL_HIGH 1>;
			#gpio-cells = <2>;
			gpio-controller;//表示gpio1节点是一个gpio控制器
			interrupt-controller;
			#interrupt-cells = <2>;
			clocks = <&pioE_clk>;
		};

gpios:描述了leds的引脚。
GPIO_ACTIVE_HIGH:说明高电平点亮
&pioE:表示leds使用的IO属于GPIOE组,pioE的定义可以搜索到。
pioE: gpio@fffffa00 :pioE的起始地址0xfffffa00,可以在datasheet中找到与之对应
#gpio-cells = <2>:表示gpio有两个cell,符合gpios = <&pioE 24 GPIO_ACTIVE_HIGH>的格式定义。
gpio-controller:表示gpioE节点是一个gpio控制器
(二)驱动代码
在驱动/driver目录中,搜索"gpio-leds"内容,找到对应的驱动leds-gpio.c中的compatible与设备树中的compatible一致。查看配置文件“.config”中“CONFIG_LEDS_GPIO=y”。满足以上两个条件leds-gpio会被编译进入内核。
在”leds-gpio.c”中可以看到对设备树信息的提取和使用,即如下图所示的of_函数。
在这里插入图片描述
在”leds-gpio.c”中也可以看到对gpio子系统的使用
在这里插入图片描述
在”leds-gpio.c”中采用平台总线实现。
在这里插入图片描述

操作LEDS

LED设备和驱动都正常的情况下,在系统运行过后,可以在系统中查看到有两个leds设备树节点,与设备树配置文件一致。
在这里插入图片描述
同时,会产生/sys/bus/platform/devices/leds/leds目录,其下分别有d2和d4两个子目录,可直接对leds进行控制操作。
将255或0写入brightness文件即可控制亮灭:

echo 0 > /sys/bus/platform/devices/leds/leds/d2/brightness
echo 255 > /sys/bus/platform/devices/leds/leds/d2/brightness

查看trigger文件,即可知道当前系统支持的触发器,示例:

cat /sys/bus/platform/devices/leds/leds/d2/trigger
none nand-disk mmc0 mmc1 timer [heartbeat] gpio

在设备树文件中,d2内容“linux,default-trigger = “heartbeat””,所以当前触发器为heartbeat,此时可以观察d2对应的LED灯,正常会每1秒间隔闪烁2次,也就是heartbeat效果。
想要重新设置触发器很简单,使用echo将需要的触发器名称写入trigger文件即可。

echo timer > /sys/bus/platform/devices/leds/leds/d2/trigger

再次查看,timer则设置成了触发器

none nand-disk mmc0 mmc1 [timer] heartbeat gpio

此时d2对应的LED灯,正常会每隔1秒闪烁1次。
操作截图如下:
在这里插入图片描述

<think>好的,我现在需要帮助用户解决如何配置Linux内核以启用自带LED驱动,并排查命令执行失败的原因。用户提到了使用`make menuconfig`命令,并想了解前置条件和执行环境。 首先,我应该回忆Linux内核配置的基本流程。内核配置通常需要安装必要的开发工具和库,比如`build-essential`、`libncurses-dev`这些,可能还有`flex`和`bison`。用户执行`make menuconfig`时如果失败,可能是缺少这些依赖包。 接下来,内核源码需要正确解压和准备。用户可能下载了内核源码但没有进入正确的目录,或者源码损坏了。这时候需要确认目录是否存在,是否有权限问题。 关于LED驱动的配置路径,我记得在内核的设备驱动部分,可能位于Device Drivers -> LED Support。用户需要在这里启用相关的选项,比如LED Class Support和对应的硬件驱动,比如GPIO控制的LED。 然后是配置后的编译和安装步骤。用户需要知道如何保存配置,如何编译内核模块,以及如何安装模块。如果用户使用的是嵌入式系统,可能需要复制到特定的目录。 排查命令失败的原因,首先检查依赖是否安装,终端大小是否足够,权限是否是root或者sudo。还有可能架构不对,比如交叉编译环境没有设置正确。 最后,生成相关问题需要考虑用户可能的后续问题,比如交叉编译配置、保存配置的位置、如何调试驱动加载问题,以及更新后的配置未生效的原因。 需要确保回答结构清晰,分步骤说明,并引用用户提供的参考中的`make menuconfig`命令。同时,检查LaTeX格式是否正确,虽然用户的问题可能不涉及数学公式,但如果有变量或路径名,可能需要用行内格式。</think>### 如何配置Linux内核启用自带LED驱动及排查问题 #### 一、前置条件与执行环境 1. **基础开发环境** 确保已安装编译工具链及依赖库: ```bash sudo apt-get install build-essential libncurses-dev flex bison ``` 缺少这些依赖会导致`make menuconfig`执行失败[^1]。 2. **内核源码准备** - 确认内核源码已正确解压,并进入源码根目录: ```bash cd /path/to/linux-3.5 ``` - 检查目录权限,建议以普通用户身份操作,必要时使用`sudo`。 3. **终端环境** `make menuconfig`需在支持图形化终端的环境中运行。若通过SSH连接,需确保终端支持`ncurses`库,且窗口大小足够(建议80x25或更大)。 --- #### 二、配置LED驱动的步骤 1. **启动配置界面** 执行命令进入菜单: ```bash make menuconfig ``` 2. **导航至LED驱动配置** 按以下路径逐级展开: ``` Device Drivers → LED Support ``` 关键配置项: - **LED Class Support**:启用核心支持(必须选择`<*>`编译进内核- **LED Trigger support**:配置触发模式(如定时闪烁、心跳等) - **LED drivers for specific hardware**:根据硬件选择(如`LED Support for GPIO connected LEDs`) 3. **保存配置** 选择`Save`保存为`.config`文件,退出界面。 --- #### 三、常见问题排查 1. **`make menuconfig`执行失败** - **错误现象**:提示`ncurses library not found` **解决方案**:安装`libncurses-dev`: ```bash sudo apt-get install libncurses-dev ``` - **错误现象**:终端显示混乱 **解决方案**:调整终端大小或改用其他终端工具(如`konsole`)。 2. **驱动未生效** - 检查内核编译是否包含驱动:确保配置项标记为`<*>`(编译进内核)而非`<M>`(模块)。 - 验证硬件兼容性:确认LED硬件接口(如GPIO编号)与驱动配置匹配。 3. **权限问题** 若操作硬件时提示权限拒绝,尝试: ```bash sudo chmod 666 /sys/class/leds/<led_name>/brightness ``` --- #### 四、完整流程示例 ```bash # 进入内核源码目录 cd linux-3.5 # 清理旧配置(可选) make distclean # 生成新配置 make menuconfig # 编译内核与模块 make -j4 # 安装模块 sudo make modules_install # 重启系统 sudo reboot ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值