zoukankan      html  css  js  c++  java
  • 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 ", pdata->standby_state);
            printk("======== %s len = %d ",__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(" ****** standby_state = %d ",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 ", pdata->reset_state);
            printk("======== %s len = %d ",__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(" ******%s  %s  line = %d ",__func__,__FILE__,__LINE__);

            pdata->reset_state = (int)state;
            printk(" ****** reset_state = %d ",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 ",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一起讨论。

  • 相关阅读:
    POJ3094 UVALive3594 HDU2734 ZOJ2812 Quicksum【进制】
    UVALive5583 UVA562 Dividing coins
    POJ1979 HDU1312 Red and Black【DFS】
    POJ1979 HDU1312 Red and Black【DFS】
    POJ2386 Lake Counting【DFS】
    POJ2386 Lake Counting【DFS】
    HDU4394 Digital Square
    HDU4394 Digital Square
    UVA213 UVALive5152 Message Decoding
    UVA213 UVALive5152 Message Decoding
  • 原文地址:https://www.cnblogs.com/LoongEmbedded/p/5298307.html
Copyright © 2011-2022 走看看