当前位置: 首页 > news >正文

Android系统之Broadcom GPS 移植

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一起讨论。

转载于:https://www.cnblogs.com/LoongEmbedded/p/5298307.html

相关文章:

  • 寒假汇编语言作业(4)
  • 使用jni接口完成android本地程序的运行--具体的操作
  • java和c的本质--最重要的是启动
  • 脑子放放电
  • 关于ProjectServer定制化项目中心页面
  • c没有main函数/java没有main方法--语言运行的实质之实例
  • 深有体会内存对系统性能的重要性
  • 判断括号的匹配性的一种算法
  • 焦点图下面的索引小圆环
  • java虚拟机的启动实例--eclipse的方式
  • 本地方法中printf如何传给java--java系统级命名管道
  • OUYA游戏开发核心技术剖析大学霸内部资料
  • 解决windows 10 9926 中vmware安装的虚拟机无法桥接上网的问题
  • 字符设备驱动程序
  • html中#include file的使用方法
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • java2019面试题北京
  • java正则表式的使用
  • npx命令介绍
  • Python学习笔记 字符串拼接
  • SpingCloudBus整合RabbitMQ
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Windows Containers 大冒险: 容器网络
  • 爱情 北京女病人
  • 分布式事物理论与实践
  • 警报:线上事故之CountDownLatch的威力
  • 嵌入式文件系统
  • 如何设计一个微型分布式架构?
  • 突破自己的技术思维
  • 网络应用优化——时延与带宽
  • 项目管理碎碎念系列之一:干系人管理
  • 一文看透浏览器架构
  • 赢得Docker挑战最佳实践
  • ​Linux·i2c驱动架构​
  • #ubuntu# #git# repository git config --global --add safe.directory
  • #快捷键# 大学四年我常用的软件快捷键大全,教你成为电脑高手!!
  • #每天一道面试题# 什么是MySQL的回表查询
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (06)金属布线——为半导体注入生命的连接
  • (C语言)fgets与fputs函数详解
  • (C语言)逆序输出字符串
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (第二周)效能测试
  • (二十三)Flask之高频面试点
  • (附源码)ssm高校实验室 毕业设计 800008
  • (七)Java对象在Hibernate持久化层的状态
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (十八)三元表达式和列表解析
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .libPaths()设置包加载目录
  • .mysql secret在哪_MySQL如何使用索引
  • [ C++ ] STL---string类的模拟实现
  • [AIGC] 开源流程引擎哪个好,如何选型?