【问题标题】:Add Custom sensor in AOSP在 AOSP 中添加自定义传感器
【发布时间】:2025-12-09 21:55:02
【问题描述】:

我想在我的 AOSP 源代码中添加 LSM6DS3 传感器驱动程序。我正在使用 SC600T 设备。

  1. 我已经将lsm6ds3 添加到该位置 /SC600T/SC60_SC600_Android9.0.0_kernel4.9_r029/kernel/msm-4.9/drivers/iio/imu/st_lsm6ds3,带有MakefileKconfig 文件。

  2. /../../iio/imu/Kconfig 文件中添加以下行:

    source "drivers/iio/imu/st_lsm6ds3/Kconfig" 
    
  3. 添加到/../../iio/imu/Makefile的下面一行。

    obj-y += st_lsm6ds3/
    
  4. /SC600T/../../iio/imu/st_lsm6ds3/Makefile的内容:

    # SPDX-License-Identifier: GPL-2.0-only
    st_lsm6dsx-y := st_lsm6dsx_core.o st_lsm6dsx_buffer.o \
        st_lsm6dsx_shub.o
    
    obj-$(CONFIG_IIO_ST_LSM6DSX) += st_lsm6dsx.o
    obj-$(CONFIG_IIO_ST_LSM6DSX_I2C) += st_lsm6dsx_i2c.o
    obj-$(CONFIG_IIO_ST_LSM6DSX_SPI) += st_lsm6dsx_spi.o
    obj-$(CONFIG_IIO_ST_LSM6DSX_I3C) += st_lsm6dsx_i3c.o
    
  5. 我还在设备树文件中添加了lsm6ds3节点:

    &i2c_2 {
        status = "ok";
        #address-cells = <0x1>;
        #size-cells = <0x0>;
        lsm6ds3@6b {
            compatible = "st,lsm6ds3";
            reg = <0x6b>;
            interrupt-parent = <&tlmm>;
            interrupt-gpios = <&tlmm 45 0x2008>;
            interrupts = <45 0x02>;
        };
    

我已在 SENSOR_I2C_SCL(引脚号 131)和 SENSOR_I2C_SDA(引脚号 132)上连接了 LSM6DS3 加速度计传感器。

之后,我在目标设备(SC600T)上成功编译了源代码和flash boot和dtbo。

当我尝试使用 adb shell &gt;&gt; /sys/bus/devices/i2C/devices 检查传感器数据时,节点可用并且 lsm6ds3 地址节点是 6b 也是可用的。 但是没有探测到 lsm6ds3 传感器。 enter image description here

enter image description here

然后我将在 msm8953_defconfig 文件中添加以下行。

  1. 在 msm8953_defconfig 文件中添加以下行:
     CONFIG_IIO_ST_LSM6DSX=y 
     CONFIG_IIO_ST_LSM6DSX_I2C=y
     CONFIG_IIO_ST_LSM6DSX_SPI=y
     CONFIG_IIO_ST_LSM6DSX_I3C=y 
    

在我编译源代码时添加此文件后出现以下错误:

[  2% 309/12824] Building kernel...
FAILED: out/target/product/msm8953_64/obj/kernel/msm-4.9/arch/arm64/boot/Image.gz-dtb 
/bin/bash -c "(rm -rf out/target/product/msm8953_64/obj/kernel/msm-4.9/arch/arm64/boot/dts ) && (make -j3 -C kernel/msm-4.9 O=../../out/target/product/msm8953_64/obj/kernel/msm-4.9 DTC_EXT=dtc CONFIG_BUILD_ARM64_DT_OVERLAY=y ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- KCFLAGS=-mno-android ) && (make -j3 -C kernel/msm-4.9 O=../../out/target/product/msm8953_64/obj/kernel/msm-4.9 DTC_EXT=dtc CONFIG_BUILD_ARM64_DT_OVERLAY=y ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- KCFLAGS=-mno-android modules ) && (make -j3 -C kernel/msm-4.9 O=../../out/target/product/msm8953_64/obj/kernel/msm-4.9 INSTALL_MOD_PATH=../../../dlkm INSTALL_MOD_STRIP=1 DTC_EXT=dtc CONFIG_BUILD_ARM64_DT_OVERLAY=y ARCH=arm64 CROSS_COMPILE=aarch64-linux-android- modules_install ) && (mdpath=\`find out/target/product/msm8953_64/dlkm/lib/modules -type f -name modules.dep\`; if [ \"\$mdpath\" != \"\" ];then mpath=\`dirname \$mdpath\`; ko=\`find \$mpath/kernel -type f -name *.ko\`; for i in \$ko; do mv \$i out/target/product/msm8953_64/dlkm/lib/modules/; done; fi ) && (mdpath=\`find out/target/product/msm8953_64/dlkm/lib/modules -type f -name modules.dep\`; if [ \"\$mdpath\" != \"\" ];then mpath=\`dirname \$mdpath\`; rm -rf \$mpath; fi )"
make: Entering directory `/media/ubuntu/Vezo_360/SC600T/SC60_SC600_Android9.0.0_kernel4.9_r029/kernel/msm-4.9'
make[1]: Entering directory `/media/ubuntu/Vezo_360/SC600T/SC60_SC600_Android9.0.0_kernel4.9_r029/out/target/product/msm8953_64/obj/kernel/msm-4.9'
  GEN     ./Makefile
scripts/kconfig/conf  --silentoldconfig Kconfig
make[2]: Leaving directory `/media/ubuntu/Vezo_360/SC600T/SC60_SC600_Android9.0.0_kernel4.9_r029/out/target/product/msm8953_64/obj/kernel/msm-4.9'
make[1]: Entering directory `/media/ubuntu/Vezo_360/SC600T/SC60_SC600_Android9.0.0_kernel4.9_r029/out/target/product/msm8953_64/obj/kernel/msm-4.9'
  CHK     include/config/kernel.release
  GEN     ./Makefile
  CHK     include/generated/uapi/linux/version.h
  CHK     include/generated/utsrelease.h
  Using /media/ubuntu/Vezo_360/SC600T/SC60_SC600_Android9.0.0_kernel4.9_r029/kernel/msm-4.9 as source for kernel
  /media/ubuntu/Vezo_360/SC600T/SC60_SC600_Android9.0.0_kernel4.9_r029/kernel/msm-4.9 is not clean, please run 'make mrproper'
  in the '/media/ubuntu/Vezo_360/SC600T/SC60_SC600_Android9.0.0_kernel4.9_r029/kernel/msm-4.9' directory.
make[2]: *** [prepare3] Error 1
make[2]: *** Waiting for unfinished jobs....
make[2]: Leaving directory `/media/ubuntu/Vezo_360/SC600T/SC60_SC600_Android9.0.0_kernel4.9_r029/out/target/product/msm8953_64/obj/kernel/msm-4.9'
make: *** [sub-make] Error 2
make: Leaving directory `/media/ubuntu/Vezo_360/SC600T/SC60_SC600_Android9.0.0_kernel4.9_r029/kernel/msm-4.9'
[  2% 312/12824] target  C: libdsutils <= vendor/qcom/proprietary/data/dsutils/src/ds_util.c
vendor/qcom/proprietary/data/dsutils/src/ds_util.c:719:7: warning: unused variable 'adb_lvl' [-Wunused-variable]
  int adb_lvl = 0;
      ^
vendor/qcom/proprietary/data/dsutils/src/ds_util.c:2357:5: warning: unused function 'ds_can_exec' [-Wunused-function]
int ds_can_exec
    ^
2 warnings generated.
[  2% 314/12824] target  C++: KmInstallKeybox <= ven...ecuremsm/keymaster_install_toolbox/InstallKeybox.cpp
ninja: build stopped: subcommand failed.
20:36:27 ninja failed with: exit status 1

#### failed to build some targets (42 seconds) ####

在 AOSP 中添加任何自定义传感器,这是否所有步骤都是强制性的? 为什么没有探测到 lsm6ds3 传感器?我需要从硬件方面检查什么吗?

【问题讨论】:

  • 日志中某处的实际错误,我相信这里没有显示(可能是与 DTB 相关的问题,附近有 FAILED 字样)。

标签: linux-kernel android-source sensors android-sensors


【解决方案1】:

移远 SC600 设备上的传感器通过称为 ADSP 的东西,即闭源。在此系统下,传感器通过 vendor/qcom/proprietary/sensors/dsps/reg_defaults/sensor_def_qcomdev.conf 文件进行配置。

有一个可与 ADSP 配合使用的兼容传感器列表。您必须向您的 Quectel 代表询问。否则你必须要求他们集成你想要的传感器,这当然要求太多了,所以认为这是不可能的(除非高通把 ADSP 源代码交给你,我认为这不会发生)。

【讨论】:

  • hii @withg 感谢您的回复。我会和他沟通的。