近日稍微对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层驱动开发简介的更多相关文章

  1. 基于335X平台Linux交换芯片驱动开发

    基于335X平台Linux交换芯片驱动开发   一.软硬件平台资料 1.开发板:创龙AM3359核心板,网口采用RMII形式. 2.Kernel版本:4.4.12,采用FDT 3.交换芯片MARVEL ...

  2. Linux 下wifi 驱动开发(三)—— SDIO接口WiFi驱动浅析

    SDIO-Wifi模块是基于SDIO接口的符合wifi无线网络标准的嵌入式模块,内置无线网络协议IEEE802.11协议栈以及TCP/IP协议栈.可以实现用户主平台数据通过SDIO口到无线网络之间的转 ...

  3. Linux 下wifi 驱动开发(四)—— USB接口WiFi驱动浅析

    源: Linux 下wifi 驱动开发(四)—— USB接口WiFi驱动浅析

  4. Linux GPIO键盘驱动开发记录_OMAPL138

    Linux GPIO键盘驱动开发记录_OMAPL138 Linux基本配置完毕了,这几天开始着手Linux驱动的开发,从一个最简单的键盘驱动开始,逐步的了解开发驱动的过程有哪些.看了一下Linux3. ...

  5. Android 从上层到底层-----kernel层

    CPU:RK3288 系统:Android 5.1 功能:上层 app 控制 led 亮灭 开发板:Firefly RK3288 1.在dts文件中增加 led 设备 path:kernel/arch ...

  6. 移植Linux Kernel SM750 驱动到VxWorks 7

    一.SM750简介 SM750 是SiliconMotion 推出的一款适合嵌入式设备的显卡(Embedded GPU),采用PCIe接口与CPU连接,内部集成16MB DDR SDRAM显存,产品具 ...

  7. Linux Kernel 0.12 启动简介,调试记录(Ubuntu1804, Bochs, gdb)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  8. 转: 嵌入式linux下usb驱动开发方法--看完少走弯路【转】

    转自:http://blog.csdn.net/jimmy_1986/article/details/5838297 嵌入式linux下的usb属于所有驱动中相当复杂的一个子系统,要想将她彻底征服,至 ...

  9. Cucumber 行为驱动开发简介

    Cucumber 是一个能够理解用普通语言 描述的测试用例的支持行为驱动开发(BDD)的自动化测试工具,用Ruby编写,支持Java和.Net等多种开发语言. 现在看看Cucumber中用到的术语 . ...

随机推荐

  1. webpack 样式分离之The root route must render a single element

    公司项目使用的是webpack1,使用extract-text-webpack-plugin 插件无法将css分离出来,检查原因,发现有如下代码 <Route path="/home& ...

  2. Mysql 索引增加与删除

    [1]索引 索引,通俗理解,即目录. 之前说过,计算机是对现实世界的模拟.目录应用在数据库领域,即所谓的索引. 目录的作用显而易见,所以建立索引可以大大提高检索的速度. 但是,会降低更新表的速度,如对 ...

  3. Flask,ORM及模板引擎Jinja2

    跨域:http://blog.csdn.net/yannanxiu/article/details/53036508 下载flask_cors包 pip install flask-cors 使用fl ...

  4. windowsphone8.1学习笔记之应用数据(三)

    之前说了如何操作文本文件,如果是图片文件或者其他的二进制文件则需要操作文件的Stream或者Buffer数据.就需要用到DataReader和DataWriter这两个类了,这个的好好的练一下,以后的 ...

  5. apache 301重定向到带www的二级域名

    Options +FollowSymlinks RewriteEngine on rewritecond %{http_host} ^nlike.cn [nc] rewriterule ^(.*)$ ...

  6. JAVA中int与String类型的相互转换

    Java的int和String类型间互相转换,小功能但是经常用到,下面是几种实现的方法: 字符串类型String转换成整数int 1. int i = Integer.parseInt([String ...

  7. BZOJ4390: [Usaco2015 dec]Max Flow

    BZOJ4390: [Usaco2015 dec]Max Flow Description Farmer John has installed a new system of N−1 pipes to ...

  8. java中byte转string的方法有哪些?

    1.第一种 byte b = 1; String valueOf = String.valueOf(b) 2.第二种 byte b = 1; String st = Byte.toString(b); ...

  9. LeetCode:用最少的箭引爆气球【452】

    LeetCode:用最少的箭引爆气球[452] 题目描述 在二维空间中有许多球形的气球.对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标.由于它是水平的,所以y坐标并不重要,因此只要知道 ...

  10. Java基础教程:多线程基础(4)——Lock的使用

    Java基础教程:多线程基础(4)——Lock的使用 快速开始 Java 5中Lock对象的也能实现同步的效果,而且在使用上更加方便. 本节重点的2个知识点是:ReentrantLock类的使用和Re ...