?? edid_maker.c
字號:
/* * * 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 + -