Android 驱动和系统开发 1. 一个简单的例子(原创).pdf
文本预览下载声明
Android 驱动和系统开发 1. 一个简单的例子(原创)
分类: Linux JNI Android2012-07-03 15:38 3192人阅读 评论(13) 收藏 举报
首先,边学习边记录点自己的代码,希望看了我写的代码觉得不怎么样的,多多
提出来,让我也学习学习,我一定会虚心接受大家的指导。
这里我们是来学习 android 驱动和 android系统框架的,这里我只针对于整个
android设备驱动的一个流程,从上到下的调用,而且在这里我们去使用 android
源码环境,原因是我使用的电脑比较破,编译 android会挂,而且 android BSP
太大了,git下来很麻烦,所以这里我只是选用了ubuntu的环境来学习 android 底
层和系统层的开发,那么有人会问,没有源代码,如何去学习呢,又如何来演示
出来呢?不急,慢慢道来,首先还是来谈一下 android的底层和系统层,下图供
参考,基本每个设计 android的工程师都知道这张图
android使用的是 Linux 内核,虽然说稍微改了点东西,增加了些移动嵌入式设
备的特性,比如说 early suspend、进程间通信(bind)、特有的 log机制(logcat)
等,但是 Linux主流的一些东西都没有改变,所以,这里我们还是使用 Linux下
得驱动作为底层来学习,具体的 android的特性,之后的博客中会做深入。
Linux内核驱动之上应该是 android的 HAL层,也就是传说中得硬件抽象层,我
把这玩意一直理解成是 Linux 应用层,虽然,有的厂家的代码写的比较庞大,
比较好得还是使用 C++的类来封装,典型的设备是传感器模块,一般都会有一
个 HAL层来衔接,这里我们使用 Linux 的应用层编程 c/c++来实现调用驱动来
收发数据等操作。
在上面应该是 JNI层啦,在我们的学习中,JNI的基础知识在我的另外一个博客
专栏中有提到,在这里我们也是使用 JNI来实现接口。
然后是 framework,我们还是使用 java代码封装 JNI,然后写一些 java的测试
代码,当然了,没有 android的 UI,对于 java的 UI编程,我也是没玩过,对于
java我只是一个初学者,写测试代码还凑合,一般都是一边 google一边写的 ^0^
接下来就开始行动吧,首先是我们的驱动部分,这些代码都是我自己写的,所以
难免会有很多写的不对的地方,希望大家觉得我哪边写的不好的多提些意见,毕
竟我也只是一个小菜鸟。
这个驱动完成的主要任务是从内核空间向用户空间发送一个坐标信息(模拟鼠标
的动作),当然了,我们的驱动是虚拟的,当然不会主动的向用户空间 poll数据,
所以,我们要先自己往文件系统中写数据,然后驱动会通过 input 子系统向 user
space发送数据。
下面是我驱动的一个结构图,一般我写个驱动都会先考虑很多,然后再着手去做,
三思而后行嘛,驱动的整体架构如果出了问题,到最后是很难再修正的,只有重
新写。
可以看到,我们的思路很清晰,初始化的时候开一个线程,注意这个线程是一个
死循环,但是在循环当中有一个试图获得信号量的动作,如果得不到,就会进入
休眠,如下是 thread的代码:
1 span style=font-size:16px;static int work_thread(void *data)
2 {
3 int x, y, ret;
4 struct virtual_dev *pvdev = (struct virtual_dev *)data;
5 struct semaphore sema = pvdev-sem;
6 // poll the data into user space
7 printk(KERN_INFO work thread running!!);
8
9 while(pvdev-running) {
10 do{
11 ret = down_interruptible(sema);
12 } while(ret == -EINTR);
13 //printk(done!\n);
14 //poll the x and y data into user space
15 x = pvdev-x;
16 y = pvdev-y;
17 input_report_abs(pvdev-input, ABS_X, x);
18 input_report_abs(pvdev-input, ABS_Y, y);
19 input_sync(pvdev-input);
20 printk(position: %d | %d\n, x, y);
21 }
22 return 0;
23 }/sp
显示全部