WINCE基于CH7024实现TV OUT (VGA)功能
********************************LoongEmbedded********************************
作者:LoongEmbedded(kandi)
时间:2011.01.03
类别:WINCE驱动开发
********************************LoongEmbedded********************************
系统:WINCE6.0+S3C2443
实现原理
CPU(在此为S3C2443)输出的RGB数字信号通过CH7024转换成PAL制式的模拟信号输出到电视。
1. 硬件设计
图0
2. CH7024
2.1 CH7024引脚的描述
D[0:23]
图形控制器(这里是LCD控制器)通过这24个输入引脚把RGB数字信号输入到CH7024中。
H
水平(也即行)同步信号输入/输出端,当SYO控制位(0x0E[1])为0,这个引脚作为输入数据的水平同步信号输入端;当SYO控制位(0x0E[1])为1,这个引脚作为输入数据的水平同步信号输出端
V
垂直(也即帧)同步信号输入/输出端,当SYO控制位(0x0E[1])为0,这个引脚作为输入数据的垂直同步信号输入端;当SYO控制位(0x0E[1])为1,这个引脚作为输入数据的垂直同步信号输出端。
DE
数据使能引脚,当这个引脚为高电平的时候,输入的图像数据是激活的(active);,当这个引脚为低电平的时候,输入的图像数据是空白的(blanking),这个引脚是有CPU的GPC4引脚来控制的,那么应该怎么配置呢?先看CPU对GPC4引脚的描述
图1
图2
SPD
串行端口(serial port)数据输入/输出引脚,这个引脚作为双流向的(bi-directional)串行端口,在此作为输入功能,和CPU的IICSDA连接,我们就算是通过IIC总线接口来读写CH7024的寄存器的。
SPC
串行端口时钟输入引脚,这个引脚作为串行端口的时钟输入引脚。在此作为输入功能,和CPU的IICSCL连接。
RESET
复位输入引脚,这个引脚被内部拉高,如果输入低电平,CH7024就保持在上电的复位状态(power-on reset condition);如果输入高电平,那么就可以通过IIC总线接口来写CH7024的复位寄存器0x03h[1]来复位所有的控制寄存器,见CH7024中对复位寄存器的描述
图3
CVBS
混合视频(composite video)输出引脚,在S-video Y引脚没有使用时,这是个主要的混合视频输出脚,但如果S-video Y引脚使用时这个引脚就关闭输出了。
Y
亮度输出(luma output)引脚,在主要的CVBS输出引脚没有使用的时候,这是个S-video亮度输出引脚。
C/CVBS
色度(chroma)/CVBS输出
当S-video使用的时候,这个引脚输出S-video色度,当如果双重的CVBS输出有需要,这个输出引脚就用来作为除首要的CVBS输出(也即上面的CVBS引脚)之外的次要的CVBS输出。
P-Out
像素时钟输出引脚,这个引脚可以提供时钟信号给图像控制器(比如LCD控制器),这可以作为基准频率(reference frequency),当然了这个引脚也可以直接输出时钟给CH7024自身,这样情况下CH7024就工作在主模式。
XI/FIN
晶振输入/外部基准输入引脚。
XO
晶振输出引脚
XCLK
外部时钟输入引脚,这个时钟输入信号时作为H、V、DE和D[23:0]这些信号的输入基准。
2.2 CH7027作为IIC从设备的地址
#define AVO_WRITE (0xEC + 0) //写CH7024寄存器内容的IIC从设备的地址
#define AVO_READ (0xEC + 1)//读取CH7024寄存器内容的IIC从设备的地址
因为我们的系统中CPU是通过IIC接口来camera驱动的TVP5150A和AVOUT驱动CH7024相互的,所以需要分配好它们作为从设备的地址,CH7024的datasheet好像是找不到它作为IIC从设备如何确定从地址,这里是我自己定的,只要不冲突就可以了,应该如此理解。
3. AVOUT驱动模型
因为CPU是通过IIC接口来操作CH7024的,所以我借鉴了camera驱动的模型来建立AVOUT驱动的模型,下面我们来看AVO_Init函数中的主要内容:
图4
下面来看看AVO_Initialize的函数体:
图5
接下来看CH7024_WriteAndReadBlock的函数体
图6
CH7024_YCbCr8bit_TV数组的内容如下:
图7
这个数组一维的值是CH7024的寄存器地址,二维的值是寄存器对应的内容。那么这个数组需要包含CH7024哪些寄存器和其对应的值是多少了,这不仅和CH7024工作在主或者从模式有关,还和很多选择和设置有关,下面部分就来看看是如何得出这个二维数组的内容的
1. 如何使用CH7024的Setting Wizard.exe来获取所需要初始化的寄存器的值
⑴双击Setting Wizard.exe,选择Run Wizard来进入参数选择向导。
图8
⑵选择Unusing Data Enable Signal
图9
选择Unusing Data Enable Signal的依据见CH7024的datasheet中的下面的描述
图10
⑶选择输入数据的格式
图11
图12描述在MULTI=0时,对于不同的IDF的总线数据
图12
图13描述MULTI的使用
图13
图14描述告诉我们,只有在IDF=2,3和4时才用到HIGH控制位
图14
图15是IDF=0模式的RGB数据描述
图15
图16是IDF=0模式的RGB数据描述
图16
⑷选择输出
图17
图18关于SEL_R的描述
图18
⑸根据不同的选择生成可能合适的HTI和VTI
图19
图20关于XCH的描述
图20
图21
2. 如何选择HTI和VTI,如何调试出正常显示的图像
图22
图22中选择input之后,会在右边的生成N组HTI和VTI,那么我们该选择哪一组会更有利于我们进一步的调试呢(不是选好一组数据后生成寄存器的值之后就ok了),比较好的一组是VTI大于272/0.85(320)的有比较接近的一组,那自然而然我们开始肯定会选择图22中VTI=322这一组数据,双击322对应得这一行,弹出上面的对话框,选择确定后点击右下角的“Gen File”,然后会生成一组寄存器及其的值的文件在Setting Wizard.exe所在的目录下,生成的文件名是RegSetting.ini,见下图
图23
我们从RegSetting.ini中获得我们需要对CH7024哪些寄存器初始化,它们的值是多少,在RegSetting.ini中都有,这里面的值就是用来填充图7的CH7024_YCbCr8bit_TV数组的内容,这样我们就可以在电视机上验证我们对CH7024寄存器的初始化是否正确了。
用VTI=322这组数据验证后发现出来的图像数据和在LCD上显示的还有很大的差异,就我调试这时候存在的问题有下面几点,下面就没一点存在的问题怎么解决的总结一下:
注:下面提到的图像都是指在电视机上显示的图像
⑴图像左移(也就是左偏)和上移(也就是上偏)
为什么会这样呢?应该是由于同一组设置参数产生的图像在不同电视上显示的差异性造成,故须预留一部分黑边兼容不同电视差异,这样在不同电视上都可以全部显示输入数据,但是在有些电视上会出现黑边没有充满电视屏幕,所以我们在图22中选择更大的VTI那一组,经过调试发现,在VTI=360这一组的图像不会左移和上移了。
⑵图像向上快速移动
这种情况,我们可以微调VBPD的值,我有8为9后就可以定住图像了,不会往上移动了,当然,微调VFPD也可以。
⑶在LCD上显示的图像在电视机上在水平方向大概只能显示95%。
怎么解决这个问题呢?看下图
图24
从上图第1Eh和1Fh的描述可知,这两个寄存器的值越大在水平方向上显示的TV图像就越大,所以根据我们的问题,我们就需要把这个对TVHA的值调小,这样才能让在LCD上显示的图像在电视机上可以100%显示,所以我们就需要在CH7024_YCbCr8bit_TV数组中添加者两个寄存器,那么它们的值是多少合适的,这就根据调试的效果来决定了。
⑷图像的颜色显示等和LCD上显示的颜色不一致
可以通过对寄存器0x05,0x06,0x07,0x08和0x09的调整来满足。
调试总结:
⑴要利用Setting Wizard.exe工具来生成我们需要的寄存器的值。
⑵要认真搞清楚寄存器对应的作用,如何控制和跳转。
⑶熟悉CH7024的引脚的功能。
RK27电视输出功能详解V1.0_百度文库
http://wenku.baidu.com/view/e3fbc638376baf1ffc4fad32.html