Android HAL层与Linux Kernel层驱动开发简介

近日稍微对Android中的驱动开发作了一些简要的了解,稍稍理清了一下Android驱动开发的套路,总结一下笔记。linux

HAL:Hardware Abstract Layer 硬件抽象层,因为Linux Kernel须要遵循GPL开源协议,硬件厂商为了保护本身硬件方面的各项参数不被外泄,而一个设备的驱动程序包含了硬件的一些重要参数,因此驱动的开源势必会使硬件厂商蒙受损失,Google为了保护硬件厂商的利益,因此在Android系统中加入了HAL层,在HAL层中没必要遵循GPL协议,因此代码能够封闭。 
因此若是硬件驱动开源的写在Kernel里,Framework直接调用,而不肯意开源的就写在HAL层里,实现闭源。框架

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


一,编写驱动期以及LoadingTime: 
编写驱动分为两个部分,一个是HAL层的驱动代码,一个是Kernel层的驱动代码。3d

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。blog

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()往下就是硬件了。get

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

相关文章
相关标签/搜索