RK Android7.1 G-sensor 调试
G-sensor,全称为Accelerometer-sensor,是一种加速度传感器
G-sensor能够感知到加速力的变化,加速力就是当物体在加速过程中作用在物体上的力,
比如晃动、跌落、上升、下降等各种移动变化都能被G-sensor转化为电信号
一. OS Android5.1 Kernel 3.10
dts 配置
sensor@18 { compatible = "stk8baxx_acc"; reg = <0x18>; type = <SENSOR_TYPE_ACCEL>; irq-gpio = <&gpio0 GPIO_A1 IRQ_TYPE_EDGE_FALLING>; irq_enable = <0>; poll_delay_ms = <30>; layout = <1>;//4 };
1.1.正常加载
正常的加载 sensor <4>[ 2.978067] sensor_chip_init:stk8baxx_acc:devid=0x0,ops=0xc0e00474 <6>[ 2.998169] input: stk8baxx_attr as /devices/virtual/input/input2 <6>[ 2.998320] input: gsensor as /devices/ff160000.i2c/i2c-4/4-0018/input/input3 <4>[ 2.998441] sensor_misc_device_register:miscdevice: mma8452_daemon <4>[ 2.998449] sensor_probe:initialized ok,sensor name:stk8baxx_acc,type:2,id=27 <4>[ 2.998449] <6>[ 2.998478] sensor_init: Probe name sensors 错误的加载 sensor <4>[ 2.646424] sensor_chip_init:gs_stk8312:devid=0x0,ops=0xc0bf44b0 <4>[ 2.646944] sensor_initial:fail to init sensor <4>[ 2.646952] sensor_chip_init:fail to init sensor <3>[ 2.646960] i2c i2c-4: sensor_probe failed -11 <3>[ 2.646960] <4>[ 2.646975] sensors: probe of 4-003d failed with error -11 <6>[ 2.646994] sensor_init: Probe name sensors <4>[ 2.647010] sensor-dev.c v1.4 add angle calculation support between two gsensors 2013-09-01
1.2.getevent 查看数据读取
getevent -p add device 1: /dev/input/event5 name: "PixArt USB Optical Mouse" events: KEY (0001): 0110 0111 0112 REL (0002): 0000 0001 0008 MSC (0004): 0004 input props: <none> add device 2: /dev/input/event2 name: "stk8baxx_attr" events: input props: <none> add device 3: /dev/input/event3 name: "gsensor" events: ABS (0003): 0000 : value 62496, min -2000000, max 2000000, fuzz 0, flat 0, resolution 0 0001 : value -7812, min -2000000, max 2000000, fuzz 0, flat 0, resolution 0 0002 : value 941346, min -2000000, max 2000000, fuzz 0, flat 0, resolution 0 input props: <none> add device 4: /dev/input/event1 name: "rk29-keypad" events: KEY (0001): 0072 0073 0074 008f input props: <none> add device 5: /dev/input/event4 name: "rockchip_headset.32" events: KEY (0001): 00e2 input props: <none> add device 6: /dev/input/event0 name: "rkxx-remotectl" events: KEY (0001): 0002 0003 0004 0005 0006 0007 0008 0009 000a 000b 001c 0040 0042 0058 0066 0067 0069 006a 006c 0071 0072 0073 0074 008b 008f 0092 009e 00a3 00a5 00ac 00b7 00b9 00ba 00bb 00bc 00d9 00e8 00f8 0175 0183 0184 0190 0191 0192 input props: <none>
1.3.android SensorManager onSensorChanged
https://www.runoob.com/w3cnote/android-tutorial-sensor3.html
二.OS Android7.1.2 Kernel 4.4.143
2.1.driver/input/sensors/accel/目录下增加相应驱动
struct sensor_operate gsensor_mpu6500_ops = { .name = "mpu6500_acc",//与 sensor-dev.c 中定义的名称一致 .type = SENSOR_TYPE_ACCEL,//sensor 类型是 gsensor .id_i2c = ACCEL_ID_MPU6500,//定义在include/linux/sensor-dev.h 中 .read_reg = MPU6500_ACCEL_XOUT_H,//读取 gsensor 数据的起始寄存器地址 .read_len = 6,//需要读取的 gsensor 数据的字节数 .id_reg = MPU6500_WHOAMI,//芯片唯一 ID 寄存器 .id_data = MPU6500_DEVICE_ID,//芯片 ID 值 .precision = MPU6500_PRECISION,//采样 gsensor 数据的adc 位数 .ctrl_reg = MPU6500_PWR_MGMT_2,//用于使能 gsensor 的寄存器地址 .int_status_reg = MPU6500_INT_STATUS,//中断状态寄存器地址 .range = {-32768, 32768},//量程,这里表示上报的量程为+-2G .trig = IRQF_TRIGGER_HIGH |IRQF_ONESHOT,//中断类型 .active = sensor_active,//用于开关 gsensor .init = sensor_init,//用于初始化 gsensor .report = sensor_report_value,//用于上报gsensor数据 };
2.2.Android 中的 sensor 相关宏配置
BoardConfig.mk 中
# Sensors BOARD_SENSOR_ST := true //采用 RK 的 sensors Hal,也就是本文介绍的 BOARD_SENSOR_MPU_PAD := false //仅适用 MPU6500、mpu6050 等芯片 支持哪些类型的 sensor,如果没有,要配置成 false,否则 vts 和 cts 测试会失败: BOARD_GRAVITY_SENSOR_SUPPORT := true BOARD_COMPASS_SENSOR_SUPPORT := false BOARD_GYROSCOPE_SENSOR_SUPPORT := false BOARD_PROXIMITY_SENSOR_SUPPORT := false BOARD_LIGHT_SENSOR_SUPPORT := true BOARD_PRESSURE_SENSOR_SUPPORT := false BOARD_TEMPERATURE_SENSOR_SUPPORT := false
2.3.Rockchip sensors hal
代码路径:hardware/rockchip/sensor/st 支持最新的 SENSORS_DEVICE_API_VERSION_1_3 android sensors hal API 接口 其实现的接口包括: get_sensors_list - 返回所有传感器的列表 activate - 启动或停止传感器 batch - 设置传感器的参数,如采样率和最大报告延迟 setDelay - 仅用于 1.0 版本的 HAL,设置指定传感器的采样率 flush - 刷写指定传感器的 FIFO ,并在完成后报告刷写完成事件 poll - 返回可用的传感器事件
有意思的是 需要
mmm hardware/rockchip/sensor/st/
单独烧制内核getevnt没有出现数据的同学试试这个 还有一件事记得把 无障碍 中的自动旋转屏幕打开
二.G光感测试Demo
package com.gatsby.light; import android.hardware.Sensor; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.os.Bundle; import android.widget.TextView; import androidx.appcompat.app.AppCompatActivity; import java.io.DataOutputStream; public class MainActivity extends AppCompatActivity { private SensorManager sm; private TextView light_tv; private Sensor ligthSensor; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); light_tv = (TextView) findViewById(R.id.light_tv); RootCommand("settings put system screen_brightness_mode 1"); sm = (SensorManager) getSystemService(SENSOR_SERVICE); ligthSensor = sm.getDefaultSensor(Sensor.TYPE_LIGHT); sm.registerListener(listener, ligthSensor, SensorManager.SENSOR_DELAY_NORMAL); } private SensorEventListener listener = new SensorEventListener() { @Override public void onSensorChanged(SensorEvent sensorEvent) { //获取当前光照强度 //Toast.makeText(MainActivity.this,"当前光照强度:" + sensorEvent.values[0] + "勒克斯", Toast.LENGTH_LONG).show(); float lux = sensorEvent.values[0]; showData("光线强度--->" + lux, light_tv); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { } }; private void showData(final String str, TextView tv) { runOnUiThread(new Runnable() { @Override public void run() { tv.append(str + "\n"); } }); } @Override protected void onDestroy() { super.onDestroy(); //传感器使用完毕,释放资源 if (sm != null) { sm.unregisterListener(listener); } } }
那一日我遇到了自己 开始流泪
假若他日相逢 我将何以贺你 以流泪 以沉默
1640859234000