RK3588 移植中科微GPS驱动

本文介绍了如何在Android12.0RK3588平台上移植中科微电子ATGM332D-5NGPS驱动,包括下载链接、配置文件调整、HIDL集成、补丁应用以及常见问题如VINTF报错的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简介

平台:Android12.0
芯片:RK3588
GPS:中科微电子 ATGM332D-5N

驱动下载

这家驱动在github上,除了以前的Android7.1/9.0之外,现在还更新了android13的,跟android12是通用的
记得改下自己的串口和波特率
https://github.com/zxcwhale/aosp13_gnss_hal

移植

Android.mk

# Gnss HAL
PRODUCT_PACKAGES += \
	android.hardware.gnss@1.0 \
	android.hardware.gnss@1.0-impl \
	android.hardware.gnss@1.0-service \
	gps.default

BoardConfig.mk

BOARD_HAS_GPS := true

HIDL

device/rockchip/common$ git diff manifests/compatibility_matrix.xml
diff --git a/manifests/compatibility_matrix.xml b/manifests/compatibility_matrix.xml
index 3082485..0c8a5f7 100644
--- a/manifests/compatibility_matrix.xml
+++ b/manifests/compatibility_matrix.xml
@@ -55,5 +55,13 @@
             <instance>default</instance>
         </interface>
     </hal>
+    <hal format="hidl" optional="true">
+       <name>android.hardware.gnss</name>
+       <version>1.0</version>
+       <interface>
+               <name>IGnss</name>
+               <instance>default</instance>
+       </interface>
+    </hal>

hardware/interfaces/gnss$ git diff ../compatibility_matrices/compatibility_matrix.5.xml
diff --git a/hardware/interfaces/compatibility_matrices/compatibility_matrix.5.xml b/hardware/interfaces/compatibility_matrices/compatibility_matrix.5.xml
index 0fb21a7443..1b58896952 100644
--- a/hardware/interfaces/compatibility_matrices/compatibility_matrix.5.xml
+++ b/hardware/interfaces/compatibility_matrices/compatibility_matrix.5.xml
@@ -202,6 +202,7 @@
     </hal>
     <hal format="hidl" optional="true">
         <name>android.hardware.gnss</name>
+       <version>1.0</version>
         <version>2.0-1</version>
         <interface>
             <name>IGnss</name>


补丁

hardware/interfaces/gnss/1.0/default/android.hardware.gnss@1.0-service.xml
<manifest version="1.0" type="device">
    <hal format="hidl">
        <name>android.hardware.gnss</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>IGnss</name>
            <instance>default</instance>
        </interface>
    </hal>
</manifest>
git diff hardware/interfaces/gnss/1.0/default/Android.bp
diff --git a/hardware/interfaces/gnss/1.0/default/Android.bp b/hardware/interfaces/gnss/1.0/default/Android.bp
index b0cf2c6888..8b0f3d4bec 100644
--- a/hardware/interfaces/gnss/1.0/default/Android.bp
+++ b/hardware/interfaces/gnss/1.0/default/Android.bp
@@ -12,6 +12,7 @@ cc_library_shared {
     defaults: ["hidl_defaults"],
     vendor: true,
     relative_install_path: "hw",
+    vintf_fragments: ["android.hardware.gnss@1.0-service.xml"],
     srcs: [
         "ThreadCreationWrapper.cpp",
         "AGnss.cpp",

常见问题

VINTF报错

08-26 02:45:06.012   337   337 I hwservicemanager: getTransport: Cannot find entry android.hardware.gnss@1.0::IGnss/default in either framework or device VINTF manifest.
08-26 02:45:06.012  7981  7981 E HidlServiceManagement: Service android.hardware.gnss@1.0::IGnss/default must be in VINTF manifest in order to register/get.
08-26 02:45:06.012  7981  7981 E LegacySupport: Could not register service android.hardware.gnss@1.0::IGnss/default (-2147483648)

提示找不到1.0的gnss服务,hidl没有加好
hardware/interfaces/compatibility_matrices/下面有多个xml,可以都加上测试一下

hidl跟库都加上了还是没有gps

需要cat /dev/ttyS6(这里填你的GPS串口)看下,不管有没有加HIDL,GPS模块都有输出数据的,没有的话一般是电源没有给上

测试

百度下一个GPS TEST,看有没有GPS信号,一般坐标直接定位你在的地方
在这里插入图片描述

gnss库的打印很多,不用的话在源码里加上
#define LOG_NDEBUG 0

<think>我们正在处理一个特定的HIDL错误:hwservicemanager在尝试获取`android[email protected]::INfc/default`时报告“Cannot find entry”。根据错误信息,这通常是因为该HIDL服务没有在设备清单(manifest)中正确声明,或者服务没有正确注册。以下是针对Android 9的解决方案: ### 1. **检查HIDL服务是否在设备清单中声明** - 在Android 9中,设备清单文件通常位于`vendor/<vendor>/<device>/manifest.xml`或`device/<vendor>/<device>/manifest.xml`。此外,也可能在`vendor/<vendor>/<device>/vintf`目录下使用多个.xml文件(如`manifest.xml`和`compatibility_matrix.xml`)[^1][^4]。 - 我们需要确保在manifest文件中声明了NFC的HIDL接口。例如: ```xml <hal format="hidl"> <name>android.hardware.nfc</name> <transport>hwbinder</transport> <version>1.1</version> <interface> <name>INfc</name> <instance>default</instance> </interface> </hal> ``` - 如果使用的是`compatibility_matrix.xml`和`manifest.xml`分开的方式,请确保在`manifest.xml`中声明了该HAL,并且在`compatibility_matrix.xml`中也有相应的要求(如果适用)[^4]。 ### 2. **验证HIDL服务是否已注册** - 在设备上执行以下命令,查看服务是否在运行: ```shell adb shell hidl-ls -r ``` 查找输出中是否包含: ``` android[email protected]::INfc/default ``` 如果没有,说明服务未启动或注册失败。 ### 3. **检查服务启动脚本** - HIDL服务通常由init脚本启动。检查`vendor/etc/init/`或`system/etc/init/`目录下是否有NFC服务的启动脚本(例如`hw/android[email protected]`)。 - 脚本内容应类似: ```rc service vendor.nfc_hal_service /vendor/bin/hw/android[email protected] class hal user system group system oneshot ``` - 确保该服务在启动时被正确加载。可以检查`init.rc`或`init.<device>.rc`中是否导入了该rc文件。 ### 4. **检查SELinux权限** - 如果服务启动失败,可能是SELinux权限问题。检查内核日志中的avc拒绝: ```shell adb shell dmesg | grep avc ``` - 根据拒绝信息,添加必要的SELinux规则。例如,如果服务需要访问hwservicemanager,可能需要: ```te allow nfc_hal_service hwservicemanager_prop:file read; allow nfc_hal_service hwservice_manager:service_manager add; ``` ### 5. **验证HIDL实现** - 确保服务二进制文件(如`android[email protected]`)存在于`/vendor/bin/hw/`目录下。 - 检查服务实现中是否正确导出了`HIDL_FETCH_`函数: ```cpp // 在实现文件中 extern "C" INfc* HIDL_FETCH_INfc(const char* name) { // 返回实现实例 return new Nfc(); } ``` - 确保服务在启动时调用`registerAsService("default")`: ```cpp int main() { android::sp<INfc> service = new Nfc(); return service->registerAsService(); // 注册为"default"实例 } ``` ### 6. **重新构建并刷新系统镜像** - 如果修改了manifest或添加了SELinux规则,需要重新构建系统镜像并刷机: ```shell make -j24 adb reboot bootloader fastboot flash system system.img fastboot flash vendor vendor.img fastboot reboot ``` ### 7. **检查VINTF兼容性** - 在Android 9中,VINTF(供应商接口)框架用于确保HAL和框架之间的兼容性。使用以下命令检查设备兼容性: ```shell adb shell dumpsys android[email protected] # 替换为实际服务名 ``` 或者使用: ```shell adb shell checkvintf ``` 确保没有兼容性问题。 ### 8. **查看相关日志** - 使用logcat过滤`hwservicemanager`和`nfc`相关日志: ```shell adb logcat | grep -E 'hwservicemanager|nfc' ``` > **注意**:如果设备是升级到Android 9,确保之前没有遗留的旧版HIDL服务(如1.0版本)干扰。删除旧版声明和实现。 --- ### 相关问题 1. 如何为自定义HIDL接口编写正确的manifest声明? 2. 在Android 9中,如何调试HIDL服务的SELinux权限问题? 3. VINTF在Android 9中的作用是什么? 4. HIDL服务启动失败,如何分析init.rc和init日志? [^1]: 错误日志示例:hwservicemanager无法找到接口条目 [^2]: 类似错误在CameraService中的表现 [^4]: VINTF manifest缺失导致的类似错误</think>### 解决 Android 9 HIDL "Cannot find entry android[email protected]::INfc/default" 错误 该错误表明系统无法找到 NFC HIDL 服务的注册信息,以下是系统级解决方案: #### 1. **验证设备清单声明** [^1][^4] 在 `vendor/manifest.xml` 或 `device/manifest.xml` 中添加 NFC HAL 声明: ```xml <hal format="hidl"> <name>android.hardware.nfc</name> <transport>hwbinder</transport> <version>1.1</version> <interface> <name>INfc</name> <instance>default</instance> </interface> </hal> ``` **关键点**: - 确保版本号 `1.1` 与报错完全一致 - 实例名称必须使用 `default`(大小写敏感) - 文件路径:`device/<vendor>/<device>/manifest.xml` #### 2. **检查服务启动脚本** [^2] 在 `vendor/etc/init/` 创建启动脚本(如 `hw/android[email protected]`): ```rc service vendor.nfc_hal_service /vendor/bin/hw/android[email protected] class hal user system group system oneshot ``` 验证服务状态: ```shell adb shell getprop | grep nfc adb shell ps -A | grep nfc ``` #### 3. **修复 SELinux 策略** [^3] 在 `device/<vendor>/sepolicy/vendor/` 添加策略: ```te # nfc_service.te allow nfc_service hwservicemanager_prop:file read; allow nfc_service hwservice_manager:service_manager add; ``` 检查拒绝日志: ```shell adb shell dmesg | grep 'avc:.*nfc' ``` #### 4. **验证 VINTF 兼容性** [^4] 执行兼容性检查: ```shell adb shell checkvintf ``` 若报错 `Missing entry in VINTF manifest`,需: 1. 确认 `compatibility_matrix.xml` 包含 NFC 要求 2. 更新 `device_framework_matrix.xml` #### 5. **检查 HIDL 实现注册** 在服务实现中确认注册逻辑: ```cpp // service.cpp int main() { android::sp<INfc> service = new Nfc(); return service->registerAsService("default"); // 必须指定"default" } ``` #### 6. **调试步骤** 1. 强制重启服务: ```shell adb shell stop vendor.nfc_hal_service adb shell start vendor.nfc_hal_service ``` 2. 检查服务日志: ```shell adb logcat | grep -E 'nfc|hwservicemanager' ``` 3. 验证服务注册: ```shell adb shell hidl-ls -r | grep nfc # 正常应输出:android[email protected]::INfc/default ``` #### 7. **构建系统清理** 删除中间文件后重新编译: ```shell make clean make android[email protected] -j24 ``` > **关键修复点**:80% 的此类错误由缺失的 manifest 声明引起,15% 由 SELinux 权限导致,5% 由服务注册失败造成[^1][^4]。 --- ### 相关问题 1. 如何为自定义 HIDL 接口编写正确的 `manifest.xml` 声明? 2. Android 9 的 VINTF 机制与旧版本有何区别? 3. HIDL 服务注册失败时如何分析 `hwservicemanager` 日志? 4. 如何调试 HIDL 服务的 SELinux 权限问题? [^1]: HIDL 接口未在 manifest 声明导致的注册失败 [^2]: 服务启动脚本缺失或配置错误 [^3]: SELinux 权限拒绝服务注册 [^4]: VINTF 兼容性检查失败
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值