gps

 

Android  GPS 架构代码导读

  我们不需要关心Java层的代码,只需要关心HAL层和GPS业务管理实现代码,驱动层的代码。

 

JNI 层: android_location_GpsLocationProvider.cpp

 

所有提供给Java层的接口文件都定义在gps.h文件中

libhardware_legacy/include/hardware_legacy/gps.h

上层通过调用gps_get_interface—〉gps_find_hardware—〉gps_get_hardware_interface—〉

获取到博通定义的gps接口_GpsInterface,该接口提供和设置了所有的接口函数。

libhardware_legacy/gps/gps.cpp

broadcom\gps\allpartners\deliverables\middleware_connectors\unix\android\gps_jni\Gps_lcsapi.c(gps 所有接口实现函数)

glgps的程序的入口:

   hardware\broadcom\gps\allpartners\deliverables\glgpsapp\unix\Main.c

 主要的调用关系如下: main---〉_gpsrun—〉GpsRun

 

Mtk6516 gps驱动加载机制

   在Linux 2.6 起引入了一套新的驱动管理和注册机制 :Platform_device 和 Platform_driver。设备用 Platform_device 表示;驱动用 Platform_driver 进行注册。

platform 设备用结构体platform_device 来描述,该结构体定义在 kernel\include\linux\platform_device.h 中,

struct platform_device {

  …….

struct resource * resource; --设备资源信息, kernel\include\linux\ioport.h 中

 

};

 

platform driver 机制:有platform_device 和 platfrom_driver两部分组成,大致流程:定义 platform_device -> 注册 platform_device-> 定义 platform_driver-> 注册 platform_driver。

优势:platform 机制将设备本身的资源注册进内核,由内核统一管理,在驱动程序中使用这些资源时通过 platform device 提供的标准接口进行申请并使用,提高了驱动和资源管理的独立性,并且拥有较好的可移植性和安全性。

 

//以mtk6516平台集成BRCM4751gps芯片为例讲诉整个加载过程:

 在kernel\arch\arm\mach-mt6516\ mt6516_devs.c文件中定义platform_device 结构体mt6516_device_uart,通过如下逻辑platform_add_devices向系统中添加该设备了,调用 platform_device_register() 进行设备注册,且注册设备必须在platform_driver_register之前,

驱动注册时需要匹配内核中所以已注册的设备名。

 …à board_init-à mt6516_board_init-à注册各种设备.

 

驱动多数都是以模块实现的,可以静态或动态加载的:module_inità mt6516_uart_init

 

 static struct platform_driver mt6516_uart_dev_drv =

{

    .probe   = mt6516_uart_probe,

    .remove  = mt6516_uart_remove,

#ifdef CONFIG_PM   

    .suspend = mt6516_uart_suspend,

    .resume  = mt6516_uart_resume,

#endif   

    .driver = {

        .name    = DRV_NAME,

        .owner   = THIS_MODULE,   

    }

};

 

static struct uart_ops mt6516_uart_ops =

{

    .tx_empty       = mt6516_uart_tx_empty,

    .set_mctrl      = mt6516_uart_set_mctrl,

    .get_mctrl      = mt6516_uart_get_mctrl,

    .stop_tx        = mt6516_uart_stop_tx,

    .start_tx       = mt6516_uart_start_tx,

    .stop_rx        = mt6516_uart_stop_rx,

    .send_xchar     = mt6516_uart_send_xchar,

    .enable_ms      = mt6516_uart_enable_ms,

    .break_ctl      = mt6516_uart_break_ctl,

    .startup        = mt6516_uart_startup,

    .shutdown       = mt6516_uart_shutdown,

    .set_termios    = mt6516_uart_set_termios,

    .pm             = mt6516_uart_power_mgnt,

    .set_wake       = mt6516_uart_set_wake,

    .type           = mt6516_uart_type,

    .release_port   = mt6516_uart_release_port,

    .request_port   = mt6516_uart_request_port,

    .config_port    = mt6516_uart_config_port,

    .verify_port    = mt6516_uart_verify_port,

    .ioctl          = mt6516_uart_ioctl,

#ifdef CONFIG_CONSOLE_POLL

    .poll_get_char  = mt6516_uart_get_poll_char,

    .poll_put_char  = mt6516_uart_put_poll_char,

#endif   

};

 

重点:platform_driver 的 driver.name必须和platform_device的name相同,注册成功时会调用 platform_driver 结构元素 probe 函数指针进行设备硬件的操作。

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值