前面文章我们简单给大家介绍了如何移植闪光灯芯片sgm3141,该驱动依赖了led子系统和v4l2子系统。V4L2可以参考前面camera系列文章,本文主要讲述led子系统。
一、LED子系统框架
Linux内核的 led 子系统主要功能:
为每个设备在/sys/class/leds下创建不同的文件节点,用于操作led
抽象出所有的灯基本操作,设置亮、灭,光强、闪烁等
框架所处的位置,正如上图所示,由下往上看:
Hardware:硬件设备,指的是LED,可以是各种设备上的led灯
硬件驱动层:是直接操作硬件的实现,用于驱动硬件,实现相应的功能,并且将硬件设备注册进框架之中。
核心层:将LED进行统一管理,向下提供注册接口,向上提供统一访问接口,方便用户访问
用户层:用户通过指定的文件节点,能够直接控制LED的亮灭。
不同的led位于不同的外设上,有的可能通过gpio控制,也可能由其他的芯片控制,有的led只需要控制亮灭,有的需要设置为闪烁,只需要基于架构设置对应的回调函数即可。
二、LED子系统驱动文件
了解完LED子系统框架之后,我们来分析一下其相关的目录结构!
上面即为LED子系统的目录结构,其主要核心文件有:
led-core.c:核心层实现,抽象软件实现的相关功能,如闪烁,亮度设置等等,并管理LED设备
led-gpio.c:直接控制硬件设备,并且将其硬件设备注册进入LED驱动框架
led-class.c:定义用户访问的相关接口
led-class-flash.c:灯闪烁相关功能函数实现
led-triggers.c:LED出发功能的抽象
ledtrig-cpu.c:将LED作为CPU灯
ledtrig-heartbeat.c:将LED作为心跳灯
打开了LED子系统目录下的kernel/drivers/leds/Makefile,我们看到
我们必须在内核的配置中,通过 make menuconfig打开LED的相关配置,才支持LED相关功能。
三、查看sysfs文件结构
1. sys/class/leds/
我们在开发板中输入ls /sys/class/leds/,可以查看LED子系统生成的文件信息。
blue:板子的RGB灯的蓝色
green:板子的RGB灯的绿色
red: 板子的RGB灯的红色
gpio-flash:camera gpio闪光灯
mmc0:: :SD卡指示灯
2. red等子目录
根据打开配置的不同,生成不同的文件节点,比如red目录下信息:
相关属性文件有:brightness、max_brightness、trigger等
max_brightness:表示LED灯的最大亮度值。
brightness:表示当前LED灯的亮度值,它的可取 值范围为[0~max_brightness],一些LED设备不支持多级亮度,直接以非0值来 表示LED为点亮状态,0值表示灭状态。
delay_off、delay_on:trigger为timer时,LED亮灭的时间,单位ms
trigger:则指示了LED灯的触发方式,查看该文件的内容时,该文件会 列出它的所有可用触方式,而当前使用的触发方式会以“[]”符号括起。
常见的触 发方式如下表所示:
1)点亮 LED
2)关闭led
3)这几个文件节点由下面宏表示,
创建位置:
3. gpio-flash闪光灯目录
创建代码:
注册代码
测试gpio闪光灯
“
注意,实际操作摄像头闪光灯,并不是通过sysfs下的文件节点操作,而是通过v4l2架构下发ioctl的命令来实现的
”四、驱动解析1. 结构体和注册函数
下面介绍led相关的重要的结构体
该结构体包括led操作的所有信息,和回调函数
注册struct led_classdev结构图变量:
对于gpio闪光灯,则需要填充一下结构体:
gpio闪光灯注册函数:
2. gpio闪光灯sgm3141驱动详解
看上图:
sgm3141驱动通过函数led_classdev_flash_register()->led_classdev_register()向led子系统注册该设备
sgm3141驱动通过函数v4l2_async_register_subdev()向v4l2子系统注册该设备
如果用户直接通过/sys/class/leds/gpio-flash/flash_strobe文件操作led灯,则会直接调用struct led_flash_ops flash_ops的 .strobe_set方法,即sgm3141_led_flash_strobe_set()
操作log:
如果用户的app拍照时操作闪光灯,则是通过v4l2子系统调用下发ioctl命令命令序列:
操作log:
sgm驱动注册流程分析驱动架构基于platform总线,platform_driver 结构体如下:
领取专属 10元无门槛券
私享最新 技术干货