rk3568 移植 GPS/GNSS 模组

rk3568 移植 GNSS 模组 (SIM68D UM220)

部分LTE模组(EC20 M750) 仅有 GPS ,但场景需求 GNSS 定位功能,此时需要额外增加 GNSS的模组功。单GPS/GNSS 模组总线方式分为 UART、SPI、USB,本文以 SIM68D 模组的UART总线模组为例讲解移植全过程。


文章目录

  • rk3568 移植 GNSS 模组 (SIM68D UM220)
    • 分步走看重点
    • 1 GNSS 加载内核驱动
    • 2 GNSS HAL 移植
      • 2.1 NMEA HAL 驱动移植
      • 2.2 NMEA HAL 验证
    • 3 rk3568 GNSS 平台适配
      • 3.1 开启 GNSS hidl
      • 3.2 rk3568 开启 GPS功能
      • 3.3 GNSS 添加相关系统服务
      • 3.4 GNSS 配置文件
      • 3.4 GNSS 数据通信节点赋权
    • 4 GNSS 适配 seLinux 权限
    • Tips
    • 结语


分步走看重点

a) 加载内核驱动
b) 移植 GNSS HAL驱动库
c) 添加相关系统服务
d) 适配 seLinux 权限

1 GNSS 加载内核驱动

经查阅原理图 GNSS 模组仅有供电使能控制信号,作为上电控制,前级输入为 vcc5v0_sys;通信端口 为 uart4, 内核设备树需做对应调整。

	vcc5v0_sys: vcc5v0-sys {
		vin-supply = <&dc_12v>;
	};
+
+	vcc3v3_gnss: vcc3v3-gnss-regulator {
+		compatible = "regulator-fixed";
+		regulator-min-microvolt = <3300000>;
+		regulator-max-microvolt = <3300000>;
+		enable-active-high;
+		gpio = <&gpio2 RK_PB0 GPIO_ACTIVE_HIGH>;
+		pinctrl-names = "default";
+		pinctrl-0 = <&gps_pwr_en>;
+		regulator-name = "vcc3v3_gnss";
+		regulator-always-on;
+		vin-supply = <&vcc5v0_sys>;
+	};
	vcc_lcd: vcc-lcd {

&uart2 {
	status = "disabled";
};
+
+&uart4 {
+	status = "okay";
+};
&usbdrd_dwc3_0 {

&pinctrl {
+	gps {
+		gps_pwr_en: gps-pwr-en {
+			rockchip,pins =
+				<2 RK_PB0 RK_FUNC_GPIO &pcfg_pull_none>;
+		};
+	};
	wireless-bluetooth {

内核编译完成并刷入内核分区,可以看到 /dev/ttyS4 节点生成;测量 GNSS 模组供电有 3.3v电压,驱动已经完成一半。
查阅模组手册,模组波特率为 115200,手动设置串口节点波特率,可直接读取,此时已基本完成内核驱动。

adb root;adb shell
# 设定端口波特率
stty -F /dev/ttyS4 ispeed 115200 ospeed 115200 cs8
# 查看串口接收的 NMEA 原始数据
cat /dev/ttyS4

2 GNSS HAL 移植

SIM68D 是使用 NMEA 协议标准的GPS协议模组,可以直接查看到明文数据。RK3568 Android11 HAL 没有 NEMA 处理机制,需要下载第三方驱动来来适配模组。本着所查即可用的原则,从 github 中扒来相关 NMEA 驱动。

2.1 NMEA HAL 驱动移植

拉取 NMEA 源码,拷贝到 HAL 指定目录

git clone https://github.com/zxcwhale/android9_gnss_hal_driver
cp -r android9_gnss_hal_driver/gnsshal hardware/rocchip/

增加编译配置,下次编译时可自动生成 gps HAL库

vi device/rockchip/rk356x/rk3568_r/rk3568_r.mk
PRODUCT_PACKAGES += \
-    SoundRecorder
+    SoundRecorder \
+    gps.$(TARGET_BOARD_PLATFORM)

2.2 NMEA HAL 验证

编译生成驱动可单独验证是否正常;先到到系统,重启生效。

adb shell mount -o remount,rw /vendor
adb push out/target/product/rk3568_r/obj/SHARED_LIBRARIES/gps.rk30board_intermediates/gps.rk3568.so  /vendor/lib64/hw/
adb reboot 

3 rk3568 GNSS 平台适配

3.1 开启 GNSS hidl

--- a/manifest.xml
+++ b/manifest.xml
@@ -207,5 +207,14 @@
             <instance>slot1</instance>
         </interface>
     </hal>
+    <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>

3.2 rk3568 开启 GPS功能

--- a/rk3568_r/BoardConfig.mk
+++ b/rk3568_r/BoardConfig.mk
@@ -6,6 +6,7 @@ BOARD_SENSOR_MPU_PAD := false
 BOARD_COMPASS_SENSOR_SUPPORT := true
 BOARD_GYROSCOPE_SENSOR_SUPPORT := true
 CAMERA_SUPPORT_AUTOFOCUS:= false
+BOARD_HAS_GPS := true

3.3 GNSS 添加相关系统服务

 PRODUCT_PACKAGES += \
-    SoundRecorder
+    SoundRecorder \
+    [email protected] \
+    [email protected] \
+    [email protected] \
    gps.$(TARGET_BOARD_HARDWARE)

正确配置后,刷机后在对应目录生成相关库文件。

   /vendor/lib64/[email protected]
   /vendor/lib64/[email protected]
   /vendor/lib64/hw/[email protected]

3.4 GNSS 配置文件

新建 gnss.conf 配置文件,内容如下:

# Configuration file for GNSS HAL driver

# TTY settings
TTY_NAME=/dev/ttyS4 # GNSS 模组通信端口
TTY_BAUD=115200 # GNSS 模组默认波特率

# SUPL settings
SUPL_HOST=supl.qxwz.com
SUPL_PORT=7275

编译文件自动拷贝

PRODUCT_PACKAGE_OVERLAYS += $(LOCAL_PATH)/gnss.conf:$(TARGET_COPY_OUT_VENDOR)/etc/gnss.conf

3.4 GNSS 数据通信节点赋权

经查阅原理图,GNSS 使用 UART4端口收发数据;将生成的 /dev/ttyS4 赋读写权限。

vi device/rockchip/common/ueventd.rockchip.rc
# for GPS
+/dev/ttyS4                0666   gps        gps
/dev/gps                  0660   gps        gps

4 GNSS 适配 seLinux 权限

GNSS 的 seLinux 权限与 GPS 配置方法相同,方法参照rk3568 LTE(seLinux 权限)。

Tips

  1. seLinux 权限可根据内核信息自动生成,方法参照rk3568 LTE(seLinux 权限)。
  2. 如果直接读取数据正常,但是 GNSS 又无法显示星历。
    在室外并增加GPS天线同样无法搜到卫星,强制关闭 seLinux可正常显示星历;可断定为 seLinux 权限引起。
  3. 内核电源申请异常,可根据内核信息确定是否为复用或者 GPIO 被占用引起;如果是这种情况就需要排除复用。

结语

用心做好每件事,节省的不仅仅是精力,还有富裕的学习时间。

你可能感兴趣的:(Android,seLinux,LTE,android)