本文转载自:http://blog.csdn.net/gabbzang/article/details/12063031

http://blog.csdn.NET/dwyane_zhang/article/details/6775738

没事做整理一下GPS的流程,也算给自己一个交代。

1.硬件抽象层:

高通MSM的硬件层代码在:hardware/qcom/gps/loc_api下,高通的GPS集成在baseband侧,与Modem部分一样,同样是基于share Memory上高通自有的RPC协议实现。所以高通的硬件层分为两部分,一部分实现的是:硬件抽象层的接口实现,另一部分实现的是基于RPC协议封装的具体控制和数据操作,该部分主要是利用高通的RPC代码生成器生成。两个部分是通过一个glue层粘合在一起的。高通MSM的硬件抽象层在其子目录 libloc_api中,主要在loc_eng.cpp中。loc_eng_ioctl.cpp用于承载到glue层的具体控制和回调。而剩余其它几个文件主要是辅助GPS定位的XTRA和Net Initiated的实现。

GpsInterface接口实现如下:

高通的GPS硬件抽象层包含GPS数据的“获取”和“解析”,它们都通过RPC上报。然后再调用loc_eng_init注册的回调,向上层上报。

上报部分的实现是基于loc_eng_process_deferred_action函数的线程中,该线程实现一个等待循环,当GPS有数据解析上报时,RPC部分会回调loc_eng_init初始化时的loc_event_cb,该回调函数会激活线程中的等待循环。线程通过loc_eng_process_loc_event函数处理获取数据,并调用loc_eng_report_xxx(xxx代表position、卫星状态sv等),将数据通过上层注册的回调函数进行上报。这部分代码如下:

高通GPS还实现了XTRA与AGPS,其中AGPS的接口在sLocEngAGpsInterface中实现,内容如下:

loc_eng_agps_set_server函数完成对server的配置。硬件抽象层根据loc_eng_set_position_mode中传入的配置,决定是否启用AGPS。其中启动函数为set_agps_server,该函数最终通过RPC写入GPS。

Android系统之Broadcom GPS 移植

http://blog.csdn.Net/dwyane_zhang/article/details/7458270

1.      内核部分的移植:

内核部分的移植基本上就是对芯片上下电,建立数据结构体,打通GPS通信的串口通道,以及建立文件设备结点供上层调用。所建立的文件结点是针对Power_enable和Reset两个脚。

在板载文件board-msm7x30.c里需要做的任务:

static void msm7x30_init_gps(void)

{

vreg_l2 = vreg_get(NULL, "xo_out");

ret = vreg_set_level(vreg_l2, 2600);

ret = vreg_enable(vreg_l2);

给芯片上电的电压为2.6V。

vreg_l13 = vreg_get(NULL, "wlan");

ret = vreg_set_level(vreg_l13, 1800);

ret = vreg_enable(vreg_l13);

给芯片另外一个脚上电为1.8V。

}

除了以上两个引脚的上电以为,还有另外两个比较重要的引脚gps_poweron和gps_reset初始化的上电时序。如下:

int gps_power_init(void)

{

gps_reset_level(0); //reset off

mdelay(200);

gps_reset_level(1); //reset on

mdelay(200);

gps_standby_level(0); //standby off

return 0;

}

前面是对芯片的上电的完成,下面需要对GPS通道的UART进行配置。由于Uart驱动是比较成熟的驱动,所以只需要把uart3的资源加进驱动里面去就OK了。如下:

struct platform_device *devices[]__initdata = {

&msm_device_uart3;

}

以上板载里的添加就算完成了。

下面是对gps_poweron和gps_reset这两个引脚完成文件结点的驱动,来提供给上层操作:

这部分的驱动在kernel/drivers/gpio/gps-gpio.c文件中。

#include <Linux/sysdev.h>
#include <linux/errno.h>
#include <linux/io.h>
#include <linux/device.h>
#include <mach/gpio.h>
#include <linux/platform_device.h>
#include <linux/gpio_gps.h>
#include <asm/uaccess.h>
#include <mach/hardware.h>
#include <linux/device.h>

static ssize_t gps_standby_show(struct device *dev,
                struct device_attribute *attr, char *buf)
{
        int len = 0;
        struct gps_gpio_platform_data *pdata = dev->platform_data;

len += sprintf(buf + len, "%u\n", pdata->standby_state);
        printk("======== %s len = %d\n",__func__,len);
        return len;
}

static ssize_t gps_standby_store(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t size)
{
        unsigned long state = simple_strtoul(buf, NULL, 10);
        struct gps_gpio_platform_data *pdata = dev->platform_data;

pdata->standby_state = (int)state;
        printk("\n ****** standby_state = %d \n",pdata->standby_state);

if(state)
                pdata->gps_standby_level(1); //standby on
        else
                pdata->gps_standby_level(0); //standby off

return size;
}

static ssize_t gps_reset_show(struct device *dev,
                struct device_attribute *attr, char *buf)
{
        int len = 0;
        struct gps_gpio_platform_data *pdata = dev->platform_data;

len += sprintf(buf + len, "%u\n", pdata->reset_state);
        printk("======== %s len = %d\n",__func__,len);

return len;
}

static ssize_t gps_reset_store(struct device *dev,
                struct device_attribute *attr, const char *buf, size_t size)
{
        unsigned long state = simple_strtoul(buf, NULL, 10);
        struct gps_gpio_platform_data *pdata = dev->platform_data;
        printk("\n ******%s  %s  line = %d \n",__func__,__FILE__,__LINE__);

pdata->reset_state = (int)state;
        printk("\n ****** reset_state = %d \n",pdata->reset_state);

if(state)
                pdata->gps_reset_level(1); //reset on
        else

pdata->gps_reset_level(0); //reset off

return size;
}

static DEVICE_ATTR(GPS_nRST, 0644, gps_reset_show, gps_reset_store);
static DEVICE_ATTR(GPS_PWR_EN, 0644, gps_standby_show, gps_standby_store);

static int gps_gpio_probe(struct platform_device *pdev)
{
    int ret;
    struct gps_gpio_platform_data *pdata = pdev->dev.platform_data;

pdata->standby_state = 0;
    pdata->reset_state = 1;
    pdata->gps_power_init();
    ret = device_create_file(&pdev->dev, &dev_attr_GPS_nRST);
    //    ret = device_create_file(&pdev->dev, &GPS_PWR_EN);
    printk("//////   ret  = %d \n",ret);
    if(ret)
        return ret;
    else
        return device_create_file(&pdev->dev, &dev_attr_GPS_PWR_EN);

}

static int gps_gpio_remove(struct platform_device *pdev)
{
    struct gps_gpio_platform_data *pdata = pdev->dev.platform_data;
    pdata->gps_reset_level(0);
    pdata->gps_standby_level(0);

return 0;
}

struct platform_driver gps_gpio_driver = {
    .probe = gps_gpio_probe,
    .remove = gps_gpio_remove,
    .driver = {
        .name   = "gps_gpio",
        .owner  = THIS_MODULE,
    },
};

static int __init gps_gpio_init(void)
{
    return platform_driver_register(&gps_gpio_driver);
}

static void __exit  gps_gpio_exit(void)
{
    platform_driver_unregister(&gps_gpio_driver);
}

late_initcall(gps_gpio_init);
module_exit(gps_gpio_exit);

MODULE_AUTHOR("zhangmin");
MODULE_LICENSE("GPL v2");

这里怎么实现就不详说了,看到代码了应该很好懂。

这样GPS在内核的工作基本上就完成了。

2.      GPS硬件抽象层的移植

所有的工作在hardware/broadcom/gps/目录中完成。

首先把broadcom的代码拿过来解压,直接把解压后的文件夹放在hardware/broadcom/gps/目录下。

①    创建一个Android.mk 里面的内容如下:

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := libgll.a

LOCAL_MODULE := libgll

LOCAL_MODULE_CLASS := STATIC_LIBRARIES

LOCAL_MODULE_TAGS := user

LOCAL_MODULE_SUFFIX := .a

include $(BUILD_PREBUILT)

include $(CLEAR_VARS)

LOCAL_SRC_FILES := libglnet.a

LOCAL_MODULE := libglnet

LOCAL_MODULE_CLASS := STATIC_LIBRARIES

LOCAL_MODULE_TAGS := user

LOCAL_MODULE_SUFFIX := .a

include $(BUILD_PREBUILT)

②    然后把Android.mk放在目录/prebuilt/android-arm/gps/下。

③ 然后把broadcom提供的libgll.a 和 libglnet.a文件也直接拷在目录/prebuilt/android-arm/gps/下。

④    创建一个buildspec.mk文件,内容如下:

TARGET_ARCH_VARIANT:=armv7-a

SHOW_COMMANDS:=y

CONFIG_HAL_SERIAL_TYPE=UART

CONFIG_HAL_SERIAL_DEV=/dev/ttyS0

CONFIG_HAL_CMD=yes

CONFIG_HAL_CMD_FILE=/cache/glgpsctrl

CONFIG_HAL_LTO=yes

CONFIG_HAL_LTO_DIR=/data/gps/

CONFIG_HAL_LTO_FILE=lto.dat

CONFIG_HAL_NMEA_PIPE=yes

CONFIG_HAL_NMEA_FILE=/cache/gpspipe

CONFIG_HAL_NV=yes

CONFIG_HAL_NV_DIR=/data/gps/

CONFIG_HAL_NV_FILE=gldata.sto

CONFIG_HAL_RRC=no

CONFIG_HAL_GPIO_SYSFS=yes

CONFIG_HAL_CATCH_SIGNALS=yes

CONFIG_HAL_EE_DIR=./gps/

CONFIG_HAL_EE_FILE=cbee.cbee

CONFIG_HAL_LCS_API=yes

#CONFIG_HAL_LOG_ANDROID=yes

CONFIG_HAL_TIME_MONOTONIC=yes

CONFIG_HAL_SUPL=true

ENABLE_TLS=yes

然后把它放在hardware/broadcom/gps/目录下。

⑤    将broadcom提供的glconfig.xml文件放在frameworks/base/data/etc/目录下。

⑥    然后在frameworks/base/data/etc/目录下的Android.mk中添加以下几行:

include $(CLEAR_VARS)

LOCAL_MODULE := glconfig.xml

LOCAL_MODULE_TAGS := user eng

LOCAL_MODULE_CLASS := ETC

# This will install the file in /system/etc

LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)

LOCAL_SRC_FILES := $(LOCAL_MODULE)

include $(BUILD_PREBUILT)

这样硬件抽象层的内容也移植完了。

通过这两部的移植,基本上GPS就可以正常的工作了。

如何检查GPS已经移植可以使用了呢?首先查看编译出来后在/system/bin/下是否生成了glgps这个可执行文件。

然后用命令来测试下:

glgps –c /system/etc/glconfig.xml Periodic

这样把机器放在空旷的地方测试就会在机器的/data/gps/log/目录下生成NEMA数据。

最后再用gpstest.apk来测试确认下是否真的搜到星定到位了。

整个GPS驱动相对来说比较简单,因为厂商基本上已经封装的很好,如果遇到问题可以直接联系FAE一起讨论。

高通MSM8255 GPS 调试分析&&Android系统之Broadcom GPS 移植【转】的更多相关文章

  1. Android系统之Broadcom GPS 移植

    1.      内核部分的移植: 内核部分的移植基本上就是对芯片上下电,建立数据结构体,打通GPS通信的串口通道,以及建立文件设备结点供上层调用.所建立的文件结点是针对Power_enable和Res ...

  2. linux驱动由浅入深系列:高通sensor架构实例分析之三(adsp上报数据详解、校准流程详解)【转】

    本文转载自:https://blog.csdn.net/radianceblau/article/details/76180915 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分 ...

  3. linux驱动由浅入深系列:高通sensor架构实例分析之二(驱动代码结构)【转】

    本文转载自:https://blog.csdn.net/radianceblau/article/details/73498303 本系列导航: linux驱动由浅入深系列:高通sensor架构实例分 ...

  4. 第一章 Android系统的编译和移植实例

    第一章 Android系统的编译和移植实例 这一章节主要介绍了Android系统的编译和移植技术,作为建立在Linux内核的基础上的Android操作系统,它的编译和移植不论在过程还是技术方面都和嵌入 ...

  5. Android : 高通平台Camera调试之SetpropKey/camxoverridesettings.txt

    高通相关网址:Createpoint: https://createpoint.qti.qualcomm.com(可下载文档,Release Note等)Chipcode: https://chipc ...

  6. 高通LCD驱动调试

    本文转载自:http://www.itgo.me/a/x6305658852004979994/lcd%20qcom 来自 :http://blog.csdn.net/dacaozuo/article ...

  7. 高通平台Camera调试(一)【转】

    本文转载自:http://www.voidcn.com/blog/Winva/article/p-6044730.html 4.3. Camera 参考文档: 1) 80-NA157-22_PRESE ...

  8. CVE-2017-11882:Microsoft office 公式编辑器 font name 字段栈溢出通杀漏洞调试分析

    \x01 漏洞简介 在 2017 年 11 月微软的例行系统补丁发布中,修复了一个 Office 远程代码执行漏洞(缓冲区溢出),编号为 CVE-2017-11882,又称为 "噩梦公式&q ...

  9. 高通msm8909耳机调试

    http://blog.csdn.net/mike8825/article/details/69489865?locationnum=3&fps=1 1.DTS相应修改: DTS相关代码:ke ...

随机推荐

  1. 时间迭代和BigDecimal操作

    常规小操作的代码: import java.math.BigDecimal; import java.sql.Timestamp; import java.text.SimpleDateFormat; ...

  2. 【2048小游戏】——原生js爬坑之封装行的移动算法&事件

    引言:2048小游戏的核心玩法是移动行,包括横行和纵行,玩家可以选择4个方向,然后所有行内的数字就会随着行的移动而向特定的方向移动.这个行的移动是一个需要重复调用的算法,所以这里就要将一行的移动算法封 ...

  3. 好工具MyEclise2016 CI下载

    地址:http://pan.baidu.com/s/1gfBw9Ab 安装后,点开crack目录,按步骤走. 下面是我安装成功的画面.

  4. AudioSession/AudioCaptureSession的分析与使用

    这个是AudioSession的结构图: 前一个部分已经介绍了AVFoundation对音频录制.播放的一种方法,以下再介绍第二种: AVCaptureSession 用这个类的长处在什么地方呢? ( ...

  5. 利用 LeakCanary 来检查 Android 内存泄漏

    前言 你被概率性的 OOM 困扰么?有时候,OOM 像幽灵一样,挥之不去,可真想把它揪出来时,又捉之不着.或许,是时候用 LeakCanary 来诊断一下了.它是一个用来检查 Android 下内存泄 ...

  6. apache hadoop 2.4.0 64bit 在windows8.1下直接安装指南(无需虚拟机和cygwin)

    工作须要.要開始搞hadoop了,又是大数据,自己感觉大数据.云.仅仅是ERP.SOAP风潮之后与智能地球一起诞生的概念炒作. 只是Apache是个奇妙的组织.Java假设没有它也不会如今如火中天.言 ...

  7. 缷载vs2015后项目不能加载问题

    当加载项目时出现MSBuildToolsPath is not specified for the ToolsVersion "14.0" defined at "HKE ...

  8. 【Unity 3D】学习笔记三十三:游戏元素——天空盒子

    天空盒子 一般的3D游戏都会有着北京百年一遇的蓝天.让人惊叹不已.事实上天空这个效果没有什么神奇的仅仅需用到天空盒子这个组件即可.能够将天空设想成一个巨大的盒子,这个盒子将整个游戏视图和全部的游戏元素 ...

  9. mysql经常使用查询:group by,左连接,子查询,having where

    前几天去了两个比較牛的互联网公司面试.在sql这块都遇到问题了,哎.可惜呀,先把简单的梳理一下 成绩表 score 1.group by 使用 按某一个维度进行分组 比如: 求每一个同学的总分 SEL ...

  10. win10+vs2017+asp.net MVC5+EF6+mysql 闪退问题,解决方法

    1.安装 mysql-for-visualstudio-2.0.5.msi 2.安装 mysql-connector-net-6.10.7.msi 3.在VS2017 右键选中项目,管理NuGet程序 ...