不同硬件平台上移植Android的Camera系统

2024-01-02 18:18

本文主要是介绍不同硬件平台上移植Android的Camera系统,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文:http://blog.csdn.net/wxzking/article/details/6311977

对于一个芯片公司,当一款芯片成型后,往往会根据不同客户的不同需求,设计不同的开发板卡,使用不同的外设,但它们的“芯”却是同一颗芯。对于我们刚成型的芯片XP8008(因设计公司机密,随便命名作为代称),就面临着很多这样的情况。

一、        硬件环境描述

当初使用芯片XP8008做Android平台下camera移植时,我们自己设计了开发板卡,使用了公司常用的sensor。Sensor的厂家很多,而且不同sensor都各有利弊。对于sensor的选择,一方面考虑芯片的支持能力,另一方面考虑客户的需求。这里,我假设我们开发阶段使用的sensor型号分别为SSA5526和SSA9076.,SSA5526做为后摄像头,200万像素,SSA9076做为前摄像头,30万像素。目前,已经在这样的硬件环境下,将Android的Camera系统移植了上去。该项目叫做PHONE001。

       最近有一家客户要使用我们的芯片XP8008,但是他们要用的sensor型号为:SSB0520和SSB0903。这两款sensor来自于另外一个厂家。它们的功能与我开发阶段用的相似,像素值完全一样。但不同的是,每个厂家都有自己的寄存器地址选择和bit位意义,而且上电流程也未必一样。

       从整个硬件平台上来看,由于所用芯片相同,只有sensor型号不同,所以可以说整个Camera系统的移植,实际上就是不同sensor驱动的移植。

二、        Camera硬件系统分析

从sensor本身的引脚来看,它们一般有如下一些需要配置的引脚:RESET,PWRDWN,VSYNC,HSYNC,PCLK,MCLK,SCA,SCL,AVDD,DVDD,IOVDD,还有就是数据引脚了。对于30万像素的sensor有8个数据引脚:D0——D7,对于200万像素的sensor有10个数据引脚:D0——D9。

这些引脚的意义大致如下:

RESET:用来reset sensor;RESET一般是低有效,当脉冲为低时,reset sensor,而正常工作时,应该为高。SSA5526中,其为低有效。

PWRDWN:power down引脚,切断供电。PWRDWN一般高有效,当脉冲为高时,进入省电模式,而正常工作时为低。但有些sensor却是低有效,比如SSB0520。在使用不同sensor时,就需要注意这点。SSA5526中,其为高有效。

HSYNC:行同步,sensor在抓取一行数据开始的时刻,通过HSYNC引脚向Camera interface发出信号,告知其。SSA5526中,其为高有效。

VSYNC:帧同步,这个与HSYNC对应,在sensor抓取一帧数据开始时,通过VSYNC引脚向Camera interface发出信号,告知其。SSA5526中,其为低有效。

PCLK:理解为sensor抓取一个像素的脉冲高低。SSA5526中,其为低有效。

MCLK:sensor工作的时钟频率。

SCA和SCL:这是I2C的两条总线线路:SDA为串行数据线,SCL为串行时钟线。它们的工作原理,可以参考注1。

AVDD,DVDD,IOVDD为电压引脚。AVDD为模拟电源引脚,DVDD和IOVDD为数字电源引脚。DVDDIOVDD的关系有待确认。AVDD和IOVDD的关系参考注2。

根据sensor自身的引脚,我们就可以推想出芯片中Camera部分的引脚。如果芯片只支持一个Camera,那芯片只需要上述的引脚即可。但是当芯片支持双Camera时,就需要额外的引脚。PWRDWN需要两个引脚,分别控制不同的sensor,这是因为不同sensor的PWRDWN有效脉冲不一样。另外,数据传输引脚采用CCIR656标准,统一设计了8个数据引脚。

三、        Sensor驱动框架设计

由于不同客户对Sensor的需求不同,可能随时更换不同型号的sensor,所以应该设计一套统一的sensor驱动接口。当sensor型号发生变化时,只需更换对应的文件即可。调用sensor驱动的程序不用变化。鉴于此,我设计如下几个文件:sensor_driver.c/sensor_driver.h用于定义并实现sensor的统一接口。Sensor_SSA5526.c/ Sensor_SSA9076.c/ Sensor_SSB0520.c/ Sensor_SSB0903.c用于不同型号的sensor去实现支持sensor的统一接口。

在文件sensor_driver.h中,定义一个可以描述sensor所有信息的结构体struct sensor_info_t。它包含成员:

I2C读写地址,SSA5526中,I2C写地址为0x60,读地址为0x61;

RESET,PWRDWN,VSYNC,HSYNC,PCLK的有效电平配置;

AVDD,DVDD,IOVDD的电压值配置;

Sensor型号识别信息;

Sensor所支持的捕获图像的最大长和宽,以及图像的格式等;

Sensor支持不同长和宽捕获图像数据时的相应寄存器配置;

Sensor支持的特效的函数接口,比如白平衡调节,亮度变化,饱和度变化,防闪烁等;

这些信息包含了整个Sensor的所有属性及功能,通过获取该结构体,对其操作,可以控制该Sensor。

定义两个这样的结构体:

struct sensor_info_t sensor_front_t;

struct sensor_info_t sensor_back_t;

文件Sensor_SSA5526.c/ Sensor_SSB0520.c去实现sensor_back_t,作为后摄像头;文件Sensor_SSA9076.c/ Sensor_SSB0903.c去实现sensor_front_t,作为前摄像头。在文件sensor_driver.c使用sensor_front_t和sensor_back_t即可。

在文件sensor_driver.h中也定义了供V4L2驱动所调用的sensor统一接口,包含如下接口:

Int sensor_init(uint32_t sensor_id);根据场景,选择前或后sensor,进行初始化;

Int sensor_deinit(void);注销当前使用的sensor;

Int sensor_ioctl(uint32_t cmd, uint32_t arg);通过IOCTRL,调用sensor的特效函数;

Int sensor_set_size(uint32_t width, uint32_t height);设置sensor所要抓取的图像的大小;

这几个接口在sensor_driver.c中实现。

项目不同,使用的sensor也不同。在Makefile中,可以根据项目名称来选择编译哪些型号的sensor文件。比如,当前项目为PHONE002,使用的sensor为SSB0520和SSB0903,以前的项目为PHONE001,使用的sensor为SSA5526和SSA9076,就可以这样写:

Obj-$(CONFIG_PHONE001) += SSA5526.o SSA9076.o

Obj-$(CONFIG_PHONE002) += SSB0520.o SSB0903.o

当编译不同项目时,就会编译对应的sensor驱动文件。

四、        Sensor驱动移植

根据上面描述的Sensor驱动框架设计,在移植sensor驱动时,需要做的就是实现SSB0520.c/SSB0903.c,然后修改Makefile文件即可。对于文件SSB0520.c/SSB0903.c的实现,应该参考SSA5526.c/SSA9076.c的实现,使所有的sensor驱动文件都保持同样的风格,有利于以后的驱动修改。

五、        Camera系统测试

Sensor驱动移植完了,别的文件都不用修改,直接编译。等新的code下载到新的板卡上去后,就可以开机进行Camera测试了。对于新的sensor,我们必须进行全面的功能测试,以确保sensor驱动的正确性。

六、        参考

[注1]I2C工作原理

ISDA数据,SCL时钟.时钟是单片机工作的必要条件之一.单片机的工作必要条件有三个,电源,时钟,复位电路.SDA是单片机工作时传输各种数据的接口。

I2C 总线是一种串行数据总线,只有二根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。在I2C 总线上传送的一个数据字节由八位组成。总线对每次传送的字节数没有限制,但每个字节后必须跟一位应答位。数据传送首先传送最高位(MSB)。首先由主机发出启动信号“S”(SDA在SCL 高电平期间由高电平跳变为低电平),然后由主机发送一个字节的数据。启动信号后的第一个字节数据具有特殊含义:高七位是从机的地址,第八位是传送方向位,0 表示主机发送数据(写),1表示主机接收数据(读)。被寻址到的从机设备按传送方向位设置为对应工作方式。标准I2C 总线的设备都有一个七位地址,所有连接在I2C 总线上的设备都接收启动信号后的第一个字节,并将接收到的地址与自己的地址进行比较,如果地址相符则为主机要寻访的从机,应答在第九位时钟脉冲时向SDA 线送出低电平作为应答。除了第一字节是通用呼叫地址之外第二字节开始即数据字节。数据传送完毕,由主机发出停止信号“P”(SDA在SCL 高电平期间由低电平跳变为高电平)。

[注2] AVDD和IOVDD的关系

AVDD是模拟电源引脚,IOVDD是数字电源引脚,它们应该分别供电,即最好不要采用一个电源供电,在不得不采用一个电源供电时,需要采取隔离、退耦措施,以避免数据电路电源上的噪声对模拟电路通过模拟电源产生干扰。在采用两个电源分别对模拟电路和数字电路分别供电时,可以采用不同的电源电压。如对模拟电路供电的电源电压为3.0V而对数字电路供电的电源电压为3.3V;或者反过来。更多描述,可参考

http://www.eefocus.com/html/09-08/79319s.shtml

Revision History

修订历史记录

Version

版本

Date

日期

Author

作者

Brief Description

变更简要

0.0.1

2011-04-09

Wangxiaozhe

wxiaozhe@163.com

QQ:1226062415

Init draft.

这篇关于不同硬件平台上移植Android的Camera系统的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/563275

相关文章

基于Python实现一个简单的题库与在线考试系统

《基于Python实现一个简单的题库与在线考试系统》在当今信息化教育时代,在线学习与考试系统已成为教育技术领域的重要组成部分,本文就来介绍一下如何使用Python和PyQt5框架开发一个名为白泽题库系... 目录概述功能特点界面展示系统架构设计类结构图Excel题库填写格式模板题库题目填写格式表核心数据结构

Linux系统中的firewall-offline-cmd详解(收藏版)

《Linux系统中的firewall-offline-cmd详解(收藏版)》firewall-offline-cmd是firewalld的一个命令行工具,专门设计用于在没有运行firewalld服务的... 目录主要用途基本语法选项1. 状态管理2. 区域管理3. 服务管理4. 端口管理5. ICMP 阻断

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

Windows 系统下 Nginx 的配置步骤详解

《Windows系统下Nginx的配置步骤详解》Nginx是一款功能强大的软件,在互联网领域有广泛应用,简单来说,它就像一个聪明的交通指挥员,能让网站运行得更高效、更稳定,:本文主要介绍W... 目录一、为什么要用 Nginx二、Windows 系统下 Nginx 的配置步骤1. 下载 Nginx2. 解压

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

windows系统上如何进行maven安装和配置方式

《windows系统上如何进行maven安装和配置方式》:本文主要介绍windows系统上如何进行maven安装和配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不... 目录1. Maven 简介2. maven的下载与安装2.1 下载 Maven2.2 Maven安装2.

使用Python实现Windows系统垃圾清理

《使用Python实现Windows系统垃圾清理》Windows自带的磁盘清理工具功能有限,无法深度清理各类垃圾文件,所以本文为大家介绍了如何使用Python+PyQt5开发一个Windows系统垃圾... 目录一、开发背景与工具概述1.1 为什么需要专业清理工具1.2 工具设计理念二、工具核心功能解析2.

Linux系统之stress-ng测压工具的使用

《Linux系统之stress-ng测压工具的使用》:本文主要介绍Linux系统之stress-ng测压工具的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、理论1.stress工具简介与安装2.语法及参数3.具体安装二、实验1.运行8 cpu, 4 fo

ubuntu20.0.4系统中安装Anaconda的超详细图文教程

《ubuntu20.0.4系统中安装Anaconda的超详细图文教程》:本文主要介绍了在Ubuntu系统中如何下载和安装Anaconda,提供了两种方法,详细内容请阅读本文,希望能对你有所帮助... 本文介绍了在Ubuntu系统中如何下载和安装Anaconda。提供了两种方法,包括通过网页手动下载和使用wg

ubuntu系统使用官方操作命令升级Dify指南

《ubuntu系统使用官方操作命令升级Dify指南》Dify支持自动化执行、日志记录和结果管理,适用于数据处理、模型训练和部署等场景,今天我们就来看看ubuntu系统中使用官方操作命令升级Dify的方... Dify 是一个基于 docker 的工作流管理工具,旨在简化机器学习和数据科学领域的多步骤工作流。