From 3a87ef310f685adc0d0e11d02b0d835d8922f757 Mon Sep 17 00:00:00 2001 From: Mubashshir Date: Mon, 18 Dec 2023 13:22:24 +0600 Subject: [PATCH 1/2] Implement edid.S as edid.h and edid-private.h Signed-off-by: Mubashshir --- edid-private.h | 210 ++++++++++++++++++++++++++++++++++++++++ edid.h | 255 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 465 insertions(+) create mode 100644 edid-private.h create mode 100644 edid.h diff --git a/edid-private.h b/edid-private.h new file mode 100644 index 0000000..a556f82 --- /dev/null +++ b/edid-private.h @@ -0,0 +1,210 @@ +/* + edid-private.h: EDID data template + + Copyright (C) 2012 Carsten Emde + Copyright (C) 2023 Mubashshir + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + + +#ifndef __EDID_PRIVATE_H__ +#define __EDID_PRIVATE_H__ +edid_start: .data +/* Fixed header pattern */ +header: .byte 0x00,0xff,0xff,0xff,0xff,0xff,0xff,0x00 + +#define __swap16(v1) ((v1>>8)+((v1&0xff)<<8)) +#define __msbs2(v1,v2) ((((v1>>8)&0x0f)<<4)+((v2>>8)&0x0f)) +#define __msbs4(v1,v2,v3,v4) \ + (((v1&0x03)>>2)+((v2&0x03)>>4)+((v3&0x03)>>6)+((v4&0x03)>>8)) +#define __pixdpi2mm(pix,dpi) ((pix*25)/dpi) +#define __count_impl(X) X +#define __count(X) __count_impl(X) +#define count() __count(__COUNTER__) +#define PROCESS(NAME, ...) ___COUNT(count(), NAME, ## __VA_ARGS__) +#define ___COUNT(num, NAME, ...) __IMPL_ ## NAME(num, ## __VA_ARGS__) +#define __label(pref, mid, suff) pref ## mid ## suff: +#define __required_symbol(section) .ifndef section; .err; .endif + + +#define __IMPL_BEGIN(num, \ + VER, REV, \ + M, F, G, \ + YEAR, WEEK, \ + PROD, SERIAL \ +)\ +mfg_id: .hword __swap16(((((M-'@')&0x1f)<<10)+(((F-'@')&0x1f)<<5)+((G-'@')&0x1f))); \ +prod_code: .hword PROD; \ +serial_number: .long SERIAL; \ +week: .byte WEEK; \ +year: .byte YEAR-1990; \ +.if VER != 1; .err; .endif; \ +version: .byte VER; \ +.if REV < 0 || REV > 4; .err; .endif; \ +revision: .byte REV + + +#define __VIDEO_DIGITAL(X) 0b10000000 | X +#define __VIDEO_ANALOG(X) 0b00000000 | X +#define __IMPL_VIDEO(num, TYPE, MODE) \ +video_parms: .byte __VIDEO_##TYPE(MODE) + +#define __IMPL_MAX_SIZE(num, X, Y, DPI) \ +max_size: .byte (__pixdpi2mm(X, DPI)/10) , (__pixdpi2mm(Y, DPI)/10) + +#define __IMPL_GAMMA(num, X) \ +gamma: .byte X + +#define __IMPL_DSP(num, X) \ +dsp_features: .byte X + +#define __IMPL_LSB(num, color_pair, v1x, v1y, v2x, v2y) \ +color_pair ## _lsb: .byte \ + ((v1x & 0b11)<<6) \ + | ((v1y & 0b11)<<4) \ + | ((v2x & 0b11)<<2) \ + | ((v2y & 0b11)<<0) + +#define __IMPL_MSB(num, color, x, y) \ +color ## _x_y_msb: .byte x, y + +#define __IMPL_EST_TIMING(num, B7, B6, B5, B4, B3, B2, B1, B0) \ +etimings_##num: .byte \ + (B7<<7) | \ + (B6<<6) | \ + (B5<<5) | \ + (B4<<4) | \ + (B3<<3) | \ + (B2<<2) | \ + (B1<<1) | \ + (B0<<0) + +#define __IMPL_STD_RES(num, type, ...) \ +std_res_ ## num: __STD_RES_##type(num, ## __VA_ARGS__) + +#define __STD_RES_PAD(num)\ + .fill 1,2,0x0101 + +/* Standard timing */ +/* X resolution, less 31, divided by 8 (256-2288 pixels) */ +/* Y resolution, X:Y pixel ratio + Bits 7-6 X:Y pixel ratio: 00=16:10; 01=4:3; 10=5:4; 11=16:9. + Bits 5-0 Vertical frequency, less 60 (60-123 Hz) */ +#define __STD_RES_RATIO(num, X, RATIO, FREQ)\ + .byte (X/8)-31, (RATIO<<6)+FREQ-60 + +#define __IMPL_DSC(num, type, ...) \ +dsc ## num: __DSC_##type(num, ## __VA_ARGS__) + +#define __DSC_DUMMY(num) \ + .byte 0, 0, 0, 0x10; \ + .fill 12,1,0x01; \ + .byte 0x0a, 0x20 + +#define __DSC_DTD(num, CLK, DPI, FEATURES, \ + XPIX, YPIX, \ + XOFFSET, YOFFSET, \ + XPULSE, YPULSE, \ + XBLANK, YBLANK, \ + XBORDER, YBORDER) \ +/* Pixel clock in 10 kHz units. (0.-655.35 MHz, little-endian) */ \ + .hword CLK/10; \ +/* Horizontal active pixels 8 lsbits (0-4095) */ \ + .byte XPIX&0xff; \ +/* Horizontal blanking pixels 8 lsbits (0-4095) + End of active to start of next active. */ \ + .byte XBLANK&0xff; \ +/* Bits 7-4 Horizontal active pixels 4 msbits + Bits 3-0 Horizontal blanking pixels 4 msbits */ \ + .byte __msbs2(XPIX,XBLANK); \ +/* Vertical active lines 8 lsbits (0-4095) */ \ + .byte YPIX&0xff; \ +/* Vertical blanking lines 8 lsbits (0-4095) */ \ + .byte YBLANK&0xff; \ +/* Bits 7-4 Vertical active lines 4 msbits + Bits 3-0 Vertical blanking lines 4 msbits */ \ + .byte __msbs2(YPIX,YBLANK); \ +/* Horizontal sync offset pixels 8 lsbits (0-1023) From blanking start */\ + .byte XOFFSET&0xff; \ +/* Horizontal sync pulse width pixels 8 lsbits (0-1023) */ \ + .byte XPULSE&0xff; \ +/* Bits 7-4 Vertical sync offset lines 4 lsbits -63) + Bits 3-0 Vertical sync pulse width lines 4 lsbits -63) */ \ + .byte ((YOFFSET-63)<<4)+(YPULSE-63); \ +/* Bits 7-6 Horizontal sync offset pixels 2 msbits + Bits 5-4 Horizontal sync pulse width pixels 2 msbits + Bits 3-2 Vertical sync offset lines 2 msbits + Bits 1-0 Vertical sync pulse width lines 2 msbits */ \ + .byte __msbs4(XOFFSET,XPULSE,YOFFSET,YPULSE); \ +/* Horizontal display size, mm, 8 lsbits (0-4095 mm, 161 in) */ \ + .byte __pixdpi2mm(XPIX, DPI)&0xff; \ +/* Vertical display size, mm, 8 lsbits (0-4095 mm, 161 in) */\ + .byte __pixdpi2mm(YPIX, DPI)&0xff; \ +/* Bits 7-4 Horizontal display size, mm, 4 msbits + Bits 3-0 Vertical display size, mm, 4 msbits */ \ + .byte __msbs2(__pixdpi2mm(XPIX, DPI),__pixdpi2mm(YPIX, DPI)); \ +/* Horizontal border pixels (each side; total is twice this) */ \ + .byte XBORDER; \ +/* Vertical border lines (each side; total is twice this) */ \ + .byte YBORDER; \ +/* Bit 7 Interlaced + Bits 6-5 Stereo mode: 00=No stereo; other values depend on bit 0: + Bit 0=0: 01=Field sequential, sync=1 during right; 10=similar, + sync=1 during left; 11=4-way interleaved stereo + Bit 0=1 2-way interleaved stereo: 01=Right image on even lines; + 10=Left image on even lines; 11=side-by-side + Bits 4-3 Sync type: 00=Analog composite; 01=Bipolar analog composite; + 10=Digital composite (on HSync); 11=Digital separate + Bit 2 If digital separate: Vertical sync polarity (1=positive) + Other types: VSync serrated (HSync during VSync) + Bit 1 If analog sync: Sync on all 3 RGB lines (else green only) + Digital: HSync polarity (1=positive) + Bit 0 2-way line-interleaved stereo, if bits 4-3 are not 00. */ \ + .byte FEATURES + +#define __DSC_ALNUM(num, data) \ + .byte 0,0; /* Not a detailed timing descriptor */ \ + .byte 0; /* Must be zero */\ + .byte 0xfe;/* Descriptor is monitor range limits */\ + .byte 0; /* Must be zero */\ +dsc##num##_start:\ + .ascii data; \ +dsc##num##_end:\ + .byte 0x0a; /* End marker */\ + .fill 12-((dsc##num##_end)-(dsc##num##_start)), 1, 0x20 /* Padded spaces */ + +#define __DSC_RAW(num, type, data) \ + .byte 0,0; /* Not a detailed timing descriptor */ \ + .byte 0; /* Must be zero */\ + .byte type;/* Descriptor is monitor range limits */\ + .byte 0; /* Must be zero */\ +dsc##num##_start:\ + data; \ +dsc##num##_end:\ + .byte 0x0a; /* End marker */\ + .fill 12-((dsc##num##_end)-(dsc##num##_start)), 1, 0x20 /* Padded spaces */ + +#define __IMPL_EXTENSIONS(num, x) \ +extensions: .byte x /* Number of extensions to follow */ + +#define __IMPL_END(num) \ +checksum: .byte CRC /* Sum of all bytes must be 0 (mod 256) */ + +#define __required_symbol_count(num, req) \ +.if num != req; \ + .err; \ +.endif; +#endif /* __EDID_PRIVATE_H__ */ diff --git a/edid.h b/edid.h new file mode 100644 index 0000000..4d74201 --- /dev/null +++ b/edid.h @@ -0,0 +1,255 @@ +/* + edid.S: EDID data template API + + Copyright (C) 2012 Carsten Emde + Copyright (C) 2023 Mubashshir + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. +*/ + + +#ifndef __EDID_H__ +#define __EDID_H__ + +#include "edid-private.h" +#define XY_RATIO_16_10 0b00 +#define XY_RATIO_4_3 0b01 +#define XY_RATIO_5_4 0b10 +#define XY_RATIO_16_9 0b11 + +/* Manufacturer */ + +/* EDID 1.3 standard definitions */ +/* Serial number. 32 bits, little endian. */ +/* Week of manufacture */ +/* Year of manufacture, less 1990. (1990-2245) + If week=255, it is the model year instead */ + +#define BEGIN(\ + VER, REV, \ + M, F, G, \ + YEAR, WEEK, \ + PROD, SERIAL \ +) PROCESS(BEGIN, \ + VER, REV, \ + M, F, G, \ + YEAR, WEEK, \ + PROD, SERIAL \ +) + +#define VIDEO_DIGITAL_DEPTH6 0b00010000 +#define VIDEO_DIGITAL_DEPTH8 0b00100000 +#define VIDEO_DIGITAL_DEPTH10 0b00110000 +#define VIDEO_DIGITAL_DEPTH12 0b01000000 +#define VIDEO_DIGITAL_DEPTH14 0b01010000 +#define VIDEO_DIGITAL_DEPTH16 0b01100000 +#define VIDEO_DIGITAL_RDEPTH 0b01110000 +#define VIDEO_DIGITAL_DVI 0b00000001 +#define VIDEO_DIGITAL_HDMIa 0b00000010 +#define VIDEO_DIGITAL_HDMIb 0b00000011 +#define VIDEO_DIGITAL_MDDI 0b00000100 +#define VIDEO_DIGITAL_DP 0b00000101 + +#define VIDEO_ANALOG_P100N040V 0b01000000 +#define VIDEO_ANALOG_P071N028V 0b00100000 +#define VIDEO_ANALOG_BLANK 0b00010000 +#define VIDEO_ANALOG_SYNC_SEP 0b00001000 +#define VIDEO_ANALOG_COMP_SYNC 0b00000100 +#define VIDEO_ANALOG_GREEN_SYNC 0b00000010 +#define VIDEO_ANALOG_SERR_VSYNC 0b00000001 +#define VIDEO_ANALOG_P070N000V VIDEO_ANALOG_P100N040V | VIDEO_ANALOG_P071N028V +/* If Bit 7=1 Digital input. If set, the following bit definitions apply: + Bits 6-1 Reserved, must be 0 + Bit 0 Signal is compatible with VESA DFP 1.x TMDS CRGB, + 1 pixel per clock, up to 8 bits per color, MSB aligned, + If Bit 7=0 Analog input. If clear, the following bit definitions apply: + Bits 6-5 Video white and sync levels, relative to blank + 00=+0.7/-0.3 V; 01=+0.714/-0.286 V; + 10=+1.0/-0.4 V; 11=+0.7/0 V + Bit 4 Blank-to-black setup (pedestal) expected + Bit 3 Separate sync supported + Bit 2 Composite sync (on HSync) supported + Bit 1 Sync on green supportedp + Bit 0 VSync pulse must be serrated when somposite or + sync-on-green is used. */ +#define VIDEO(TYPE, FLAGS) PROCESS(VIDEO, TYPE, FLAGS) +#define VIDEO_ANALOG(FLAGS) PROCESS(VIDEO, ANALOG, FLAGS) +#define VIDEO_DIGITAL(FLAGS) PROCESS(VIDEO, DIGITAL, FLAGS) + +/* Maximum horizontal image size, in centimetres + (max 292 cm/115 in at 16:9 aspect ratio) */ +#define MAX_SIZE(XPIX, YPIX, DPI) PROCESS(MAX_SIZE, XPIX, YPIX, DPI) + +/* Maximum vertical image size, in centimetres. + If either byte is 0, undefined (e.g. projector) */ + +/* Display gamma, minus 1, times 100 (range 1.00-3.5 */ +#define GAMMA(VAL) PROCESS(GAMMA, VAL) + +/* Bit 7 DPMS standby supported + Bit 6 DPMS suspend supported + Bit 5 DPMS active-off supported + Bits 4-3 Display type: 00=monochrome; 01=RGB colour; + 10=non-RGB multicolour; 11=undefined + Bit 2 Standard sRGB colour space. Bytes 25-34 must contain + sRGB standard values. + Bit 1 Preferred timing mode specified in descriptor block 1. + Bit 0 GTF supported with default parameter values. */ +#define DSP_STANDBY 0b10000000 +#define DSP_SUSPEND 0b01000000 +#define DSP_ACTIVEOFF 0b00100000 +#define DSP_COLOR 0b00010000 +#define DSP_RGB_COLOR 0b00001000 +#define DSP_STD_SRGB 0b00000100 +#define DSP_PREFER_DT1 0b00000010 +#define DSP_DEFAULTGTF 0b00000001 +#define DSP_NONE 0b00000000 +#define DSP(FLAGS) PROCESS(DSP, FLAGS) +/* Chromaticity coordinates. */ +#define LSB(color_pair, v1x, v1y, v2x, v2y) PROCESS(LSB, color_pair, v1x, v1y, v2x, v2y) +/* Red and green least-significant bits + Bits 7-6 Red x value least-significant 2 bits + Bits 5-4 Red y value least-significant 2 bits + Bits 3-2 Green x value lst-significant 2 bits + Bits 1-0 Green y value least-significant 2 bits */ +#define LSB_RED_GREEN(v1x, v1y, v2x, v2y) PROCESS(LSB, red_green, v1x, v1y, v2x, v2y) +/* Blue and white least-significant 2 bits */ +#define LSB_BLUE_WHITE(v1x, v1y, v2x, v2y) PROCESS(LSB, blue_white, v1x, v1y, v2x, v2y) + +/* 0-255 encodes 0-0.996 (255/256); 0-0.999 (1023/1024) with lsbits */ +/* Color(R,G,B,W) x and y value most significant 8 bits */ +#define MSB(color, x, y) PROCESS(MSB, color, x, y) + +#define MSB_RED(x, y) PROCESS(MSB, red, x, y) +#define MSB_GREEN(x, y) PROCESS(MSB, green, x, y) +#define MSB_BLUE(x, y) PROCESS(MSB, blue, x, y) +#define MSB_WHITE(x, y) PROCESS(MSB, white, x, y) + +/* Established timings */ +/* Bit 0,7 720x400 @ 70 Hz + Bit 0,6 720x400 @ 88 Hz + Bit 0,5 640x480 @ 60 Hz + Bit 0,4 640x480 @ 67 Hz + Bit 0,3 640x480 @ 72 Hz + Bit 0,2 640x480 @ 75 Hz + Bit 0,1 800x600 @ 56 Hz + Bit 0,0 800x600 @ 60 Hz + Bit 1,7 800x600 @ 72 Hz + Bit 1,6 800x600 @ 75 Hz + Bit 1,5 832x624 @ 75 Hz + Bit 1,4 1024x768 @ 87 Hz, interlaced (1024x768) + Bit 1,3 1024x768 @ 60 Hz + Bit 1,2 1024x768 @ 72 Hz + Bit 1,1 1024x768 @ 75 Hz + Bit 1,0 1280x1024 @ 75 Hz + Bit 2,7 1152x870 @ 75 Hz (Apple Macintosh II) + Bits 2,6-0 Other manufacturer-specific display mod */ +#define EST_TIMING(B7, B6, B5, B4, B3, B2, B1, B0) PROCESS(EST_TIMING, B7, B6, B5, B4, B3, B2, B1, B0) + +// wrapper +#define STD_RES(TYPE, ...) PROCESS(STD_RES, TYPE, ## __VA_ARGS__) +/* Standard timing + @param XRES + @param STD_RATIO + @param FREQ + X resolution, less 31, divided by 8 (256-2288 pixels) + Y resolution, X:Y pixel ratio + Bits 7-6 X:Y pixel ratio: 00=16:10; 01=4:3; 10=5:4; 11=16:9. + Bits 5-0 Vertical frequency, less 60 (60-123 Hz) */ +// declare standard ratio based resolution +#define STD_RES_RATIO(XRES, STD_RATIO, FREQ) \ + PROCESS(STD_RES, RATIO, XRES, STD_RATIO, FREQ) +// add padding +#define STD_RES_PAD() \ + PROCESS(STD_RES, PAD) + +#define DTD_INTERLACED 0x1000000 +#define DTD_STERIO(X, Y) (X<<6) | (Y<<5) +#define DTD_SYNC_TYPE(X, Y) (X<<4) | (Y<<3) +#define DTD_SYNC_DIR(X, Y) (X<<2) | (Y<<1) +#define DTD_LINE_INTERLEAVED 1 + + +#define DSC(TYPE, ...) \ + PROCESS(DSC, TYPE, ## __VA_ARGS__) +// Dummy descriptor, used for padding +#define DSC_DUMMY() \ + PROCESS(DSC, DUMMY) +// Alphanumeric data +#define DSC_ALNUM(data) \ + PROCESS(DSC, ALNUM, data) + +// DSC_SERIAL() +#define DSC_SERIAL(data) \ + PROCESS(DSC, RAW, 0xff, .ascii data) + +// Detailed Timing Descriptor +#define DSC_DTD(CLK, DPI, FEATURES, \ + XPIX, YPIX, \ + XOFFSET, YOFFSET, \ + XPULSE, YPULSE, \ + XBLANK, YBLANK, \ + XBORDER, YBORDER) \ + PROCESS(DSC, DTD, \ + CLK, DPI, FEATURES, \ + XPIX, YPIX, \ + XOFFSET, YOFFSET, \ + XPULSE, YPULSE, \ + XBLANK, YBLANK, \ + XBORDER, YBORDER) + +#define EXTENSIONS(x) PROCESS(EXTENSIONS, x) + +#define END() PROCESS(END) +#elif ! defined(__EDID_H_REPEAT__) +#define __EDID_H_REPEAT__ + __required_symbol_count(count(), 28) + __required_symbol(edid_start) + __required_symbol(header) + __required_symbol(mfg_id) + __required_symbol(prod_code) + __required_symbol(serial_number) + __required_symbol(week) + __required_symbol(year) + __required_symbol(version) + __required_symbol(revision) + __required_symbol(video_parms) + __required_symbol(max_size) + __required_symbol(gamma) + __required_symbol(dsp_features) + __required_symbol(red_green_lsb) + __required_symbol(blue_white_lsb) + __required_symbol(red_x_y_msb) + __required_symbol(green_x_y_msb) + __required_symbol(blue_x_y_msb) + __required_symbol(white_x_y_msb) + __required_symbol(etimings_11) + __required_symbol(etimings_12) + __required_symbol(etimings_13) + __required_symbol(std_res_14) + __required_symbol(std_res_15) + __required_symbol(std_res_16) + __required_symbol(std_res_17) + __required_symbol(std_res_18) + __required_symbol(std_res_19) + __required_symbol(std_res_20) + __required_symbol(std_res_21) + __required_symbol(dsc22) + __required_symbol(dsc23) + __required_symbol(dsc24) + __required_symbol(dsc25) + __required_symbol(extensions) + __required_symbol(checksum) +#endif /* __EDID_H__ */ From 8de823a9ae6c1f84106035a6f0d46c9f07ca058a Mon Sep 17 00:00:00 2001 From: Mubashshir Date: Mon, 18 Dec 2023 13:23:18 +0600 Subject: [PATCH 2/2] Use edid.h to create EDID for 3840x2160 resolution Signed-off-by: Mubashshir --- 3840x2160-template.S | 66 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) create mode 100644 3840x2160-template.S diff --git a/3840x2160-template.S b/3840x2160-template.S new file mode 100644 index 0000000..b0341ef --- /dev/null +++ b/3840x2160-template.S @@ -0,0 +1,66 @@ +/* 3840x2160: Modeline "3840x2160" 594.00 3840 4016 4104 4400 2160 2168 2178 2250 +hsync +vsync */ +#include "edid.h" + +BEGIN( + 1, 3, // version + 'L', 'N', 'X', // Manufacturer (3char) + 2012, 5, // mfg year, week + 0, 0 // PROD ID, Serial +); + +VIDEO_ANALOG(VIDEO_ANALOG_COMP_SYNC); +MAX_SIZE(3840, 2160, 96); + +GAMMA(120); +DSP(DSP_STANDBY|DSP_ACTIVEOFF|DSP_SUSPEND|DSP_PREFER_DT1|DSP_RGB_COLOR); + +LSB_RED_GREEN (1, 1, 3, 2); +LSB_BLUE_WHITE (3, 0, 0, 0); +MSB_RED (0xa4, 0x59); +MSB_GREEN (0x4a, 0x98); +MSB_BLUE (0x25, 0x20); +MSB_WHITE (0x50, 0x54); + +EST_TIMING(0, 0, 0, 0, 0, 0, 0, 0); +EST_TIMING(0, 0, 0, 0, 0, 0, 0, 0); +EST_TIMING(0, 0, 0, 0, 0, 0, 0, 0); + +STD_RES_RATIO(1920, XY_RATIO_16_9, 120); +STD_RES_RATIO(1280, XY_RATIO_16_9, 60); +STD_RES_RATIO(1600, XY_RATIO_16_9, 60); +STD_RES_PAD(); +STD_RES_PAD(); +STD_RES_PAD(); +STD_RES_PAD(); +STD_RES_PAD(); + +DSC_DTD(594000, 96, + DTD_SYNC_TYPE(1, 1) | DTD_SYNC_DIR(1, 1), + 3840, 2160, + 176, 71, + 88, 73, + 560, 90, + 0, 0); + +DSC_DTD(113120, 155, + DTD_SYNC_TYPE(1, 1) | DTD_SYNC_DIR(0, 1), + 1920, 1080, + 48, 66, + 32, 69, + 222, 20, + 0, 0); +DSC_DTD(118250, 129, + DTD_SYNC_TYPE(1, 1) | DTD_SYNC_DIR(1, 0), + 1600, 900, + 96, 66, + 160, 68, + 512, 34, + 0, 0); +DSC_SERIAL("Linux #0"); + +EXTENSIONS(0); +END(); + +#include "edid.h" // validate presence of all required symbols + +// vim: ft=c:ts=8