Linux 自带的 LED 灯驱动实验

目录

一、配置内核

二、设备树节点编写

1、确定compatible 属性值

 2、编写节点

三、验证

 测试


         其实 Linux 内核已经自带了 LED 灯驱动,要使用 Linux 内核自带的 LED 灯驱动首先得先配置 Linux 内核,使能自带的 LED 灯驱动。

一、配置内核

在Linux内核目录下输入如下命令打开 Linux 配置菜单

make menuconfig

 按照如下路径打开 LED 驱动配置项:

-> Device Drivers
        -> LED Support (NEW_LEDS [=y])
                ->LED Support for GPIO connected LEDs

 选择“LED Support for GPIO connected LEDs”,将其编译进 Linux 内核,也即是在此选项上按下“Y”键,使此选项前面变为“<*>”

 这个在移植nxp官方Linux的时候已经默认选中的了,按下“?”可以查看这个选项详细信息

选中之后保存退出,也是在linux源码根目录下输入下面命令

vi .config

 然后在打开的文件里面,找到下面这个,就说明是开启了 LED 灯驱动

 重新编译 Linux 内核,然后使用新编译出来的 zImage 镜像启动开发板

二、设备树节点编写

        打开文档 Documentation/devicetree/bindings/leds/目录下的leds-gpio.txt和common.txt,文档详细的讲解了 Linux 自带驱动对应的设备树节点该如何编写。

1、确定compatible 属性值

        这个属性用于将设备和驱动绑定起来,其值为字符串列表,用于选择设备所要使用的驱动程序,下面就要找到自带的LED驱动的compatible ,才能写设备树节点

打开Linux源码目录下面路径的文件

/drivers/leds/leds-gpio.c

直接搜 compatible 就能看到自带的LED驱动的compatible

 2、编写节点

 和之前的设备树节点编写一样,编写如下

 187行,节点名字

188行,compatible,一定要和内核自带的LED驱动里面的compatible一样,也就是上一步查找的

189行,这里定义一个子节点名(不重名即可),相当于定义一个物理led灯,如果有多个物理led灯就另外添加子节点,不能在led0里添加

190行,led0的label 属性,此属性为可选,每个子节点都有一个 label 属性, label 属性一般表示LED 灯的名字,比如以颜色区分的话就是 red

191-192行,pinctrl-names 属性,此属性描述 pinctrl 名字一般为“default” ;pinctrl-0 节点,此节点引用自己创建的 pinctrl_gpioled 节点,表示 gpioled 设备的所使用的 PIN 信息保存在pinctrl_gpioled 节点中,在“iomuxc”下定义的,如下

 这两行内容和pinctrl_gpioled 节点在之前“pinctrl 和 gpio 子系统点灯”实验中已定义,可以直接使用。要注意的是,检查有别的设备使用GPIO1_IO03__GPIO1_IO03,有就先屏蔽

193行,gpios是添加 GPIO 属性信息,表明gpioled 所使用的 GPIO 是哪个引脚 ,低电平有效。这个要注意的是,有别的设备使用用到”&gpio1 3“,搜索看是否有别的设备使用,有就先屏蔽,比如我们自己写的gpio-led,先屏蔽

 194行,default-state”属性值,可以设置为 on、 off 或 keep,为 on 的时候 LED 灯默认打开,为 off 的话 LED 灯默认关闭,为 keep 的话 LED 灯保持当前模式

195行,“linux,default-trigger”属性值,也就是设置 LED 灯的默认功能,可以查阅
Documentation/devicetree/bindings/leds/common.txt 这个文档来查看可选功能,比如:
backlight: LED 灯作为背光;
default-on: LED 灯打开;
heartbeat: LED 灯作为心跳指示灯,可以作为系统运行提示灯;
ide-disk: LED 灯作为硬盘活动指示灯;
timer: LED 灯周期性闪烁,由定时器驱动,闪烁频率可以修改;

这里使用心跳指示灯

三、验证

使用编译好的dtb和zImage启动开发板,加载内核之后灯就会自动“双闪”的亮

可以查看一下设备,进入下面路径

/sys/bus/platform/devices

 目录下使用ls,可以找到我们创建的设备树节点"dtsleds"

进入“dtsleds”目录 

 进入“leds”目录

 在这就可以看到我们设备树上面定义的一个red灯

进入“red”目录

 测试

 先测试关闭led灯,现在是心跳灯的亮法,在"red"目录下输入下面命令

echo 0 > brightness

 可以看到执行就会关闭led

测试开灯,在"red"目录下输入下面命令

echo 1 > brightness

可以看到执行就会打开led

重新开启心跳灯,在"red"目录下输入下面命令

echo heartbeat > trigger

好了,测试基本是正常,说明使用自带的led驱动成功

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Linux下的LED驱动程序可以通过编写内核模块来实现。具体步骤如下: 1. 编写驱动程序的源代码,包括初始化、打开、关闭、读写等函数。 2. 使用makefile编译源代码,生成.ko文件。 3. 将.ko文件拷贝到Linux系统中。 4. 使用insmod命令将.ko文件加载到内核中。 5. 在用户空间中编写应用程序,通过ioctl等系统调用来控制LED。 6. 使用rmmod命令将.ko文件从内核中卸载。 需要注意的是,编写内核模块需要具备一定的Linux内核编程基础,同时需要了解硬件接口的相关知识。 ### 回答2: LinuxLED驱动程序是一个很有趣的话题,它涉及到Linux内核模块编程、硬件驱动等知识。本文将会详细讲解如何编写一个简单的LED驱动程序。 首先,我们需要明确LED是一种电子元件,它的亮灭状态取决于电压极性。在单片机或者芯片组中,LED通常与GPIO口相连,通过控制GPIO口的电平状态来控制LED的亮灭。 Linux内核中,GPIO口的控制是通过GPIO子系统来完成的。GPIO子系统定义了gpio_chip结构体用来描述GPIO芯片的属性,定义了gpio_desc结构体来描述GPIO口的属性。通过这些结构体和GPIO API接口,我们可以对GPIO口进行读、写、中断等操作。 LED驱动程序的编写步骤如下: 1.定义led_device结构体,用来描述LED设备的属性,如名称、GPIO口号等。 2.在led_device的probe函数中,通过gpio_request和gpio_direction_output函数来申请GPIO资源和设置输出状态。 3.在led_device的remove函数中,通过gpio_free函数来释放GPIO资源。 4.在led_device的open和release函数中,可以进行相关操作,如LED的闪烁等。 5.最后,通过module_init和module_exit函数来注册和注销LED设备驱动。 下面是一个简单的LED驱动程序示例: #include <linux/init.h> #include <linux/module.h> #include <linux/gpio.h> static struct led_device { char *name; int gpio; } led_dev = { .name = "my_led", .gpio = 17, }; static int __init led_init(void) { int ret; ret = gpio_request(led_dev.gpio, led_dev.name); if (ret) { printk(KERN_ERR "Failed to request gpio %d\n", led_dev.gpio); return ret; } gpio_direction_output(led_dev.gpio, 0); printk(KERN_INFO "LED driver initialized\n"); return 0; } static void __exit led_exit(void) { gpio_free(led_dev.gpio); printk(KERN_INFO "LED driver removed\n"); } module_init(led_init); module_exit(led_exit); MODULE_DESCRIPTION("LED driver"); MODULE_AUTHOR("Your name <[email protected]>"); MODULE_LICENSE("GPL"); 至此,一个简单的LED驱动程序就完成了。当模块被加载时,LED就会闪烁,当模块被卸载时,LED就会熄灭。当然,这只是一个最简单的例子,实际的LED驱动程序还需要考虑更多的因素,如命名空间、多个LED的控制等。 ### 回答3: LED是一种小巧、节能、长寿命的光源,因此在很多场合都得到了广泛应用。而在Linux操作系统中,需要通过驱动程序来控制LED的亮灭。本文将从驱动程序的角度,介绍如何在Linux下编写LED驱动程序。 首先,我们需要了解Linux内核中LED子系统的工作原理。LED子系统采用了一个标准的设备模型,每一个LED设备都被抽象为一个设备节点,并由一个独立的LED驱动程序来实现该设备节点的操作。LED设备节点包括了如下几个重要的属性: 1. 设备节点的名称:该名称应当在整个系统中唯一,通常采用/dev/ledX的形式命名,其中X为一个递增的数字。 2. 设备节点的状态:该状态表明了LED当前的亮灭状态,通常采用“0”或“1”来表示。 3. 设备节点的操作函数:该函数包括了控制LED的各种操作,例如打开、关闭、设置亮度等等。 下面我们来看一下如何编写一个简单的LED驱动程序。首先,我们需要定义一个led_device结构体,用于表示LED设备的各种属性: struct led_device { char *name; // 设备节点的名称 int status; // 设备节点的状态 void (*on) (void); // 打开LED void (*off) (void); // 关闭LED }; 接下来,我们需要实现该结构体中的两个操作函数——打开LED和关闭LED,实现方式如下: void led_on (void) { // 将设备的状态设置为“1”,表示LED亮起来 led_device.status = 1; } void led_off (void) { // 将设备的状态设置为“0”,表示LED关闭 led_device.status = 0; } 最后,我们需要实现一个在系统启动时自动加载该驱动程序的功能。这可以通过将该驱动程序打包成一个内核模块的形式来实现。内核模块是一种动态加载的可执行文件,通过将该驱动程序编译成一个内核模块,并在系统启动时自动加载该模块,即可实现自动控制LED的功能。 综上所述,Linux下编写LED驱动程序需要了解LED子系统的工作原理,定义一个led_device结构体,并实现打开和关闭LED的操作函数。通过将该驱动程序编译成一个内核模块,并在系统启动时自动加载该模块,即可实现自动控制LED的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值