Android HAL层与Linux Kernel层驱动开发简介
近日稍微对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为闭源部分.本文只是对驱动开发思路以及代码执行流程作了个简介,如有错误的地方还请指正。
Android HAL层与Linux Kernel层驱动开发简介的更多相关文章
- 基于335X平台Linux交换芯片驱动开发
基于335X平台Linux交换芯片驱动开发 一.软硬件平台资料 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.Kernel版本:4.4.12,采用FDT 3.交换芯片MARVEL ...
- Linux 下wifi 驱动开发(三)—— SDIO接口WiFi驱动浅析
SDIO-Wifi模块是基于SDIO接口的符合wifi无线网络标准的嵌入式模块,内置无线网络协议IEEE802.11协议栈以及TCP/IP协议栈.可以实现用户主平台数据通过SDIO口到无线网络之间的转 ...
- Linux 下wifi 驱动开发(四)—— USB接口WiFi驱动浅析
源: Linux 下wifi 驱动开发(四)—— USB接口WiFi驱动浅析
- Linux GPIO键盘驱动开发记录_OMAPL138
Linux GPIO键盘驱动开发记录_OMAPL138 Linux基本配置完毕了,这几天开始着手Linux驱动的开发,从一个最简单的键盘驱动开始,逐步的了解开发驱动的过程有哪些.看了一下Linux3. ...
- Android 从上层到底层-----kernel层
CPU:RK3288 系统:Android 5.1 功能:上层 app 控制 led 亮灭 开发板:Firefly RK3288 1.在dts文件中增加 led 设备 path:kernel/arch ...
- 移植Linux Kernel SM750 驱动到VxWorks 7
一.SM750简介 SM750 是SiliconMotion 推出的一款适合嵌入式设备的显卡(Embedded GPU),采用PCIe接口与CPU连接,内部集成16MB DDR SDRAM显存,产品具 ...
- Linux Kernel 0.12 启动简介,调试记录(Ubuntu1804, Bochs, gdb)
PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明 本文作为本人csdn blog的主站的备份.(Bl ...
- 转: 嵌入式linux下usb驱动开发方法--看完少走弯路【转】
转自:http://blog.csdn.net/jimmy_1986/article/details/5838297 嵌入式linux下的usb属于所有驱动中相当复杂的一个子系统,要想将她彻底征服,至 ...
- Cucumber 行为驱动开发简介
Cucumber 是一个能够理解用普通语言 描述的测试用例的支持行为驱动开发(BDD)的自动化测试工具,用Ruby编写,支持Java和.Net等多种开发语言. 现在看看Cucumber中用到的术语 . ...
随机推荐
- java中的 equals + hashCode
[0]README 0.1)本文转自 core java volume 1, 旨在理清 equals + hashCode方法: [1]equals方法 1.1) Object中的 equals 方法 ...
- jvmtop 监控
1 jar包 <!-- -JVMTOP监控- --> <dependency> <groupId>joda-time</groupId> <art ...
- 再看python多线程------threading模块
现在把关于多线程的能想到的需要注意的点记录一下: 关于threading模块: 1.关于 传参问题 如果调用的子线程函数需要传参,要在参数后面加一个“,”否则会抛参数异常的错误. 如下: for i ...
- Centos7升级python版本
升级Python 我的安装目录是/home/python 下载 ` cd /home/python wget https://www.python.org/ftp/python/3.5.0/Pytho ...
- Spring Boot:Thymeleaf篇
Spring Boot干货系列:(四)Thymeleaf篇http://www.cnblogs.com/zheting/p/6707037.html 前言 Web开发是我们平时开发中至关重要的,这里就 ...
- 使用cocos2d-js-3.0RC1中的物理引擎chipmunk模拟的“别碰钉子”源码分享(含碰撞检测)
分别用box2d和chipmunk实现了一下,不过box2d没整理,也懒得整理了.chipmunk整理了一下,分享给大家吧. 刚开始研究,抛砖引玉 简要说明:1.初始化物理环境,增加边界 initPh ...
- mysql系列之7.mysql读写分离
准备 下载如下linux安装包 jdk-6u31-linux-x64-rpm.bin amoeba-mysql-binary-2.2.0.tar.gz # crontab -e //同步时间 */ ...
- 在非OnPaint里应该使用ClientDC来画图
import wx class Example(wx.Frame): def __init__(self, parent, title): super(Example, self).__init__( ...
- ubuntu 下解决sublime v3 中文输入法时 退格键删除不了拼音的问题
ubuntu下,sulime想要支持中文需要这样设置: 1.安装中文输入解决的github git clone https://github.com/lyfeyaj/sublime-text-imfi ...
- 【题解】Making The Grade(DP+结论)
[题解]Making The Grade(DP+结论) VJ:Making the Grade HNOI-D2-T3 原题,禁赛三年. 或许是我做过的最简单的DP题了吧(一遍过是什么东西) 之前做过关 ...