Android与Linux区别详细介绍.ppt_第1页
Android与Linux区别详细介绍.ppt_第2页
Android与Linux区别详细介绍.ppt_第3页
Android与Linux区别详细介绍.ppt_第4页
Android与Linux区别详细介绍.ppt_第5页
已阅读5页,还剩46页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、10 Android驱动,1, Linux核心与驱动 2, Android专用驱动 3, Android设备驱动 4, EMB9G45 平台LED驱动开发,10.1 Linux核心与驱动,Android使用Linux2.6内核。 Android1.0 使用 Linux2.6.25 Android1.5 使用 Linux2.6.27 Android1.6 使用 Linux2.6.29 Android2.1 使用 Linux2.6.30 Android2.2 使用 Linux2.6.32 .,|- Makefile (全局的Makefile) |- bionic (Bionic含义为仿生,这里面是

2、一些基础的库的源代码) |- bootloader (引导加载器) |- build (build目录中的内容不是目标所用的代码,而是编译和配置所需要的脚本和工具) |- dalvik (JAVA虚拟机) |- development (程序开发所需要的模板和工具) |- external (目标机器使用的一些库) |- frameworks (应用程序的框架层) |- hardware (与硬件相关的库) |- kernel (Linux2.6的源代码) |- packages (Android的各种应用程序) |- prebuilt (Android在各种平台下编译的预置脚本) |- re

3、covery (与目标的恢复功能相关) - system (Android的底层的一些库),10.1 Android源码第一级目录,10.1 Linux核心与驱动,Linux内核在Android源代码中的目录:kernel Android中内核的结构和标准的Linux 2.6内核基本是相同的,但增加了一些私有内容,主要是在Linux内核中增加了一些驱动 Android的专用驱动 Android使用的设备驱动 Android对Linux内核的更改较小,但增加了一些没有加入标准Linux内核的内容,例如yaffs文件系统,10.2 Android专用驱动,Ashmem 匿名共享内存 Binder

4、基于OpenBinder系统驱动,为Android平台提供IPC支持 Logger 轻量级的 log 驱动 能源管理(android power management) 基于Linux的轻量级的能源管理,为嵌入式系统做了优化 Android PMEN 物理内存驱动 Low Memory Killer 在缺少内存的情况下,杀死进程,10.2.1 Ashmem,Ashmem(anonymous shared memory) 匿名共享内存,通过内核的机制,为用户空间程序提供分配内存的机制,实现类似malloc的功能。 Ashmem设备节点名称:/dev/ashmem。 主设备号为10(Misc Dr

5、iver),次设备号自动生成 Ashmem驱动程序在内核中的头文件和代码路径: kernel/include/linux/ashmem.h kernel/mm/ashmeme.c 在用户空间C libutils库对其进行了封装并提供了接口: system/core/libcutils/ashmem-dev.c:在用户空间的调用封装 system/core/libcutils/ashmem-host.c:没有使用 system/core/include/cutils/ashmem.h:简单封装头文件,10.2.2 Binder,Android的Binder驱动程序 为用户层程序提供了IPC(进程

6、间通信)的支持,Android整个系统的运行依赖于Binder驱动 Binder 设备节点名称:/dev/binder 主设备号为10(Misc Driver),次设备号动态生成 Binder 驱动程序在内核中的头文件和代码路径如下: kernel/include/linux/binder.h kernel/drivers/misc/binder.c,10.2.2 Binder,在用户空间libutil工具库和Service Manage 守护进程中调用Binder接口提供对整个系统的支持: frameworks/base/cmds/servicemanager/:Service Manage

7、r守护进程的实现 frameworks/base/include/utils/:Binder驱动在用户空间的封装接口 frameworks/base/libs/utils/:Binder驱动在用户空间的封装实现 Binder 是Android 中主要使用的IPC 方式,通常只需要按照模版定义相关的类即可,不需要直接调用Binder 驱动程序的设备节点。,10.2.3 Logger,Android 的Logger驱动程序为用户层程序提供log支持,这个驱动作为一个工具来使用。 Logger有三个设备节点: /dev/log/main /dev/log/event /dev/log/radio 主

8、设备号为10(Misc Driver),次设备号动态生成,10.2.3 Logger,logger驱动在内核中的头文件和代码路径如下: kernel/include/linux/logger.h kernel/drivers/misc/logger.c 在Android的用户空间logcat程序调用logger驱动: System/core/logcat/:可执行程序 logcat 是一个可执行程序,用户取出系统log 信息,这是在系统中使用的一个辅助工具。,10.3 Android使用的设备驱动,Framebuffer 显示驱动 Event 输入设备驱动 v412 摄像头-视频驱动 OSS

9、音频驱动 ALSA 音频驱动 MTD 驱动 蓝牙驱动 Wlan 驱动,10.3.1 Framebuffer显示驱动,对嵌入式系统,Framebuffer 通常作为其LCD 控制器或者其他显示设备的驱动。 Framebuffer 驱动是一个字符设备,在文件系统中的设备节点:/dev/fbX 主设备号为29,次设备号递增生成。 代码路径: include/linux/fb.h drivers/video/fbmem.c,10.3.1 Framebuffer显示驱动,10.3.1 Framebuffer显示驱动,Framebuffer驱动在用户空间大多使用ioctl、mmap等文件系统的接口进行操作

10、 ioctl 用于获得和设置信息,mmap 可以将Framebuffer 的内存映射到用户空间 Framebuffer 驱动也可以直接支持write 操作,直接用写的方式输出显示内容,10.3.2 Event输入设备驱动,Input 驱动程序是Linux 输入设备的驱动程序,分成游戏杆(joystick)、鼠标(mouse)和事件设备(Event queue)3 种驱动程序。 其中事件驱动程序是目前通用的驱动程序,可支持键盘、鼠标、触摸屏多种输入设备。 Input 驱动程序的主设备号是13,3 种驱动程序的设备号分配是: joystick 游戏杆:061 mouse 鼠标:3362 mice

11、鼠标:63 事件设备(Event queue):6495,10.3.2 Event输入设备驱动,Event设备在文件系统中的设备节点为: /dev/input/eventX 主设备号为13,次设备号递增生成,为64-95 Input 驱动程序的头文件:include/linux/input.h Input驱动程序的核心和Event部分代码路径: drivers/input/input.c:核心代码 drivers/input/vevdev.c:event部分的实现,10.3.2 Event输入设备驱动,10.3.2 Event输入设备驱动,Event 设备在用户空间大多使用read、ioctl

12、、poll 等文件系统的接口进行操作,read 用于读取输入信息,ioctl 用于获得和设置信息 poll 调用可以进行用户空间的阻塞,当内核有按键等中断时,通过在中断中唤醒poll 的内核实现,这样在用户空间的poll 调用也可以返回。,10.3.3 v4l2摄像头-视频驱动,v4l全称是Video4Linux(Video for Linux),是Linux内核中标准的关于视频驱动程序。现在使用的版本是Video4Linux2(Video for Linux Two) v4l2驱动的设备节点:/dev/video/videoX 主设备号为81,对于视频设备,次设备号为0-63;Radio设备

13、,为64-127;对于Teletext,为192-223;VBI(Vertical Blank Interrupt)设备为224-255.,10.3.3 v4l2摄像头-视频驱动,v4l2驱动主要头文件路径: include/linux/videodev.h:v4l第一版的头文件 include/linux/videodev2.h:定义主要的数据接口和常量 include/media/v4l2-dev.h:设备头文件,具体设备使用其中接口注册 v4l2驱动核心实现路 drivers/media/video/v4l2-dev.c v4l2驱动通常可以配合Android中Camera或者Overl

14、ay的硬件抽象层使用,10.3.3 v4l2摄像头-视频驱动,10.3.4 OSS音频驱动,OSS(Open Sound System,开放声音系统), 数字音频设备,用于播放或录制数字化的声音 OSS驱动是字符设备,其主设备号为14,次设备号为各个设备单独定义。OSS主要有以下几种设备文件 /dev/mixer:次设备号为0,访问声卡中内置的mixer,调整音量大小 /dev/sndstat:次设备号为6,测试声卡 /dev/dsp:次设备号为3,读此设备相当于录音,写此设备相当于放音,10.3.4 OSS音频驱动,OSS驱动程序的主要头文件 include/linux/soundcard.

15、h:OSS驱动的主要头文件 include/linux/sound.h:定义OSS驱动的次设备号和注册函数 OSS驱动程序的核心: sound/sound_core.c Android没有直接使用OSS驱动,可以基于OSS驱动实现Android Audio部分的硬件抽象层,10.4 Android驱动开发,驱动开发的主要工作有两个部分: Linux驱动开发 Android系统硬件抽象层 Linux中的驱动工作在内核空间,Android系统硬件抽象层工作在用户空间,有了这两个部分的结合,就可以让庞大的Android系统运行在特定的硬件平台上。,10.4 Android驱动开发,10.4.1 Li

16、nux 驱动开发,下面将介绍如何在EMB9G45开发平台上进行LED驱动开发 EMB9G45 开发平台的LED 部分硬件原理图,如右图所示,10.4.1 Linux 驱动开发,EMB9G45 核心板上设计有3 个用户可编程的LED(D6D8),颜色各不相同,本驱动使用其中的D7 与D8 D7 与D8 的正极分别与“+3V3”相连,负极分别间接与at91sam9g45 处理器的PD31、PD0 相连,即PD31、PD0 输出低电平时,LED 亮;输出高电平时,LED 灭。,10.4.1 Linux 驱动开发,设备驱动程序首先应包含设备的注册和释放函数,即static int _init leds

17、_ctrl_init(void)和static void _exit leds_ctrl_exit(void) 代码如下,10.4.1 Linux 驱动开发,leds_ctrl_init(void) 函数调用platform_driver_register(&leds_ctrl_driver)函数来注册设备的驱动程序。 leds_ctrl_driver 结构体如下:,10.4.1 Linux 驱动开发,static int leds_ctrl_probe(struct platform_device *pdev):检测设备 static int leds_ctrl_remove(struct

18、platform_device *pdev):移除设备。 name 变量为设备名 owner 定义了设备的所有者,一般初始化为THIS_MODULE,10.4.1 Linux 驱动开发,file_operations 结构体是一个函数指针集合,定义能够在设备上进行的操作,比如open()、read()、write()、release()、ioctl()操作。 驱动程序中定义的file_operations 结构体如下: 变量open 定义的leds_ctrl_open 用于打开LED 设备,变量release 定义的leds_ctrl_release用于释放LED 设备。,10.4.1 Lin

19、ux 驱动开发,变量ioctl 定义的leds_ctrl_ioctl 则是用于控制LED 灯的亮灭,其具体定义如下:,10.4.1 Linux 驱动开发,传入函数leds_ctrl_ioctl 的参数有4 个, file 保存文件的读写位置, inode 记录文件上的物理信息。 cmd 是应用程序用于区别设备驱动程序请求处理内容的值。 至于变量arg,向上层(或硬件抽像层)进行值传递,10.4.2 HAL(硬件抽象层),Hardware Abstraction Layer 硬件抽象层是一个轻量级(lightweight)的运行环境,提供了简单的设备驱动程序接口,应用程序使用设备驱动程序与底层硬

20、件之间进行通信。HAL应用程序接口和ANSIC标准库结合在一起,这样用户可以使用C语言库函数来访问Android文件系统。 HAL是基于Linux Kernel与Libraries和Android Runtime之间。也就是说,HAL是底层硬件设备驱动程序暴露给Application Framework (也就是通常我们使用的Android API )的一个接口层。 提示:Android硬件抽象层的接口是本地移植层的接口,不属于标准API,不具有向前或者向后兼容性。,10.4.2 HAL(硬件抽象层),内核驱动编写的最终目的是去控制开发平台上的led灯D7、D8,所以JNI 需要调用led 硬

21、件抽象层代码与内核通信 led 硬件抽象层头文件leds_hal.h 定义结构体,通过此结构体JNI调用硬件抽象层函数:,10.4.2 HAL(硬件抽象层),硬件抽象层的c 文件leds_hal.c 定义结构成员get_leds_ctrl_dev:,10.4.2 HAL(硬件抽象层),硬件抽象层与Linux 内核驱动的通信,需包含头文件sys/ioctl.h 应用程序的启动时,相关函数通过层层调用到这里的leds_ctrl_open(),当系统调用open(FILE_PATH, O_RDWR)时,操作系统会将文件系统对应路径为FILE_PATH 的设备文件inode 中的file_operat

22、ions 安装进用户进程的task_struct 中的file_struct,然后再调用具体文件的file_operations 中的open 函数 其他操作close、ioctl 也是如此,10.4.2 HAL(硬件抽象层),open(FILE_PATH, O_RDWR)是通过读、写方式(所以在访问设备节点前要修改设备节点的权限,改为可读可写)打开一个路径为FILE_PATH 的设备,如果打开设备出错,返回值为-1,打开正确返回值为一个不小于0 的文件描述符。 后期的其他操作都是通过控制文件描述符来完成对设备的操作。,10.4.2 HAL(硬件抽象层),硬件抽象层的c 文件leds_hal.

23、c中的部分代码如下,10.4.2 HAL(硬件抽象层),10.4.2 HAL(硬件抽象层),10.4.3 Android NDK,Android NDK 是配合Android SDK的工具,它集成了交叉编译器,并提供了相应的mk 文件隔离CPU、平台、ABI 等差异,开发人员只需要简单修改mk 文件(指出“哪些文件需要编译”、“编译特性要求”等),就可以创建出so NDK可以自动地将so 和Java 应用一起打包,极大地减轻了开发人员的打包工作。 比较简单的说,NDK是一套交叉编译工具,它可以帮你把你用C 或C+书写的代码,编译为.so格式的文件,使你可以在你的Android 程序当中用Java

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论