首页 > 系统相关 >初探linux子系统集之led子系统(一)

初探linux子系统集之led子系统(一)

时间:2023-01-15 15:03:43浏览次数:47  
标签:leds led brightness LEDS trigger linux LED 子系统


         就像学编程第一个范例helloworld一样,学嵌入式,单片机、fpga之类的第一个范例就是点亮一盏灯。对于庞大的linux系统,当然可以编写一个字符设备驱动来实现我们需要的led灯,也可以直接利用gpio口,应用程序来拉高拉低管脚控制。不过,既然linux系统自己本来就带有led子系统,那么就可以好好利用之。好处不用多说了,主要对于应用层来说,不同平台都用linux的led子系统,那么应用程序不用做任何的改变,就可以在新的平台上运行,可移植性好。

         linux的led子系统的源码路径:

Include/Linux/leds.h
/drivers/leds


         首先看一下led子系统中的主要文件:

# LED Core
obj-$(CONFIG_NEW_LEDS) +=led-core.o
obj-$(CONFIG_LEDS_CLASS) += led-class.o
obj-$(CONFIG_LEDS_TRIGGERS) +=led-triggers.o

# LED PlatformDrivers
obj-$(CONFIG_LEDS_GPIO) += leds-gpio.o

# LED Triggers
obj-$(CONFIG_LEDS_TRIGGER_TIMER) +=ledtrig-timer.o
obj-$(CONFIG_LEDS_TRIGGER_IDE_DISK) +=ledtrig-ide-disk.o
obj-$(CONFIG_LEDS_TRIGGER_HEARTBEAT) +=ledtrig-heartbeat.o
obj-$(CONFIG_LEDS_TRIGGER_BACKLIGHT) +=ledtrig-backlight.o
obj-$(CONFIG_LEDS_TRIGGER_GPIO) +=ledtrig-gpio.o
obj-$(CONFIG_LEDS_TRIGGER_DEFAULT_ON) += ledtrig-default-on.o


主要由leds.h、led-core.c、led-class.c、led-triggers.c,其中led-triggers又分为了timer、ide-disk、heartbeat、backlight、gpio、default-on等算法。

 

例子程序是leds-gpio,接下去会主要分析这个驱动实现。

 

首先简单看一下主要的文件

 

Leds.h

1、enum led_brightness{
LED_OFF = 0,
LED_HALF = 127,
LED_FULL = 255,
};


Led的亮度,分为三等级,关、中间、最亮。

 

2、struct led_classdev{
constchar *name; // Led的名字
int brightness; //led亮度
int max_brightness; //led最大亮度
int flags;

/*Lower 16 bits reflect status */
#define LED_SUSPENDED (1 << 0)
/*Upper 16 bits reflect control information */
#define LED_CORE_SUSPENDRESUME (1 << 16)

/*Set LED brightness level */
/*Must not sleep, use a workqueue if needed */
void (*brightness_set)(struct led_classdev*led_cdev,
enum led_brightness brightness); //亮度设置函数指针
/*Get LED brightness level */
enumled_brightness (*brightness_get)(struct led_classdev *led_cdev); //获取亮度函数指针

int (*blink_set)(struct led_classdev*led_cdev,
unsigned long *delay_on,
unsigned long *delay_off); //闪烁时点亮和熄灭的时间设置

structdevice *dev;
structlist_head node; //leds-list的node
constchar *default_trigger; //默认trigger的名字

unsignedlong blink_delay_on,blink_delay_off; //闪烁的开关时间
structtimer_list blink_timer; //闪烁的定时器链表
int blink_brightness; //闪烁的亮度

#ifdef CONFIG_LEDS_TRIGGERS
/*Protects the trigger data below */
structrw_semaphore trigger_lock; //trigger的锁

structled_trigger *trigger; //led的trigger
structlist_head trig_list; //trigger的链表
void *trigger_data; //trigger的数据
#endif
};


3、struct led_trigger {
/*Trigger Properties */
constchar *name; //trigger的名字
void (*activate)(struct led_classdev*led_cdev); //激活trigger
void (*deactivate)(struct led_classdev*led_cdev);

/*LEDs under control by this trigger (for simple triggers) */
rwlock_t leddev_list_lock;
structlist_head led_cdevs; //led设备的链表

/*Link to next registered trigger */
structlist_head next_trig;
};

 

4、/* For the leds-gpiodriver */
struct gpio_led {
constchar *name; //led的名字
constchar *default_trigger; //默认的trigger
unsigned gpio; //gpio口
unsigned active_low : 1;
unsigned retain_state_suspended : 1;
unsigned default_state : 2;
/*default_state should be one of LEDS_GPIO_DEFSTATE_(ON|OFF|KEEP) */
};

 

5、structgpio_led_platform_data {
int num_leds; led的个数
conststruct 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,
unsignedlong *delay_on,
unsignedlong *delay_off);
};



 

led-core.c

DECLARE_RWSEM(leds_list_lock);
EXPORT_SYMBOL_GPL(leds_list_lock);

LIST_HEAD(leds_list);
EXPORT_SYMBOL_GPL(leds_list);


主要是声明了leds的链表和锁。

 

Led-class.c

1、  leds_init

主要是创建leds_class,赋值suspend和resume以及dev_attrs。

led_class_attrs

static  struct device_attribute led_class_attrs[] = {
__ATTR(brightness,0644, led_brightness_show, led_brightness_store),
__ATTR(max_brightness,0444, led_max_brightness_show, NULL),
#ifdef CONFIG_LEDS_TRIGGERS
__ATTR(trigger,0644, led_trigger_show, led_trigger_store),
#endif
__ATTR_NULL,
};


2、led_classdev_register

         创建classdev设备,也即Leds_class类中实例化一个对象,类似于c++的new一个对象,leds有很多种,而这里是注册一个特定的led,内核中的面向对象思想也极其丰富。

         加到leds_list链表中,初始化blinktimer,指定blink_timer的function和data,设置trigger,然后一个新的led设备就注册好了,就可以使用了。

 

led-triggers.c

1、led_trigger_register

         扫描trigger链表中是否有同名的trigger,接着把当前trigger加入到链表中,如果led_classdev中有默认的trigger,那么就设置这个默认的。

 

好了,简单看了下led子系统中比较重要的结构体和函数,那么接下去就可以通过leds-gpio这个驱动来进一步了解led子系统了。



 

标签:leds,led,brightness,LEDS,trigger,linux,LED,子系统
From: https://blog.51cto.com/u_15940062/6008709

相关文章

  • 和菜鸟一起学linux之initramfs方式启动
    关于initramfs       initramfs在编译内核的同时被编译并与内核连接成一个文件,它被链接到地址__initramfs_start处,与内核同时被加载到ram中。initramfs被解析处理后......
  • AndroidThings学习笔记--gpio控制Led和Button
    1.了解androidthings的框架  Androidthings框架,其实和android原生区别不是非常的大。如下图所示:  AndroidThings扩展了一些硬件相关的api,比如外设io的api,以及用户驱......
  • Linux后台运行
    title:Linux后台运行date:2022-09-0312:51:35tags:-Linuxcategories:-Linux如何后台运行脚本方法1:nohup在执行命令前面加nohup但是CTRL+C就......
  • 和菜鸟一起学linux之常见错误的解决和常用命令
    1、错误提示:make:警告:检测到时钟错误。您的创建可能是不完整的。   解决方法:当前编译目录下,命令行输入:find.-typef-exectouch{}\;2、SSH生成密钥:ssh-keygen;SSH......
  • 初探linux子系统集之写在前言
                           ......
  • 和菜鸟一起学linux内核之初始化init篇
    注:以下大部分内容摘自linux内核编程入门篇和linux内核完全注释      初始化init下只有一个main函数。      首先利用setup.s程序取得的程序参数设置系统的根......
  • CUDNN_STATUS_EXECUTION_FAILED 错误原因:显卡版本和cuda版本不匹配
    又是寄人篱下使用服务器的一天...造成错误的过程:跑实验需要装一个新的虚拟环境来使用cuda,别人的readme上面要用torh1.3,搜了一下教程,适配的cuda版本是10.1,目前显卡支持......
  • linux/windows查看端口被占用情况
    linux下查看端口被占用情况1.可以通过"~$netstat-anp"来查看哪些端口被打开。(注:加参数'-n'会将应用程序转为端口显示,即数字格式的地址,2.然后可以通过"~$lsof-i:$POR......
  • 查看linux重启时间方法
    who-b lastreboot last-x linuxlast命令详解功能说明:列出目前与过去登入系统的用户相关信息。语法:last[-adRx][-f<记录文件>][-n<显示列......
  • expect远程ssh连接linux终端
    前提条件,需要安装expect,安装方法请参考​​http://tongzidane.blog.163.com/blog/static/5816589220118161127811/​​#!/usr/bin/expect #设置超时时间为60秒 set......