android系统开发(六)-HAL层开发基础

Android HAL层,即硬件抽象层,是Google响应厂家“希望不公开源码”的要求推出的新概念
1,源代码和目标位置
源代码: /hardware/libhardware目录,该目录的目录结构如下:
/hardware/libhardware/hardware.c编译成libhardware.so,目标位置为/system/lib目录
/hardware/libhardware/include/hardware目录下包含如下头文件:
hardware.h 通用硬件模块头文件
copybit.h copybit模块头文件
gralloc.h gralloc模块头文件
lights.h 背光模块头文件
overlay.h overlay模块头文件
qemud.h qemud模块头文件
sensors.h 传感器模块头文件
/hardware/libhardware/modules目录下定义了很多硬件模块
这些硬件模块都编译成xxx.xxx.so,目标位置为/system/lib/hw目录

2,HAL层的实现方式
JNI->通用硬件模块->硬件模块->内核驱动接口
具体一点:JNI->libhardware.so->xxx.xxx.so->kernel
具体来说:android frameworks中JNI调用/hardware/libhardware/hardware.c中定义的hw_get_module函数来获取硬件模块,
然后调用硬件模块中的方法,硬件模块中的方法直接调用内核接口完成相关功能

3,通用硬件模块(libhardware.so)
(1)头文件为:/hardware/libhardware/include/hardware/hardware.h
头文件中主要定义了通用硬件模块结构体hw_module_t,声明了JNI调用的接口函数hw_get_module
hw_module_t定义如下:
typedef struct hw_module_t {
/* tag must be initialized to HARDWARE_MODULE_TAG /
uint32_t tag;

/** major version number for the module */
uint16_t version_major;/** minor version number of the module */
uint16_t version_minor;/** Identifier of module */
const char *id;/** Name of this module */
const char *name;/** Author/owner/implementor of the module */
const char *author;/** Modules methods */
struct hw_module_methods_t* methods; //硬件模块的方法/** module's dso */
void* dso;/** padding to 128 bytes, reserved for future use */
uint32_t reserved[32-7];

} hw_module_t;
硬件模块方法结构体hw_module_methods_t定义如下:
typedef struct hw_module_methods_t {
/* Open a specific device /
int (open)(const struct hw_module_t module, const char* id,
struct hw_device_t** device);

} hw_module_methods_t;
只定义了一个open方法,其中调用的设备结构体参数hw_device_t定义如下:
typedef struct hw_device_t {
/* tag must be initialized to HARDWARE_DEVICE_TAG /
uint32_t tag;

/** version number for hw_device_t */
uint32_t version;/** reference to the module this device belongs to */
struct hw_module_t* module;/** padding reserved for future use */
uint32_t reserved[12];/** Close this device */
int (*close)(struct hw_device_t* device);

} hw_device_t;
hw_get_module函数声明如下:
int hw_get_module(const char *id, const struct hw_module_t **module);
参数id为模块标识,定义在/hardware/libhardware/include/hardware目录下的硬件模块头文件中,
参数module是硬件模块地址,定义了/hardware/libhardware/include/hardware/hardware.h中

(2)hardware.c中主要是定义了hw_get_module函数如下:

#define HAL_LIBRARY_PATH "/system/lib/hw"

static const char *variant_keys[] = {
“ro.hardware”,
“ro.product.board”,
“ro.board.platform”,
“ro.arch”
};
static const int HAL_VARIANT_KEYS_COUNT =
(sizeof(variant_keys)/sizeof(variant_keys[0]));

int hw_get_module(const char *id, const struct hw_module_t **module)
{
int status;
int i;
const struct hw_module_t *hmi = NULL;
char prop[PATH_MAX];
char path[PATH_MAX];
for (i=0 ; i

#define HAL_MODULE_INFO_SYM         HMI
#define HAL_MODULE_INFO_SYM_AS_STR  "HMI"

4,硬件模块
硬件模块的开发主要是完成/hardware/libhardware/include/hardware目录下对应的头文件中的内容,主要是硬件模块头文件和hardware.h中
的结构体中定义了一些函数指针,调用内核提供的接口将具体的函数实现,然后编译成指定名称的动态链接库放到/system/lib/hw目录下即可。
用一句话来概括:硬件模块的开发就是定义一个hardware.h中定义的hw_module_t结构体,结构体名称为宏HAL_MODULE_INFO_SYM,然后实现结构体
的相关内容即可。

5,内核驱动
主要是要向用户层开放接口,让硬件模块和内核可以交互。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/469203.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

numpy数组中冒号[:,:,0]与[...,0]的区别

先随机产生一个[3,4,5]的numpy数组。则该x维度是3,shape是(3,4,5),总共包含60个元素。 x[:,:,0] 意思是对数组x切片,可以想象成一个正方体数据,每次切下一个面的数据。第二维取0则得出来[3,4]大小的数组&am…

苹果忘记开机密码_苹果电脑忘记开机密码快速恢复的方法!

很多用户不经常使用电脑,或者粗心大意忘记自己设置的电脑开机密码!!!这可怎么办呢?今天小编就来和大家分享【Mac电脑忘记开机密码快速恢复的方法教程!】有需要的的用户不要错过哦!步骤一&#x…

Web框架 Bottle 、Flask 、Tornado

Bottle Flask Tornado Python的WEB框架 Bottle Bottle是一个快速、简洁、轻量级的基于WSIG的微型Web框架,此框架只由一个 .py 文件,除了Python的标准库外,其不依赖任何其他模块。 pip install bottle easy_install bottle apt-get install py…

【Pytorch神经网络理论篇】 36 NLP中常见的任务+BERT模型+发展阶段+数据集

同学你好!本文章于2021年末编写,获得广泛的好评! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深度学习理论篇(2023版)目录地址…

10个你可能没用过的linux命令

如果你是一个硬件系统管理员或者Linux工程师,你可能会记得大多数Linux命令行技巧。下面的这些Linux命令行技巧通常不被Linux用户所使用。 1.使用pgrep快速查找一个PID pgrep遍历目前正在运行的进程然后列出符合查找规则的进程ID(PID)。 pg…

win7关机快捷键_1个U盘+1款软件,电脑小白也能在家轻松重装win7系统

U盘重装系统,顾名思义就是将U盘插入笔记本后,对电脑进行重装系统。但是我们得清楚一个事情,所谓的U盘并不是普通的U盘,是一个装有PE镜像文件的启动盘。也许很多人还不懂,今天我就来给大家介绍一下如何用1个U盘1款软件&…

cmd导入mysql文件

之所以要使用CMD(命令行)导入Mysql文件(.sql文件形式)也许是你还没遇到过 Mysql图形管理工具都无法正常导入sql文件。在网上找了很多的网友提供的资料来看几乎都是显示 所用工具限制,这里我就不多说了。 如下&#xff…

【Pytorch神经网络实战案例】30 jieba库分词+训练中文词向量

1 安装jieba 1.1 安装 pip install jieba 1.2 测试 import jieba seg_list jieba.cut("谭家和谭家和") for i in seg_list:printf(i); 1.3 词向量 在NLP中,一般都会将该任务中涉及的词训练成词向量,然后让每个词以词向量的形式型的输入…

nrf52832开发环境安装

1、下载hex要安装的软件 nodic的芯片要下载 software application bootloader 1.1、nrfgostudio_win-64_1.21.1_installer:这个可以从官方网站下载http://www.nordicsemi.com/index.php/chi_simple/nordic/Products/nRF51-DK/nRFgo-Studio-Win64/46414 1.2、jlin…

javascript option 菜单图标_苹果电脑上神奇的Option键 巧用option键提升效率

Option键 是苹果电脑一个非常有用的键option键主要的用途,是绕过一些你不想要的对话框。巧用option键可以提升效率,喜欢的朋友收藏起来吧!Option键神奇功能拖拽粘贴Mac电脑上拖拽文件默认是剪切功能按住Option键拖拽文件就能快速达到复制粘贴…

核酸结果统计难?130行代码实现基于ocr的核酸截图识别存储Excel(复现代码核查核酸报告)

来源: 核酸结果统计难?复旦博士生的操作火了https://m.gmw.cn/baijia/2022-04/08/35644611.html 1 程序背景 学校要收核酸截图,汇总太麻烦了,故将OCR整合到数据中。 1.1 命名规范 20200250202003曹文举4.12阴性.jpg 1.2 Eas…

ubuntu下面的git服务器搭建

1、安装相应的软件和依赖 ubuntu:~$ sudo apt-get install git-core openssh-server openssh-client git-core是git版本控制核心软件安装openssh-server和openssh-client是由于git需要通过ssh协议来在服务器与客户端之间传输文件然后中间有个确认操作,输…

实验四:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用

王康 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 系统调用:操作系统中,程序员通过封装好的库函数来实现系统调用 前提 1,用户态内核态中断: 1,用户态内核…

【Pytorch神经网络理论篇】 37 常用文本处理工具:spaCy库+torchtext库

同学你好!本文章于2021年末编写,获得广泛的好评! 故在2022年末对本系列进行填充与更新,欢迎大家订阅最新的专栏,获取基于Pytorch1.10版本的理论代码(2023版)实现, Pytorch深度学习理论篇(2023版)目录地址…

海龟画图 python太阳花_python 简单的绘图工具turtle使用详解

目录 1. 画布(canvas) 1.1 设置画布大小 2. 画笔 2.1 画笔的状态 2.2 画笔的属性 2.3 绘图命令 3. 命令详解 4. 绘图举例 4.1 太阳花 4.2 绘制小蟒蛇 4.3 绘制五角星 python2.6版本中后引入的一个简单的绘图工具,叫做海龟绘图(Turtle Graphics),turtle库是python的内…

RK平台ubuntu安装vbox

1、安装ubuntu14.04 2、在ubuntu下添加权限,根据lsusb出来的 vid pid来添加 3、安装vbox 不是最高版本越好。 4、安装xp, 5、在xp里面安装RK驱动 6、试着用RK的工具连接进入烧录模式的板子,如果连接不上修改vbox的usb,确保是usb2.0

【Pytorch神经网络实战案例】31 TextCNN模型分析IMDB数据集评论的积极与消极

卷积神经网络不仅在图像视觉领域有很好的效果,而且在基于文本的NLP领域也有很好的效果。TextCN如模型是卷积神经网络用于文本处理方面的一个模型。 在TextCNN模型中,通过多分支卷积技术实现对文本的分类功能。 1 TextCNN 1.1 TextCNN模型结构 TexCNN…

rk3188开机失败(ump_file_open() 251)

刚开始配置rk3188板子的时候&#xff0c; 基本配置&#xff0c;RK3188 RK616 ACT8846 8G的flash, 开机的时候提示如下&#xff1a; <6>[ 18.729270] request_suspend_state: wakeup (0->0) at 18680347129 (1970-01-01 00:00:18.671397630 UTC) <4>[ 23.8…

python怎么画出好看的统计图_用最简单的 Python ,画最好看的图 [简单数据可视化]...

可以直接修改参数使用&#xff0c;非常的方便。import numpy as np import pandas as pd import holoviews as hv hv.extension(bokeh) macro_df pd.read_csv(http://assets.holoviews.org/macro.csv, \t) key_dimensions [(year, Year), (country, Country)] value_dimensio…

project ‘org.springframework.boot:spring-boot-starter-parent:2.1.4.RELEASE‘ not found

复制别人的的依赖&#xff0c;在parent里面版本号爆红&#xff0c;解决方案&#xff1a; 在左上方file里找到nvalidate Caches/Restart&#xff0c;清理一下idea缓存&#xff0c;重启idea以后不会爆红了