近日稍微对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. Double类parseDouble()和valueOf()方法的区别

    数字类型的String字符串转换为浮点数通常采用parseDouble()和valueOf()方法, 两者主要是存在以下两点区别. 区别一:参数区别Double.parseDouble(java.la ...

  2. Spring属性编辑器详解

    1.常见的属性的注入:int,string,list,set,map 2.什么是属性编辑器及作用? (1)将spring配置文件中的字符串转换为相应的java对象 (2)spring内置了一些属性编辑 ...

  3. MySQL 忘记密码解决办法

    第一步: 关闭MySQL服务.  第二步: 打开DOS窗口,在里面输入安装MqSQL的目录本机为:C:\Program Files\MySQL\MySQL Server 5.6\bin 第三步: 在命 ...

  4. 10个迷惑新手的Cocoa&Objective-c开发问题

    本文转载至  http://blog.csdn.net/lvxiangan/article/details/27964733     language background run­time thre ...

  5. OpenFileDialog对话框Filter属性(转)

    OpenFileDialog对话框的Filter属性说明: 首先说明一个示例,分析一下Filter属性的构成:“ Excel文件|*.xls ”,前面的“Excel文件”成为标签,是一个可读的字符串, ...

  6. zendstudio 13.0

    官网原版下载 http://downloads.zend.com/studio-eclipse/13.0.0/ZendStudio-13.0.0-win32.win32.x86.exe 破解补丁: 链 ...

  7. nvl()与regexp_replace()

    NVL(字段,0):将空值转化为0 regexp_replace(字段, ‘[1-9]‘ ,'') is not null; 将数字转化为0

  8. Oracle伪列rownum

    Oracle基础知识:伪列rownum,伪列就像表中的列一样,但是在表中并不存储.伪列只能查询,不能进行增删改操作. 在查询的结果集中,ROWNUM为结果集中每一行标识一个行号,第一行返回1,第二行返 ...

  9. Bootstrap——全局CSS样式

    1.栅格系统 containter:用于固定宽度并支持响应式布局的容器 container-fluid:用于100%宽度,占据全部视口(viewport)的容器 row:行,必须在container或 ...

  10. JVM性能分析工具详解--MAT等

    获得堆转储文件 巧妇难为无米之炊,我们首先需要获得一个堆转储文件.为了方便,本文采用的是 Sun JDK 6.通常来说,只要你设置了如下所示的 JVM 参数: -XX:+HeapDumpOnOutOf ...