Android驱动程序编写过程记录

本文仅仅记录开发驱动程序的一个过程,以供以后编写驱动进行参考
第一步:编写LINUX内核层的驱动程序
这个很通用的一层,编写后不管是集成在内核中还是单独的ko文件,到最后系统启动后都需要在dev目录下生成设备节点 。
第二步:编写HAL层驱动程序
这层代码一般放在/xxx/目录中,这层跟内核中的代码类似,都是C代码,但是该层操作dev目录下生成的设备节点,同时也为层操作做准备,把可以提供给层的功能写一遍,该文件需要定义一个结构
名字必须是
也是固定的
LE_ID是自定义的,之后JNI层查找就是根据该ID查找的,这里要注意一点
LE_ID的定义为一个字符串,此字符串定义要与.mk中的定义一致,否则在JNI层
初始化调用函数时会失败,现在做的驱动 := .$(M)
那么LE_ID就得定义为“”,不能为其他,因为系统查找是根据文件名查找的竟然 。。。。
定义,里面包含的是公共方法
然后呢在open方法中对设备控制结果进行初始化,驱动方法都在此函数中进行赋值

结构定义
// 定义一个继承自的结构, 记录本stub操作设备时需要包括的接口
结构以及宏定义都需要定义在一个头文件中,因为JNI层也需要该头文件 。。。
到这里HAL层基本就OK了,编译完成后会在/lib/hw中生成对应的so动态库,JNI层就会操作这个动态库
第三步:编写JNI层
这时候就需要到目录下了,我为了管理方便在该目录下直接建立了一个专门目录,虽然不符合要求 。。。
进入到我的目录,建立个java目录跟jni目录 。进入jni目录
将刚才HAL层的头文件建立个超链接引过来
建立个cpp文档,这个文档就是JNI层的具体实现文档,该文档命名也有要求类名.cpp

Android驱动程序编写过程记录

文章插图
在该文档中入口函数为
函数自己写用来实现方法的注册
该文档中对下操作定义的设备,对中实现的方法进行包装
然后声明到方法中以供JAVA层调用,如下定义:
在init函数中有使用(LE_ID, ( const**)&)获取设备
就在这里系统会根据LE_ID去查找HAL层生成的so动态库文件
然后对设备对象进行各种操作
这部分代码需要生成一个运行库以供JAVA层调用,真麻烦 。。。
JAVA层不能调用HAL层生成的库而只能用JNI层的库?太深奥 。。。
到这里该层就可以进行编译,会在/lib目录下生成一个so库
第四步:中的Sever实现,就是JAVA层了
【Android驱动程序编写过程记录】到第三步新建的目录中,进入java目录,然后新建com....等目录,进入目录中新建.aidl文档,在其中