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一起討論。
相關文章
- Android系統移植與驅動開發Android
- 和菜鳥一起學android4.0.3原始碼之硬體gps簡單移植Android原始碼
- 系統移植存放位置
- android開發之GPS定位詳解Android
- GPS對時裝置(GPS對時系統)LINUX系統下配置NTP方法Linux
- qt-5.6.0 移植之qt檔案系統的建立QT
- OpenHarmony移植案例與原理:startup子系統之syspara_lite系統屬性部件
- 部署GPS分散式檔案系統分散式
- GPS車輛定位系統功能概述
- Android的GPS定位Android
- 系統移植——uboot常用命令boot
- 鴻蒙系統freeModbusTcp移植簡介鴻蒙TCP
- Simpleperf分析之Android系統篇Android
- 開啟android的gpsAndroid
- STM32FATFS檔案系統移植
- LKCOS:基於程式移植的COS系統
- Android 之 MIT積木搭建系統AndroidMIT
- android GPS 獲取城市資訊Android
- 【移植Linux 3.4.2核心之四】修改核心程式碼支援YAFFS檔案系統Linux
- AIX 使用migratepv移植lv,系統做mirrorAI
- 日報 | 美軍研發無需GPS的定位系統
- Android系統修改之Notification佈局修改Android
- Android系統之Binder通訊機制Android
- Android 儲存系統之原始碼篇Android原始碼
- Android 儲存系統之架構篇Android架構
- 醫院GPS時鐘系統(子母鐘系統)構成與行業應用行業
- android gps機制分析--之二Android
- 未來蘋果裝置將移植 Linux 系統蘋果Linux
- uboot和系統移植擴充套件--主Makefile分析boot套件
- 使用migratepv移植系統及映象一例
- 如何移植32位程式到64位系統薦
- 米爾瑞米派Remi Pi Ubuntu系統移植指南REMUbuntu
- Android系統原始碼分析之-ContentProviderAndroid原始碼IDE
- android之Notification監聽系統清除通知欄Android
- 嵌入式Linux系統libmosquitto移植概述LinuxIBMUI
- 把Iptables移植到嵌入式Linux系統(轉)Linux
- android典型程式碼系列(十六)------GPS定位Android
- ANDROID音訊系統散記之四:4.0音訊系統HAL初探Android音訊