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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值