近日稍微对Android中的驱动开发做了一些简要的了解,稍稍理清了一下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为闭源部分.本文只是对驱动开发思路以及代码执行流程作了个简介,如有错误的地方还请指正。

更多相关文章

  1. 没有一行代码,「2020 新冠肺炎记忆」这个项目却登上了 GitHub 中
  2. Android(安卓)NDK学习笔记6-JNI对引用数据类型的操作
  3. # Android+Java后端(Springboot,Mybatis)开源小商店项目
  4. Android(安卓)UI绘制流程(一)
  5. Android与设计模式:用单一职责则为Activity解耦
  6. Ashmem 对 Android(安卓)内存分配与共享的增强
  7. Android键值上报流程
  8. android view层次与位置大小
  9. Android(安卓)简单图片浏览器(疯狂Android讲义第三版)

随机推荐

  1. Android学习与面试重点目录
  2. Android 实用工具之HierarchyViewer
  3. android屏幕分辨率详解 ldpi mdpi hdpi
  4. 使用maven构建android 的apk包并自动签名
  5. Android自动化测试框架开发(二)Monkey、Mon
  6. Android(安卓)中 shape 图形的使用
  7. 删除Android工程中冗余资源
  8. Android(安卓)学习 之 API文档汇总(不断更
  9. android性能测试方法
  10. Android(安卓)- Unparsed aapt error(s)