HDMI 设置 显示分辨率和频率

HDMI控制器支持很多显示的分辨率和频率,每种都有相对应的timing

比如:

HDMI 设置 显示分辨率和频率_第1张图片

HDMI 设置 显示分辨率和频率_第2张图片

这些值,在streamon的时候通过函数

“hdmi_timing_apply” 写到HDMI的setting core registers和 Timing generator registers寄存器。


在进行HDMI显示时,设置的格式必须要和hdmi preset(timing的预置值)一致,否则导致显示不正确,或者内存溢出错误。

在videodev2.h中有配置的宏

HDMI 设置 显示分辨率和频率_第3张图片

HDMI 在初始化的时候有默认的配置(hdmi_drv.c)


在probe中,根据预置的宏获取hdmi时钟参数,


S5PV210支持的参数为:

HDMI 设置 显示分辨率和频率_第4张图片

通过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



你可能感兴趣的:(Linux-HDMI)