原文: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为数字电源引脚。DVDD和IOVDD的关系有待确认。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 QQ:1226062415 | Init draft. |