部分LTE模组(EC20 M750) 仅有 GPS ,但场景需求 GNSS 定位功能,此时需要额外增加 GNSS的模组功。单GPS/GNSS 模组总线方式分为 UART、SPI、USB,本文以 SIM68D 模组的UART总线模组为例讲解移植全过程。
a) 加载内核驱动
b) 移植 GNSS HAL驱动库
c) 添加相关系统服务
d) 适配 seLinux 权限
经查阅原理图 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
SIM68D 是使用 NMEA 协议标准的GPS协议模组,可以直接查看到明文数据。RK3568 Android11 HAL 没有 NEMA 处理机制,需要下载第三方驱动来来适配模组。本着所查即可用的原则,从 github 中扒来相关 NMEA 驱动。
拉取 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)
编译生成驱动可单独验证是否正常;先到到系统,重启生效。
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
--- 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>
--- 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
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]
新建 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
经查阅原理图,GNSS 使用 UART4端口收发数据;将生成的 /dev/ttyS4 赋读写权限。
vi device/rockchip/common/ueventd.rockchip.rc
# for GPS
+/dev/ttyS4 0666 gps gps
/dev/gps 0660 gps gps
GNSS 的 seLinux 权限与 GPS 配置方法相同,方法参照rk3568 LTE(seLinux 权限)。
用心做好每件事,节省的不仅仅是精力,还有富裕的学习时间。