不同硬件平台上移植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

相关文章

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

Linux系统中查询JDK安装目录的几种常用方法

《Linux系统中查询JDK安装目录的几种常用方法》:本文主要介绍Linux系统中查询JDK安装目录的几种常用方法,方法分别是通过update-alternatives、Java命令、环境变量及目... 目录方法 1:通过update-alternatives查询(推荐)方法 2:检查所有已安装的 JDK方

Linux系统之lvcreate命令使用解读

《Linux系统之lvcreate命令使用解读》lvcreate是LVM中创建逻辑卷的核心命令,支持线性、条带化、RAID、镜像、快照、瘦池和缓存池等多种类型,实现灵活存储资源管理,需注意空间分配、R... 目录lvcreate命令详解一、命令概述二、语法格式三、核心功能四、选项详解五、使用示例1. 创建逻

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

golang程序打包成脚本部署到Linux系统方式

《golang程序打包成脚本部署到Linux系统方式》Golang程序通过本地编译(设置GOOS为linux生成无后缀二进制文件),上传至Linux服务器后赋权执行,使用nohup命令实现后台运行,完... 目录本地编译golang程序上传Golang二进制文件到linux服务器总结本地编译Golang程序

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局