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

Android系统之Broadcom GPS 移植的更多相关文章

  1. 高通MSM8255 GPS 调试分析&&Android系统之Broadcom GPS 移植【转】

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

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

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

  3. Android系统移植与驱动开发

    21世纪,Android发展非常迅速,在市场上占有很大的比例,遥遥领先与iOS,很大程度上是因为任何人都可以利用Android的源代码定制完全属于自己的嵌入式开发系统,而不需要向Google交一分钱. ...

  4. 【树莓派】树莓派刷Android系统

    树莓派3安装Android TV系统图文教程 http://www.mz6.net/news/android/6866.html 树莓派3 Android TV系统怎样安装?树莓派3一个重要用途就是当 ...

  5. 嵌入式linux和嵌入式android系统有什么区别和联系?

    转自:http://bbs.eeworld.com.cn/thread-430437-1-1.html 这个问题很多人问,尤其是初入嵌入式的菜鸟.其实大家都认为android是java,已经不是lin ...

  6. 第一章 Android系统移植与驱动开发概述

    本书第一章首先简单概要地介绍了关于Android系统移植和驱动开发的相关内容. 所谓“移植”是指为特定的自己的设备,如手机定制Android的过程.自己开发一些程序(移植)装载在设备上,使得Andro ...

  7. 浅谈Android系统移植、Linux设备驱动

    一.Android系统架构 第一层:Linux内核 包括驱动程序,管理内存.进程.电源等资源的程序 第二层:C/C++代码库 包括Linux的.so文件以及嵌入到APK程序中的NDK代码 第三层:An ...

  8. 第一章Android系统移植与驱动开发概述--读书笔记

    以前,初步学习过嵌入式Linux驱动开发的基础课程,对于驱动开发可以说是有了一点点微末的基础吧.首先我们要对Android嵌入式系统有一个初步的认识,Android系统发展到今天已经具备了完善的架构. ...

  9. 深入浅出 - Android系统移植与平台开发(三)- 编译并运行Android4.0模拟器

    作者:唐老师,华清远见嵌入式学院讲师. 1.   编译Android模拟器 在Ubuntu下,我们可以在源码里编译出自己的模拟器及SDK等编译工具,当然这个和在windows里下载的看起来没有什么区别 ...

随机推荐

  1. Dynamics CRM2016 时间字段属性中的新增行为

    之前的博客中有特地介绍过CRM中的时间字段以及它在不同的应用场景中涉及的时制转换,而CRM2016又给时间字段添加了新的行为,具体见下属截图,简单介绍下每个图中对应的行为的意思,最后会做demo来具体 ...

  2. 反射 学习笔记之Class类的使用

    1  java世界中万事万物皆对象,除了2个特殊情况 int float等这些基本数据类型,(但是也都有Integer和Float等封装类做了弥补) java staic定义的,它不是属于对象的,而是 ...

  3. 2apt-get命令,deb包安装,源码安装

    1 安装卸载软件 更新源服务器列表 sudovi /etc/apt/sources.list 更新完服务器列表后需要更新下源 sudoapt-get update 更新源 sudoapt-get in ...

  4. 浅谈SSH框架

    在学习或者接触一个新的概念的时候,我们应该在脑海中发挥我们的搜索引擎,牵一发动全身的去想,这个知识跟我之前接触过的有哪些相同或者不同的地方,从这个角度去看那些新的知识和概念,经过旧知识和新知识的对比我 ...

  5. 1.搜索引擎的历史,搜索引擎起步,发展,繁荣,搜索引擎的原理,搜索技术用途,信息检索过程,倒排索引,什么是Lucene,Lucene快速入门

     一: 1  搜索引擎的历史 萌芽:Archie.Gopher Archie:搜索FTP服务器上的文件 Gopher:索引网页 2  起步:Robot(网络机器人)的出现与spider(网络爬虫) ...

  6. UNIX网络编程——通过UNIX域套接字传递描述符和 sendmsg/recvmsg 函数

    在前面我们介绍了UNIX域套接字编程,更重要的一点是UNIX域套接字可以在同一台主机上各进程之间传递文件描述符. 下面先来看两个函数: #include <sys/types.h> #in ...

  7. Android中利用Camera与Matrix实现3D效果详解

    本文行文目录: 一.Camera与Matrix初步认识 二.Camera与Matrix旋转效果拆分介绍 三.Camera与Matrix实现立体3D切换效果 [csdn地址:http://blog.cs ...

  8. Linux 内存管理之highmem简介

    一.Linux内核地址空间 一般来说Linux 内核按照 3:1 的比率来划分虚拟内存(X86等):3 GB 的虚拟内存用于用户空间,1GB 的内存用于内核空间.当然有些体系结构如MIPS使用2:2 ...

  9. Linux内核编译时会遇到的问题--缺少mkimage

    由于各大平台所带的内核不同,所以编译方式也不同,但方法都是大同小异. 但是,编译内核有时候会提示缺少mkimage这个命令,如何解决? 供应商提供内核的同时也会提供其它的一些,比如Uboot,root ...

  10. 新手学python(2):C语言调用完成数据库操作

    继续介绍本人的python学习过程.本节介绍如何利用python调用c代码.内容还是基于音乐信息提取的过程,架构如图一.Python调用c实现的功能是利用python访问c语言完成mysql数据库操作 ...