ImageVerifierCode 换一换
格式:DOCX , 页数:48 ,大小:38.80KB ,
资源ID:6749126      下载积分:12 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/6749126.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(android驱动开发和移植详解汇总.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

android驱动开发和移植详解汇总.docx

1、android驱动开发和移植详解汇总android驱动开发和移植详解本文出处:Android 底层开发技术实战详解内核、移植和驱动我们开发的 Android 驱动程序是基于 Linux 内核的,本文首先介绍移植 Android 系统的基本知识和基本原理,这也是为驱动开发打下坚实基础,知其然也知其所以然;最后我们将通过深入浅出的案例学习驱动开发过程。1.1 驱动开发需要做的工作Android 作为当前最流行的手机操作系统之一,受到了广大开发人员和商家的青睐。Android正在逐渐形成一个蓬勃发展的产业,带来了无限商机。既然 Android 这么火爆,我们程序员可以学习它的哪一方面的内容呢?本书的

2、驱动开发又属于哪一领域呢?接下来将为读者奉上这两个问题的答案。Android 是一个开放的系统,这个系统的体积非常庞大,开发人员无须掌握整个 Android 体系中的开发知识,只需熟悉其中某一个部分即可收获自己的未来。从具体功能上划分,Android 开发主要分为如下三个领域。1. 移植开发移动电话系统移植开发的目的是构建硬件系统,并且移植 Android 的软件系统,最终形成手机产品。2. Android 应用程序开发应用程序开发的目的是开发出各种 Android 应用程序,然后将这些应用程序投入 Android 市场,进行交易。Android 的应用程序开发是 Android 开发的另一个

3、方面。从开发的角度来看,这种形式的开发可以基于某个硬件系统,在没有硬件系统的情况下也可以基于 Linux 或者 Windows 下的 Android模拟器来开发。这种类型的开发工作在 Android 系统的上层。事实上,在 Android 软件系统中,第 3 个层次(Java 框架)和第 4 个层次(Java 应用)之间的接口也就是 Android 的系统接口(系统 API)。这个层次是标准的接口,所有的 Android 应用程序都是基于这个层次的接口开发出来的。Android 系统的第 4 个层次就是一组内置的 Android应用程序。Android 应用程序开发者开发的应用程序和 Andr

4、oid 系统的第 4 个层次的应用程序其实是一个层次的内容。例如,Android 系统提供了基本的桌面程序,开发者可以根据 Android 的系统接口,实现另外一个桌面程序,提供给用户安装使用。根据 Android 系统的接口开发游戏,也是Android 底层开发技术实战详解内核、移植和驱动Android 应用程序开发的一个重要方向。 上述两种类型的开发结构如图 3-1 所示。主屏幕联系人电话浏览器应用程序活动管理器窗口管理器内容提供器视图系统通知管理器应用程序框架应用程序开发包管理器电话管理器资源管理器本地管理器XMPP服务接口管理器包管理器包管理器持久层库Android 运行 环境Dalv

5、ik虚拟 机器包管理器位图及矢量浏览器引擎库2D图形引 擎中间协议libc函数库显示驱动相机驱动蓝牙驱动Flash内存驱 动Binder IPC 驱动Linux内核层能源管理USB驱动键盘驱动WiFi驱动音频驱动移植开发各种硬件图 3-1 Android 开发的领域3. Android 系统开发系统开发的目的是升级或改造 Android 中已经存在的应用和架构,开发出有自己特色的手机系统。例如联想手机乐 Phone 就是在 Android 基础上打造的一款适合国人使用习惯的手机系统,如图 3-2 所示。58图 3-2乐 Phone Android 系统开发的一个比较典型的示例就是当系统需要某种

6、功能时,为了给 Java 层次的应用程序提供调用的接口,需要从底层到上层的整体开发,具体步骤如下所示。 增加 C 或者 C+和本地库。 定义 Java 层所需要的类(系统 API)。 将所需要的代码封装成 JNI。 结合 Java 类和 JNI。 应用程序调用 Java 类。 一定要慎重对待对 Android 系统 API 的改动工作,因为系统 API 的稍微变动就可能会涉及Android 应用程序的兼容问题。Android 系统本身的功能也处于增加和完善的过程中,因此 Android 系统的开发也是一个重要的方面。这种类型的开发涉及 Android 软件系统的各个层次。在更多的时候,Andr

7、oid 系统开发只是在不改变系统 API 的情况下修正系统的缺陷,增加系统的稳定性。从商业模式的角度来看,第一种类型的开发和第二种类型的开发是 Android 开发的主流。事实上,移动电话的制造者主要进行第一种类型的开发,产品是 Android 实体手机;公司、个人和团体都可以进行第二种类型的开发,其产品是不同的 Android 应用程序。在 Android 的开发过程中,每一种类型的开发都只涉及整个 Android 系统的一个子集。在Android 系统中有着众多开发点,这些开发点相互独立,又有内在联系。在开发的过程中,需要重点掌握目前开发点涉及的部分。背景说明:Android API 的接

8、口是用 Java 语言编写的,通常更改接口函数的格式(参数、返回值)、常量的值等内容就相当于更改系统 API。Android 是一个开放的系统,适用于从最低端直到最高端的智能手机。核心的 AndroidAPI 在每部手机上都可使用,但仍然有一些 API 接口有一些特别的适用范围:这就是所谓的“可选 API”。在为某手机编写 Android 应用程序时,需要多少地对 Android API 进行修改,然后实现我们需要的功能。例如使用 Android API 添加蓝牙程序和 Wi-Fi 程序。在更改 AndroidAPI 时,通常更改其接口函数的格式(参数、返回值)和常量值等内容。但是 Andro

9、idAPI 毕竟是谷歌推出的一系列标准,为了方便以后系统的升级,建议大家不改变Android API 的格式,而是只改变 Android API 的具体行为,也就是说为这些固定的Android API 编写各种各样的应用程序。1.2 Android 移植 本书讲解的是 Android 驱动方面的开发知识,由图 3-1 可知,驱动开发是底层的应用,属于Linux 内核层的工作。因为驱动是系统和硬件之间的载体,涉及不同硬件的应用问题,所以需要做系统移植工作。本节将简要介绍系统移植方面的有关问题。59Android 底层开发技术实战详解内核、移植和驱动1.2.1 移植的任务Android 移植开发的

10、最终目的是开发手机产品。从开发者的角度来看,这种类型的开发以具有硬件系统为前提,在硬件系统的基础上构建 Android 软件系统。这种类型的开发工作在 Android系统的底层。在软件系统方面,主要的工作集中在以下两个方面。(1)Linux 中的相关设备驱动程序驱动程序是硬件和上层软件的接口。在 Android 手机系统中,需要基本的屏幕、触摸屏、键盘等驱动程序,以及音频、摄像头、电话的 Modem、Wi-Fi、蓝牙等多种设备驱动程序。(2)Android 本地框架中的硬件抽象层在 Android 中硬件抽象层工作在用户空间,介于驱动程序和 Android 系统之间。Android 系统对硬件

11、抽象层通常都有标准的接口定义,在开发过程中,实现这些接口也就给 Android 系统提供了硬件抽象层。 上述两个部分综合起来相互结合,共同完成了 Android 系统的软件移植。移植成功与否取决于驱动程序的品质和对 Android 硬件抽象层接口的理解程度。Android 移植开发的工作由核心库、Dalvik 虚拟机、硬件抽象层、Linux 内核层和硬件系统协同完成,具体结构如图 3-3 所示。核心库Dalvik虚拟机硬件抽象层Linux内核层(各种驱动)硬件系统移植图 3-3Android 移植结构1.2.2 移植的内容在 Android 系统中,在移植过程中主要移植驱动方面的内容。Andr

12、oid 移植主要分为如下几个类型。 基本图形用户界面(GUI)部分:包括显示部分、用户输入部分和硬件相关的加速部分,还 包括媒体编解码和 OpenGL 等。 音视频输入输出部分:包括音频、视频输出和摄像头等。 连接部分:包括无线局域网、蓝牙、GPS 等。 电话部分:包括通话、GSM 等。 附属部件:包括传感器、背光、振动器等。具体来说主要移植下面的内容。 Display 显示部分:包括 FrameBuffer 驱动和 Gralloc 模块。 Input 用户输入部分:包括 Event 驱动和 EventHub。 Codec 多媒体编解码:包括硬件 Codec 驱动和 Codec 插件,例如 O

13、penMax。 3D Accelerator(3D 加速器)部分:包括硬件 OpenGL 驱动和 OpenGL 插件。60 Audio 音频部分:包括 Audio 驱动和 Audio 硬件抽象层。 Video Out 视频输出部分:包括视频显示驱动和 Overlay 硬件抽象层。 Camera 摄像头部分:包括 Camera 驱动(通常是 v4l2)和 Camera 硬件抽象层。 Phone 电话部分:包括 Modem 驱动程序和 RIL 库。 GPS 全球定位系统部分:包括 GPS 驱动(例如串口)和 GPS 硬件抽象层。 Wi-Fi 无线局域网部分:包括 Wlan 驱动和协议和 Wi-Fi

14、 的适配层。 Blue Tooth 蓝牙部分:包括 BT 驱动和协议及 BT 的适配层。 Sensor 传感器部分:包括 Sensor 驱动和 Sensor 硬件抽象层。 Vibrator 振动器部分:包括 Vibrator 驱动和 Vibrator 硬件抽象层。 Light 背光部分:包括 Light 驱动和 Light 硬件抽象层。 Alarm 警告器部分:包括 Alarm 驱动和 RTC 系统和用户空间调用。 Battery 电池部分:包括电池部分驱动和电池的硬件抽象层。注意:在 Android 系统中有很多组件,但并不是每一个组件都需要移植,例如那些纯软的组件就不需要移植。像浏览器引擎

15、虽然需要下层的网络支持,但是实际上并不需要直接为其移植网络接口,而是通过无线局域网或者电话系统数据连接来完成标准的网络接口。1.2.3 驱动开发的任务前面介绍了 Android 系统的基本知识和移植内容,那么究竟在驱动开发领域需要做什么工作呢?我们的任务就是为某一个将要在 Android 系统上使用的硬件开发一个驱动程序。因为 Android是基于 Linux 的,所以开发 Android 驱动其实就是开发 Linux 驱动。对于大部分子系统来说,硬件抽象层和驱动程序都需要根据实际系统的情况来实现,例如传感器部分、音频部分、视频部分、摄像头部分和电话部分。另外也有一些子系统的硬件抽象层是标准的

16、,只需实现 Linux 内核中的驱动程序即可,例如输入部分、振动器部分、无线局域网部分和蓝牙部分等。对于有标准的硬件抽象层的系统,有的时候通常也需要做一些配置工作。随着 Android 系统的更新和发展,它已经不仅仅是一个移动设备的平台,也可以用于消费类电子和智能家电,例如 3.0 以后的版本主要是针对平板电脑的,另外电子书、数字电视、机顶盒、固定电话等都逐渐使用 Android 系统。在这些平台上,通常需要实现比移动设备更少的部件。一般来说,包括显示和用户输入的基本用户界面部分是需要移植的,其他部分是可选的。例如电话系统、振动器、背光、传感器等一般不需要在非移动设备系统上实现,一些固定位置设

17、备通常不需要实现 GPS 系统。1.3 Android 对 Linux 的改造Android 内核是基于 Linux 2.6 内核的,这是一个增强内核版本,除了修改部分 Bug 外,还提供了用于支持 Android 平台的设备驱动。Android 不但使用了 Linux 内核的基本功能,而且对 Linux进行了改造,目的是实现更为强大的通信功能。611.3.1 Android 对 Linux 内核文件的改动在本书第 1 章的内容中已经讲解过 Linux 内核的基本知识,其实 Android 对 Linux 内核也进行了改动,这些改动保存在下面的文件中。drivers/misc/kernel_d

18、ebugger.cdrivers/misc/pmem.cdrivers/misc/qemutrace/qemu_trace_sysfs.cdrivers/misc/qemutrace/qemu_trace.cdrivers/misc/qemutrace/qemu_trace.hdrivers/misc/uid_stat.cdrivers/staging/android/lowmemorykiller.cdrivers/staging/android/logger.cdrivers/staging/android/timed_output.hdrivers/staging/android/ram

19、_console.cdrivers/staging/android/timed_gpio.cdrivers/staging/android/logger.hdrivers/staging/android/binder.hdrivers/staging/android/binder.cdrivers/staging/android/timed_output.cdrivers/staging/android/timed_gpio.hdrivers/rtc/alarm.cdrivers/rtc/rtc-goldfish.cdrivers/net/pppolac.cdrivers/net/ppp_mp

20、pe.cdrivers/net/pppopns.cdrivers/video/goldfishfb.cdrivers/switch/switch_class.cdrivers/switch/switch_gpio.cdrivers/char/dcc_tty.cdrivers/char/goldfish_tty.cdrivers/watchdog/i6300esb.cdrivers/input/misc/gpio_event.cdrivers/input/misc/gpio_input.cdrivers/input/misc/gpio_output.cdrivers/input/misc/key

21、chord.cdrivers/input/misc/gpio_axis.cdrivers/input/misc/gpio_matrix.cdrivers/input/keyreset.cdrivers/input/keyboard/goldfish_events.cdrivers/input/touchscreen/synaptics_i2c_rmi.cdrivers/usb/gadget/android.cdrivers/usb/gadget/f_adb.hdrivers/usb/gadget/f_mass_storage.hdrivers/usb/gadget/f_adb.cdrivers

22、/usb/gadget/f_mass_storage.c62drivers/mmc/host/goldfish.cdrivers/power/goldfish_battery.cdrivers/leds/ledtrig-sleep.cdrivers/mtd/devices/goldfish_nand_reg.hdrivers/mtd/devices/goldfish_nand.ckernel/power/earlysuspend.ckernel/power/consoleearlysuspend.ckernel/power/fbearlysuspend.ckernel/power/wakelo

23、ck.ckernel/power/userwakelock.ckernel/cpuset.ckernel/cgroup_debug.ckernel/cgroup.cmm/ashmem.cinclude/linux/ashmem.hinclude/linux/switch.hinclude/linux/keychord.hinclude/linux/earlysuspend.hinclude/linux/android_aid.hinclude/linux/uid_stat.hinclude/linux/if_pppolac.hinclude/linux/usb/android.hinclude

24、/linux/wifi_tiwlan.hinclude/linux/android_alarm.hinclude/linux/keyreset.hinclude/linux/synaptics_i2c_rmi.hinclude/linux/android_pmem.hinclude/linux/kernel_debugger.hinclude/linux/gpio_event.hinclude/linux/wakelock.hinclude/linux/if_pppopns.hnet/ipv4/sysfs_net_et/ipv4/af_et/ipv6/af_et/bluetooth/af_bl

25、uetooth.csecurity/commoncap.cfs/proc/base.c1.3.2 为 Android 构建 Linux 的操作系统如果我们以一个原始的 Linux 操作系统为基础,改造成一个适合于 Android 的系统,所要做的工作其实非常简单,仅仅是增加适用于 Android 的驱动程序。在 Android 中有很多 Linux 系统的驱动程序,将这些驱动程序移植到新系统的步骤非常简单,具体来说有以下三个步骤。编写新的源代码。在 KConfig 配置文件中增加新内容。63 在 Makefile 中增加新内容。在 Android 系统中,通常会使用 FrameBuffer 驱

26、动、Event 驱动、Flash MTD 驱动、Wi-Fi 驱动、蓝牙驱动和串口等驱动程序。并且还需要音频、视频、传感器等驱动和 sysfs 接口。移植的过程就是移植上述驱动的过程,我们的工作是在 Linux 下开发适用于 Android 的驱动程序,并移植到 Android 系统。在 Android 中添加扩展驱动程序的基本步骤如下所示。 在 Linux 内核中移植硬件驱动程序,实现系统调用接口。 在 HAL 中把硬件驱动程序的调用封装成 Stub。为上层应用的服务实现本地库, Dalvik 虚拟机调用本地库来完成上层 Java 代码的实现。由编写 Android 应用程序,提供 Andro

27、id 应用服务和用户操作界面。1.4 内核空间和用户空间接口是一个媒介驱动程序是供系统使用硬件的,也就是说,驱动程序是介于系统和硬件之间的桥梁。 Linux在下开发这些中间桥梁的驱动程序时,需要用到内核空间和用户空间之间的接口。1.4.1 内核空间和用户空间的相互作用 现在,越来越多的应用程序需要编写内核级和用户级的程序来一起完成具体的任务。通常采用以下模式:首先,编写内核服务程序利用内核空间提供的权限和服务来接收、处理和缓存数据;然后,编写用户程序和先前完成的内核服务程序进行交互。具体来说,可以利用用户程序来配置内核服务程序的参数,提取内核服务程序提供的数据,当然也可以向内核服务程序输入待处

28、理数据。 比较典型的应用包括 Netfilter(内核服务程序:防火墙);Iptable(用户级程序:规则设置程序);IPSEC(内核服务程序:VPN 协议部分);IKE(用户级程序:VPN 密钥协商处理);当然还包括大量的设备驱动程序及相应的应用软件。这些应用都是由内核级和用户级程序通过相互交换信息来一起完成特定任务的。1.4.2 系统和硬件之间的交互实现硬件和系统的交互是底层开发的主要任务之一。在 Linux 平台下有如下 5 种实现此功能的方式。1. 编写自己的系统调用 系统调用是用户级程序访问内核最基本的方法。目前 Linux 大致提供了二百多个标准的系统调用(具体请参考内核代码树中的

29、“include/asm-i386/unistd.h” “arch/i386/kernel/entry.S”和文件),并且允许我们添加自己的系统调用来实现和内核的信息交换。假如我们想建立一个系统调用日志系统,将所有的系统调用动作记录下来,以便进行入侵检测,此时可以编写一个内核服务程序,该程序负责收集所有的系统调用请求,并将这些调用信息记录到在内核中自建的缓冲里。我们无64法在内核里实现复杂的入侵检测程序,因此必须将该缓冲里的记录提取到用户空间。最直截了当的方法是自己编写一个新系统调用实现这种提取缓冲数据的功能。当内核服务程序和新系统调用都实现后,就可以在用户空间里编写用户程序执行入侵检测任务了

30、,入侵检测程序可以定时、轮询或在需要的时候调用新系统调用从内核提取数据,然后进行入侵检测。2. 编写驱动程序Linux/UNIX 的一个特点就是把所有的东西都看做文件(every thing is a file)。系统定义了简洁完善的驱动程序界面,客户程序可以用统一的方法通过这个界面和内核驱动程序交互。而大部分系统的使用者和开发者已经非常熟悉这种界面及相应的开发流程了。驱动程序运行于内核空间,用户空间的应用程序通过文件系统中“/dev/”目录下的一个文件来和它交互。这就是我们熟悉的文件操作流程:open()read()write()ioctl()close()。注意:并不是所有的内核驱动程序都是这个界面,网络驱动程序和各种协议栈的使用就不大一致,比如套接口编程虽然也有 open(),close()等概念,但它的内核实现及外部使用方式都和普通驱动程序有很大差异。这里先不谈设备驱动程序在内核中要做的中断响应、设备管理、数据处理等工作,在此先把注意力集中在它与用户级程序交互这一部分。操作系统为此定义了一种统一的交互界面,就是前面所说的 open()、read()、write()、ioctl()和 close()等。每个驱动程序按照自己的需要做独立实现,把自己提供的功能和服务隐藏在这个统一界面下。客户级程序选择需要的驱动程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1