【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】HAL源码分析

这篇具有很好参考价值的文章主要介绍了【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】HAL源码分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、环境介绍

RK3588主板搭载Android12操作系统,内核是Linux5.10,使用ST的六轴传感器LSM6DSR芯片。

二、芯片介绍

LSM6DSR是一款加速度和角速度(陀螺仪)六轴传感器,还内置了一个温度传感器。该芯片可以选择I2C,SPI通讯,还有可编程终端,可以后置摄像头等设备,功能是很强大的(感兴趣的可以去看数据手册)。该芯片原厂公开了input和iio两种驱动和HAL,我这边选用的是iio驱动,所以HAL也配套选择了iio的。

三、驱动移植

【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】驱动移植__花花的博客-CSDN博客

四、HAL移植

【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】HAL移植__花花的博客-CSDN博客

五、源码结构

1,包总结构

【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】HAL源码分析,Android,linux,运维,服务器,驱动开发,android

2,源码结构

2022/04/29  17:12             6,971 Accelerometer.cpp
2022/04/29  17:12             1,532 Accelerometer.h
2022/04/29  17:12             8,555 Android.mk
2022/04/29  17:12             3,184 android_KK_defconfig
2022/04/29  17:12             3,227 android_L_defconfig
2022/04/29  17:12             3,227 android_M_defconfig
2022/04/29  17:12             3,227 android_N_defconfig
2022/04/29  17:12             3,296 android_O_defconfig
2022/04/29  17:12             3,356 android_P_defconfig
2022/04/29  17:12             3,398 android_Q_defconfig
2022/04/29  17:12             3,386 android_R_defconfig
2022/04/29  17:12             1,782 ChangeODRTimestampStack.cpp
2022/04/29  17:12             1,407 ChangeODRTimestampStack.h
2022/04/29  17:12             3,903 CircularBuffer.cpp
2022/04/29  17:12             1,563 CircularBuffer.h
2022/04/29  17:12             3,695 common_data.h
2022/04/29  17:12             1,496 DeviceOrientation.cpp
2022/04/29  17:12             1,191 DeviceOrientation.h
2022/04/29  17:12             2,453 DynamicSensorProxy.cpp
2022/04/29  17:12             1,680 DynamicSensorProxy.h
2022/04/29  17:12             1,882 FlushBufferStack.cpp
2022/04/29  17:12             1,425 FlushBufferStack.h
2022/04/29  17:12             1,223 FlushRequested.cpp
2022/04/29  17:12             1,263 FlushRequested.h
2022/04/29  17:12             1,848 Gesture.cpp
2022/04/29  17:12             1,264 Gesture.h
2022/04/29  17:12             7,439 Gyroscope.cpp
2022/04/29  17:12             1,776 Gyroscope.h
2022/04/29  17:12            27,339 HWSensorBase.cpp
2022/04/29  17:12             4,279 HWSensorBase.h
2022/04/29  17:12             6,015 Magnetometer.cpp
2022/04/29  17:12             1,540 Magnetometer.h
2022/04/29  17:12             1,701 Pressure.cpp
2022/04/29  17:12             1,116 Pressure.h
2022/04/29  17:12             1,759 RHumidity.cpp
2022/04/29  17:12             1,132 RHumidity.h
2022/04/29  17:12            10,134 RingBuffer.cpp
2022/04/29  17:12             2,393 RingBuffer.h
2022/04/29  17:12             2,986 SelfTest.cpp
2022/04/29  17:12             1,285 SelfTest.h
2022/04/29  17:12             1,869 SensorAdditionalInfo.cpp
2022/04/29  17:12             1,524 SensorAdditionalInfo.h
2022/04/29  17:12            22,098 SensorBase.cpp
2022/04/29  17:12             8,760 SensorBase.h
2022/04/29  17:12           106,872 SensorHAL.cpp
2022/04/29  17:12             6,754 SensorHAL.h
2022/04/29  17:12             1,769 SignificantMotion.cpp
2022/04/29  17:12             1,205 SignificantMotion.h
2022/04/29  17:12             3,137 StepCounter.cpp
2022/04/29  17:12             1,244 StepCounter.h
2022/04/29  17:12             2,168 StepDetector.cpp
2022/04/29  17:12             1,247 StepDetector.h
2022/04/29  17:12             2,720 SWAccelerometerUncalibrated.cpp
2022/04/29  17:12             1,361 SWAccelerometerUncalibrated.h
2022/04/29  17:12             4,833 SWAccelGyroFusion6X.cpp
2022/04/29  17:12             1,227 SWAccelGyroFusion6X.h
2022/04/29  17:12             4,994 SWAccelMagnFusion6X.cpp
2022/04/29  17:12             1,227 SWAccelMagnFusion6X.h
2022/04/29  17:12             5,260 SWAccelMagnGyroFusion9X.cpp
2022/04/29  17:12             1,254 SWAccelMagnGyroFusion9X.h
2022/04/29  17:12             3,226 SWGameRotationVector.cpp
2022/04/29  17:12             1,321 SWGameRotationVector.h
2022/04/29  17:12             1,253 SWGeoMagRotationVector.cpp
2022/04/29  17:12             1,018 SWGeoMagRotationVector.h
2022/04/29  17:12             2,363 SWGravity.cpp
2022/04/29  17:12             1,249 SWGravity.h
2022/04/29  17:12             2,657 SWGyroscopeUncalibrated.cpp
2022/04/29  17:12             1,336 SWGyroscopeUncalibrated.h
2022/04/29  17:12             2,589 SWLinearAccel.cpp
2022/04/29  17:12             1,303 SWLinearAccel.h
2022/04/29  17:12             1,774 SWMagnetometerUncalibrated.cpp
2022/04/29  17:12             1,039 SWMagnetometerUncalibrated.h
2022/04/29  17:12             1,531 SWOrientation.cpp
2022/04/29  17:12               958 SWOrientation.h
2022/04/29  17:12             1,636 SWRotationVector.cpp
2022/04/29  17:12               979 SWRotationVector.h
2022/04/29  17:12            12,457 SWSensorBase.cpp
2022/04/29  17:12             2,484 SWSensorBase.h
2022/04/29  17:12             1,214 SWVirtualGyroscope.cpp
2022/04/29  17:12               991 SWVirtualGyroscope.h
2022/04/29  17:12             1,726 Temp.cpp
2022/04/29  17:12             1,097 Temp.h
2022/04/29  17:12             1,794 TiltSensor.cpp
2022/04/29  17:12             1,199 TiltSensor.h
2022/04/29  17:12            25,399 utils.cpp
2022/04/29  17:12             5,302 utils.h
2022/04/29  17:12             1,341 WristTiltGesture.cpp
2022/04/29  17:12             1,202 WristTiltGesture.h

3,源码文件概要

文件名 类型 备注
Android.mk 配置文件 编译配置
android_KK_defconfig 配置文件 android_KK系统配置文件
android_L_defconfig 配置文件 android_L系统配置文件
android_M_defconfig 配置文件 android_M系统配置文件
android_N_defconfig 配置文件 android_N系统配置文件
android_O_defconfig 配置文件 android_O系统配置文件
android_P_defconfig 配置文件 android_P系统配置文件
android_Q_defconfig 配置文件 android_Q系统配置文件
android_R_defconfig 配置文件 android_R系统配置文件
ChangeODRTimestampStack.cpp HAL框架
ChangeODRTimestampStack.h HAL框架
CircularBuffer.cpp HAL框架
CircularBuffer.h HAL框架
RingBuffer.cpp HAL框架
RingBuffer.h HAL框架
SelfTest.cpp HAL框架
SelfTest.h HAL框架
common_data.h HAL框架
DynamicSensorProxy.cpp HAL框架
DynamicSensorProxy.h HAL框架
FlushBufferStack.cpp HAL框架
FlushBufferStack.h HAL框架
FlushRequested.cpp HAL框架
FlushRequested.h HAL框架
SensorAdditionalInfo.cpp HAL框架
SensorAdditionalInfo.h HAL框架
utils.cpp HAL框架 工具类
utils.h HAL框架
HWSensorBase.cpp HAL框架 传感器次基类
HWSensorBase.h HAL框架
SensorBase.cpp HAL框架 传感器基类
SensorBase.h HAL框架
SensorHAL.cpp HAL框架 对接系统上层接口
SensorHAL.h HAL框架
Accelerometer.cpp 芯片传感器类 加速度传感器子类
Accelerometer.h 芯片传感器类
Gesture.cpp 芯片传感器类
Gesture.h 芯片传感器类
Gyroscope.cpp 芯片传感器类 陀螺仪子类
Gyroscope.h 芯片传感器类
Magnetometer.cpp 芯片传感器类 磁力计子类
Magnetometer.h 芯片传感器类
Pressure.cpp 芯片传感器类 压力计子类
Pressure.h 芯片传感器类
RHumidity.cpp 芯片传感器类 湿度计子类
RHumidity.h 芯片传感器类
Temp.cpp 芯片传感器类 温度计子类
Temp.h 芯片传感器类
SignificantMotion.cpp 芯片传感器类 特殊动作触发子类
SignificantMotion.h 芯片传感器类
StepCounter.cpp 芯片传感器类 计步器子类
StepCounter.h 芯片传感器类
StepDetector.cpp 芯片传感器类 步测子类
StepDetector.h 芯片传感器类
TiltSensor.cpp 芯片传感器类 倾斜检测子类
TiltSensor.h 芯片传感器类
WristTiltGesture.cpp 芯片传感器类 手腕倾斜手势检测子类
WristTiltGesture.h 芯片传感器类
DeviceOrientation.cpp 芯片传感器类 设备角度检测子类
DeviceOrientation.h 芯片传感器类
SWAccelerometerUncalibrated.cpp 软件传感器类
SWAccelerometerUncalibrated.h 软件传感器类
SWAccelGyroFusion6X.cpp 软件传感器类
SWAccelGyroFusion6X.h 软件传感器类
SWAccelMagnFusion6X.cpp 软件传感器类
SWAccelMagnFusion6X.h 软件传感器类
SWAccelMagnGyroFusion9X.cpp 软件传感器类
SWAccelMagnGyroFusion9X.h 软件传感器类
SWGameRotationVector.cpp 软件传感器类
SWGameRotationVector.h 软件传感器类
SWGeoMagRotationVector.cpp 软件传感器类
SWGeoMagRotationVector.h 软件传感器类
SWGravity.cpp 软件传感器类
SWGravity.h 软件传感器类
SWGyroscopeUncalibrated.cpp 软件传感器类
SWGyroscopeUncalibrated.h 软件传感器类
SWLinearAccel.cpp 软件传感器类
SWLinearAccel.h 软件传感器类
SWMagnetometerUncalibrated.cpp 软件传感器类
SWMagnetometerUncalibrated.h 软件传感器类
SWOrientation.cpp 软件传感器类
SWOrientation.h 软件传感器类
SWRotationVector.cpp 软件传感器类
SWRotationVector.h 软件传感器类
SWSensorBase.cpp 软件传感器类
SWSensorBase.h 软件传感器类
SWVirtualGyroscope.cpp 软件传感器类
SWVirtualGyroscope.h 软件传感器类
六,源码分析

本文主要从传感器注册到数据读取流程分析,并取加速度传感器子类做概要分析。

1,传感器注册流程

1)SensorHAL.cpp中ST_sensors_supported结构体数组的列表含括所有支持的传感器列表及基本配置,以LSM6DSR的加速度传感器为例,源码:

#ifdef CONFIG_ST_HAL_LSM6DSR_ENABLED
	ST_HAL_NEW_SENSOR_SUPPORTED(CONCATENATE_STRING(ST_SENSORS_LIST_46, ACCEL_NAME_SUFFIX_IIO), SENSOR_TYPE_ACCELEROMETER, DEVICE_IIO_ACC, "LSM6DSR Accelerometer Sensor", 0.0f)
#endif /* CONFIG_ST_HAL_LSM6DSR_ENABLED */

1> CONFIG_ST_HAL_LSM6DSR_ENABLED是配置文件/hardware/STMicroelectronics/SensorHAL_IIO/configuration.h中配置的,设置为1才能支持该传感器

【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】HAL源码分析,Android,linux,运维,服务器,驱动开发,android

2> ST_SENSORS_LIST_46定义在SensorHAL.h中,是传感器设备型号名称,用于后续传感器注册检索

#define ST_SENSORS_LIST_46				"lsm6dsr"

3> ACCEL_NAME_SUFFIX_IIO定义在SensorHAL.h中,是传感器类型,用于后续传感器注册检索

#define ACCEL_NAME_SUFFIX_IIO				"_accel"

4> 结合2>和3>,再回顾下驱动移植篇,传感器设备全名“lsm6dsr_accel”就满足该配置的检索要求

5> SENSOR_TYPE_ACCELEROMETER定义在/prebuilts/vndk/v31/x86_64/include/hardware/libhardware/include/hardware/sensors-base.h中,与应用层传感器类型对应。

【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】HAL源码分析,Android,linux,运维,服务器,驱动开发,android

6> DEVICE_IIO_ACC定义在/hardware/STMicroelectronics/SensorHAL_IIO/src/utils.h中。

7> "LSM6DSR Accelerometer Sensor"是上送到SensorManger的传感器名称。

2)HAL入口定义

【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】HAL源码分析,Android,linux,运维,服务器,驱动开发,android

3)st_hal_open_sensors函数主要流程

1> 内存与接口指针初始化

2> iio设备自动检索载入st_hal_load_iio_devices_data

3>基于载入的设备实例化传感器类st_hal_create_class_sensor

4>基于载入的设备实例化软件传感器类st_hal_create_virtual_class_sensor

5>针对数据读取通道的设备开启数据读取线程

pthread_create(&hal_data->data_threads[j], NULL, &SensorBase::ThreadDataWork, (void *)temp_sensor_class[i]);

6>针对有事件通道的设备开启数据事件获取线程

pthread_create(&hal_data->events_threads[k], NULL, &SensorBase::ThreadEventsWork, (void *)temp_sensor_class[i]);

2,设备自动检索载入流程(st_hal_load_iio_devices_data)

该函数会检索可用设备并设置,存储其必要参数。

1>device_iio_utils::get_devices_name检索"/sys/bus/iio/devices/"路径下的iio设备并记录其设备号与设备名称。

2>遍历检索所得设备名称,与HAL支持的设备列表做对比ST_sensors_supported,能匹配的上的设备才做处理。

3>检索支持设备的通道数据device_iio_utils::scan_channel

检索设备路径下scan_elements目录,使能所有xxx_en文件并读取确认,读取所有支持的类型并记录通道信息。在get_type函数中,读取xxx__type文件并解析内容,存储通道数据读取信息。该数据将用于后续数据读取线程的数据解析。

小彩蛋:在get_type函数中有一个小bug,该问题在后续更新的版本中已修复。会引起bits_used大于16时,mask数据为0,后续得到的数据结果也为0。

修改前代码:常量数据1默认数据类型为整型int,该类型占16位,1左移大于16位时,有效值溢出了,有效位中数值将为0。

channel->mask = (1 << channel->bits_used) - 1;

修改后代码:

channel->mask = ((unsigned long long int)1 << channel->bits_used) - 1;

以加速度计为例,检索到的数据通道信息如下:

num_channels=4
channels[0].name=[in_accel_x].type_name=[(null)].index=[0].enabled=[1].scale=[0.004785].offset=[0.000000].bytes=[2].bits_used=[16].shift=[0].mask=[65535].be=[0].sign=[1].location=[0]
channels[1].name=[in_accel_y].type_name=[(null)].index=[1].enabled=[1].scale=[0.004785].offset=[0.000000].bytes=[2].bits_used=[16].shift=[0].mask=[65535].be=[0].sign=[1].location=[2]
channels[2].name=[in_accel_z].type_name=[(null)].index=[2].enabled=[1].scale=[0.004785].offset=[0.000000].bytes=[2].bits_used=[16].shift=[0].mask=[65535].be=[0].sign=[1].location=[4]
channels[3].name=[in_timestamp].type_name=[(null)].index=[3].enabled=[1].scale=[1.000000].offset=[0.000000].bytes=[8].bits_used=[64].shift=[0].mask=[-1].be=[0].sign=[1].location=[8]

4>关闭使能设备device_iio_utils::enable_sensor

数据0写入到设备路径下"buffer/enable"文件。

5>设置时钟device_iio_utils::set_clock_type

数据"boottime"写入到设备路径下"current_timestamp_clock"文件。

6>获取支持的采样频率列表device_iio_utils::get_sampling_frequency_available

读取设备路径下“sampling_frequency_available”文件,获取采样频率列表。

7>获取支持的分辨率列表device_iio_utils::get_available_scales

读取设备路径下“in_xxx_scale_available”文件,获取分辨率列表。

8>设定设备到最高分辨率st_hal_set_fullscale

计算最高分辨率并写入到设备路径下"in_xxx_xxx_scale"文件中。

9>取设备缓冲区长度device_iio_utils::get_hw_fifo_length

读取设备路径下“hwfifo_watermark_max”文件,将读到的数据乘以2再写入到“buffer/length”文件,“hwfifo_enabled”写入1使能硬件缓冲区。(此处理解描述可能有点不到位,后续有更准确的描述请私信我修改,作为回报将退回VIP查看费用)

3,数据读取流程(SensorBase::ThreadDataWork)

1)基本流程(HWSensorBase::ThreadDataTask())

按设备硬件缓冲区长度开辟缓冲区malloc;死循环检索设备“/dev/iio:device”是否可读poll;若设备可读,则按硬件缓冲区长度读取其中数据。读取到数据后按载入设备时获取到的通道信息进行解析(ProcessScanData)。后处理时间戳(一定要求,不然数据不能正常上送)等信息,这部分比较复杂,也非当前必须内容,我就没分析了。

2)数据解析ProcessScanData

该函数流程是解析单组数据,根据每个数据通道信息,获取location偏移地址的bits_used长度数据,将数据按然后shift移位后再与上mask(取有效位,处理负数情况),后将获得的原始采样数据加上偏移量offse后再乘以分辨率scale。

以加速度计为例,获取到的一份数据解析日志(按ThreadDataTask流程)

LSM6DSRAccelerometerSensor--read_size=48scan_size=16(read_size/scan_size)=3
LSM6DSRAccelerometerSensor--data[0]=0x17
LSM6DSRAccelerometerSensor--data[1]=0xFF
LSM6DSRAccelerometerSensor--data[2]=0xDF
LSM6DSRAccelerometerSensor--data[3]=0xFF
LSM6DSRAccelerometerSensor--data[4]=0xDA
LSM6DSRAccelerometerSensor--data[5]=0x7
LSM6DSRAccelerometerSensor--data[6]=0xFF
LSM6DSRAccelerometerSensor--data[7]=0xFF
LSM6DSRAccelerometerSensor--data[8]=0xDB
LSM6DSRAccelerometerSensor--data[9]=0x7C
LSM6DSRAccelerometerSensor--data[10]=0xA1
LSM6DSRAccelerometerSensor--data[11]=0xEC
LSM6DSRAccelerometerSensor--data[12]=0x9
LSM6DSRAccelerometerSensor--data[13]=0x0
LSM6DSRAccelerometerSensor--data[14]=0x0
LSM6DSRAccelerometerSensor--data[15]=0x0
LSM6DSRAccelerometerSensor--data[16]=0x17
LSM6DSRAccelerometerSensor--data[17]=0xFF
LSM6DSRAccelerometerSensor--data[18]=0xDF
LSM6DSRAccelerometerSensor--data[19]=0xFF
LSM6DSRAccelerometerSensor--data[20]=0xDB
LSM6DSRAccelerometerSensor--data[21]=0x7
LSM6DSRAccelerometerSensor--data[22]=0xFF
LSM6DSRAccelerometerSensor--data[23]=0xFF
LSM6DSRAccelerometerSensor--data[24]=0xDB
LSM6DSRAccelerometerSensor--data[25]=0x40
LSM6DSRAccelerometerSensor--data[26]=0xDE
LSM6DSRAccelerometerSensor--data[27]=0xEE
LSM6DSRAccelerometerSensor--data[28]=0x9
LSM6DSRAccelerometerSensor--data[29]=0x0
LSM6DSRAccelerometerSensor--data[30]=0x0
LSM6DSRAccelerometerSensor--data[31]=0x0
LSM6DSRAccelerometerSensor--data[32]=0x18
LSM6DSRAccelerometerSensor--data[33]=0xFF
LSM6DSRAccelerometerSensor--data[34]=0xE0
LSM6DSRAccelerometerSensor--data[35]=0xFF
LSM6DSRAccelerometerSensor--data[36]=0xDC
LSM6DSRAccelerometerSensor--data[37]=0x7
LSM6DSRAccelerometerSensor--data[38]=0xFF
LSM6DSRAccelerometerSensor--data[39]=0xFF
LSM6DSRAccelerometerSensor--data[40]=0xDB
LSM6DSRAccelerometerSensor--data[41]=0x4
LSM6DSRAccelerometerSensor--data[42]=0x1B
LSM6DSRAccelerometerSensor--data[43]=0xF1
LSM6DSRAccelerometerSensor--data[44]=0x9
LSM6DSRAccelerometerSensor--data[45]=0x0
LSM6DSRAccelerometerSensor--data[46]=0x0
LSM6DSRAccelerometerSensor--data[47]=0x0
num_channels=4
channels[0].name=[in_accel_x].type_name=[(null)].index=[0].enabled=[1].scale=[0.004785].offset=[0.000000].bytes=[2].bits_used=[16].shift=[0].mask=[65535].be=[0].sign=[1].location=[0]
input=65303le16toh
val=-233shift
val=-233sign
sensor_out_data->raw[k]=-1.114905process_2byte_received
channels[1].name=[in_accel_y].type_name=[(null)].index=[1].enabled=[1].scale=[0.004785].offset=[0.000000].bytes=[2].bits_used=[16].shift=[0].mask=[65535].be=[0].sign=[1].location=[2]
input=65503le16toh
val=-33shift
val=-33sign
sensor_out_data->raw[k]=-0.157905process_2byte_received
channels[2].name=[in_accel_z].type_name=[(null)].index=[2].enabled=[1].scale=[0.004785].offset=[0.000000].bytes=[2].bits_used=[16].shift=[0].mask=[65535].be=[0].sign=[1].location=[4]
input=2010le16toh
val=2010shift
val=2010sign
sensor_out_data->raw[k]=9.617849process_2byte_received
channels[3].name=[in_timestamp].type_name=[(null)].index=[3].enabled=[1].scale=[1.000000].offset=[0.000000].bytes=[8].bits_used=[64].shift=[0].mask=[-1].be=[0].sign=[1].location=[8]
num_channels=4
channels[0].name=[in_accel_x].type_name=[(null)].index=[0].enabled=[1].scale=[0.004785].offset=[0.000000].bytes=[2].bits_used=[16].shift=[0].mask=[65535].be=[0].sign=[1].location=[0]
input=65303le16toh
val=-233shift
val=-233sign
sensor_out_data->raw[k]=-1.114905process_2byte_received
channels[1].name=[in_accel_y].type_name=[(null)].index=[1].enabled=[1].scale=[0.004785].offset=[0.000000].bytes=[2].bits_used=[16].shift=[0].mask=[65535].be=[0].sign=[1].location=[2]
input=65503le16toh
val=-33shift
val=-33sign
sensor_out_data->raw[k]=-0.157905process_2byte_received
channels[2].name=[in_accel_z].type_name=[(null)].index=[2].enabled=[1].scale=[0.004785].offset=[0.000000].bytes=[2].bits_used=[16].shift=[0].mask=[65535].be=[0].sign=[1].location=[4]
input=2011le16toh
val=2011shift
val=2011sign
sensor_out_data->raw[k]=9.622635process_2byte_received
channels[3].name=[in_timestamp].type_name=[(null)].index=[3].enabled=[1].scale=[1.000000].offset=[0.000000].bytes=[8].bits_used=[64].shift=[0].mask=[-1].be=[0].sign=[1].location=[8]
num_channels=4
channels[0].name=[in_accel_x].type_name=[(null)].index=[0].enabled=[1].scale=[0.004785].offset=[0.000000].bytes=[2].bits_used=[16].shift=[0].mask=[65535].be=[0].sign=[1].location=[0]
input=65304le16toh
val=-232shift
val=-232sign
sensor_out_data->raw[k]=-1.11012process_2byte_received
channels[1].name=[in_accel_y].type_name=[(null)].index=[1].enabled=[1].scale=[0.004785].offset=[0.000000].bytes=[2].bits_used=[16].shift=[0].mask=[65535].be=[0].sign=[1].location=[2]
input=65504le16toh
val=-32shift
val=-32sign
sensor_out_data->raw[k]=-0.15312process_2byte_received
channels[2].name=[in_accel_z].type_name=[(null)].index=[2].enabled=[1].scale=[0.004785].offset=[0.000000].bytes=[2].bits_used=[16].shift=[0].mask=[65535].be=[0].sign=[1].location=[4]
input=2012le16toh
val=2012shift
val=2012sign
sensor_out_data->raw[k]=9.627419process_2byte_received
channels[3].name=[in_timestamp].type_name=[(null)].index=[3].enabled=[1].scale=[1.000000].offset=[0.000000].bytes=[8].bits_used=[64].shift=[0].mask=[-1].be=[0].sign=[1].location=[8]

4,加速速度传感器子类(Accelerometer)

Accelerometer(传感器类)--继承-->HWSensorBaseWithPollrate--继承-->HWSensorBase--继承-->SensorBase

基于C++特性,在传感器类中实现特性部分即可,公共特征部分由父类实现。

若要自己增加一个特殊的传感器,可参考该类来编码实现。

1)构造函数Accelerometer::Accelerometer

初始化精度、最大范围等特征值。

2)使能函数Accelerometer::Enable

执行校准使能(若配置支持的话)后调用父类使能函数。

3)数据处理函数Accelerometer::ProcessData

执行坐标系旋转,校准,和数据上送流程。

本文只是个人笔记,可能有些问题和不足之处,欢迎指正。

码字不易请尊重版权,本文不授权任何单位及个体转载。

新人入行,经验分享,如有所误,欢迎指出~

版权归属:深圳市琪智科技有限公司-花花文章来源地址https://www.toymoban.com/news/detail-703847.html

到了这里,关于【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】HAL源码分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RK3588 Android 12 北斗模块调试

    北斗模块用的MTK RS1612M3 , http://www.sragps.com/web/down.html,可以查看相关资料,用串口和系统通讯 Android12中主要包括串口设备树修改,GPS2.0加载,gps.default.so编译和上层应用测试,以下主要记录测试中碰到的难点 板子上用的串口8,因此打开uart8的设备树配置 uart8 { status = “okay”;

    2024年02月15日
    浏览(29)
  • [RK3588 Android12]设置屏幕方向、分辨率和密度

    修改device/rockchip/common/BoardConfig.mk SF_PRIMARY_DISPLAY_ORIENTATIO参数值 在控制台输入 wm size 1920x1080 或 修改device/rockchip/rk3588/rk3588_s/rk3588_s.mk 增加PRODUCT_PROPERTY_OVERRIDES += ro.config.size_override参数值 在控制台输入 wm density 240 或 修改device/rockchip/rk3588/rk3588_s/rk3588_s.mk 修改PRODUCT_PROPERTY_OVERRI

    2024年02月15日
    浏览(41)
  • RK3588平台开发系列讲解(安卓篇)Android12 获取 root 权限

    沉淀、分享、成长,让自己和他人都能有所收获!😄 📢获取 Android 设备的 root 权限是指取得超级用户( root 用户)的权限,使得用户可以对系统进行更广泛的修改和操作。但需要注意,获取 root 权限可能会导致安全风险,包括系统不稳定、数据丢失或设备损坏,因此应该谨

    2024年02月03日
    浏览(51)
  • Android RK3588-12 hdmi-in Camera方式最大支持3个

      hdmi-in Camera最大支持3个     modified:   hardware/interfaces/camera/device/3.4/default/ExternalCameraDevice.cpp     modified:   hardware/interfaces/camera/device/3.4/default/ExternalCameraDeviceSession.cpp     modified:   hardware/interfaces/camera/device/3.4/default/include/ext_device_v3_4_impl/ExternalCameraDeviceSession.h     modified:

    2024年02月08日
    浏览(37)
  • RK3588平台开发系列讲解(USB篇)Linux Android USB软件架构

    平台 内核版本 安卓版本 RK3588 Linux 5.10 Android 12

    2024年02月09日
    浏览(42)
  • RK3588芯片支持8K视频的硬编解码

    RK3588是一款采用8nm制程工艺的高端通用型SoC,CPU采用四核A76和四核A55的八核架构,GPU采用Mail G610MP4,集成6TOPS独立NPU,支持四通道LPDDR5,有效保证了RK3588芯片的性能输出。RK3588在视频编解码方面也十分突出,支持8K视频的硬编硬解,非常适合VR(虚拟现实)、AR(增强现实)、

    2024年02月12日
    浏览(36)
  • 陀螺仪LSM6DSV16X与AI集成(5)----6D方向检测功能

    陀螺仪通常可以读取三个方向上的旋转,即绕X轴、Y轴和Z轴的旋转。每个方向上的旋转包括正向旋转和反向旋转,因此一共有六个位置。这六个位置分别是:1.X轴正向旋转、2.X轴反向旋转、3.Y轴正向旋转、4.Y轴反向旋转、5.Z轴正向旋转、6.Z轴反向旋转 通过检测陀螺仪在每个方

    2024年02月22日
    浏览(33)
  • 【android】rk3588-android-bt

    参考: https://source.android.com/docs/core/connect/bluetooth?hl=zh-cn https://android.googlesource.com/platform/hardware/interfaces/+/master/bluetooth/ 蓝牙整体硬件架构上分为主机(计算机或MCU)和主机控制器(实际蓝牙芯片组)两部分;主机和控制器之间的通信遵循主机控制器接口(HCI),如下所示:

    2024年01月24日
    浏览(29)
  • 陀螺仪LSM6DSV16X与AI集成(3)----读取融合算法输出的四元数

    LSM6DSV16X 特性涉及到的是一种低功耗的传感器融合算法(Sensor Fusion Low Power, SFLP). 低功耗传感器融合(SFLP)算法: 该算法旨在以节能的方式结合加速度计和陀螺仪的数据。传感器融合算法通过结合不同传感器的优势,提供更准确、可靠的数据。 6轴游戏旋转向量: SFLP算法能

    2024年02月03日
    浏览(29)
  • arm鲁班猫lubanCat rk3588 ubuntu20.04下源码编译安装qt5.12.5

    ubuntu-18.04上通过源码来编译及安装Qt-5.12库 QT官方线上文档for linux qt源码下载地址 进入下面目录下载 【new_archive/qt/5.12/5.12.5/single/qt-everywhere-src-5.12.5.tar.xz】 将压缩包放到Ubuntu某目录,并进入解压: 初步解压出:qt-everywhere-src-5.12.5.tar 最终得到:qt-everywhere-src-5.12.5 或者【右键】

    2024年04月11日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包