MTK方案 Android9.0 调试传感器流程

本文是参考以下大神文档后根据自己调试的方案整理一下,想要详细了解sensor工作流程的可以点击以下链接:

参考链接

https://blog.csdn.net/goodnight1994/article/details/97503586

 

从大神的文章可以了解到,sensor流程是从APP --> framework --> hal

1、从framework层的Java调用Jni接口时,执行如下代码,代码路径:frameworks/base/services/java/com/android/server/SystemServer.java

    private void startBootstrapServices() {
        Slog.i(TAG, "Reading configuration...");
...skip...
        // The sensor service needs access to package manager service, app ops
        // service, and permissions service, therefore we start it after them.
        // Start sensor service in a separate thread. Completion should be checked
        // before using it.
        mSensorServiceStart = SystemServerInitThreadPool.get().submit(() -> {
            TimingsTraceLog traceLog = new TimingsTraceLog(
                    SYSTEM_SERVER_TIMING_ASYNC_TAG, Trace.TRACE_TAG_SYSTEM_SERVER);
            traceLog.traceBegin(START_SENSOR_SERVICE);
            startSensorService();
            traceLog.traceEnd();
        }, START_SENSOR_SERVICE);
    }

2、startSensorService();为本地接口,代码路径:frameworks/base/services/core/jni/com_android_server_SystemServer.cpp

static void android_server_SystemServer_startSensorService(JNIEnv* /* env */, jobject /* clazz */) {
    char propBuf[PROPERTY_VALUE_MAX];
    property_get("system_init.startsensorservice", propBuf, "1");
    if (strcmp(propBuf, "1") == 0) {
        SensorService::instantiate();
    }

}

由上面可知,system_init.startsensorservice这个属性为1时才会调用SensorService::instantiate()函数创建的sensorservice实例,搜索了整份代码也没有设置system_init.startsensorservice这个属性的值,我直接把它写到buildinfo.sh,编译代码时直接写入build.prop,如下:

diff --git a/build/make/tools/buildinfo.sh b/build/make/tools/buildinfo.sh
index 6c5dba979c..c645132993 100755
--- a/build/make/tools/buildinfo.sh
+++ b/build/make/tools/buildinfo.sh
@@ -27,6 +27,7 @@ fi
 if [ -n "$AB_OTA_UPDATER" ] ; then
   echo "ro.build.ab_update=$AB_OTA_UPDATER"
 fi
+echo "system_init.startsensorservice=1"

3、拷贝sensors.default.so到板卡的vendor/lib/hw/路径,权限直接赋644

console:/ # chmod 644 vendor/lib/hw/sensors.default.so                         
console:/ # ls -l vendor/lib/hw/sensors.default.so
-rw-r--r-- 1 root root 100580 2020-11-07 10:50 vendor/lib/hw/sensors.default.so
console:/ #

 

运行软件后有如下提示:

 

可以正常创建sensorservice实例,不过找不到Sensors接口:android.hardware.sensors@1.0::ISensors/default,这个接口是在manifest.xml中定义的,但是在板卡的vendor/manifest.xml中找不到对应的接口,需要在代码中定义,如下:

diff --git a/device/mediatek/m5621/manifest.xml b/device/mediatek/m5621/manifest.xml
index d986412116..e3c482deed 100755
--- a/device/mediatek/m5621/manifest.xml
+++ b/device/mediatek/m5621/manifest.xml
@@ -439,6 +439,15 @@
             <instance>default</instance>
         </interface>
     </hal>
+    <hal format="hidl">
+        <name>android.hardware.sensors</name>
+        <transport>hwbinder</transport>
+        <version>1.0</version>
+        <interface>
+            <name>ISensors</name>
+            <instance>default</instance>
+        </interface>
+    </hal>
     <sepolicy>
         <version>26.0</version>

经过一番检查后,发现MTK方案的sensor流程有很多缺陷,system_init.startsensorservice属性没有设置、ISensors接口没有定义、sensors依赖库及服务也没有预置,te权限也不够完善(蓝牙空鼠是通过/dev/uhid传输数据的)

diff --git a/device/mediatek/m5621/device_fusion.mk b/device/mediatek/m5621/device_fusion.mk
index c82cc61e48..fc5b502c6b 100755
--- a/device/mediatek/m5621/device_fusion.mk
+++ b/device/mediatek/m5621/device_fusion.mk
@@ -568,3 +568,15 @@ PRODUCT_SOONG_NAMESPACES += vendor/mediatek/proprietary_tv/open/custom/$(BRAND)/
 # Add for Smoke Test
 PRODUCT_PROPERTY_OVERRIDES += \
     ro.com.google.clientidbase=android-m5621-tv
+
+# Sensors HAL
+PRODUCT_PACKAGES += \
+    android.hardware.sensors@1.0-impl \
+    android.hardware.sensors@1.0-service \
+    android.hardware.sensors@1.0-service.rc
+
+PRODUCT_COPY_FILES += \
+    device/mediatek/m5621/sensor/sensors.default.so:vendor/lib/hw/sensors.default.so
diff --git a/device/mediatek/m5621/sensor/sensors.default.so b/device/mediatek/m5621/sensor/sensors.default.so
new file mode 100755
index 0000000000..f852793575
Binary files /dev/null and b/device/mediatek/m5621/sensor/sensors.default.so differ
diff --git a/system/core/rootdir/ueventd.rc b/system/core/rootdir/ueventd.rc
index 38f3d6b9b8..76d4e8f053 100755
--- a/system/core/rootdir/ueventd.rc
+++ b/system/core/rootdir/ueventd.rc
@@ -69,7 +69,7 @@ subsystem sound
 /dev/diag                 0660   radio      radio
 /dev/diag_arm9            0660   radio      radio
 /dev/ttyMSM0              0600   bluetooth  bluetooth
-/dev/uhid                 0660   uhid       uhid
+/dev/uhid                 0777   system     uhid
 /dev/uinput               0660   system     bluetooth
 /dev/alarm                0664   system     radio
 /dev/rtc0                 0640   system     system
diff --git a/system/sepolicy/vendor/hal_sensors_default.te b/system/sepolicy/vendor/hal_sensors_default.te
old mode 100644
new mode 100755
index 1bde858cd0..2a81acd8ec
--- a/system/sepolicy/vendor/hal_sensors_default.te
+++ b/system/sepolicy/vendor/hal_sensors_default.te
@@ -14,3 +14,6 @@ allow hal_sensors_default ion_device:chr_file r_file_perms;
 # allow sensor hal to use lock for keeping system awake for wake up
 # events delivery.
 wakelock_use(hal_sensors_default);
+
+allow hal_sensors_default sysfs:dir { read open };
+allow hal_sensors_default uhid_device:chr_file { read write open };
+allow hal_sensors_default bluetooth_device:chr_file { read write open ioctl };
diff --git a/vendor/toptech/sepolicy/device.te b/vendor/toptech/sepolicy/device.te
index 36e2c8e2ab..d4242a8505 100755
--- a/vendor/toptech/sepolicy/device.te
+++ b/vendor/toptech/sepolicy/device.te
@@ -1,3 +1,5 @@

 type topupgrade_block_device, dev_type;
 type rtk_bt_device, dev_type;
+
+type hidraw_audio_device, dev_type;
diff --git a/vendor/toptech/sepolicy/file_contexts b/vendor/toptech/sepolicy/file_contexts
index 4759ddd543..f70074c9b6 100755
--- a/vendor/toptech/sepolicy/file_contexts
+++ b/vendor/toptech/sepolicy/file_contexts
@@ -11,4 +11,5 @@
 /dev/rtkbt_dev                                              u:object_r:rtk_bt_device:s0
 # /data
 /data/vendor/bluetooth(/.*)?                                u:object_r:bluetooth_vendor_data_file:s0
+/dev/hidraw[0-9]*                                           u:object_r:hidraw_audio_device:s0

注意:修改system/core/rootdir/ueventd.rc文件时需要注意一下,MTKrelease code时这个文件有点问题,里面的/*直接把后面的代码屏蔽了,导致后面的权限没有作用

diff --git a/system/core/rootdir/ueventd.rc b/system/core/rootdir/ueventd.rc
old mode 100644
new mode 100755
index b03d83bf1b..38f3d6b9b8
--- a/system/core/rootdir/ueventd.rc
+++ b/system/core/rootdir/ueventd.rc
@@ -63,7 +63,7 @@ subsystem sound
 /dev/kgsl                 0666   root       root

 # kms driver for drm based gpu
-/dev/dri/*                0666   root       graphics
+/dev/dri*                0666   root       graphics

 # these should not be world writable
 /dev/diag                 0660   radio      radio
@@ -74,20 +74,20 @@ subsystem sound
 /dev/alarm                0664   system     radio
 /dev/rtc0                 0640   system     system
 /dev/tty0                 0660   root       system
-/dev/graphics/*           0660   root       graphics
+/dev/graphics*           0660   root       graphics
 /dev/msm_hw3dm            0660   system     graphics
-/dev/input/*              0660   root       input
+/dev/input*              0660   root       input

编译完软件,蓝牙空鼠功能运行结果如下:

console:/ # logcat -G 20M;logcat | grep -E "Sensor|sensor"
11-11 07:33:23.302  2633  2651 I sensor_apps: 11-11 07:33:23.301 Nano_DevsEvent(329): list { 'add', 'hidraw0' }
11-11 07:33:23.303  2633  2648 I sensor_apps: 11-11 07:33:23.303 Nano_HidrawOpen(1082): Raw Name: TV RC
11-11 07:33:23.303  2633  2648 I sensor_apps: 11-11 07:33:23.303 Nano_HidrawOpen(1083): Raw Phys: 
11-11 07:33:23.303  2633  2648 I sensor_apps: 11-11 07:33:23.303 Nano_HidrawOpen(1084): Report Descriptor Size: 145
11-11 07:33:23.303  2633  2648 I sensor_apps: 11-11 07:33:23.303 Nano_HidrawOpen(1085): Report Descriptor:
11-11 07:33:23.307  2633  2648 I sensor_apps: 11-11 07:33:23.307 Nano_HidrawOpen(1091): 05 01 09 06 a1 01 85 01 05 07 19 e0 29 e7 15 00 25 01 75 01 95 08 81 02 75 08 95 01 81 01 05 08 19 01 29 05 75 01 95 05 91 02 75 03 95 01 91 03 05 07 19 00 29 ff 15 00 25 ff 75 08 95 06 81 00 c0 06 00 ff 09 01 a1 01 a1 02 85 5d 09 00 15 00 26 ff 00 75 08 95 14 81 22 c0 a1 02 85 5b 09 02 15 00 26 ff 
11-11 07:33:23.307  2633  2648 I sensor_apps: 11-11 07:33:23.307 Nano_HidrawOpen(1092): Raw Info:
11-11 07:33:23.307  2633  2648 I sensor_apps: 11-11 07:33:23.307 Nano_HidrawOpen(1093): bustype: 5
11-11 07:33:23.307  2633  2648 I sensor_apps: 11-11 07:33:23.307 Nano_HidrawOpen(1094): vendor: 0x0417
11-11 07:33:23.307  2633  2648 I sensor_apps: 11-11 07:33:23.307 Nano_HidrawOpen(1095): product: 0x0001
11-11 07:33:23.311  2633  4788 I sensor_apps: 11-11 07:33:23.311 uhid_create(124): Open uhid-cdev
11-11 07:33:23.311  2633  4788 I sensor_apps: 11-11 07:33:23.311 uhid_create(133): Create uhid device success
11-11 07:33:23.311  2633  2648 I sensor_apps: 11-11 07:33:23.311 Nano_CursorOpen(290): Create cursor thread
11-11 07:33:23.311  2633  2648 I sensor_apps: 11-11 07:33:23.311 Nano_HidrawActive(1177): [RC0] Active 12
11-11 07:33:23.312  2633  4788 I sensor_apps: 11-11 07:33:23.312 Nano_CursorProcess(85): Cursor: WnAirmiceInit...
11-11 07:33:23.353  2633  2651 I sensor_apps: 11-11 07:33:23.353 Nano_DevsEvent(329): list { 'add', 'hidraw1' }
11-11 07:33:23.354  2633  2648 I sensor_apps: 11-11 07:33:23.354 Nano_EventHandle(240): [1]Device Unkown
11-11 07:33:28.954  2633  4785 I sensor_apps: 11-11 07:33:28.954 Nano_Hidraw_BleDataProc(799): call WnAirmiceRecover,periord:20
11-11 07:33:28.954  2633  4785 I sensor_apps: 11-11 07:33:28.954 Nano_Hidraw_BleDataProc(805): [RC0] -> {START}FrameSend=0 FrameRecv=0 FrameLost=0
11-11 07:33:29.141  2633  4785 I sensor_apps: 11-11 07:33:29.141 Nano_CursorRead(216): typeFlag:[0] -> [aa],call WnAirmiceRecover,periord:20
11-11 07:33:32.079  2633  4785 I sensor_apps: 11-11 07:33:32.079 Nano_CursorRead(233): Btn state : (0)->(1)
11-11 07:33:32.291  2633  4785 I sensor_apps: 11-11 07:33:32.291 Nano_CursorRead(233): Btn state : (1)->(0)


11-11 07:33:39.654  2633  4785 I sensor_apps: 11-11 07:33:39.654 Nano_Hidraw_BleDataProc(813): [RC0] -> {STOP}FrameSend=0 FrameRecv=0 FrameLost=0

 

 

 

 

 

 

 

 

 

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
MTK是指联发科技(MediaTek)公司所生产的芯片,Android USB电容屏调试是指在MTK芯片上运行的Android系统中对USB电容屏进行调试。USB电容屏是一种电容触摸屏技术,用于实现用户与设备的交互。 MTK Android USB电容屏调试主要包括以下步骤: 1. 连接设备:将MTK芯片上运行的Android设备通过USB线连接到电脑上。 2. 安装驱动:首先需要安装MTK芯片的USB驱动程序,确保电脑可以正确识别设备。 3. 启用USB调试模式:在Android设备的设置中,找到“开发者选项”,并启用USB调试模式。这样可以通过USB线连接设备到电脑后,使得电脑可以与设备进行通信。 4. 打开调试工具:打开MTK Android USB电容屏调试的软件工具,该工具可以用于对USB电容屏进行调试。具体的调试过程和功能因工具而异,可以根据实际情况进行相应的操作。 5. 进行调试:使用MTK Android USB电容屏调试工具,可以对USB电容屏的触摸灵敏度、校准、手势识别等功能进行测试和调整。通过工具提供的接口,可以实时查看触摸点的坐标、压力和速度等信息,以便进行调试。 6. 保存调试结果:在调试完成后,可以将调试结果保存到电脑或设备上,以备后续使用。 总结:MTK Android USB电容屏调试是一项对MTK芯片上运行的Android设备中的USB电容屏进行测试、调整和优化的过程。通过使用相关的调试工具,可以实现对触摸屏的各项功能进行测试和调整,以确保设备在用户操作时的体验和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zoipuus

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值