博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android HAL层与Linux Kernel层驱动开发简介
阅读量:6655 次
发布时间:2019-06-25

本文共 1342 字,大约阅读时间需要 4 分钟。

近日稍微对Android中的驱动开发做了一些简要的了解。

这里写图片描述

HAL:Hardware Abstract Layer 硬件抽象层,由于Linux Kernel需要遵循GPL开源协议,硬件厂商为了保护自己硬件方面的各项参数不被外泄,而一个设备的驱动程序包含了硬件的一些重要参数,所以驱动的开源势必会使硬件厂商蒙受损失,Google为了保护硬件厂商的利益,所以在Android系统中加入了HAL层,在HAL层中不必遵循GPL协议,所以代码可以封闭。 

所以如果硬件驱动开源的写在Kernel里,Framework直接调用,而不愿意开源的就写在HAL层里,实现闭源。

那究竟HAL怎样实现闭源的呢?我们来画个简图.(注意:本文只提供攥写驱动的大致思路,不对细节代码负责。) 

这里写图片描述

一,编写驱动期以及LoadingTime: 

编写驱动分为两个部分,一个是HAL层的驱动代码,一个是Kernel层的驱动代码。

1,HAL框架提供了三个结构体,分别为hw_device_t , hw_module_t ,hw_module_methods_t。 

编写HAL层驱动首先要依据这三个结构体作扩展,我们创建自己驱动的device_t,module_t代码,并且写hw_module_methods_t这个结构体中方法的实现代码,这个部分叫做HAL Stub,编写此部分驱动分为三个步骤: 
第一,创建myDeviceModel实例,第二,将hw_module_methods_t指针设定给myDeviceModel,实现hw_module_methods_t这个函数表里函数的代码.

2,在Kernel层框架同样提供了多个结构体(module,file,file_operations,cdev),我们可以对系统提供的结构体进行扩展,或者直接使用系统的结构体。这个部分叫做Linux Kernel Stub,编写此部分代码分为多个步骤:第一,创建myFile实例,第二 设定file_operations指针给myFile,第三 写file_operations这个函数表中函数的实现代码即开源部分代码,第四,创建myDeviceModule装配 cdev与myFile。

3,写完以后编译系统即将驱动封装载入系统中,装在过程首先会调用myDeviceModule的init,完成内核stub的载入,Hal层完成了对myDevice的创建.

二,调用驱动期(RunTime): 

上面提到在HAL层我们编写了HAL_STUB部分,我们来分析下系统究竟怎么调用到硬件的,首先我们使用HAL框架为我们提供的函数get到我们写的HALStub层的myDeviceModule,通过myDeviceModule获取到myDevice,调用myDevice的setData或者getData方法,然后调用封闭代码区的函数,封闭代码区会调用systemCall调用linux内核的read(),write()函数,read(),write()往下就是硬件了。

总结:HALStub与KernelSutb部分为厂商开源部分,mydevice.so为闭源部分.本文只是对驱动开发思路以及代码执行流程作了个简介,如有错误的地方还请指正。

你可能感兴趣的文章
lua 随机生成 中国大陆 ip
查看>>
三种实现页面跳转的方法
查看>>
Fuchsia 操作系统的四层结构
查看>>
Linux 4.21包含对AMD Rome处理器中新的Zen 2架构重要的新优化
查看>>
Linux内核的缓存
查看>>
react-jianshu项目的创建
查看>>
NSCalendar取得上个月
查看>>
echarts 2.0 macarons主题安装
查看>>
OpenStack块存储nova-volume工作机制和相关问题
查看>>
【C#每日一贴】禁用承载进程----“工程名.vshost.exe”
查看>>
ThinkPHP Where 条件中使用表达式
查看>>
wxpython
查看>>
matlab常用快捷键
查看>>
js正则校验通用的文本框
查看>>
免费架构之ADF12C essentials+MYSQL5.5.40+GLASSFISH4.1
查看>>
openssl genrsa 生成私钥
查看>>
model层功能函数命名规范
查看>>
如何隐藏你的无线网络
查看>>
Android使用代码实现关机/重启
查看>>
Properties and Attributes in HTML
查看>>