基于安卓系统的相机的模块设计与实现.doc

上传人:laozhun 文档编号:2392784 上传时间:2023-02-17 格式:DOC 页数:36 大小:150.50KB
返回 下载 相关 举报
基于安卓系统的相机的模块设计与实现.doc_第1页
第1页 / 共36页
基于安卓系统的相机的模块设计与实现.doc_第2页
第2页 / 共36页
基于安卓系统的相机的模块设计与实现.doc_第3页
第3页 / 共36页
基于安卓系统的相机的模块设计与实现.doc_第4页
第4页 / 共36页
基于安卓系统的相机的模块设计与实现.doc_第5页
第5页 / 共36页
点击查看更多>>
资源描述

《基于安卓系统的相机的模块设计与实现.doc》由会员分享,可在线阅读,更多相关《基于安卓系统的相机的模块设计与实现.doc(36页珍藏版)》请在三一办公上搜索。

1、. 436.2.3 HAL 层测试 . 446.3 CAMERA 拍摄效果测试. 45第七章 结束语.49致谢.51参考文献.53目 录第一章 绪论.11.1 选题背景及研究意义 .11.2 国内外研究现状 .11.3 主要研究内容 .21.4 论文结构安排 .3第二章 相关技术概述.52.1 ANDROID 平台框架.52.2 LINUX 内核相关概念简介 .72.2.1 Linux 用户空间和内核空间 .72.2.2 Linux 系统调用 .82.2.3 Linux 设备驱动 .8第三章 ANDROID 的开发环境搭建 .113.1 ANDROID 移植概述. 113.2 ANDROID

2、开发环境的搭建.123.2.1 开发所需软件资源.123.2.2 开发所需硬件资源.15第四章 ANDROID 下的 CAMERA 模块分析和设计 .174.1 CAMERA 应用层、运行时环境、库介绍.174.2 CAMERA HAL 层分析和设计 .174.3 LINUX 驱动层分析和设计 .194.3.1 Camera 控制器驱动 .194.3.2 Camera Sensor 驱动.204.4 整体框架.23第五章 ANDROID 下的 CAMERA 模块实现.255.1 基于 V4L2 标准的 CAMERA 模块实现.255.1.1 HAL 层实现.255.1.2 Linux 驱动层实

3、现 .275.2 CAMERA 模块的普通字符设备方式实现.385.2.1 HAL 层实现.385.2.2 Linux 驱动层实现 .39第六章 CAMERA 模块的测试.416.1 CAMERA 模块的测试环境.416.2 CAMERA 模块的功能测试.426.2.1 Camera 硬件测试 .42第一章 绪论1第一章 绪论1.1 选题背景及研究意义随着科技的发展和无线移动互联网的普及,手机的功能越来越强大,人们对手机的需求也不仅仅是基本的打电话或玩简单的小游戏了,人们更多的是希望手机能像电脑一样方便,所以智能手机渐渐成为人们选择的目标。而 Google 的Android 系统凭借其通用、开

4、源、免费的特点迅速的在短时间内占有了大量的市场,成为时下手机终端产品时下的热门。而作为 Android 智能手机的必备功能之一的拍照功能更是常成为用户选择 Android 产品的重要依据,其质量、稳定性、拍摄效果往往可以左右人们的选择。Android 是基于 Linux 内核的软件平台和操作系统,是 Google 在 2007 年 11月 5 日公布的手机系统平台,早期由 Google 开发,后由开放手机联盟(OpenHandset Alliance)开发。它采用了软件堆层(Software Stack,又名以软件叠层)的架构,主要分为三部分。低层以 Linux 内核工作为基础,只提供基本功能

5、;其他的应用软件则由各公司自行开发,以 Java 作为编写程序的一部分。Android 下的 Camera 模块同样分为三部分,应用层,HAL 层,Linux 驱动层。应用层由 Google 提供参考代码,有较完善的接口,HAL 层需要与驱动层相配合,HAL 层通常由芯片厂商提供参考代码,由于没有统一的标准,不同的芯片公司会有不同的代码结构。驱动层会涉及 Camera 控制器驱动和 Camera Sensor 驱动,Camera 控制器驱动会由芯片厂商提供参考代码,Camera Sensor 驱动是手机设计公司根据Camera控制器驱动提供的接口来对具体的Camera外设进行初始化和配置以协调

6、Camera控制器和Camera Sensor使他们能够正常工作。但在Camera HAL层到驱动层没有固定的代码编写标准,这就为代码的编写提供了各种的框架结构,不利于手机的研发。针对这些问题,本文以实现某一块开发板上的 Android Camera 模块开发为背景,研究 Camera 的在 HAL 和驱动层的工作过程和原理,帮助开发者更好的理解和尽快的解决 Android Camera 相关的问题,提升 Android 手机研发进度。1.2 国内外研究现状首款 Android 手机是由 Google 和 HTC(宏达电)联合推出的 HTC G1,它以Android 为操作系统,包含移动电话工

7、作所需的全部软件。随后,Android 平台的研发队伍阵容强大,包括 Google、HTC(宏达电)、T-Mobile、高通、摩托罗拉、AbstractWith the rapid development of mobile internet, more people start to use smartphones. In all of these operating systems for smart phone, android system, withgoogles supports and its open source characteristic, has been suppor

8、ted by variouscompanies. Camera equipment as an essential component of smart phone, has becomean important part of peoples attention. About camera, android system provides betterinterfaces for camera applications in upper layer. But in android HAL layer and linuxdriver layer, there is no standard fr

9、amework for camera module. As a result, this paper,developing and porting an android camera module in a development board as thebackground, introduces the development environment of android system and theporting of android, deeply analyzes and researches the HAL layer, camera controllerdriver and ca

10、mera sensor driver, summarizes the working principle and working flowof camera module in android system, and realizes the HAL layer and linux driver layerof the camera module in a development board based on V4L2 standard and regularcharacter device model.Keyword: android camera application HAL layer

11、 camera controller drivercame ra sensor drive rra 模块设计和实现4ra 模块设计和实现2三星、LG 以及中国移动在内的 34 家企业都有基于该平台开发手机的新型业务。在中国,台湾的联发科也在2010的北京国际通信展上展出了他们的4、5款Android手机,而台湾的 mstar、上海的展讯通讯等公司也正在积极研发基于 Android 平台的手机。关于 Android 下的 Camera 模块,在 Linux 下,存在一个 V4L(Video For Linux)标准,它由 AlanCox在 bttv驱动接口基础上改进而来,在 2006/2007

12、年发展为现在的 V4L2 标准。它为视频设备在 Linux 内核和用户层应用程序提供了一系列接口函数。由于 Android 是以 Linux为内核,所以 Android 下的 Camera 模块可以按照 V4L2 标准来写 HAL 层和内核驱动,但其中的 HAL 层必须与 Android 的一些标准接口相配合。但并不是所有的芯片设计公司都会使用这种标准,由于芯片设计不同和方便移植,一些芯片公司往往会按照自己的结构来设计 Camera 模块,由于 Camera 设备属于字符设备,所以这些芯片公司通常会在 Linux下以普通字符设备驱动的方式来设计 Camera 的驱动,在 HAL 层会根据驱动提

13、供的调用接口来设计 HAL 层。Camera 模块还包括 Camera Sensor,它通常由 Sensor 公司提供,如OmniVision、美光、格微科、比亚迪等。这些公司设计 Camera Sensor 的硬件设备,提供相关的硬件文档给手机设计公司,通常这些 Sensor 的特性都具有很多的相似性,需要根据相应的文档配合手机芯片来完成 Camera 模块。1.3 主要研究内容本文以三星 6410 芯片为平台、OV(OmniVision)系列的 Camera Sensor,辅助对比高通 7227 芯片,分析 Android 下的 Camera 模块框架和各部分特征。主要完成的工作有:1.

14、研究国内外关于 Android 的发展现状,介绍 Linux 开发环境下 Android 系统移植的相关知识;2. 分析和总结了 Android 下 Camera HAL 层相关的结构;3. 分析某芯片公司的 Camera 控制器驱动,总结其相关工作逻辑;4. 研究 Camera Sensor 的工作原理;5. 按照所总结方法设计了 Android 的 Camera 模块并在某个三星 6410 芯片的开发板上实现其功能。由于 Camera 模块涉及 Camera 应用层、HAL 层、芯片上的 Camera 控制器驱动、Camera Sensor 驱动、Camera 硬件设备的连接,这些部分存在

15、紧密的联系,某一层的问题往往会影响到整个模块的正常工作,所以在实现 Camera 模块的过程中,对问题的排查,对代码的调试也是模块实现的重要组成部分。ra 模块设计和实现62. Application Frameworks(应用框架)应用程序就是依赖应用框架层次 API 开发的。应用架构设计的初衷是:简化组件复用机制;任何应用都能发布自己的功能,这些功能又可以被任何其他应用使用(当然要受来自框架的强制安全规范的约束)。和复用机制相同,框架允许组件的更换。所有应用都是一组服务和系统,一般包含: 一套丰富且可扩展的视图 组件,含有 lists, grids, text boxes, buttons

16、, 甚至嵌入的网络浏览器; Content Providers(内容提供器) 使一个应用可以访问另外一个应用的数据(如联系人),或者使一个应用内部可以共享自身数据; Resource Manager(资源管理器),提供对非编码资源例如本地化字符串、图形和布局文件的访问通道; Notification Manager(通告管理器),使应用在状态栏显示自定义的警报通知; Activity Manager(行动管理器)负责管理应用的生命周期,提供通用导航回退支持。3. Libraries(库)Android 包含一套 C/C+库,Android 系统的各式组件都在使用。这些功能通过 Android

17、应用框架暴露给开发人员。下面列举一些核心库: SystemC library - 衍生于 BSD 的标准 C 系统库(libc)实现(注:BSD:Berkeley Software Distribution,伯克利软件套件,是 Unix 的衍生系统,1970年代由伯克利加州大学开创),尤其支持嵌入式的基于 Linux的设备; Media Libraries - 媒体库基于 PacketVideos OpenCORE;媒体库支持很多流行音频和视频格式、静态图形文件(包括 MPEG4, H.264, MP3, AAC,AMR, JPG, and PNG)的播放和录制; Surface Manage

18、r - 管理范围:对子系统显示功能的访问,跨应用的无缝组合 2D 和 2D 图形层; LibWebCore - 是流行的浏览器引擎,可以支持 Android 浏览器和嵌入应用的 WEB 视图组件; SGL - 底层的 2D 图形引擎; 3D libraries - 基于 OpenGL ES 1.0 API 的实现;该类库使用硬件 3D 加速器(如果硬件支持的话)或者内置的、高度优化的 3D 软件加速机制; FreeType - 支持位图和矢量字体; SQLite - 能干、轻量级的关系型数据库引擎,面向所有应用。4. Android Runtime(Android 运行时)第一章 绪论31.4

19、 论文结构安排论文共分为六章,各章主要内容如下:第一章:绪论。提出项目背景及研究意义、国内外研究现状、论文的主要研究内容和组织结构。第二章:相关技术概述。列举并详细描述研究过程中涉及到的关键理论和技术,其中包括 Android 平台框架介绍、Linux 内核相关概念介绍。第三章:Android 的开发环境搭建及移植概述。介绍 Android 手机开发所需要的软硬件环境。首先介绍开发所需配置的主机环境,如何获取开发所需源码。接下来根据源码编译需求进一步对主机环境进行配置,分别编译源码的不同部分。之后介绍源码所需要运行在的硬件环境。第四章:Android 下的 Camera 模块分析。通过分析把

20、Camera 模块分为 Camera应用层、HAL 层、Linux驱动层三个部分,指出 Camera 模块功能实现主要在 HAL层、Linux驱动层,驱动层又分为 Camera 控制器驱动和 Camera Sensor 驱动。接着分析 HAL 层和 Linux驱动层的工作流程,以及所涉及设备的工作原理。第五章:Android 下的 Camera 模块实现。通过 Android 提供的接口函数实现Camera 模块的 HAL 层,在驱动层分别使用 V4L2 标准和普通字符驱动模式实现Camera 的 Linux 驱动。第六章:调试和测试。首先介绍 Camera 模块从硬件到 Android HA

21、L 层的功能调试方法。再介绍 Camera 成像效果相关的知识,通过配合必要的检测设备修改驱动程序完成 Camera 成像效果的调试。最后通过在不同的环境下测试 Camera的功能和成像效果。第七章:总结。对 android 终端产品前景展望,对论文内容进行概括总结。第二章 相关技术概述7Android 的核心类库提供 Java 类库所提供的绝大部分功能。每个 Android 应用都运行在自己的进程上,享有 Dalvik 虚拟机为它分配的专有实例。为了支持多个虚拟机在同一个设备上高效运行,Dalvik 被改写过。Dalvik虚拟机执行的是 Dalvik 格式的可执行文件(.dex)该格式经过优

22、化,以降低内存耗用到最低。Java 编译器将 Java 源文件转为 class 文件,class 文件又被内置的 dx工具转化为 dex格式文件,这种文件在 Dalvik 虚拟机上注册并运行。 在一些底层功能比如线程和低内存管理方面,Dalvik 虚拟机是依赖 Linux内核的。5. Hardware Abstraction Layer(硬件抽象层)Android 的 HAL(硬件抽象层)是 Google 因应厂商“希望不公开源码”的要求下,所推出的新观念,HAL 的目的是为了把 Android framework 与 Linuxkernel 完整“隔开”。让 Android 不至过度依赖 L

23、inux kernel,让 Android framework的开发能在不考虑驱动程序的前提下进行发展。6. Linux Kernel(Linux 内核)Android 依赖 Linux 2.6 版,提供核心系统服务:安全、内存管理、进程管理、网络组、驱动模型。内核部分还相当于一个介于硬件层和系统中其他软件组之间的一个抽象层次。2.2 Linux 内核相关概念简介因为 Camera 模块的驱动是 Linux 下的驱动,其 HAL 层代码也需要与 Linux内核进行交互,所以有必要介绍一些 Linux内核概念帮助理解。2.2.1 Linux 用户空间和内核空间Linux 为了保证程序的独立操作,

24、保护资源不受非法访问,让操作系统运行在两种不同的级别。例如应用程序运行在用户空间,驱动程序运行在内核空间,这个任务是由 CPU 完成的。所有的现代处理器都具备这个功能,在较低的级别中将禁止某些操作。程序代码只能通过有限数目的“门”来从一个级别切换到另一个级别。当前所有处理器都至少具有两个级别,而其他一些处理器,比如 x86 系列,则有更多的级别。当处理器存在多个级别时,Linux 使用最高级别和最低级别。在 Linux 中,内核运行在最高级别(也称作超级用户态),在这个级别中可以进行所有的操作。而应用程序运行在最低级别(即所谓的用户态),在这个级别中,处理器控制着对硬件的直接访问以及对内存的非

25、授权访问。每当应用程序执行系统调用或者被硬件中断挂起时,Linux 将执行模式从用ra 模块设计和实现8户空间切换到内核空间。2.2.2 Linux 系统调用所谓系统调用,就是内核提供的、功能十分强大的一系列的函数。这些系统调用是在内核中实现的,再通过一定的方式把系统调用给用户,一般都通过门(gate)陷入(trap)实现。系统调用是用户程序和内核交互的接口1。系统调用在 Linux 系统中发挥着巨大的作用,如果没有系统调用,那么应用程序就失去了内核的支持。系统调用是用户接口在内核中的实现,如果没有系统调用,用户就不能利用内核。不同 CPU 处理系统调用的方法也不一样。比如 x86 系列处理器

26、通过中断0x80,从用户态切换到内核态,通过处理器寄存器传递参数,执行系统调用。Arm系列的处理器通过改变状态寄存器 CPSR 来从用户态切换到内核态,执行系统调用。一般系统调用的过程如下:1. 执行用户程序;2. 根据 glibc 中的函数实现,取得系统调用号并执行 int $0x80 产生中断(arm处理器通过改变状态寄存器);3. 进行地址空间的转换和堆栈的切换,执行 SAVE_ALL(进行内核模式);4. 进行中断处理,根据系统调用表调用内核函数;5. 执行内核函数;6. 执行 RESTORE_ALL 并返回用户模式。2.2.3 Linux 设备驱动驱动是一个允许高级计算机软件与硬件交

27、互的程序,这种程序建立了一个硬件与硬件,或硬件与软件沟通的界面,经由主板上的总线或其它沟通子系统与硬件形成连接的机制,这样的机制使得硬件设备上的数据交换成为可能2。Linux 设备驱动在 Linux 内核里扮演着特殊的角色。它们是截然不同的“黑盒子”,使硬件的特殊的一部分响应定义好的内部编程接口。它们完全隐藏了设备工作的细节。用户的活动通过一套标准化的调用来进行,这些调用与特别的驱动是独立的;设备驱动的角色就是将这些调用映射到作用于实际硬件的和设备相关的操作上。这个编程接口是这样,驱动可以与内核的其他部分分开建立,并在需要的时候在运行时“插入”2。Linux 将设备驱动分为三类:字符设备驱动、

28、块设备驱动和网络设备驱动。字符设备指那些必须以串行顺序依次进行访问的设备,如触摸屏、鼠标、Camera第二章 相关技术概述5第二章 相关技术概述2.1 Android 平台框架Android 平台是一组面向移动设备的软件包,它包含了一个操作系统、中间件和关键应用程序。开发人员可以使用 Android SDK(软件开发工具包)为这个平台创造应用程序。应用程序使用 Java 语言编写并在 Dalvik 之内运行。Dalvik 是一款量身定制的虚拟机,它专为嵌入式应用设计,运行在 Linux 内核上层,其框架分为 Applications,Application Frameworks,Librari

29、es,Android Runtime,HardwareAbstraction Layer,Linux Kernel,如图 2.1 所示。Android AnatomyApplicationshome dialer IM Brower Camera .Application FrameworksActivityManagerWindowsManagerContentProvidersResourceManagerNotificationManager.Android RuntimeCore LibrariesDalvik Virtual MachineLibrariesSurfaceManage

30、rMediaFrameworksSQLite WebKitLibc .Hardware Abstraction LayerGraphicsAudio Camera Blutooth GPS .Linux KernelDisplay Driver Camera diver USB DriverKeypad Driver .图 2.1 Android 平台框架1. Applications(应用)Android 将预装一组核心应用程序,包括 email 客户端、短信服务、日历日程、地图服务、浏览器、联系人和其他应用程序。所有应用程序都是 Java 编程语言编写的。第二章 相关技术概述9等。块设备可

31、以以任意顺序进行访问,以块为单位进行操作,如硬盘、nand 等3。字符设备和块设备驱动设计有很大差异,但对于用户层而言,他们都是用文件操作接口 open()、close()、read()、write()等函数进行访问。而网络设备驱动是面向数据包的发送和接收设计的,它并不对应于文件系统的节点。Linux 驱动与上层应用、应用的关系如图 2.2 所示。用户应用程序Linux系统调用接口硬件设备c语言库函数Linux文件系统字符设备驱动块设备驱动网络设备驱动图 2.2 Linux 应用层与底层硬件的交互过程图 2.2 描述了 Linux 下应用层与底层硬件通信的过程,应用程序通过 c 库函数或 Li

32、nux系统调用操作设备节点,通过 Linux的文件系统找到对应的驱动操作,通过驱动与硬件设备交互。ra 模块设计和实现10章 Andrid 的开发环境搭建11第三章 Android 的开发环境搭建3.1 Android 移植概述Android 可以运行在 Google 提供的模拟器上,也可以运行在具体与硬件相关的开发板上。运行在模拟器上的 Android 不涉及 Linux 内核部分,主要是为了方便上层开发,对需要各个外设参与的应用程序,Google 提供了一系列的模拟代码,使之可以像真实的设备一样,为用户的应用程序提供参考。本文的 Android Camera 模块的开发,需要在一块基于 A

33、rm 芯片的开发板上运行。需要软件硬件两个方面的支持。本章介绍 Android Camera 模块开发在软件硬件方面的需求。首先需要一台基于 x86 的 PC 机作为开发使用的机器,并需要在这台机器上安装必要的操作系统,在对其进行配置。使其能够编译 Android,并能够把编译成的文件下载到开发板上。而本文所述 Android 移植是在真实的设备上,根据不同的芯片、不同的外设,提供能够使这些硬件正常工作的代码。将 Android 移植到某个开发板上,通常需要移植三个部分:Bootloader, LinuxKernel 和 Android 文件系统。1. Bootloader 移植Bootloa

34、der 是在 Linux 内核运行之前运行的一段程序,它通常对 CPU、内存、flash、串口等进行初始化,移植需要根据开发板相关的硬件特性配置相关设配。Bootloader 还担负着下载代码到开发板上的任务,通过相关的选项让 Bootloader运行时停在某个位置,通过选择相应 Linux 内核和 Android 文件系统,之后把它们烧写到开发板的 nand 上,以便下次运行时调用。本文主要是对 Android 下Camera 模块的研究和开发,所以对 Bootloader 移植不做详细分析,默认 Bootloader不存在任何问题。2. Linux 内核移植Linux 内核移植需要根据不同

35、的芯片外设。通过 make menuconfig 命令配置对应的通用硬件,再根据芯片和产品不同的硬件特性编写相应的驱动程序,通过修改 Makefile 和 Kconfig 把它们编入内核,最后通过 Bootloader 提供的方法把内核文件烧写到开发板上。3. Android 文件系统移植Android 文件系统需要根据不同的用途,根据不同的芯片公司的设备提供与ra 模块设计和实现12设备通行的用户层代码,使用户可以方便的使用开发板的硬件资源。由于 Android 内核是基于 Linux 的,基于 Linux 内核的操作系统是较好的。现在成熟的 Linux 发行版有 Ubuntu,Fedora,Debian 等。本章以 Ubuntu10.04 为操作系统配置开发环境。3.2 Android 开发环境的搭建本文的 Android Camera 模块的开发,需要在一块基于 Arm 芯片的开发板上运行。需要软件硬件两个方面的支持。本章介绍 Android Camera 模块开发在软件硬件方面的需求。首先需要一台基于 x86 的 PC 机作为开发使用的机器,并需要在这台机器上安装必要的操作系统,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号