⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 edid_maker.c

📁 SigmDesign SMP8634 media decode chip development SDK
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * * Copyright (c) Sigma Designs, Inc. 2005. All rights reserved. * *//**	@file edid_maker.c	@brief sample application to create EDID / CEA extension version 3 data blocks		@author Christian Wolff*/#include <stdio.h>#include <stdlib.h>#include <string.h>#include <unistd.h>#define ALLOW_OS_CODE 1#include "../rua/include/rua.h"#include "../rua/include/rua_property.h"#include "../rmcore/include/rmstatustostring.h"#include "../rmlibcw/include/rmlibcw.h"#include "common.h"#define EDID_PNP_ID   "SMA"     // PRELIMINARY (i.e.: made up) Sigma Designs, Inc.#define EDID_IEEE_OUI 0x0016E8  // Sigma Designs, Inc., issued 2005-12-22#define HDMI_IEEE_OUI 0x000C03   // HDMI Licensing, LLCstatic RMstatus edid_start(RMuint8 *edid, RMuint32 *offset, 	RMascii *vendor, 	RMuint16 product_code, 	RMuint32 serial, 	RMuint8 week, 	RMuint32 year){	RMuint32 i;	RMuint16 v;		if (edid == NULL) return RM_INVALID_PARAMETER;		// header	edid[0x00] = 0x00;	edid[0x01] = 0xFF;	edid[0x02] = 0xFF;	edid[0x03] = 0xFF;	edid[0x04] = 0xFF;	edid[0x05] = 0xFF;	edid[0x06] = 0xFF;	edid[0x07] = 0x00;		// vendor / product info	if ((week == 0) && year) week = 0xFF;	v = 0;	for (i = 0; i < 3; i++) {		v = (v << 5) | (vendor[i] - 'A' + 1);	}	edid[0x08] = v >> 8;	edid[0x09] = v & 0xFF;	edid[0x0A] = product_code >> 8;	edid[0x0B] = product_code & 0xFF;	edid[0x0C] = serial >> 24;	edid[0x0D] = (serial >> 16) & 0xFF;	edid[0x0E] = (serial >> 8) & 0xFF;	edid[0x0F] = serial & 0xFF;	edid[0x10] = week;	edid[0x11] = year ? (year - 1990) : 0x00;	edid[0x12] = 1;	edid[0x13] = 3;		edid[0x7E] = 0;		*offset = 0x36;		return RM_OK;}static RMstatus edid_add_display(RMuint8 *edid, 	RMuint8 h_size_cm, 	RMuint8 v_size_cm, 	RMuint8 gamma100, // gamma * 100 - 100	RMbool standby, 	RMbool suspend, 	RMbool active_off, 	RMbool rgb){	RMuint32 i;		if (edid == NULL) return RM_INVALID_PARAMETER;		edid[0x14] = 0x80;	edid[0x15] = h_size_cm;	edid[0x16] = v_size_cm;	edid[0x17] = gamma100;	edid[0x18] = (standby ? 0x80 : 0) | (suspend ? 0x40 : 0) | (active_off ? 0x20 : 0) | (rgb ? 0x08 : 0x10) | 0x02;		// default color characteristics	edid[0x19] = 0x0D;	edid[0x1A] = 0xC9;	edid[0x1B] = 0xA0;	edid[0x1C] = 0x57;	edid[0x1D] = 0x47;	edid[0x1E] = 0x98;	edid[0x1F] = 0x27;	edid[0x20] = 0x12;	edid[0x21] = 0x48;	edid[0x22] = 0x4C;		// supports 640x480@60Hz	edid[0x23] = 0x20;	edid[0x24] = 0x00;	edid[0x25] = 0x00;		// no further VESA formats	for (i = 0x26; i <= 0x35; i++) {		edid[i] = 0x01;	}		return RM_OK;}static RMstatus edid_add_monitor(RMuint8 *edid, 	RMascii *name, 	RMuint8 min_v_rate, 	RMuint8 max_v_rate, 	RMuint8 min_h_rate, 	RMuint8 max_h_rate, 	RMuint32 max_pix_clk_mhz){	RMuint32 i;		if (edid == NULL) return RM_INVALID_PARAMETER;		edid[0x5A] = 0x00;	edid[0x5B] = 0x00;	edid[0x5C] = 0x00;	edid[0x5D] = 0xFC;	edid[0x5E] = 0x00;		i = 0; 	while (name[i] && (i < 13)) {		edid[0x5F + i] = name[i];		i++;	}	if (i < 13) {		RMuint32 j;		edid[0x5F + i] = 0x0A;		for (j = 1; j < 13; j++) {			edid[0x5F + j] = 0x20;		}	}		edid[0x6C] = 0x00;	edid[0x6D] = 0x00;	edid[0x6E] = 0x00;	edid[0x6F] = 0xFD;	edid[0x70] = 0x00;	edid[0x71] = min_v_rate;	edid[0x72] = max_v_rate;	edid[0x73] = min_h_rate;	edid[0x74] = max_h_rate;	edid[0x75] = max_pix_clk_mhz / 10;	edid[0x76] = 0x00;	edid[0x77] = 0x0A;	edid[0x78] = 0x20;	edid[0x79] = 0x20;	edid[0x7A] = 0x20;	edid[0x7B] = 0x20;	edid[0x7C] = 0x20;	edid[0x7D] = 0x20;		return RM_OK;}// Please be aware that according to spec either none or both of the yuv settings have to be TRUEstatic RMstatus edid_add_extension_block(RMuint8 *edid, 	RMbool underscan, 	RMbool audio, 	RMbool yuv444, 	RMbool yuv422){	RMuint32 block, i;		block = (++(edid[0x7E]) << 7);	for (i = 0; i < 0x80; i++) {		edid[block + i] = 0;	}		edid[block + 0] = 0x02;	edid[block + 1] = 0x03;	edid[block + 2] = 4;	edid[block + 3] = (underscan ? 0x80 : 0) | (audio ? 0x40 : 0) | (yuv444 ? 0x20 : 0) | (yuv422 ? 0x10 : 0);		return RM_OK;}static RMstatus edid_add_video_tag(RMuint8 *edid, 	RMuint8 VIC, 	RMbool native){	RMuint32 block, offs;		block = (edid[0x7E] << 7);		if (edid[block + 3] & 0x0F) {		RMDBGPRINT((ENABLE, "Extension already contains DTD!\n"));		return RM_ERROR;	}		offs = edid[block + 2];	if ((offs == 4) || (offs == 36)) {		edid[block + offs] = 0x41;		offs++;	} else if (offs < 68) {		if (offs > 36) {			edid[block + 36] = 0x40 | ((edid[block + 36] & 0x1F) + 1);		} else {			edid[block + 4] = 0x40 | ((edid[block + 4] & 0x1F) + 1);		}	} else {		RMDBGPRINT((ENABLE, "Extension full!\n"));		return RM_ERROR;	}	edid[block + offs] = (native ? 0x80 : 0) | (VIC & 0x7F);	offs++;	edid[block + 2] = offs;		return RM_OK;}// PCM, 2 ch., 32/44.1/48 kHz// Speaker allocation L_Rstatic RMstatus edid_add_basic_audio_tag(RMuint8 *edid){	RMuint32 block, offs;		block = (edid[0x7E] << 7);		if (edid[block + 3] & 0x0F) {		RMDBGPRINT((ENABLE, "Extension already contains DTD!\n"));		return RM_ERROR;	}		offs = edid[block + 2];		edid[block + offs++] = 0x23;  // audio format, 1 descr.	edid[block + offs++] = 0x09;  // pcm, 2 ch.	edid[block + offs++] = 0x07;  // sample rates	edid[block + offs++] = 0x07;  // 24/20/16 bit		edid[block + offs++] = 0x83;  // speaker allocation	edid[block + offs++] = 0x01;  // L+R only	edid[block + offs++] = 0x00;  // res.	edid[block + offs++] = 0x00;  // res.		edid[block + 2] = offs;		return RM_OK;}// audio capabilities of one I2S line (-source 0)// Speaker allocation L_Rstatic RMstatus edid_add_1I2S_audio_tag(RMuint8 *edid){	RMuint32 block, offs;		block = (edid[0x7E] << 7);		if (edid[block + 3] & 0x0F) {		RMDBGPRINT((ENABLE, "Extension already contains DTD!\n"));		return RM_ERROR;	}		offs = edid[block + 2];		edid[block + offs++] = 0x23;  // audio format, 1 descr.	// 1	edid[block + offs++] = 0x09;  // pcm, 2 ch.	edid[block + offs++] = 0x7F;  // all sample rates	edid[block + offs++] = 0x07;  // 16, 20, 24 bit		edid[block + offs++] = 0x83;  // speaker allocation	edid[block + offs++] = 0x7F;  // all speakers	edid[block + offs++] = 0x00;  // res.	edid[block + offs++] = 0x00;  // res.		edid[block + 2] = offs;		return RM_OK;}// audio capabilities of four I2S lines// Speaker allocation L_Rstatic RMstatus edid_add_4I2S_audio_tag(RMuint8 *edid){	RMuint32 block, offs;		block = (edid[0x7E] << 7);		if (edid[block + 3] & 0x0F) {		RMDBGPRINT((ENABLE, "Extension already contains DTD!\n"));		return RM_ERROR;	}		offs = edid[block + 2];		edid[block + offs++] = 0x23;  // audio format, 1 descr.	// 1	edid[block + offs++] = 0x0F;  // pcm, 8 ch.	edid[block + offs++] = 0x7F;  // all sample rates	edid[block + offs++] = 0x07;  // 16, 20, 24 bit		edid[block + offs++] = 0x83;  // speaker allocation	edid[block + offs++] = 0x7F;  // all speakers	edid[block + offs++] = 0x00;  // res.	edid[block + offs++] = 0x00;  // res.		edid[block + 2] = offs;		return RM_OK;}// audio capabilities of one 96kHz SPDIF line (-source 1, HDMI 1.2 chip)// Speaker allocation: allstatic RMstatus edid_add_SPDIF96_audio_tag(RMuint8 *edid){	RMuint32 block, offs;		block = (edid[0x7E] << 7);		if (edid[block + 3] & 0x0F) {		RMDBGPRINT((ENABLE, "Extension already contains DTD!\n"));		return RM_ERROR;	}		offs = edid[block + 2];		edid[block + offs++] = 0x38;  // audio format, 8 descr.	// 1	edid[block + offs++] = 0x09;  // pcm, up to 2 ch.	edid[block + offs++] = 0x1F;  // sample rates up to 96kHz	edid[block + offs++] = 0x07;  // 16, 20, 24 bit	// 2	edid[block + offs++] = 0x17;  // ac3, up to 8 ch.	edid[block + offs++] = 0x1F;  // sample rates up to 96kHz	edid[block + offs++] = 12;    // 96 kbit/sec	// 3	edid[block + offs++] = 0x1F;  // mpeg1, up to 8 ch.	edid[block + offs++] = 0x1F;  // sample rates up to 96kHz	edid[block + offs++] = 12;    // 96 kbit/sec	// 4	edid[block + offs++] = 0x27;  // mp3, up to 8 ch.	edid[block + offs++] = 0x1F;  // sample rates up to 96kHz	edid[block + offs++] = 12;    // 96 kbit/sec	// 5	edid[block + offs++] = 0x2F;  // mpeg2, up to 8 ch.	edid[block + offs++] = 0x1F;  // sample rates up to 96kHz	edid[block + offs++] = 12;    // 96 kbit/sec	// 6	edid[block + offs++] = 0x37;  // aac, up to 8 ch.	edid[block + offs++] = 0x1F;  // sample rates up to 96kHz	edid[block + offs++] = 12;    // 96 kbit/sec	// 7	edid[block + offs++] = 0x3F;  // dts, up to 8 ch.	edid[block + offs++] = 0x1F;  // sample rates up to 96kHz	edid[block + offs++] = 12;    // 96 kbit/sec	// 8	edid[block + offs++] = 0x77;  // wma pro, up to 8 ch.	edid[block + offs++] = 0x1F;  // sample rates up to 96kHz	edid[block + offs++] = 0;     // reserved		edid[block + offs++] = 0x83;  // speaker allocation	edid[block + offs++] = 0x7F;  // all speakers	edid[block + offs++] = 0x00;  // res.	edid[block + offs++] = 0x00;  // res.		edid[block + 2] = offs;		return RM_OK;}// audio capabilities of one 192kHz SPDIF line (-source 1, HDMI 1.3 chip)// Speaker allocation: allstatic RMstatus edid_add_SPDIF192_audio_tag(RMuint8 *edid){	RMuint32 block, offs;		block = (edid[0x7E] << 7);		if (edid[block + 3] & 0x0F) {		RMDBGPRINT((ENABLE, "Extension already contains DTD!\n"));		return RM_ERROR;	}		offs = edid[block + 2];		edid[block + offs++] = 0x38;  // audio format, 8 descr.	// 1	edid[block + offs++] = 0x09;  // pcm, up to 2 ch.	edid[block + offs++] = 0x7F;  // all sample rates	edid[block + offs++] = 0x07;  // 16, 20, 24 bit	// 2	edid[block + offs++] = 0x17;  // ac3, up to 8 ch.	edid[block + offs++] = 0x7F;  // all sample rates	edid[block + offs++] = 24;    // 192 kbit/sec	// 3	edid[block + offs++] = 0x1F;  // mpeg1, up to 8 ch.	edid[block + offs++] = 0x7F;  // all sample rates	edid[block + offs++] = 24;    // 192 kbit/sec	// 4	edid[block + offs++] = 0x27;  // mp3, up to 8 ch.	edid[block + offs++] = 0x7F;  // all sample rates	edid[block + offs++] = 24;    // 192 kbit/sec	// 5	edid[block + offs++] = 0x2F;  // mpeg2, up to 8 ch.	edid[block + offs++] = 0x7F;  // all sample rates	edid[block + offs++] = 24;    // 192 kbit/sec	// 6	edid[block + offs++] = 0x37;  // aac, up to 8 ch.	edid[block + offs++] = 0x7F;  // all sample rates	edid[block + offs++] = 24;    // 192 kbit/sec	// 7	edid[block + offs++] = 0x3F;  // dts, up to 8 ch.	edid[block + offs++] = 0x7F;  // all sample rates	edid[block + offs++] = 24;    // 192 kbit/sec	// 8	edid[block + offs++] = 0x77;  // wma pro, up to 8 ch.	edid[block + offs++] = 0x7F;  // all sample rates	edid[block + offs++] = 0;     // reserved		edid[block + offs++] = 0x83;  // speaker allocation	edid[block + offs++] = 0x7F;  // all speakers	edid[block + offs++] = 0x00;  // res.	edid[block + offs++] = 0x00;  // res.		edid[block + 2] = offs;		return RM_OK;}// All codecs, all ch., all fs, 24 bit// Speaker allocation L_Rstatic RMstatus edid_add_all_audio_tags(RMuint8 *edid){	RMuint32 block, offs;		block = (edid[0x7E] << 7);		if (edid[block + 3] & 0x0F) {		RMDBGPRINT((ENABLE, "Extension already contains DTD!\n"));		return RM_ERROR;	}		offs = edid[block + 2];		edid[block + offs++] = 0x3E;  // audio format, 10 descr.	// 1	edid[block + offs++] = 0x0F;  // pcm, up to 8 ch.	edid[block + offs++] = 0x7F;  // all sample rates	edid[block + offs++] = 0x07;  // 16, 20, 24 bit	// 2	edid[block + offs++] = 0x17;  // ac3, up to 8 ch.	edid[block + offs++] = 0x7F;  // all sample rates	edid[block + offs++] = 250;   // 2 Mbit/sec	// 3	edid[block + offs++] = 0x1F;  // mpeg1, up to 8 ch.	edid[block + offs++] = 0x7F;  // all sample rates

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -