HDMI控制器支持很多显示的分辨率和频率,每种都有相对应的timing
比如:
这些值,在streamon的时候通过函数
“hdmi_timing_apply” 写到HDMI的setting core registers和 Timing generator registers寄存器。
在进行HDMI显示时,设置的格式必须要和hdmi preset(timing的预置值)一致,否则导致显示不正确,或者内存溢出错误。
在videodev2.h中有配置的宏
HDMI 在初始化的时候有默认的配置(hdmi_drv.c)
在probe中,根据预置的宏获取hdmi时钟参数,
S5PV210支持的参数为:
通过VIDIOC_ENUM_DV_PRESETS命令可以获取HDMI控制器枚举列表,
通过VIDIOC_S_DV_PRESET,可以设置当前HDMI预设值,
通过VIDIOC_G_DV_PRESET,可以获取当前预设值。
测试程序(测试环境:在显示完480P后,再显示1080P时必须重新配置的一个程序):
int setup_preset(int fd, int preset)
{
int ret;
int count;
struct v4l2_dv_preset presetinfo;
struct v4l2_dv_enum_preset enuminfo;
memset(&presetinfo, 0, sizeof(presetinfo));
memset(&enuminfo, 0, sizeof(enuminfo));
//枚举s5pv210支持的preset值
while((ret = ioctl(fd, VIDIOC_ENUM_DV_PRESETS, &enuminfo)) >= 0)
{
printf("preset:%d,name:%s\n",enuminfo.preset, enuminfo.name);
enuminfo.index++;
}
memset(&presetinfo, 0, sizeof(presetinfo));
presetinfo.preset = preset;
//设置当前的preset值
if((ret = ioctl(fd, VIDIOC_S_DV_PRESET, &presetinfo))<0)
{
printf("VIDIOC_G_DV_PRESET error:%d\n",ret);
return -1;
}
memset(&presetinfo, 0, sizeof(presetinfo));
//读取当前的preset值
if((ret = ioctl(fd, VIDIOC_G_DV_PRESET, &presetinfo))<0)
{
printf("VIDIOC_G_DV_PRESET error:%d\n",ret);
return -1;
}
printf("preset:%d\n",presetinfo.preset);
return 0;
}
在设置格式之前调用这个函数
open_hdmi_device();
setup_preset(hdmi_fd, 18);//这里的18代表1080P@60hz
hdmi_setfmt();
log:
preset:1,name:[email protected]
preset:2,name:576p@50
preset:6,name:720p@50
preset:7,name:[email protected]
preset:8,name:720p@60
preset:14,name:1080p@24
preset:16,name:1080p@30
preset:17,name:1080p@50
preset:12,name:1080i@50
preset:13,name:1080i@60
preset:18,name:1080p@60
preset:18