首页 内核中led触发器实例

内核中led触发器实例

举报
开通vip

内核中led触发器实例内核中led触发器实例 gpio-led框架 /driver/leds/leds-gpio.c下实现了gpio-led框架。这个gpio-led框架的作用是把传入的gpio端口信息,注册成led_classdev。 数据结构 平台设备相关的gpio led数据结构 /include/linux/leds.h struct gpio_led { const char *name; //名字 char *default_trigger; //默认触发器的名字 unsigned gpio; //使用的gpio编号 u...

内核中led触发器实例
内核中led触发器实例 gpio-led框架 /driver/leds/leds-gpio.c下实现了gpio-led框架。这个gpio-led框架的作用是把传入的gpio端口信息,注册成led_classdev。 数据结构 平台设备相关的gpio led数据结构 /include/linux/leds.h struct gpio_led { const char *name; //名字 char *default_trigger; //默认触发器的名字 unsigned gpio; //使用的gpio编号 u8 active_low; //如果为真则逻辑1代 关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf 低电平 }; struct gpio_led_platform_data { int num_leds; //gpioled的数量 struct gpio_led *leds; //指向要注册的 gpio_led数组 int (*gpio_blink_set)(unsigned gpio, //硬件闪烁加速设置,可以为NULL unsigned long *delay_on, unsigned long *delay_off); }; 如何注册gpio-led平台设备 例子如下: #define GPIO_LED3 138 #define GPIO_LED4 139 static struct gpio_led gpio_leds[] = { { .name = "led3", .default_trigger = "heartbeat", .gpio = GPIO_LED3, .active_low = 1, .default_state = LEDS_GPIO_DEFSTATE_OFF, }, { .name = "led4", .gpio = GPIO_LED4, .active_low = 1, .default_state = LEDS_GPIO_DEFSTATE_OFF, }, }; static struct gpio_led_platform_data gpio_led_info = { .leds = gpio_leds, .num_leds = ARRAY_SIZE(gpio_leds), }; static struct platform_device leds_gpio = { .name = "leds-gpio", .id = -1, .dev = { .platform_data = &gpio_led_info, }, }; 最后调用platform_device_register(&leds_gpio)将LED设备注册到内核中。注册之前一定要保证编号为138和139的两个端口是可用的。 成功注册之后,系统中便会出现名为led3和led4的两个led_classdev了。由于是用gpio模拟led,所以对gpio-led设置的亮度,只要不是0就是全亮(gpio只有两个状态)。 对于可能睡眠的gpio,gpio-led会借助于工作队列去设置亮度,所以不用担心会被阻塞。 default-on触发器 在/driver/leds/ledtrig-default-on.c中实现了一个名为“default-on”的触发器。这个触发器只定义了activate成员函数 。它的 activate函数的定义如下: static void defon_trig_activate(struct led_classdev *led_cdev) { led_set_brightness(led_cdev, LED_FULL); } 也就是说,点亮led只能是最亮的亮度,无法调节。一旦ledl_classdev与之建立了连接,就一直处于最亮的状态,直到取消和触发器的连接。 心跳灯触发器 在/driver/leds/ledtrig-heartbeat.c中定义了一个名为"heartbeat"的心跳触发器,它可以控制所有与之建立连接的led会不停的闪烁。这个触发器用来指示内核是否已经挂掉。如果与之建立连接的led不再闪烁了,说明内核已经挂掉了。这就是“心跳”的含义,和从人的心脏是否跳动来判断人是否死亡的原理是类似的。 IDE硬盘指示灯触发器 在/driver/leds/ledtrig-ide-disk.c中定义了一个名为“ide-disk”的IDE硬盘指示灯触发器,与之建立连接的led可以指示硬盘的忙碌状态。这个触发器并没有active接口,因此不会自动闪烁。当内核中的其他模块调用以下函数的时候硬盘指示灯就会亮闪一下: void ledtrig_ide_activity(void); 这个函数是全局函数,内核空间都可以调用。每调用一次就闪烁一下。具体怎么用,完全依赖于IDE驱动。 可以有多个led_classdev和这个触发器建立连接。每次调用 ledtrig_ide_activity,所有与之连接的led都会闪烁一下。 使用 ledtrig_ide_activity这个函数的模块应该包含这个头文件。 闪烁定时触发器 在/driver/leds/ledtrig-timer.c中定义了一个名为“timer”的触发器。当某个led_classdev与之连接后,这个触发器会在/sys/class/leds//下创建两个属性文件delay_on\delay_off。用户空间往这两个文件中写入数据后,相应的led会按照设置的高低电平的时间(单位毫秒)来闪烁。如果led_classdev注册了硬件闪烁的接口led_cdev->blink_set就是用硬件控制闪烁,否则用软件定时器来控制闪烁。 led_classdev的sysfs属性文件 现在假设有一个名为“REDLED”的led_classdev被注册了,那么会出现/sys/class/leds/REDLED这个目录,这个目录下默认有brightness和trigger这两个属性文件,分别可以设置/读取led的亮度和触发器。如果和触发器 “timer”建立了连接,还会有delay_on和delay_off,这两个文件用于设置/读取闪烁的熄灭和点亮的时间,单位是毫秒。 LED子系统的使用 系统定义了四个默认触发器:default_on、心跳触发器、硬盘灯触发器、闪烁触发器。除了硬盘灯触发器,其他触发器没有留从其它内核模块访问的接口。led子系统的目的主要是给用户空间控制led的。当然可以定义自己的触发器并留给其它模块访问的接口。
本文档为【内核中led触发器实例】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_212655
暂无简介~
格式:doc
大小:15KB
软件:Word
页数:0
分类:生活休闲
上传时间:2018-12-27
浏览量:10