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系统之Broadcom GPS 移植的更多相关文章
- 高通MSM8255 GPS 调试分析&&Android系统之Broadcom GPS 移植【转】
本文转载自:http://blog.csdn.net/gabbzang/article/details/12063031 http://blog.csdn.NET/dwyane_zhang/artic ...
- 第一章 Android系统的编译和移植实例
第一章 Android系统的编译和移植实例 这一章节主要介绍了Android系统的编译和移植技术,作为建立在Linux内核的基础上的Android操作系统,它的编译和移植不论在过程还是技术方面都和嵌入 ...
- Android系统移植与驱动开发
21世纪,Android发展非常迅速,在市场上占有很大的比例,遥遥领先与iOS,很大程度上是因为任何人都可以利用Android的源代码定制完全属于自己的嵌入式开发系统,而不需要向Google交一分钱. ...
- 【树莓派】树莓派刷Android系统
树莓派3安装Android TV系统图文教程 http://www.mz6.net/news/android/6866.html 树莓派3 Android TV系统怎样安装?树莓派3一个重要用途就是当 ...
- 嵌入式linux和嵌入式android系统有什么区别和联系?
转自:http://bbs.eeworld.com.cn/thread-430437-1-1.html 这个问题很多人问,尤其是初入嵌入式的菜鸟.其实大家都认为android是java,已经不是lin ...
- 第一章 Android系统移植与驱动开发概述
本书第一章首先简单概要地介绍了关于Android系统移植和驱动开发的相关内容. 所谓“移植”是指为特定的自己的设备,如手机定制Android的过程.自己开发一些程序(移植)装载在设备上,使得Andro ...
- 浅谈Android系统移植、Linux设备驱动
一.Android系统架构 第一层:Linux内核 包括驱动程序,管理内存.进程.电源等资源的程序 第二层:C/C++代码库 包括Linux的.so文件以及嵌入到APK程序中的NDK代码 第三层:An ...
- 第一章Android系统移植与驱动开发概述--读书笔记
以前,初步学习过嵌入式Linux驱动开发的基础课程,对于驱动开发可以说是有了一点点微末的基础吧.首先我们要对Android嵌入式系统有一个初步的认识,Android系统发展到今天已经具备了完善的架构. ...
- 深入浅出 - Android系统移植与平台开发(三)- 编译并运行Android4.0模拟器
作者:唐老师,华清远见嵌入式学院讲师. 1. 编译Android模拟器 在Ubuntu下,我们可以在源码里编译出自己的模拟器及SDK等编译工具,当然这个和在windows里下载的看起来没有什么区别 ...
随机推荐
- Android下DrawerLayout的使用
Android下DrawerLayout的使用 DrawerLayout见名知意,就是一个具有抽屉效果的布局,看看这个效果图,是不是感觉很炫酷 这么炫的效果其实不一定非要用类似一些SlidingMen ...
- 非阻塞IO服务器模型
我们来考虑一个情形,你跟千千万万个玩家是魔兽世界的超级粉丝,每周末准时组团打boss.每当周末游戏服务器就亚历山大,因为起码几十万用户同时在线.如果用我们的多线程阻塞服务器作为游戏服务器是否可行呢?先 ...
- android布局Relative和gridLayout-android学习之旅(十六)
Relative布局简介 相对布局的组件是由兄弟组件和父组价决定的,因此这种布局被称为相对布局. 属性设置介绍 RelativeLayout.Layoutparam中只能设置为true和false的属 ...
- 【一天一道LeetCode】#235. Lowest Common Ancestor of a Binary Search Tree
一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Given a ...
- UNIX网络编程——fcntl函数
fcntl函数提供了与网络编程相关的如下特性: 非阻塞式I/O. 通过使用F_SETFL命令设置O_NONBLOCK文件状态标志,我们可以把一个套接字设置为非阻塞型. 信号驱动式I/O. 通过使用F ...
- 存储那些事儿(五):BTRFS文件系统之Btree结构详解
Btree数据结构可以说是BTRFS文件系统的基础.它提供了一个通用的方式去存储不同的数据类型.它仅仅存储3个数据类型:key, item和block header. btrfs_header的定义如 ...
- 存储那些事儿(三):OpenStack的块存储Cinder与商业存储的融合
OpenStack是一个美国国家航空航天局和Rackspace合作研发的云端运算软件,以Apache许可证授权,并且是一个自由软件和开放源代码项目.OpenStack是IaaS(基础设施即服务)软 ...
- bootmgr解压缩
主要参考以下两个文章: 1. http://bbs.wuyou.com/forum.php?mod=viewthread&tid=211314 2. http://reboot.pro/f ...
- React 之props属性
React 里有一个非常常用的模式就是对组件做一层抽象.组件对外公开一个简单的属性(Props)来实现功能,但内部细节可能有非常复杂的实现. 可以使用 JSX 展开属性 来合并现有的 props 和其 ...
- MFC的两个问题
1.启动WinApp的时候,报 ASSERT(AfxGetThread() == NULL)错误依赖的MFC DLL工程设置里面加上_USRDLL2. MFC误报内存泄露全局对象释放的问题,添加mfc ...