1.添加gps hal层代码包
将ublox gps芯片的hal层代码拷贝至apps/LINUX/android/hardware/ublox/路径下,树状图如下:
2.修改编译选项
将新增的ublox gps hal层代码编译进入image,需要修改apps/LINUX/android/device/qcom/msmnile_gvmgh/路径下的msmnile_gvmgh.mk和manifest.xml两个文件。【注:msmnile_gvmgh是我的项目工程名,即out/target/product/msmnile_gvmgh】
2.1修改msmnile_gvmgh.mk
gps hal层源码ublox/gps/hal/Android.mk中有如下描述:
HIDL_VERSION的值在ublox/gps/version.mk中定义:
搜索PLATFORM_SDK_VERSION可知该值为30,对应版本名为Android11,根据version.mk应该选择HIDL_VERSION值为2.1。
在Android中,通过PRODUCT_PACKAGES宏将指定的模块编译进最终烧写的image中,这里使用相同的方式将ublox gps hal层代码编译并打包至image。在msmnile_gvmgh.mk文件末尾添加一下内容:
#for u-blox GNSS
PRODUCT_PACKAGES += libParser \
libAgnss \
android.hardware.gnss@2.1-service-ubx \
u-blox.conf
2.2 修改manifest.xml
在ublox gps hal层代码包的README文件中有说明,需要修改manifest.xml文件,以说明为模板参考、根据项目实际情况修改即可。
3.移除高通默认的gps功能模块
去掉系统中默认的虚拟的gps功能模块,系统才能加载刚刚编译进系统的真正的gps功能代码。
修改apps/LINUX/android/hardware/qcom/gps/gps_vendor_product.mk文件。
4.添加安全配置文件
在ublox gps hal层代码包的README文件中有说明,说明如下:
u-blox/gps/sepolicy/目录下有多个Android版本的配置文件,我的Android版本为11,选择Android-11即可。
在apps/LINUX/android/device/qcom/sepolicy_vndr/SEpolicy.mk文件中添加一下内容即可:
BOARD_SEPOLICY_DIRS += hardware/u-blox/gps/sepolicy/android-11
5.配置串口
5.1 设备树配置
GPS和SoC之间通过uart进行数据交互,所以需要配置对应串口的设备树文件,如果串口已经配置好了即可以正常使用,则此步骤跳过。
5.2 Qup配置
Qup的全称是qualcomm universal peripherals即高通通用外设,uart就是连接在qup上,我的gps uart连接在QUP13上,所以肯需要在tz_8155/trustzone_images/core/settings/buses/qup_accesscontrol/qupv3/config/855/QUPAC_Access.c文件中修改qupv3_perms_auto[]数组的QUPV3_2_SE3相关配置。
每个数组项有7个元素,分别是PeriphID、ProtocolID、Mode、NsOwner、bAllowFifo、bLoad、bModExcl。
PeriphID - QUP SE ID基于QUP块和块内的SE索引,例如QUPV3_2_SE3表示QUP块2,其SE索引为3;
ProtocolID – 它定义了由QUP固件管理的协议。
Mode – 它定义了QUP固件的默认工作模式。它可以是以下之一:QUPV3_MODE_FIFO = 0,QUPV3_MODE_CPU_DMA = 1, QUPV3_MODE_GSI = 2;
NsOwner - 它定义了负责初始化和运行的QUP SE的所有者;
bAllowFifo - 允许FIFO模式始终设置为TRUE。
bLoad - 加载固件映像总是设置为TRUE。
bModExcl - 模式独占性总是设置为FALSE。
5.3 Ublox gps代码配置
ublox/gps/u-blox.conf文件是ublox gps hal层代码的配置文件,该文件中可以配置HAL层需要打开的串口设备节点以及串口的波特率等设置。