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:480p@59.94 preset:2,name:576p@50 preset:6,name:720p@50 preset:7,name:720p@59.94 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
HDMI 设置 显示分辨率和频率,布布扣,bubuko.com
原文:http://blog.csdn.net/liujia2100/article/details/22326853