RK3566 android12 虚拟GPS定位实现
一. 系统增加gps服务
--- a/hardware/interfaces/compatibility_matrices/compatibility_matrix.6.xml
+++ b/hardware/interfaces/compatibility_matrices/compatibility_matrix.6.xml
@@ -225,6 +225,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>
<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>
BOARD_HAS_GPS := true
ifeq ($(BOARD_HAS_GPS),true)
PRODUCT_COPY_FILES += \
frameworks/native/data/etc/android.hardware.location.gps.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.location.gps.xml
endif
二.移植TD-GNSS-HAL补丁
三.修改TD-GNSS-HAL上报流程
tdgnss.c
nmea_reader_parse,从系统自定义属性中读取经纬度和南北极信息
char propbuf_latitude[PROPERTY_VALUE_MAX];
property_get("persist.gps.latitude", propbuf_latitude, "0");
char propbuf_longitude[PROPERTY_VALUE_MAX];
property_get("persist.gps.longitude", propbuf_longitude, "0");
char propbuf_latitudeHemi[PROPERTY_VALUE_MAX];
property_get("persist.gps.latitudeHemi",propbuf_latitudeHemi, "N");
char propbuf_longitudeHemi[PROPERTY_VALUE_MAX];
property_get("persist.gps.longitudeHemi",propbuf_longitudeHemi, "E");
r->sv_status.num_svs = 6; //卫星数量
r->sv_status_changed = 1; //状态回调
r->sv_status.used_in_fix_mask |= (1 << (r->sv_status.num_svs));
r->fix.accuracy = 8.0; //精度
r->fix.timestamp = 1685782786; //时间戳
r->fix.latitude = strtod(propbuf_latitude,NULL);
r->fix.longitude = strtod(propbuf_longitude,NULL);
r->fix.flags |= GPS_LOCATION_HAS_LAT_LONG;
r->fix.flags |= GPS_LOCATION_HAS_ACCURACY;
D("lat : %f lon : %f ", r->fix.latitude, r->fix.longitude);
实测第三方任意定位软件均可使用