Android Sensor Input类型 (三) Sensor Class

2024-04-18 10:58

本文主要是介绍Android Sensor Input类型 (三) Sensor Class,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Sensors Class驱动

传感器类支持是一般 HAL 支持的一部分。它的主要目的是使sensorsHAL 更加通用,所有与硬件相关的配置都由kermel 提供。为了支持此功能,内核驱动程序需要遵循接口。内核驱动程序应该实现几个关键的回调。为了统一规范,抽象出了 Sensor class;

Sensors class的逻辑相对简单,与最简单led子系统逻辑相似
向用户空间提供可供访问的device读写设备节点,
向sensor设备驱动提供统一的注册接口,定义了统一的 sensors_classdev 数据结构,规范了sensor设备驱动的架构。


下面来分析下sensors class驱动主要做了哪些事情。

注册class

static int __init sensors_init(void)
{sensors_class = class_create(THIS_MODULE, "sensors");  //创建 classif (IS_ERR(sensors_class))return PTR_ERR(sensors_class);sensors_class->dev_attrs = sensors_class_attrs;        //填充 class attrsreturn 0;
}
static void __exit sensors_exit(void)
{class_destroy(sensors_class);
}
subsys_initcall(sensors_init);  //比普通driver 更早的init
module_exit(sensors_exit);

主要的内容就是创建 名为sensor的class,并且填充其dev_attrs, 这样的设置之后,在这个class中创建的每一个device都将具备 dev_attrs中设置的读写函数,
也正是因为这点才使得每一个注册到这个class中的 sensor_classdev才具备统一规范的接口、下面来看下 对dev_attrs的设置。

配置ATTRS

static struct device_attribute sensors_class_attrs[] = {__ATTR(name, 0444, sensors_name_show, NULL),__ATTR(vendor, 0444, sensors_vendor_show, NULL),__ATTR(version, 0444, sensors_version_show, NULL),__ATTR(handle, 0444, sensors_handle_show, NULL),__ATTR(type, 0444, sensors_type_show, NULL),__ATTR(max_range, 0444, sensors_max_range_show, NULL),__ATTR(resolution, 0444, sensors_resolution_show, NULL),__ATTR(sensor_power, 0444, sensors_power_show, NULL),__ATTR(min_delay, 0444, sensors_min_delay_show, NULL),__ATTR(fifo_reserved_event_count, 0444, sensors_fifo_event_show, NULL),__ATTR(fifo_max_event_count, 0444, sensors_fifo_max_show, NULL),__ATTR(max_delay, 0444, sensors_max_delay_show, NULL),__ATTR(flags, 0444, sensors_flags_show, NULL),__ATTR(enable, 0664, sensors_enable_show, sensors_enable_store),__ATTR(enable_wakeup, 0664, sensors_enable_wakeup_show,sensors_enable_wakeup_store),__ATTR(poll_delay, 0664, sensors_delay_show, sensors_delay_store),__ATTR(self_test, 0440, sensors_test_show, NULL),__ATTR(max_latency, 0660, sensors_max_latency_show, sensors_max_latency_store),__ATTR(flush, 0660, sensors_flush_show, sensors_flush_store),__ATTR(calibrate, 0664, sensors_calibrate_show, sensors_calibrate_store),__ATTR_NULL,
};

这组文件节点的创建,实现了用户用户空间对sensor 设备驱动的访问控制,我们先以mmc3416x为例看下,在文件系统中生成的实际设备节点。

msm8909:/sys/class/sensors/mmc3416x-mag # ls
calibrate enable_wakeup             flags  max_delay   min_delay  power      sensor_power uevent
device    fifo_max_event_count      flush  max_latency name       resolution subsystem    vendor
enable    fifo_reserved_event_count handle max_range   poll_delay self_test  type         version

这里以name,poll_delay 为例 分析这些接口的实现:

static ssize_t sensors_name_show(struct device *dev,struct device_attribute *attr, char *buf)
{struct sensors_classdev *sensors_cdev = dev_get_drvdata(dev);
return snprintf(buf, PAGE_SIZE, "%s\n", sensors_cdev->name);
//就是直接将 在设备驱动中填充的sensors_cdev->name 返回
}
static ssize_t sensors_enable_store(struct device *dev,struct device_attribute *attr, const char *buf, size_t size)
{struct sensors_classdev *sensors_cdev = dev_get_drvdata(dev);ssize_t ret = -EINVAL;unsigned long data = 0;ret = kstrtoul(buf, 10, &data); //把用户空间传来的时间换算成unsight longif (sensors_cdev->sensors_enable == NULL) 
ret = sensors_cdev->sensors_enable(sensors_cdev, data);//回调sensors_cdev中的 enable 函数sensors_cdev->enabled = data;return size;
}

Sensor_classdev_register

从上面两个例子可以看出,实际在class中设备节点中的操作过程很简单,就是交互sensors_cdev中填充的 设备信息与函数回调,其中 sensors_cdev的获取是通过dev_get_drvdata(dev);来获取的。

这个device就是我们注册的device,在sensor设备驱动中有将设备结构体放到 device的私有数据中,这里再来获取。

达到相同的处理函数根据不同的device信息做不同的处理,那下面就看下针对不同device的sensors_cdev的注册,这也是sensors class对设备驱动提供的注册接口。

int sensors_classdev_register(struct device *parent,struct sensors_classdev *sensors_cdev)
{sensors_cdev->dev = device_create(sensors_class, parent, 0,sensors_cdev, "%s", sensors_cdev->name);  
//创建一个devicedown_write(&sensors_list_lock);
list_add_tail(&sensors_cdev->node, &sensors_list);
//将当前注册的sensor添加到sensor list中up_write(&sensors_list_lock);pr_debug("Registered sensors device: %s\n", sensors_cdev->name);return 0;
}
EXPORT_SYMBOL(sensors_classdev_register);

在创建设备时,parent传递一个device,在mmc3416 中是传递的 inputdev,当然也可以传我们的sensor设备结构, 传递sensor_cdev为创建device的私有数据,可以使用dev_get_drvdata(dev) 来获取出来。

在各个设备节点中都是根据不同的device 取出注册时传入的sensor_cdev结构体。如此即可完成对sensor设备驱动统一的处理。

简要图示框架:

这篇关于Android Sensor Input类型 (三) Sensor Class的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/914586

相关文章

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

Android平台播放RTSP流的几种方案探究(VLC VS ExoPlayer VS SmartPlayer)

技术背景 好多开发者需要遴选Android平台RTSP直播播放器的时候,不知道如何选的好,本文针对常用的方案,做个大概的说明: 1. 使用VLC for Android VLC Media Player(VLC多媒体播放器),最初命名为VideoLAN客户端,是VideoLAN品牌产品,是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式,并支持DVD影音光盘,VCD影

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

【编程底层思考】垃圾收集机制,GC算法,垃圾收集器类型概述

Java的垃圾收集(Garbage Collection,GC)机制是Java语言的一大特色,它负责自动管理内存的回收,释放不再使用的对象所占用的内存。以下是对Java垃圾收集机制的详细介绍: 一、垃圾收集机制概述: 对象存活判断:垃圾收集器定期检查堆内存中的对象,判断哪些对象是“垃圾”,即不再被任何引用链直接或间接引用的对象。内存回收:将判断为垃圾的对象占用的内存进行回收,以便重新使用。

flume系列之:查看flume系统日志、查看统计flume日志类型、查看flume日志

遍历指定目录下多个文件查找指定内容 服务器系统日志会记录flume相关日志 cat /var/log/messages |grep -i oom 查找系统日志中关于flume的指定日志 import osdef search_string_in_files(directory, search_string):count = 0

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

两个月冲刺软考——访问位与修改位的题型(淘汰哪一页);内聚的类型;关于码制的知识点;地址映射的相关内容

1.访问位与修改位的题型(淘汰哪一页) 访问位:为1时表示在内存期间被访问过,为0时表示未被访问;修改位:为1时表示该页面自从被装入内存后被修改过,为0时表示未修改过。 置换页面时,最先置换访问位和修改位为00的,其次是01(没被访问但被修改过)的,之后是10(被访问了但没被修改过),最后是11。 2.内聚的类型 功能内聚:完成一个单一功能,各个部分协同工作,缺一不可。 顺序内聚:

Android 10.0 mtk平板camera2横屏预览旋转90度横屏拍照图片旋转90度功能实现

1.前言 在10.0的系统rom定制化开发中,在进行一些平板等默认横屏的设备开发的过程中,需要在进入camera2的 时候,默认预览图像也是需要横屏显示的,在上一篇已经实现了横屏预览功能,然后发现横屏预览后,拍照保存的图片 依然是竖屏的,所以说同样需要将图片也保存为横屏图标了,所以就需要看下mtk的camera2的相关横屏保存图片功能, 如何实现实现横屏保存图片功能 如图所示: 2.mtk