Android HAL hardware module分析 以GPS module为例

msm8953 替换系统的gps.default.so库 说明 由于车机gps是外挂的,所以需要原厂提供gps库替换系统的gps.default.so库。 流程 1.在vendor/fibo/common/目录添加gnsshal文件夹,将Android.mk和gps_zkw.c文件放入该目录。 Android.mk文件: #include $(all-subdir-makefiles) LOCAL_PATH := $(call my-dir) #ifeq ($(BOARD_GPS_LIBRARIES), libgps) #ifneq ($... 阅读详情
准备在QT210的android系统中实现GPS功能,程序已经写好了,也可以编译出gps.s5pc110.so的库,但是不知道上层怎么调用这个库,在GPS相关的Android.mk中也没有找到,很是纳闷。通过分析hardware module才知道是怎么回事,之前并没有详细的了解hardware module,现在简单的分析一下。

HAL层的hardware module主要实现文件为:
hardware/libhardware/hareware.c
hardware/libhardware/include/hardware/hardware.h

重要的结构体:
  1. typedef struct hw_device_t { 
  2.     uint32_t tag; /** tag must be initialized to HARDWARE_DEVICE_TAG */ 标识符 
  3.     uint32_t version; /** version number for hw_device_t */             版本号
  4.     struct hw_module_t* module; /** reference to the module this device belongs to */   该硬件属于哪个module
  5.     uint32_t reserved[12]; /** padding reserved for future use */ 
  6.     int (*close)(struct hw_device_t* device); /** Close this device */  关闭设备操作
  7. } hw_device_t;
表示一个硬件设备,存储了各种硬件设备的公共属性和方法

  1. typedef struct hw_module_t { 
  2.     uint32_t tag; /** tag must be initialized to HARDWARE_MODULE_TAG */ 标识符
  3.     uint16_t version_major; /** major version number for the module */ 主版本号
  4.     uint16_t version_minor; /** minor version number of the module */ 次版本号
  5.     const char *id; /** Identifier of module */                    id,决定了库的文件名
  6.     const char *name; /** Name of this module */                    模块的名字
  7.     const char *author; /** Author/owner/implementor of the module */   模块作者
  8.     struct hw_module_methods_t* methods; /** Modules methods */         模块的操作方法
  9.     void* dso; /** module's dso */ 
  10.     uint32_t reserved[32-7]; /** padding to 128 bytes, reserved for future use */
  11. } hw_module_t;
描述一个硬件模块

  1. typedef struct hw_module_methods_t {
  2.     int (*open)(const struct hw_module_t* module, const char* id,
  3.             struct hw_device_t** device);
  4. } hw_module_methods_t;
定义了操作设备的方法,只有一个open函数

hareware.c分析:
  1. /** Base path of the hal modules */ 指定硬件模块库存放的路径
  2. #define HAL_LIBRARY_PATH1 "/system/lib/hw"
  3. #define HAL_LIBRARY_PATH2 "/vendor/lib/hw"

下面这个用于搜索不同的库文件名:
  1. /**
  2.  * There are a set of variant filename for modules. The form of the filename
  3.  * is "<MODULE_ID>.variant.so" so for the led module the Dream variants 
  4.  * of base "ro.product.board", "ro.board.platform" and "ro.arch" would be:
  5.  *
  6.  * led.trout.so
  7.  * led.msm7k.so
  8.  * led.ARMV6.so
  9.  * led.default.so
  10.  */

  11. static const char *variant_keys[] = {
  12.     "ro.hardware",
  13.     "ro.product.board",
  14.     "ro.board.platform",
  15.     "ro.arch"
  16. };
库的名称要根据实际的product或board指定
在210平台GPS模块库的文件名可以为:
gps.s5pc110.so
gps.ARMV7.so
gps.default.so

hw_get_module函数作用是在系统中查找模块的库文件
根据硬件模块的id参数和指定的查找路径,配合product,board等变量,最终指定到一个so库文件
  1. int hw_get_module(const char *id, const struct hw_module_t **module) 
---------------------------------------------------------------------------------
  1.     /* Loop through the configuration variants looking for a module */
  2.     for (i=0 ; i<HAL_VARIANT_KEYS_COUNT+1 ; i++) {
  3.         if (i < HAL_VARIANT_KEYS_COUNT) {
  4.             if (property_get(variant_keys[i], prop, NULL) == 0) {
  5.                 continue;
  6.             }
  7.             snprintf(path, sizeof(path), "%s/%s.%s.so",       //system/lib/hw/*.*.so
  8.                     HAL_LIBRARY_PATH1, id, prop);
  9.             if (access(path, R_OK) == 0) break;

  10.             snprintf(path, sizeof(path), "%s/%s.%s.so",
  11.                      HAL_LIBRARY_PATH2, id, prop);
  12.             if (access(path, R_OK) == 0) break;
  13.         } else {
  14.             snprintf(path, sizeof(path), "%s/%s.default.so",    //如果没查到硬件属性,使用默认的库文件名system/lib/hw/*.default.so
  15.                      HAL_LIBRARY_PATH1, id);
  16.             if (access(path, R_OK) == 0) break;
  17.         }
  18.     }

创建GPS modules分析:

下面这段话很重要,说明了如何构建一个模块
  1. /**
  2.  * Every hardware module must have a data structure named HAL_MODULE_INFO_SYM
  3.  * and the fields of this data structure must begin with hw_module_t
  4.  * followed by module specific information.
  5.  */

可以说这是andorid中标准的构建模块的写法
  1. const struct hw_module_t HAL_MODULE_INFO_SYM = {
  2.     .tag = HARDWARE_MODULE_TAG,
  3.     .version_major = 1,
  4.     .version_minor = 0,
  5.     .id = GPS_HARDWARE_MODULE_ID,
  6.     .name = "XC-GPS Module",
  7.     .author = "WWW.XCEMBED.COM",
  8.     .methods = &hw_module_methods,
  9. };

通过分析hw_get_module函数我们知道,id是用来指定模块库文件名的,给GPS_HARDWARE_MODULE_ID赋值
#define GPS_HARDWARE_MODULE_ID  "gps"
实际上GPS_HARDWARE_MODULE_ID并不是在代码中这样定义的,可能是在某个编译脚本里,我暂时还没找到

指定methods:
  1. static struct hw_module_methods_t hw_module_methods = {
  2.     .open = open_gps
  3. };
只有一个open_gps函数,当模块加载时就会执行open_gps:
  1. static int open_gps(const struct hw_module_t* module, char const* name,
  2.                     struct hw_device_t** device)
  3. {
  4.     struct gps_device_t *gps_device = malloc(sizeof(struct gps_device_t));
  5.     if (gps_device)
  6.     {
  7.         memset(gps_device, 0, sizeof(*gps_device));
  8.         gps_device->common.tag = HARDWARE_DEVICE_TAG;
  9.         gps_device->common.version = 0;
  10.         gps_device->common.module = (struct hw_module_t*)module;
  11.         gps_device->get_gps_interface = gps_get_hardware_interface;

  12.         *device = (struct hw_device_t*)gps_device;

  13.         return 0;
  14.     }

  15.     return 1; 
  16. }

每个硬件设备都应该有一个类似xxxx_device_t的结构体,里面包含了hw_device_t
gps的设备结构体定义如下:
  1. struct gps_device_t {
  2.     struct hw_device_t common;
  3.     const GpsInterface* (*get_gps_interface)(struct gps_device_t* dev);
  4. };
在open函数中给这个模块所包含的hw_device_t赋值

get_gps_interface函数用来得到GPS的操作接口
  1. const GpsInterface* gps_get_hardware_interface(struct gps_device_t* dev)
  2. {
  3.     return &_GpsInterface;
  4. }

接下来,程序的主体部分就是实现_GpsInterface里面所定义的所有操作

HAL层的模块是由具体的上一层JNI来调用,关于怎么调用的,下一篇分析GPS module时再说,我也不是很清楚,再整理一下
Android-GnssHal层gps.xxx.so查找与加载过程分析 Android-GnssHal层gps.xxx.so加载过程分析 gps.xxx.so不是在编译的时候直接prelink而是在运行阶段动态查找并加载的; 已 android.hardware.gnss@1.0-service 为例 android.hardware.gnss@1.0-service.rc 会在系统启动时 启动 android.hardware.gnss@1.0-service 然后通过 hw_get_module 获取到对应的module并open以及获取 interface ; I 阅读详情

相关推荐

Android HAL动态加载机制:从GPS模块到通用HAL的so文件寻址逻辑剖析

本文深入剖析了Android HAL动态加载机制,特别是GPS模块(GnssHal)的so文件寻址逻辑。详细解析了hw_get_module函数的加载过程、so文件命名规则与存放路径,以及多分区协作策略,帮助开发者理解并掌握Android HAL的通用设计思想与实现方法。

weixin_30892037的博客 414

hw_get_module详解

hw_get_module是jni层获取HAL层module的接口函数,原型为:int hw_get_module(const char *id, const struct hw_module_t **module) 这个id是hal层注册时加入的,例如sensor的hal的定义 struct sensors_module_t HAL_MODULE_INFO_SYM = {     .com

LinuxEngineer的专栏 8644

Android HAL概述

Android HAL(Hardware Abstract Layer)硬件抽象层,从字面意思可以看出是对硬件设备的抽象和封装,为Android在不同硬件设备提供统一的访问接口。HAL处于Android framework和Linux kernel driver之间,HAL存在的意义有以下2个方面:HAL屏蔽了不同硬件设备的差异,为Android提供了统一的访问硬件设备的接口。不同的硬件厂商遵循HA

fengkainotdie的博客 707

Android HAL层模块的加载过程

一、概述 HAL层是Android系统架构里介于Linux内核和系统运行库层之间的一个层,个人认为这个层存在的目的主要是为了避免GPL协议所带来的开源问题。Android系统会统一加载硬件抽象层模块,负责加载硬件抽象层模块的函数是hw_get_module函数。 二、hw_get_module 1、hw_get_module原型 在Android硬件抽象层中,负责加载硬件抽象层模块的函数是hw_get_module,当调用者需要加载这些模块时,只要指定它们的ID值就可以了。它的原型如下: 1 /**

转载和创作优秀的博客 1834

解决Android RK平台编译通不过的问题:将gps.default.so预编译到/system/lib/hw下

在Android RK平台上,有时候我们需要将特定的库文件预编译到系统目录以实现特定功能。然而,有时候将库文件预编译到/system/lib/hw目录下时,可能会遇到编译通不过的问题。解决Android RK平台编译通不过的问题:将gps.default.so预编译到/system/lib/hw下。首先,我们需要找到Android源代码中与RK平台相关的文件。库文件复制到/system/lib/hw目录的位置。库文件预编译到/system/lib/hw目录下,并且编译系统也能够正常通过。

. 514

Android 10.0 RK平台gps.default.so预编译到/system/lib/hw 下编译通不过的解决方案

在10.0的底层编译变化挺大,RK平台再用以前方式把 gps.default.so放在device\rockchip\common\device.mk下编译就编不过了,就得另外想办法了,怎么样编译到/system/lib/hw下呢。

安卓兼职framework和app工程师的博客 1506

转)Android HAL hardware module分析 以GPS module为例

http://blog.sina.com.cn/s/blog_67571559010119bn.html

bzhao的专栏 795

GPS安装软件

安卓GPS模块安装软件,用于安卓蓝牙连接GPS。

android gps hal大概分析

gps android hal层分析 我用的UT4412的板子由于上面没有gps模块,自己找到了一个北斗模块给上一个3.3的电,TX、RX接到板子的串口上。 我做的gps是在网上下载的代码,下载之后代码放在hardware/libhardware/modules/下面,修改上一层的Android.mk 添加gps模块   如下: hardware_modules := gralloc hwc

李世勇(Java) 1385

8.1gps库文件.rar

android gps库(gps.default.so),使用时添加修改 cfg文件,修改相关节点

科沃兹GPS导航.rar

完美支持科沃兹导航的U-blox芯片GPS驱动,包含GPS启动软件,vk162.172支持G7020、M8030; 支持 GPS Glonass 星

android gps tty,Gps HAL层分析

1.Android 6.0源码中Gps HAL层代码分析我们知道gps在HAL层是库的方式存在的,它的库的名称是gps.default.so,我们可以根据这个命令来查找find –name Android.mk –exec grep –l “gps.default” {} \;,我们获取的文件的路径在如下位置:fspad-733-6.0/androidM/device/softwinner/com...

weixin_39672979的博客 775

安卓手机GPS修改方法

刷机后手机GPS信号很差,收不到星,有解决办法,自己搞定

安卓平台下的GPS架构介绍及驱动移植记录

一、前言 我的工作是关于汽车车机BSP部分。 汽车车机,其实基本和人们日常所用的手机一样,也是安卓平台的。所谓安卓,就是一层安卓服务包裹着Linux内核所形成的操作系统。 BSP组,主要工作内容就是负责soc的Linux系统部分的驱动移植、调试,及BUG解决。 从毕业到现在,工作也有大半年了。跟着前辈学习GPS模块的移植、调试,和BUG解决也有差不多两个月了。心里想着,是时候写一篇关于GPS驱动移植学习的总结和笔记了。 于是今天,我尝试着动手开始梳理这两个月来的所学所知。 二、U-blox m8

linuxarmsummary的专栏 2438

HAL库STM32CubeMX+DHT11温湿度传感器模块化驱动与OLED显示实战

本文详细介绍了基于HAL库和STM32CubeMX开发DHT11温湿度传感器模块化驱动的实战过程。通过精确的时序控制和模块化封装,实现了传感器数据采集,并结合OLED显示模块实时展示温湿度信息,为嵌入式开发者提供了完整的解决方案。

h6j7k8l9p0的博客 1135

实战拆解:RAG vs Agent在金融风控中的性能对比

2024年上半年我帮某华东地区城商行做零售交易反欺诈系统升级时,技术团队曾发生过一次激烈争论:一派认为应该优先上RAG(检索增强生成)方案,成本低、落地快、合规性好;另一派坚持要上Agent(智能体)方案,推理能力强、能应对复杂新型欺诈。最终我们做了完整的AB测试,结论是两者没有绝对的优劣,只有场景适配的差异:RAG适合高并发、低时延的实时风控场景,Agent适合低并发、高准确率要求的事后核查/大额审批场景,两者结合的 hybrid 方案能覆盖95%以上的风控需求。本文我会结合真实项目的测试数据,从核心概念

AI天才研究院 251

Android硬件抽象层HAL总结

Android HAL概述 Android HAL(Hardware Abstract Layer)硬件抽象层,从字面意思可以看出是对硬件设备的抽象和封装,为Android在不同硬件设备提供统一的访问接口。HAL处于Android framework和Linux kernel driver之间,HAL存在的意义有以下2个方面: HAL屏蔽了不同硬件设备的差异,为Android提供了统一的访问硬件设备的接口。不同的硬件厂商遵循HAL标准来实现自己的硬件控制逻辑,但开发者不必关心不同硬件设备的差异,只需要按

转载和创作优秀的博客 2870

从零开始讲DDR(8)——AXI 接口MIG 使用(1)

我们简单拆解了MIG AXI接口中测试文件的整体框架,首先在sim_tb_top.sv文件中例化了DDR模型和example_top。在example_top中,又例化了MIG IP和一个流量产生器ddr4_v2_2_8_axi_tg_top。在ddr4_v2_2_8_axi_tg_top中的主要功能是分别例化了boot_mode_gen,prbs_mode_gen,custom_mode_gen和axi_opcode_gen。

apple_53311083的博客 1592

HAL so库加载机制---之二

4, HAL库加载 4.1 HAL库加载过程 下面以GPS为例,分析上层是如何使用HAL库来访问硬件设备的。 com_android_server_location_GpsLocationProvider.cpp中加载gps.default.so库的代码如下, hw_module_t* module; err = hw_get_module(GPS_HARDWARE_MODULE_ID,

Jack的博客 2908

数据挖掘实战-基于LSTM时间序列模型的香烟销售预测分析

本文介绍了基于LSTM时间序列模型的香烟销售预测分析实验。实验背景为烟草市场竞争激烈,企业需提高销售预测准确性以优化生产、库存和营销策略。LSTM模型因其处理长序列数据的能力被选为预测工具。实验步骤包括数据准备、特征工程、模型构建、训练与评估及结果分析。数据集来自某市门店的销售数据,技术工具为Python 3.9和Jupyter Notebook。实验过程涵盖数据导入、预处理、产品销售与区域销售分析、销售预测(包括销售额、销量、利润及海通店销售额预测)。

m0_64336780的博客 8952

【YOLO部署Android安卓手机APP】YOLOv8部署到安卓实时目标检测识别——官方/自训练模型YOLOv8人脸/车辆等目标检测(可自定义更换其他目标)

本文首先讲解如何直接使用官方训练好的模型部署到手机APP进行人脸检测,然后讲解如何修改其他目标进行检测,以车辆检测为例进行讲解如何训练自己的模型部署到手机APP。本文为详细设计/配置文档,包含完整所需的环境配置搭建,项目工程配置步骤等,手把手记录使用pycharm和Android studio的工程开发过程,实现YOLO部署到安卓。实战开发,亲测无误。本项目实现了人脸检测和车辆检测,当然,以此你可以按照本项目开发步骤扩展更换为其他目标进行检测,例如更换为车牌、手势、人脸面部活动、人脸表情、火焰烟雾、行人等

嵌入式阿齐Archie 1万+
上一篇: 异步通知与异步I/O
下一篇: 内存管理单元MMU
jeffade
博客等级 码龄16年 37粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值