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 ($... 阅读详情
准备在S5PV210的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.     //这里是本篇的关键地方,snprintf() 将 id  HAL_LIBRARY_PATH1 等的值赋给path,
  17.             if (access(path, R_OK) == 0) break;
  18.         }
  19.     }

创建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来调用,以后再分析。
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概述

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

fengkainotdie的博客 707

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 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目录下,并且编译系统也能够正常通过。

. 513

Android HAL层模块的加载过程

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

转载和创作优秀的博客 1833

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工程师的博客 1505

GPS安装软件

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

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

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

bzhao的专栏 795

8.1gps库文件.rar

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

android gps hal大概分析

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

李世勇(Java) 1384

科沃兹GPS导航.rar

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

安卓手机GPS修改方法

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

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的博客 773

华为防火墙USG6600全流量日志配置指南:从流量监控到NAT日志的完整方案

本文详细介绍了华为USG6600防火墙全流量日志配置方案,涵盖流量监控、NAT日志及安全事件溯源等核心功能。通过精细化配置和性能优化技巧,帮助企业构建高效、合规的日志体系,提升网络安全运维效率。文章特别强调了日志采样与字段过滤的实用方法,适用于高流量环境下的资源优化。

gin88的博客 347

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

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

linuxarmsummary的专栏 2434

告别色差!用Python+TCS34725颜色传感器实现精准色彩还原(附完整校准代码)

本文详细介绍了如何利用Python和TCS34725颜色传感器实现专业级色彩还原方案。通过双阶校准法(白光校准和黑电平校准)和进阶的光照自适应技术,解决传感器原始数据不准的问题,并提供完整的校准代码和实战案例,帮助开发者实现ΔE<3的高精度色彩识别。

weixin_30836759的博客 209

ESXI添加硬盘时提示 无法创建 VMFS 数据存储 - 无法更改主机配置

ESXI添加硬盘时提示 无法创建 VMFS 数据存储 - 无法更改主机配置1.打开ESXI的SSH2.找到不能添加的硬盘路径3.用SSH操作 1.打开ESXI的SSH 2.找到不能添加的硬盘路径 我的是第一个,找到你要添加但是不能添加的那个硬盘,点进去。 完整的路劲为:1/2 比如我的: /vmfs/devices/disks/t10.ATA_____ST500LT0122D1DG142___________________________________S3PHRNHQ (比较长哈!) 3.用SSH

AI_DOG的博客 2万+

Android硬件抽象层HAL总结

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

转载和创作优秀的博客 2870

永磁同步电机控制笔记:foc控制原理通俗讲义

引言 到此为止,永磁同步电机控制相关文章已经写了7篇,其中simulink仿真系列文章5篇,控制笔记系列文章2篇,恍惚间感觉少了一篇概论,在此插入一篇,也算是对入坑电机控制一年半来的知识梳理。 文章目录引言一、同步电机是怎么转起来的二、什么样的旋转磁场效率最高三、怎么精准控制旋转磁场的方向四、怎样调节dq轴电流 一、同步电机是怎么转起来的 永磁同步电机结构如下: 外围是定子绕组,中间为永磁体,设...

搞电机的博客 2万+

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

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

weixin_30892037的博客 414

23数字图像置乱技术(matlab程序)

所谓“置乱”,就是将图像的信息次序打乱,a像素移动到b像素位置上,b像素移动到c像素位置上,……,使其变换成杂乱无章难以辨认的图片。数字图像置乱技术属于加密技术,是指发送发借助数学或者其他领域的技术,对一幅有意义的数字图像做变换,使之变成一幅杂乱无章的图像用于传输。在图像传输过程中,它通过对图像像素矩阵的重排,破坏了图像矩阵的相关性,使非法截获者无法从杂乱无章的图像中获得原图像信息,以此实现信息的加密。接收方经去乱解密可恢复原图像。

m0_57943157的博客 1204

【完整梳理验证】企业微信第三方应用接入全流程java版

由企业内部的开发者自己开发部署,相当于是企业自己的资产,调用接口基本没有任何限制。由SaaS服务商的开发者开发并部署在服务商侧,面向所有企业。需要企业授权使用(先试用后付费),服务商仅可获取企业授权部分的权限,相当于白名单控制。由服务商的开发者开发,但部署在企业内部。一般是线下签约采购方式,因此权限几乎与自建应用无异,企业管理员只需要配置不对服务商开放的敏感权限,相当于黑名单控制。服务商后台地址:企业微信服务商官网企业管理后台地址:企业微信管理后台服务商,可以理解为 SAAS 中的运营端。企业管理端,可以理

Hello, New World! 2759

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

基于树莓派4B与NCNN的YOLOv8高效部署实战:无GPU环境下的C++加速优化全流程指南**

本文详细介绍了在树莓派4B上基于NCNN框架部署YOLOv8目标检测模型的全流程。内容包括:从PyTorch模型导出NCNN格式文件、树莓派环境配置(OpenCV和NCNN编译)、C++实现代码解析(含模型加载、推理及后处理),以及实际部署测试结果。在树莓派4B上达到约2FPS,并提供INT8量化、多线程等优化建议。该方案为无GPU设备提供了轻量化目标检测的实用部署方案,适合边缘计算场景。

FJN110的博客 916
上一篇: Ubuntu 用户安装文件较器meld使用,以及添加进右键菜单
下一篇: 联发科芯片趋势
倚天神剑
博客等级 码龄17年 23粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值