一、环境介绍
RK3588主板搭载Android12操作系统,内核是Linux5.10,使用ST的六轴传感器LSM6DSR芯片。
二、芯片介绍
LSM6DSR是一款加速度和角速度(陀螺仪)六轴传感器,还内置了一个温度传感器。该芯片可以选择I2C,SPI通讯,还有可编程终端,可以后置摄像头等设备,功能是很强大的(感兴趣的可以去看数据手册)。该芯片原厂公开了input和iio两种驱动和HAL,我这边选用的是iio驱动,所以HAL也配套选择了iio的。
三、驱动移植
【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】驱动移植__花花的博客-CSDN博客
四、HAL移植
源码链接:https://github.com/STMicroelectronics/STMems_Android_Sensor_HAL_IIO/tree/STMems_Android_Sensor_HAL_IIO
1,拷贝整个文件夹到hardware/目录下
2,在/device/rockchip/rk3588/device.mk中增加
PRODUCT_PACKAGES += sensors.rk3588
3,HAL目录下,执行生成cofig指令
source android_data_config
make sensors-defconfig
报错失败可以参考【android12-linux-5.1】【ST芯片】HAL移植后配置文件生成报错__花花的博客-CSDN博客
4,增加权限配置参考(开机会卡住报错-13)
【android12-linux-5.1】【ST芯片】HAL移植后开机卡死__花花的博客-CSDN博客
5,编译后调不到HAL参考(HAL增加日志不会出来)
【android12-linux-5.1】【ST芯片】HAL移植后没调起来__花花的博客-CSDN博客
6,多HAL兼容参考
RK平台的sensor框架HAL层兼容其他HAL层so库__花花的博客-CSDN博客
7,测试任然SensorManger调不到的话,参考配置
Solved: Re: Android P can't get LSM6DSM HAL Accelerometer/... - STMicroelectronics Community
五,测试
直接系统接口SensorManger调用即可
1,MainActivity.java
package com.example.sensorsdata;
import static android.hardware.SensorManager.SENSOR_DELAY_GAME;
import static android.hardware.SensorManager.SENSOR_DELAY_NORMAL;
import static android.hardware.SensorManager.SENSOR_DELAY_UI;
import static java.lang.Math.atan2;
import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import com.google.android.material.snackbar.Snackbar;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Environment;
import android.text.method.ScrollingMovementMethod;
import android.util.Log;
import android.view.View;
import androidx.navigation.NavController;
import androidx.navigation.Navigation;
import androidx.navigation.ui.AppBarConfiguration;
import androidx.navigation.ui.NavigationUI;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.TextView;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
public class MainActivityRaw extends Activity implements SensorEventListener {
private SensorManager sensorManager = null;
private Sensor accSensor = null;//加速度传感器
private Sensor gyroSensor = null;//角速度传感器
private Sensor magSensor = null;//磁力传感器
private Sensor stepSensor = null;//计步传感器
private Sensor tempSensor = null;//温度传感器
private Sensor tempSensor2 = null;//温度传感器
private TextView textView_AccName, textView_AccX, textView_AccY, textView_AccZ;//加速度传感器参数
private TextView textView_GyrName, textView_GyrX, textView_GyrY, textView_GyrZ;//角速度传感器参数
private TextView textView_MagName, textView_MagX, textView_MagY, textView_MagZ;//磁力传感器参数
private TextView textView_StepName, textView_StepData;//计步传感器器参数
private TextView textView_TempName, textView_TempData;//温度传感器器参数
private TextView textView_TempName2, textView_TempData2;//温度传感器器参数
private String strAppName = "SensorData";
private TextView v;
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView_AccName = (TextView) findViewById(R.id.acc_name);
textView_AccX = (TextView) findViewById(R.id.acc_x);
textView_AccY = (TextView) findViewById(R.id.acc_y);
textView_AccZ = (TextView) findViewById(R.id.acc_z);
textView_GyrName = (TextView) findViewById(R.id.gyr_name);
textView_GyrX = (TextView) findViewById(R.id.gyr_x);
textView_GyrY = (TextView) findViewById(R.id.gyr_y);
textView_GyrZ = (TextView) findViewById(R.id.gyr_z);
textView_MagName = (TextView) findViewById(R.id.mag_name);
textView_MagX = (TextView) findViewById(R.id.mag_x);
textView_MagY = (TextView) findViewById(R.id.mag_y);
textView_MagZ = (TextView) findViewById(R.id.mag_z);
textView_StepName = (TextView) findViewById(R.id.step_name);
textView_StepData = (TextView) findViewById(R.id.step_data);
textView_TempName = (TextView) findViewById(R.id.temp_name);
textView_TempData = (TextView) findViewById(R.id.temp_data);
textView_TempName2 = (TextView) findViewById(R.id.temp_name2);
textView_TempData2 = (TextView) findViewById(R.id.temp_data2);
v = (TextView) findViewById(R.id.v);
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
accSensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);textView_AccName.setText(accSensor.getName());
gyroSensor = sensorManager.getDefaultSensor(Sensor.TYPE_GYROSCOPE);textView_GyrName.setText(gyroSensor.getName());
magSensor = sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD);textView_MagName.setText(magSensor.getName());
stepSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);textView_StepName.setText(stepSensor.getName());
tempSensor = sensorManager.getDefaultSensor(Sensor.TYPE_AMBIENT_TEMPERATURE);textView_TempName.setText(tempSensor.getName());
StringBuffer sb = new StringBuffer();
List<Sensor> sensors = sensorManager.getSensorList(Sensor.TYPE_ALL);
for (Sensor sensor : sensors) {
sb.append(sensor.toString());
sb.append("\n");
Log.i(strAppName, sensor.toString());
if(sensor.getName().contains("LM75A"))
{
tempSensor2 = sensor;textView_TempName2.setText(tempSensor2.getName());
}
}
v.setText(sb.toString());
}
@Override
protected void onPause() {
// TODO Auto-generated method stub
super.onPause();
sensorManager.unregisterListener(this); // 解除监听器注册
}
@Override
protected void onResume() {
// TODO Auto-generated method stub
super.onResume();
Log.e(strAppName, "registerListener start");
sensorManager.registerListener(this, accSensor, SENSOR_DELAY_GAME); //为传感器注册监听器
sensorManager.registerListener(this, gyroSensor, SENSOR_DELAY_GAME); //为传感器注册监听器
sensorManager.registerListener(this, magSensor, SENSOR_DELAY_GAME); //为传感器注册监听器
sensorManager.registerListener(this, stepSensor, SENSOR_DELAY_GAME); //为传感器注册监听器
sensorManager.registerListener(this, tempSensor, SENSOR_DELAY_GAME); //为传感器注册监听器
sensorManager.registerListener(this, tempSensor2, SENSOR_DELAY_GAME); //为传感器注册监听器
Log.e(strAppName, "registerListener end");
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// TODO Auto-generated method stub
}
@Override
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
textView_AccX.setText(String.format("%+.2f", event.values[0]));
textView_AccY.setText(String.format("%+.2f", event.values[1]));
textView_AccZ.setText(String.format("%+.2f", event.values[2]));
}
else if (event.sensor.getType() == Sensor.TYPE_GYROSCOPE) {
textView_GyrX.setText(String.format("%+.2f", event.values[0]));
textView_GyrY.setText(String.format("%+.2f", event.values[1]));
textView_GyrZ.setText(String.format("%+.2f", event.values[2]));
}
else if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
textView_MagX.setText(String.format("%+.2f", event.values[0]));
textView_MagY.setText(String.format("%+.2f", event.values[1]));
textView_MagZ.setText(String.format("%+.2f", event.values[2]));
}
else if (event.sensor.getType() == Sensor.TYPE_STEP_COUNTER) {
textView_StepData.setText(""+event.values[0]);
}
else if (event.sensor.getType() == Sensor.TYPE_AMBIENT_TEMPERATURE) {
if(tempSensor == event.sensor) {
textView_TempData.setText(String.format("%+.2f", event.values[0]));//75ms
}
else {
textView_TempData2.setText(String.format("%+.2f", event.values[0]));
}
}
}
}
2,activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/acc_name"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:textSize="40px" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:layout_marginTop="5dp"
android:text="X:"
android:textSize="50px" />
<TextView
android:id="@+id/acc_x"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:text="111"
android:textSize="50px"
android:textStyle="bold" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:layout_marginTop="5dp"
android:text="Y:"
android:textSize="50px" />
<TextView
android:id="@+id/acc_y"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:text="111"
android:textSize="50px"
android:textStyle="bold"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:layout_marginTop="5dp"
android:text="Z:"
android:textSize="50px" />
<TextView
android:id="@+id/acc_z"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:text="111"
android:textSize="50px"
android:textStyle="bold"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/gyr_name"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:textSize="40px" />
<TextView
android:layout_marginTop="5dp"
android:layout_marginLeft="2dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="50px"
android:text="X:"
/>
<TextView
android:layout_margin="5dp"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:textSize="50px"
android:text="111"
android:id="@+id/gyr_x"
android:textStyle="bold"/>
<TextView
android:layout_marginTop="5dp"
android:layout_marginLeft="2dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="50px"
android:text="Y:"
/>
<TextView
android:layout_margin="5dp"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:textSize="50px"
android:text="111"
android:id="@+id/gyr_y"
android:textStyle="bold"/>
<TextView
android:layout_marginTop="5dp"
android:layout_marginLeft="2dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="50px"
android:text="Z:"
/>
<TextView
android:layout_margin="5dp"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:textSize="50px"
android:text="111"
android:id="@+id/gyr_z"
android:textStyle="bold"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<TextView
android:id="@+id/mag_name"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:textSize="40px" />
<TextView
android:layout_marginTop="5dp"
android:layout_marginLeft="2dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="50px"
android:text="X:"
/>
<TextView
android:layout_margin="5dp"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:textSize="50px"
android:text="111"
android:id="@+id/mag_x"
android:textStyle="bold"/>
<TextView
android:layout_marginTop="5dp"
android:layout_marginLeft="2dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="50px"
android:text="Y:"
/>
<TextView
android:layout_margin="5dp"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:textSize="50px"
android:text="111"
android:id="@+id/mag_y"
android:textStyle="bold"/>
<TextView
android:layout_marginTop="5dp"
android:layout_marginLeft="2dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="50px"
android:text="Z:"
/>
<TextView
android:layout_margin="5dp"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:textSize="50px"
android:text="111"
android:id="@+id/mag_z"
android:textStyle="bold"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:orientation="horizontal">
<TextView
android:id="@+id/step_name"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:textSize="40px" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:layout_marginTop="5dp"
android:text="D:"
android:textSize="50px" />
<TextView
android:id="@+id/step_data"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:text="111"
android:textSize="50px"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:orientation="horizontal">
<TextView
android:id="@+id/temp_name"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:textSize="40px" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:layout_marginTop="5dp"
android:text="T:"
android:textSize="50px" />
<TextView
android:id="@+id/temp_data"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:text="111"
android:textSize="50px"
android:textStyle="bold" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:visibility="gone"
android:orientation="horizontal">
<TextView
android:id="@+id/temp_name2"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:textSize="40px" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="2dp"
android:layout_marginTop="5dp"
android:text="T:"
android:textSize="50px" />
<TextView
android:id="@+id/temp_data2"
android:layout_width="60dp"
android:layout_height="wrap_content"
android:layout_margin="5dp"
android:text="111"
android:textSize="50px"
android:textStyle="bold" />
</LinearLayout>
<TextView
android:layout_margin="10dp"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/v"
android:textSize="24px"
android:text="获取传感器列表显示"
></TextView>
</LinearLayout>
3,测试效果如下图(不相关的传感器先模糊处理了):直接移植只能看到加速度和角速度传感器,计步器及温度传感器需要修改HAL源码,见下篇。
4,数据方向不对处理参考
【android12-linux-5.1】【ST芯片】驱动与HAL移植后数据方向异常__花花的博客-CSDN博客
提示:该HAL于2022年就停止维护了,最新维护源码路径:https://github.com/STMicroelectronics/st-mems-android-linux-sensors-hal 。开始移植的时候完全没头绪,只顾着检测是否能用,没注意维护情况问题,但是该HAL亲测能用。HAL结构及调用分析见下篇。
另,源码包上传资源被拒,提示侵权,需要的可以评论私信我获取。
新人入行,经验分享,如有所误,欢迎指出~文章来源:https://www.toymoban.com/news/detail-700844.html
版权归属:深圳市琪智科技有限公司-花花文章来源地址https://www.toymoban.com/news/detail-700844.html
到了这里,关于【android12-linux-5.1】【ST芯片】【RK3588】【LSM6DSR】HAL移植的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!