首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Camera|10.闪光灯SGM3141概述

前面文章我们简单给大家介绍了如何移植闪光灯芯片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 结构体如下:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230530A03J9G00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券