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

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

Android中Dialog的使用详解

《Android中Dialog的使用详解》Dialog(对话框)是Android中常用的UI组件,用于临时显示重要信息或获取用户输入,本文给大家介绍Android中Dialog的使用,感兴趣的朋友一起... 目录android中Dialog的使用详解1. 基本Dialog类型1.1 AlertDialog(

Spring Boot 配置文件之类型、加载顺序与最佳实践记录

《SpringBoot配置文件之类型、加载顺序与最佳实践记录》SpringBoot的配置文件是灵活且强大的工具,通过合理的配置管理,可以让应用开发和部署更加高效,无论是简单的属性配置,还是复杂... 目录Spring Boot 配置文件详解一、Spring Boot 配置文件类型1.1 applicatio

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

Android自定义Scrollbar的两种实现方式

《Android自定义Scrollbar的两种实现方式》本文介绍两种实现自定义滚动条的方法,分别通过ItemDecoration方案和独立View方案实现滚动条定制化,文章通过代码示例讲解的非常详细,... 目录方案一:ItemDecoration实现(推荐用于RecyclerView)实现原理完整代码实现

Android App安装列表获取方法(实践方案)

《AndroidApp安装列表获取方法(实践方案)》文章介绍了Android11及以上版本获取应用列表的方案调整,包括权限配置、白名单配置和action配置三种方式,并提供了相应的Java和Kotl... 目录前言实现方案         方案概述一、 androidManifest 三种配置方式

Python如何查看数据的类型

《Python如何查看数据的类型》:本文主要介绍Python如何查看数据的类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python查看数据的类型1. 使用 type()2. 使用 isinstance()3. 检查对象的 __class__ 属性4.

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D

Android WebView无法加载H5页面的常见问题和解决方法

《AndroidWebView无法加载H5页面的常见问题和解决方法》AndroidWebView是一种视图组件,使得Android应用能够显示网页内容,它基于Chromium,具备现代浏览器的许多功... 目录1. WebView 简介2. 常见问题3. 网络权限设置4. 启用 JavaScript5. D

Python如何在Word中生成多种不同类型的图表

《Python如何在Word中生成多种不同类型的图表》Word文档中插入图表不仅能直观呈现数据,还能提升文档的可读性和专业性,本文将介绍如何使用Python在Word文档中创建和自定义各种图表,需要的... 目录在Word中创建柱形图在Word中创建条形图在Word中创建折线图在Word中创建饼图在Word