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 函数指针进行设备硬件的操作。