基于HDF驱动框架的温度传感器驱动开发 原创 精华
概述
温度传感器(Temperature)Sensor驱动,对温度传感器进行上电,通过驱动入口,将温度传感器注册到HDF驱动框架,对温度传感器驱动进行初始化,探测器件是否在位,并解析配置文件,最后通过温度传感器差异化代码实现,为上层服务提供稳定的实时数据。温度传感器sensor开发主要包括三个部分:温度传感器通用传感器驱动、温度传感器通用传感器配置和器件差异化驱动。基于HDF(Hardware Driver Foundation)驱动框架的Sensor驱动模型,实现跨操作系统迁移,器件差异配置等功能。
备注:后续会考虑进入到OpenHarmony主线,湿度传感器相关开发类似温度传感器
开发指导
开发步骤
(1)从device info HCS 的Sensor Host里读取温度传感器驱动配置信息。
(2)加载温度传感器抽象驱动,调用初始化接口,完成Sensor器件驱动资源分配和数据处理队列创建。
(3)从temperature_xxx_config HCS里读取温度传感器器件差异化驱动配置和私有化配置信息。
(4)温度传感器差异化驱动,调用通用配置解析接口,完成器件属性信息解析,器件寄存器解析。
(5)温度传感器差异化驱动完成器件探测,并分配温度传感器配置资源,完成温度传感器差异化接口注册。
(6)温度传感器器件探测成功之后,温度传感器差异化驱动通知温度传感器抽象驱动,注册温度传感器设备到Sensor设备管理中。
开发实例
Sensor驱动模型提供标准化的器件驱动,开发者无需独立开发,通过配置即可完成驱动的部署。对驱动模型抽象,屏蔽驱动与不同系统组件间的交互,使得驱动更具备通用性。基于Sensor驱动模型,加载温度传感器驱动。温度传感器选择通讯接口方式为IIC,厂家选择Sensirion,器件类型为SHT30的温度传感器传器。
1.温度传感器抽象驱动实现
-
温度传感器抽象驱动在Sensor Host中的配置信息
代码实现路径为
vendor\hihope\rk3568\hdf_config\khdf\device_info\device_info.hcs (RK3568配置路径)
vendor\unionman\unionpi_tiger\hdf_config\khdf\device_info\device_info.hcs (A311D配置路径)
具体代码如下:
-
温度传感器抽象驱动入口函数实现
代码实现路径为 \drivers\framework\model\sensor\driver\temperature\sensor_temperature_driver.c
定义温度传感器抽象驱动对应的HdfDriverEntry对象,其中,Driver Entry入口函数定义如下:
Bind接口实现驱动接口实例化,实现示例:
Init接口实现驱动接口实例化,实现示例:
Release接口在驱动卸载或者Init执行失败时,会调用此接口释放资源:
温度传感器抽象驱动内部接口开发实现示例:
提供给差异化驱动的初始化接口,完成温度传感器器件的基本配置信息解析(温度传感器信息,温度传感器总线配置,温度传感器器件探测寄存器配置),器件探测,器件寄存器解析。
2.温度传感器差异化驱动实现
-
温度传感器差异化驱动在Sensor Host中的配置信息
代码实现路径为
vendor\hihope\rk3568\hdf_config\khdf\device_info\device_info.hcs
vendor\unionman\unionpi_tiger\hdf_config\device_info\device_info.hcs
温度传感器差异化驱动私有HCS配置
代码路径如下
vendor\hihope\rk3568\hdf_config\khdf\sensor\temperature\temperature_sht30_config.hcs
vendor\unionman\unionpi_tiger\hdf_config\khdf\sensor\temperature\temperature_sht30_config.hcs
-
温度传感器差异化驱动入口函数实现
代码实现路径为 drivers/peripheral/sensor/chipset/temperature/temperature_sht30.c
定义温度传感器差异化驱动对应的HdfDriverEntry对象,其中,Driver Entry入口函数定义如下:
Bind驱动接口实例化,实现示例:
Init驱动接口实例化,实现示例:
Release驱动接口实例化,实现示例:
温度传感器差异化函数接口实现示例
需要开发者实现的ReadSht30Data接口函数,在Sht30InitDriver函数里面注册此函数。
编译指导
在编译的过程中,首先需要在Sensor Host中的配置信息中设置具体器件是否要驱动加载。
HCS路径:
vendor\hihope\rk3568\hdf_config\khdf\device_info\device_info.hcs
传感器驱动实现在内核态,代码参与编译通过适配makefile实现,并通过内核模块宏定义,控制温度传感器设备驱动是否参与编译。
Makefile路径:
drivers\hdf_core\adapter\khdf\linux\model\sensor\Makefile
Kconfig路径:
drivers\hdf_core\adapter\khdf\linux\model\sensor\Kconfig
温度传感器驱动加载,将DRIVERS_HDF_SENSOR_TEMPERATURE;
DRIVERS_HDF_SENSOR_TEMPERATURE_SHT30宏字段设置为y即可。
温度传感器驱动不加载,将DRIVERS_HDF_SENSOR_TEMPERATURE; DRIVERS_HDF_SENSOR_TEMPERATURE_SHT30宏字段设置为is not set即可。
内核配置路径(以RK3568为例):
kernel/linux/config/linux-5.10/arch/arm64/configs/rk3568_standard_defconfig
实例运行
参考代码:
RK3568运行日志如下:
A311D运行日志:
感谢分享,很完整的开发流程
代码展示的很全
device info HCS在哪里能下到
没了解过驱动开发,学习一下
了解一下驱动开发
楼主是用的鸿蒙的linux内核吗?有没有用liteos_m核运行过sensor驱动模型?
这个示例运行如何编译的呀