50 使用linux内核源码里的led驱动<LED Support for GPIO connected LEDs>

这个设备驱动适用于,连接到一个IO口的led灯.
需要在linux内核配置里选上相关的配置。在内核源码目录下:

    make menuconfig ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-

    Device Drivers  --->
        [*] LED Support  --->
            <*>   LED Class Support 
            <*>   LED Support for GPIO connected LEDs

选择上后,再编内核,再使用新的内核镜像启动系统

使用新内核启动后,可以查看出设备驱动是否已选择上:
/sys/bus/platform/drivers/目录下应有”leds-gpio”目录

驱动源码在”drivers/leds/leds-gpio.c”, 里面是一个平台驱动,我们只要写平台设备描述硬件的资源与此驱动匹配即可.

285 static struct platform_driver gpio_led_driver = {
286     .probe      = gpio_led_probe,
287     .remove     = __devexit_p(gpio_led_remove),
288     .driver     = {
289         .name   = "leds-gpio",
290         .owner  = THIS_MODULE,
291         .of_match_table = of_gpio_leds_match, // 用成员匹配,名字可为"gpio-leds"
292     },
293 };
294 
295 module_platform_driver(gpio_led_driver);
//通过阅读平台驱动的probe函数,可得知我们写的平台设备应提供具本哪些硬件信息.
235 static int __devinit gpio_led_probe(struct platform_device *pdev)
236 {
237     struct gpio_led_platform_data *pdata = pdev->dev.platform_data;
238     struct gpio_leds_priv *priv;
239     int i, ret = 0;
240 
241     if (pdata && pdata->num_leds) {
        ...
    }
    ...
268     return 0;
269 }

/

//通过probe函数,可以确定我们写平台设备时只需通过platform_data成员提供平台驱动所需的信息,无需再提供resource.
//再确定结构体gpio_led_platform_data的每个成员的作用即可,如不清楚具体用途,可以在驱动代码里通过查看对成员值的访问推出用途.

"include/linux/leds.h"

//每个led用struct gpio_led的对象来描述
struct gpio_led {
    const char *name; //名字
    const char *default_trigger; 
    unsigned    gpio; //对应的io口
    unsigned    active_low : 1; // 设1表示led低电平时亮
    unsigned    retain_state_suspended : 1; //保持挂起状态
    unsigned    default_state : 2; // 下面的三个宏
    /* default_state should be one of LEDS_GPIO_DEFSTATE_(ON|OFF|KEEP) */
};

#define LEDS_GPIO_DEFSTATE_OFF      0 //led灯灭
#define LEDS_GPIO_DEFSTATE_ON       1 // led灯开
#define LEDS_GPIO_DEFSTATE_KEEP     2 // led灯状态保持不变


struct gpio_led_platform_data {
    int         num_leds; //多少个led灯
    const struct gpio_led *leds; //led灯对象数组首地址


#define GPIO_LED_NO_BLINK_LOW   0   /* No blink GPIO state low */
#define GPIO_LED_NO_BLINK_HIGH  1   /* No blink GPIO state high */
#define GPIO_LED_BLINK      2   /* Please, blink */
    int     (*gpio_blink_set)(unsigned gpio, int state,
                    unsigned long *delay_on,
                    unsigned long *delay_off);
    // gpio_blink_set函数用于在设备这边实现闪烁的功能
};

/

板上的status-led接到PA15,高电平时亮

mypdev.c

#include <linux/init.h>
#include <linux/module.h>
#include <linux/platform_device.h>
#include <linux/input.h>
#include <mach/gpio.h>
#include <linux/leds.h>

struct gpio_led leds[] = {
    {"led0", "led0_trigger", GPIOA(15), 0, 0, 0},
};

struct gpio_led_platform_data pdata = {
    .num_leds = ARRAY_SIZE(leds),
    .leds = leds,
};


struct platform_device mypdev = {
    .name = "leds-gpio", 
    .id = -1,
    .dev = {
        .platform_data = &pdata,
    },
};

module_driver(mypdev, platform_device_register, platform_device_unregister);
MODULE_LICENSE("GPL");

///

加载设备后,如与平台驱动匹配上会有输出:
   [ 6860.993790] Registered led device: led0

然后就可以通过"/sys/class/leds/led0/brightness"文件控制led灯的亮灭
  echo 1 > /sys/class/leds/led0/brightness   //灯亮
  echo 0 > /sys/class/leds/led0/brightness   //灯灭 
<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、付费专栏及课程。

余额充值