通过前面的文章,我们介绍了Android的binder机制和远程服务调用。在这篇文章中,主要介绍了Android的应用程序调用部分系统服务时的原理。
但是本文得先介绍一下如何编写一个简单的驱动程序,先介绍了驱动程序,然后在通过JNI让framework层访问这个驱动程序,在通过注册服务来封装这个功能,最后在把这个服务添加到系统中,实现上层应用通过访问这个服务来操作驱动,当然你必须要掌握和了解 :
Android中如何编译源码(可以去 中找到这篇文章)
如果没有编译过Android源码的话,下面的内容将会看的很吃力的。
声明:本文内容参考罗升阳的书籍:《Android系统源代码情景分析》 如果想了解更详细的内容建议购买此书,大神的博客地址:
一、编写内核驱动程序
这里不会介绍内核驱动小程序内容,因为没什么好说的,就是Linux系统api,然后在了解一下驱动的概念即可。这里主要介绍操作步骤,关于代码后面我会给出下载地址,感兴趣的同学可以自己详细看一下。
第一步:进入源码内核目录创建驱动程序目录
cd kernel/drivers
在这个目录中,我们新建一个我们自己的驱动目录freg:
看到这个目录中有很多系统的驱动程序。然后就在这个freg目录中编写驱动程序:
这里的就是驱动程序,这里,我们不会为真实的硬件设备编写内核驱动程序。为了方便描述为Android系统编写内核驱动程序的过程,我们使用一个虚拟的硬件设备,这个设备只有一个4字节的寄存器,它可读可写。
第二步:配置驱动程序编译信息
在freg目录中新增Kconfig和Makefile两个文件,其中Kconfig是在编译前执行配置命令make menuconfig时用到的:
而Makefile是执行编译命令make是用到的:
第三步:将驱动程序到系统配置中
上面配置完了驱动程序自身的编译信息,如果想把这个驱动程序编译到内核中,还需要配置内核信息,修改arch/arm/Kconfig和drivers/kconfig两个文件,在menu "Device Drivers"和endmenu之间添加一行:
source "drivers/hello/Kconfig"
这样,执行make menuconfig时,就可以配置hello模块的编译选项了。修改drivers/Makefile文件,添加一行:
第四步:编译内核驱动
在内核目录下运行命令:make menuconfig
"Device Drivers" => "First Android Drivers"选项,设置为y:
这样就编译驱动程序成功了,下面就开始编译内核源码
第五步:启动模拟器检查驱动程序
到源码的根目录中,运行命令:
emulator -kernel ./kernel/common/arch/arm/boot/zImage &
有的同学可能会遇到这个错误,不过没关系,咋们在运行一下脚本文件:
如果运行成功的话,就可以看到模拟器了:
这时候,我们使用adb shell命令查看驱动程序的功能:
首先驱动程序肯定是存放在/dev目录中的,如果要进行操作驱动程序,需要到/proc目录中找到指定驱动程序,然后可以使用echo命令写入数据,cat命令读取数据。
到这里,我们就成功的编写了虚拟驱动程序,并且编译到内核中,通过命令访问也是测试通过了。这里采用的是系统提供的方法和驱动程序进行交互,也就是通过proc文件系统和devfs文件系统的方法。
二、编写内核驱动访问程序
有了上面的驱动程序内容,下面为了更好的方便操作这个驱动,我们可以在编写一个简单的C语言来直接访问这个驱动,而操作驱动的方法也很简单,使用open方法即可。
第一步:建立系统程序目录
进入/external/目录,新建一个freg程序目录:
第二步:编写操作驱动程序
这里的代码比较简单,在main函数中直接使用open打开驱动,然后就可以直接读写操作了
第三步:建立编译脚本,然后编译程序
在程序的同一目录下,创建编译脚本:Android.mk文件
参照如何单独编译Android源代码中的模块一文,使用mmm命令进行编译:
mmm ./external/freg
编译成功后,就可以在out/target/product/gerneric/system/bin目录下,看到可执行文件hello了。
重新打包Android系统文件:
make snod
这样,重新打包后的文件就包含刚才编译好的hello可执行文件了。
第四步:运行模拟器
运行模拟器的命令上面已经介绍了,这里就不在演示了,运行成功之后,就可以使用/system/bin/hello可执行程序来访问Linux内核驱动程序:
系统命令都是存放在/system/bin目录下的,我们可以看到找到我们编译的读取驱动的系统命令程序freg,然后可以运行这个程序进行驱动的读写操作了。到此就完成了使用C程序来操作驱动了。
项目案例代码:
三、总结
本文介绍了如何通过编译Android内核源码,来手动的编写一个简单的虚拟驱动程序,然后在写一个简单的C程序访问这个驱动,后续将会介绍如何在Framework层通过JNI来访问这个驱动。
手机看文章有点费劲,可以进入网页版:
关注微信公众号:编码美丽 (微信号:jiangwei0910410003)
1.文章《嵌入式arm 驱动如何编译进内核》援引自互联网,为网友投稿收集整理,仅供学习和研究使用,内容仅代表作者本人观点,与本网站无关,侵删请点击页脚联系方式。
2.文章《嵌入式arm 驱动如何编译进内核》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。
相关推荐
- . 现代买票为什么带上携程保险
- . 潮阳怎么去广州南站
- . 湖南马拉河怎么样
- . 烧纸为什么到三岔路口
- . 百色为什么这么热
- . 神州租车怎么样
- . 芜湖方特哪个适合儿童
- . 护肤品保养液是什么类目
- . 早晚的护肤保养有哪些项目
- . 女孩护肤品怎么保养的最好