linux 驱动之led子系统(一)

  linux系统基于3.4

  平台msm8x26

  android 4.4.2

  linux 中存在浩大的子系统,包罗led子系统,input子系统等等,那么就先从最复杂的led子系统末尾剖析了。这主要尽可能剖析完全。

  在andorid中的led系统是在\kernel\drivers\leds,在经常剖析代码的过程当中,起首需求看的是Kconfig和makefile文件,那好先看Kconfig

  这相似于在linux系统履行make menuconfig,起首是NEW_LEDS,看注释就是说必须使能LED Support,才华有所谓的平台的led的支撑。这些通俗是支撑的,而且通俗的平台也是会使能的,高通平台上有Msm_defconfig (arch\arm\configs),看出来支撑新增led和led的class的。

  看到这些的话,应当看出msm平台是支撑led的(想想也支撑)接上去就是看makefile了

  以上的是战争台有关的,而且从我查找的这些个obj-$(tmp),以上的文件都是会编译的。即led-core.c,led-class.c,led-triggers.c。这三个文件是led子系统的3个主要的文件,合营平台相干的led驱动,构成了一个完整的led子系统。

  好,先看led-core.c

  在led-core.c中导出了两个接口,一个是用来控制led的闪烁的,和闪烁的时间,一个接口是用来直接设置led的亮灭的。

  再看led-class.c,再看这个文件的时分我们再看一下led-class.txt

  好,说键盘灯是属于input的子系统的,不为led-class所控制。

  说led-class仅能从用户空间的?/sys/class/leds/控制,而且可以控制十分的亮度,然则通俗平台没有硬件控制,所以只能非0控制亮,0控制不亮。

  led子系统还导入了一个LED-trigger的概念,当需求的时分我们需求使能CONFIG_LEDS_TRIGGERS=y,否则不支撑。

  复杂的led-trigger例如可以更改灭和以后设置的led的亮度之间切换,时间可以经过?/sys/class/leds//delay_{on,off}接口来控制时间(ms级别)。

  可以经过?via /sys/class/leds//trigger的接口来应用led-trigger。

  2.led-class.c 剖析

  led_class 被定义为?static struct class *leds_class;这个类显示在/sys/class/ 下,当调用?class_create(owner, name)函数的时分会在/sys/class/下创立name的目次,这里创立的是leds,同时将led-class中的suspend的指针和resume的指针初始化了,通俗来讲是当系统休眠的时分系统下层会层层通知各个装备进入眠眠形状,那么担负这个装备的驱动则实践履行睡眠,例如手机的休眠键位,唤醒时调用的是resume,恢复装备的运转形状,这也是为了省电。即电源办理。个中将dev_attrs初始化为led_class_attrs,个中led_class_attrs为

  这个感化是在每个装备下创立brightness,max_brightness,trigger(固然得定义CONFIG_LEDS_TRIGGERS)的属性文件,权限是0644,读文件是调用show,写文件时调用store函数。留心最后要加上NULL。