一、背景介绍

GNSS是位置子系统中通过卫星来获取位置数据的方式之一。

二、适配方法

1.理清ohos获取卫星位置数据的流程

 

整个黑框中的接口均在vendorGnssAdapter.so中实现

2.理清流程涉及的函数接口

适配层接口 
get_gnss_module_iface获取不同功能模块的结构体入口指针
get_gnss_interface返回GnssVendorInterface的结构体入口指针
get_agnss_interface返回AGnssModuleInterface的结构体入口指针

 

调用GNSS原生驱动接口 
gnss_enable加载芯片原厂的驱动SO,获取四个函数地址,并且执行gnssmgt_init
gnss_disable释放芯片原厂的驱动SO
gnss_start启用位置上报功能
gnss_stop停用位置上报功能

 

GNSS原生驱动回调接口 
location_callback将GNSS原生驱动转换成OHOS的数据结构,并且调用HDI的locationUpdate上报信息
nmea_callback将GNSS原生驱动转换成OHOS的数据结构,并且调用HDI的nmeaUpdate上报信息
status_callback将GNSS原生驱动转换成OHOS的数据结构,并且调用HDI的statusUpdate上报信息
sv_status_callback将GNSS原生驱动转换成OHOS的数据结构,并且调用HDI的svStatusUpdate上报信息
create_thread_callback实现创建进程

3.适配框架说明

ohos中GNSS的hdi接口与GNSS原生驱动接口在逻辑上一一对应,但具体的参数及流程有些许差异需要进行转换.

HDI的四个接口函数EnableGnss,DisableGnss,StartGnss,StopGnss GNSS原生驱动的四个接口函数gnss_enable,gnss_disable,gnss_start,gnss_stop 将GNSS原生驱动四个函数的参数转换成对应HDI的参数,并调用对应HDI的函数

4.适配前提条件

GNSS的linux或安卓的原生驱动可用

调试原生gnss驱动是否正常 切换当前用户为location_host 修改/etc/passwd,将

location_host❌1022:1022:::/bin/false 修改成 location_host❌1022:1022:::/bin/sh

使用su location_host切换成用户locaion_host,通过location_host用户加载GNSS驱动。 由于GNSS驱动为so文件,此处需要写一个可执行文件来加载gnss的驱动so,以下部分代码可作为参考

pGnssmgt_init gps_init;
pGnssmgt_start gps_start;
pGnssmgt_stop gps_stop;
pGnssmgt_cleanup gps_cleanup;
​
int gnss_enable();
​
int main()
{
    gnss_enable();
    printf("ok\n");
    return 0;
}
​
int gnss_enable()
{
    void* handle;
    handle=dlopen(GNSSMGT,RTLD_LAZY);
    if(handle==NULL)
    {
        printf("%s load failed\n",GNSSMGT);
        printf("dlopen fail. %s\n",dlerror());
}else{
    printf("%s load success\n",GNSSMGT);
}
​
if(handle==NULL)//||handle1==NULL)
{
    return -1;
}
​
gps_init=(pGnssmgt_init)dlsym(handle,"gnssmgt_init");
if(gps_init==NULL)
{
    printf("init is null\n");
    return 0;
}
​
gps_init(&sGpsCallbacks);
​
gps_start=(pGnssmgt_start)dlsym(handle,"gnssmgt_start");
if(gps_start==NULL)
{
    printf("start is null\n");
    return 0;
}
​
sleep(2);
gps_start();
​
gps_stop=(pGnssmgt_stop)dlsym(handle,"gnssmgt_stop");
if(gps_stop==NULL)
{
    printf("init is null\n");
    return 0;
}
​
//dlclose(handle);
while(1)
{
    sleep(1);
}
    return 0;
}
​

gnss驱动在运行过程中可能涉及到读写配置文件以及设备文件或者系统状态,需要将对应的文件修改所有者为location_host,每次开机启动时都会自动修改文件权限

打开/vendor/etc/init.产品名称.cfg "name":"boot", "cmds":[ ..........................,//添加如下字段,名称根据实际文件名称修改 chown location_host location_host /dev/gnss0, chmod 660 /dev/gnss0, chwon location_host location_host ..., chmod 660 ....

]

 

5.编译

1.将源码文件vendorGnssAdapter.cpp,vendorGnssAdapter.h

放在device/board/公司名称/${device_name}/gnss目录下

2.修改ohos.build,添加依赖的so模块及源码模块

 {
    "subsystem": "子系统名称",
    "parts": {
        "组件名称": {
            "module_list": [
.....
                "//device/board/公司名称/${device_name}/gnss:vendorGnssAdapter",
.....
            ]
​
        }
    }
}

3.编写BUILD.gn,配置依赖模块的具体路径,源码

import("//build/ohos.gni")
import("//vendor/$product_company/$product_name/product.gni")
​
ohos_shared_library("vendorGnssAdapter") {
  output_name = "vendorGnssAdapter"
  cflags = [ 
    "-w", 
    "-g", 
    "-O", 
    "-fPIC",
  ] 
​
  defines += [ 
  "__USER__"
  ]
​
  include_dirs = [
  "//drivers/peripheral/location/gnss/hdi_service",
  "//base/location/interfaces/inner_api/include",
  ]
​
  sources = [
    "vendorGnssAdapter.cpp",
  ]
  deps = [
  ]
​
  external_deps = [
    "hiviewdfx_hilog_native:libhilog",
  ]
  install_images = [ chipset_base_dir ]
  part_name = "组件名称" 
  subsystem_name = "子系统名称" 
  install_enable = true
  output_prefix_override = true
  output_extension = "so"
}
​

 

三、下载

1.下载方法:

将系统pac包使用烧录软加载后点击 开始按钮 ,短接单板烧录按钮接入typec到电脑即可自动 下载系统镜像

四、知识分享

1.gnss的服务进程为location_host,所有者为location_host 2.配置文件及设备节点的读写执行权限,所有者及所有组权限需要在启动时设置好

 

 

 

 

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐