EDID-DECODE(1)
π EDID-DECODE β the manual page, but make it make sense π
okay bestie, gather round, because this is edid-decode(1) from the User Commands section and it is genuinely one of the most useful little gremlins on your system. no cap.
β¨ NAME β¨
edid-decode β decodes EDID data and turns it into something a human can actually read. you know, instead of a wall of hex that makes your eyes glaze over π«Ά
πΈ SYNOPSIS πΈ
edid-decode <options> [in [out]]
π¦ DESCRIPTION π¦
So edid-decode takes EDID monitor description data and decodes it into a human-readable format. that's the whole vibe. π
Here's how the in/out situation works, and yes it's giving very flexible:
- If
[in]isn't given, or if[in]is-, then the EDID gets read from standard input. yes, it will just sit there and wait for you to pipe things into it, iconic behaviour honestly. - If
[out]is given, then whatever EDID was read from[in]gets written to[out]β or to standard output if[out]is-. By default the output is written as a hex dump when writing to standard output, or a raw EDID if written to a file. - β οΈ Important one: if
[out]is given, thenedid-decodeonly does the conversion. It skips the decoding step entirely. so don't be out here expecting a pretty decode when you asked for a conversion, that's on you bestie π
Input files can be raw binaries or ASCII text. When it's ASCII, it gets scanned for hex dumps, and there are heuristics baked in to hunt down hexdumps in:
edid-decode(1)output β as long as the initial hex dump was includedxrandr(1)property outputXorg(1)log file formats
otherwise the data is just treated as a raw hexdump. and if you're wondering where to even find EDID blocks for your connected monitors β they live in /sys/class/drm/*/edid on modern Linux systems with kernel modesetting support. go look, it's right there. π
β the timing format (this part is important) β
All timings are shown in a short format, for example:
VIC 16: 1920x1080 60.000 Hz 16:9 67.500 kHz 148.500 MHz (native)
VIC 5: 1920x1080i 60.000 Hz 16:9 33.750 kHz 74.250 MHz
VIC 39: 1920x1080i 50.000 Hz 16:9 31.250 kHz 72.000 MHz
Each format starts with a timings type prefix, then the resolution, then an optional interlaced indicator (i), then the frame rate (which is the field rate for interlaced formats), then the picture aspect ratio, then the horizontal frequency, then the pixelclock frequency β and optionally some extra flags tucked between parentheses. π
β οΈ careful with the interlaced ones: for interlaced formats the frame height is given, NOT the field height. So each field in a 1920x1080i format has 540 lines. do not come for me about this, that's just how it is.
Detailed timings get another 2-3 lines of data on top of that:
VIC 16: 1920x1080 60.000 Hz 16:9 67.500 kHz 148.500 MHz (native)
Hfront 88 Hsync 44 Hback 148 Hpol P
Vfront 4 Vsync 5 Vback 36 Vpol P
VIC 5: 1920x1080i 60.000 Hz 16:9 33.750 kHz 74.250 MHz
Hfront 88 Hsync 44 Hback 148 Hpol P
Vfront 2 Vsync 5 Vback 15 Vpol P Vfront +0.5 Odd Field
Vfront 2 Vsync 5 Vback 15 Vpol P Vback +0.5 Even Field
VIC 39: 1920x1080i 50.000 Hz 16:9 31.250 kHz 72.000 MHz
Hfront 32 Hsync 168 Hback 184 Hpol P
Vfront 23 Vsync 5 Vback 57 Vpol N Both Fields
These describe the horizontal and vertical front porch, sync, backporch and sync polarity values. π§
For interlaced formats there are two lines for the vertical information:
- one for the Odd Field (aka Field 1)
- one for the Even Field (aka Field 2)
The vertical front porch of the Odd Field is actually 2.5 β hence the Vfront +0.5 at the end of the line β and the back porch of the Even Field is actually 15.5 β hence the Vback +0.5 at the end of the line. sneaky little halves, obsessed. π
There's also a special VIC 39 interlaced format where both fields have the same vertical timings, and in that case it's marked with Both Fields.
π the timing types you might see π
DMT #β Discrete Monitor Timing (see DMT 1.3 standard). The number is the DMT ID in hexadecimal.CVTβ Coordinated Video Timings (formula-based, see CVT 1.2 standard).GTFβ Generalized Timing Formula (formula-based, see GTF 1.1 standard).IBMβ Old IBM Timings.Appleβ Old Apple Timings.VIC #β Video Identification Code (see CTA-861 standard). The number is the actual VIC code.HDMI VIC #β HDMI-specific Video Identification Code (see HDMI 2.1 standard). The number is the actual HDMI VIC code.DTD #β Detailed Timings Descriptor (see EDID standard). Also used for DisplayID Video Timing Modes Types I, II, VI, VII, VIII and X. The number denotes that this is the Nth DTD in the Base Block and CTA Extension Blocks.VTDB #β 20-byte DTD or 6- or 7-byte CVT descriptor in a CTA Extension Block. The number denotes that this is the Nth such timing in the CTA Extension Blocks.RID #@#β A CTA-861.6 Video Format Descriptor with the given Resolution ID (first number) at the given framerate (second number).
π long vs short, pick your fighter π
By default, DTDs are shown in the long format while everything else is just shown in the short format.
- With the option
--short-timings, all timings are shown in short format only. - With the option
--long-timings, all timings are shown in long format.
And if you want alternate formats for long timings, you can pick them via the --xmodeline or --fbmode options. yes ma'am, options within options, we love a layered situation. β¨
π STANDARDS π
The following EDID standards are supported by edid-decode:
EDID 1.3β VESA Enhanced Extended Display Identication Data Standard, Release A, Revision 1EDID 1.4β VESA Enhanced Extended Display Identication Data Standard, Release A, Revision 2DisplayID 1.3β VESA Display Identification Data (DisplayID) Standard, Version 1.3DisplayID 2.1aβ VESA DisplayID Standard, Version 2.1aDI-EXTβ VESA Display Information Extension Block Standard, Release ALS-EXTβ VESA Enhanced EDID Localized String Extension Standard, Release AVTB-EXTβ VESA Video Timing Block Extension Data Standard, Release ADTCDBβ VESA Display Transfer Characteristics Data Block Standard, Version 1.0DDDBβ VESA Display Device Data Block (DDDB) Standard, Version 1HDMI 1.4bβ High-Definition Multimedia Interface, Version 1.4bHDMI 2.1bβ High-Definition Multimedia Interface, Version 2.1bHDCP 1.4β High-bandwidth Digital Content Protection System, Revision 1.4HDCP 2.3β High-bandwidth Digital Content Protection System, Mapping HDCP to HDMI, Revision 2.3CTA-861-Iβ A DTV Profile for Uncompressed High Speed Digital InterfacesCTA-861.7β Improvements to CTA-861-ISPWG Notebook Panel Specification, Version 3.5EPI Embedded Panel Interface, Revision 1.0Microsoft EDID extension for head-mounted and specialized monitors, Version 3
π related standards it also pulls in π
The following related standards are also used by edid-decode:
DMT 1.3β VESA and Industry Standards and Guidelines for Computer Display Monitor Timing (DMT), Version 1.0, Rev. 13CVT 2.1β VESA Coordinated Video Timings (CVT) Standard, Version 2.1CVT 1.2β VESA Coordinated Video Timings (CVT) Standard, Version 1.2CVT 1.2β VESA CVT v1.2 Errata E2GTF 1.1β VESA Generalized Timing Formula Standard, Version: 1.1HDA 1.0aβ High Definition Audio Specification, Version 1.0a
okay and that's just part one bestie, we are SO not done yet, keep scrolling π
-h,--helpβ prints the help message. that's the whole assignment, bestie π«Ά-o,--output-format <fmt>β if[out]is specified, then write the EDID in format<fmt>. and<fmt>can be one of these iconic little guys:hexβ hex numbers in ascii text (this is the default for stdout)rawβ binary data (this is the default unless you're writing to stdout)carrayβ c-program structxmlβ XML data
-c,--checkβ check if the EDID conforms to the standards. warnings and failures get reported at the end, no cap. β¨-C,--check-inlineβ same energy, check if the EDID conforms to the standards, except this time warnings and failures are reported as they happen. live commentary, periodt π-n,--native-resolutionβ report the native resolution at the end. heads up tho: you might get multiple native resolution reports, and it depends on what the Source actually parses β only Block 0 (that's your DVI outputs vibe), or Block 0 and the CTA-861 Extension Blocks (hi HDMI), or just the DisplayID Extension Blocks (very DisplayPort of them). if every block has the same native resolution, then it only reports that one resolution. and for the older displays out there, you can get two separate native resolutions: progressive and interlaced π-p,--preferred-timingsβ report the preferred timings at the end. again, could be multiple preferred timing reports depending on whether the Source parses only Block 0 (e.g. DVI outputs), or Block 0 and the CTA-861 Extension Blocks (HDMI), or Block 0 and the DisplayID Extension Blocks (typical for DisplayPort) π¦-I,--infoframe <file>β parse the given InfoFrame file. pass'-'as the filename and it reads data from stdin instead. you can use this option multiple times to parse multiple InfoFrames, go off π and if you also hand it the EDID of the display these InfoFrames are being transmitted to, then the conformity checks will take that EDID into account.
here's the tea on the format: if the first byte in the InfoFrame is 0x80 or higher, then it's assumed to be an InfoFrame that starts with the HDMI header and has a checksum, as per the HDMI Specification. otherwise it's assumed to be a regular CTA-861 InfoFrame without a checksum.
Note: this is still work-in-progress, specifically for the AVI and HDMI InfoFrames. π
-E,--eld <file>β parse the given EDID-Like Data (ELD) file. this one can be used multiple times too, for multiple ELD files. read data from stdin if'-'was passed as a filename. and if the EDID of the display to which these ELD files are generated is also given, then the conformity checks will take that EDID into account π
on Linux systems you can pull ELD out with the amixer command β just copy all the hex after the 'values=':
$ amixer -c 0 controls | grep ELD
numid=6,iface=PCM,name='ELD',device=3
numid=12,iface=PCM,name='ELD',device=7
numid=18,iface=PCM,name='ELD',device=8
numid=24,iface=PCM,name='ELD',device=9
$ amixer -c 0 cget iface=PCM,name=ELD,device=3
numid=6,iface=PCM,name='ELD',device=3
; type=BYTES,access=r--v----,values=95
:
values=0x10,0x00,0x08,0x00,0x6d,0x10,0x00,0x01,0x00,0x02,0x00,0x00,0x00,0x00,
0x00,0x00,0x30,0xae,0xf1,0x61,0x4c,0x45,0x4e,0x20,0x54,0x33,0x32,0x68,0x2d,0x32,
0x30,0x0a,0x20,0x09,0x7f,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00
--diagonal <inches>β specify the diagonal of the display in inches. this turns on extra checks for the image size, checking if it lines up with that diagonal. and yes, this assumes square pixels πΈ-P,--physical-addressβ just report the HDMI Source Physical Address and literally nothing else. it reportsf.f.f.fif the EDID could not be parsed, or if there was no CTA-861 Vendor-Specific Data Block with OUI00-0C-03. otherwise it reports the Source Physical Address as provided in that Data Block. this is the perfect little input for HDMI CEC utilities like the linuxcec-ctl(1)utility π₯-S,--short-timingsβ report all video timings in a short format. concise queen π-L,--long-timingsβ report all video timings in a long format. verbose queen π-N,--ntscβ report the video timings with values suitable for NTSC-based video. like, it'll show refresh rates of29.97 Hzinstead of30 Hz. this only happens for timings with refresh rates that are a multiple of 6, fyi π-X,--xmodelineβ report all long video timings in the ModeLine format as defined inxorg.conf(5). that ModeLine can go straight into yourxorg.conffile, or you can pass it toxrandr(1)with thexrandr --newmodeoption. slay β¨-F,--fbmodeβ report all long video timings in the video mode format as defined infb.modes(5)π-V,--v4l2-timingsβ report all long video timings in the video mode format as defined in the linux headerv4l2-dv-timings.h, for use with the V4L2VIDIOC_S_DV_TIMINGSioctl π¦-s,--skip-hex-dumpβ skip the initial hex dump of the EDID. bye felicia π-H,--only-hex-dumpβ only show the hex dump of the EDID, then exit. short and sweet π--skip-shaβ don't show the SHA hash. normally edid-decode shows the SHA, i.e. the hash of the git commit used to compile edid-decode. this uniquely identifies the version of edid-decode that's used to generate the warnings and failures. but plot twist: it'll also change the output of edid-decode for every new commit in the git repository, even if nothing else changed in the edid-decode output π use this option to avoid including the SHA in the edid-decode output.-u,--utf8β convert embedded EDID strings to UTF-8, using Code Page 437 for the base block and ISO 8859-1 for the DisplayID block πΈ--hide-serial-numbersβ hide any serial numbers in the human readable output by'...'. ngl they're still super easily extracted from the EDID hex dump at the start, so this is more of a vibe thing than a security thing π--replace-unique-idsβ replaces any unique IDs in the EDID by fixed values. serial numbers get replaced by'123456', Container IDs by all zeroes, and the'Made in'date by the year 2000. this will also update any checksums in the EDID and update the EDID hex dump at the start of the output. but heads up bestie: since this updates checksums, any checksum errors present in the original EDID will no longer be detected. gone, reduced to atoms π
where do these live? serial numbers can appear in the Base Block, CTA-861 Extension Blocks, DisplayID Extension Blocks and Localized String Extension Blocks. Container IDs can appear in the DisplayID and CTA-861 Extension Blocks.
and the 'Made in' date appears in the Base Block.
--versionβ show the SHA hash and the last commit date β
π I2C/DDC OPTIONS π
okay so these next ones read the DDC bus directly, provided the DDC bus is exposed by linux to /dev/i2c-X as an i2c adapter device. yes we're going straight to the hardware, main character energy π₯
this can be used to read the EDID and HDCP information directly from the sink and parse it. no middleman, no cap π
-a,--i2c-adapter <dev>β use the<dev>device to access the DDC lines. if<dev>starts with a digit, then/dev/i2c-<dev>is used β¨--i2c-edidβ read and parse the EDID from the i2c adapter π--i2c-hdcpβ read and parse the HDCP data from the i2c adapter π--i2c-hdcp-ri <t>β every<t>seconds, read and report the HDCP Ri value from the i2c adapter. like a lil heartbeat monitor for your HDCP π«Ά- **
--i2c-test-reliability [duration=<secs>][,sleep=<msecs>]** β read the EDID continuously for<secs>seconds (default is0, meaning forever π), with a sleep of<msecs>milliseconds (default value is50 ms`) in between each read. report a FAIL if there are mismatches between EDIDs. this tests the i2c communication towards the display. stress test, but make it β¨fashionβ¨
β¨ TIMING OPTIONS β¨
Okay bestie, this whole section is the timing calculator era π
These options either report timings for DMT, VIC and HDMI VIC codes, or they do the math and calculate timings for CVT or GTF formats based on whatever parameters you hand them. Heads up though: the EDID will not be shown when you use these β which is lowkey sad but it is what it is π The one exception vibe is that it can still be used together with the --gtf option, so it can read the secondary curve parameters. Slay.
--std <byte1>,<byte2>β shows you the standard timing that these two bytes represent. Just two little bytes and it spills the whole tea β--dmt <dmt>β shows the timings for the DMT with the given DMT ID π--vic <vic>β shows the timings for this VIC β¨--hdmi-vic <hdmivic>β shows the timings for this HDMI VIC π¦--cvt w=<width>,h=<height>,fps=<fps>[,rb=<rb>][,interlaced][,overscan][,alt][,hblank=<hblank>][,vblank=<vblank>][,early-vsync]β calculates the CVT timings for the given format. Iconic behavior honestly π
So like, decoding the deets on this one:
<width>is the width in pixels, and<height>is the frame (not field!) height in lines. Not the field bestie, the frame π«Ά<fps>is frames per second for progressive timings, and fields per second for interlaced timings.<rb>can be0(that means no reduced blanking, and it's the default), or1-3for the reduced blanking version.- If
interlacedis given, then this is an interlaced format. - If
overscanis given, then this is an overscanned format. I.e., margins are required. - If
altis given and<rb>=2, then it reports the timings optimized for video:1000 / 1001 * <fps>. Math girlie behavior π - If
altis given and<rb>=3, then the horizontal blanking is160instead of80pixels. - If
hblankis given and<rb>=3, then the horizontal blanking is<hblank>pixels (range of80-200and divisible by8), and it overridesalt. Queen of override energy π - If
vblankis given and<rb>=3, then the vertical blanking time is<vblank>microseconds (460minimum, values >705might not be supported by all RBv3 timings compliant source devices. Careful bestie, not every device is built for that π¬ - If
early-vsyncis given and<rb>=3, then it selects an early vsync timing. β¨
--gtfw=<width>,h=<height>[,fps=<fps>][,horfreq=<horfreq>][,pixclk=<pixclk>][,interlaced][,overscan][,secondary][,C=<c>][,M=<m>][,K=<k>][,J=<j>]β calculates the GTF timings for the given format π
Breaking it down, no cap:
<width>is the width in pixels,<height>is the frame (not field!) height in lines. Again: frame, not field πΈ<fps>is frames per second for progressive timings and fields per second for interlaced timings.<horfreq>is the horizontal frequency in kHz.<pixclk>is the pixel clock frequency in MHz. And listen: only one offps,horfreqorpixclkmust be given. Pick one, babe, don't be greedy π- If
interlacedis given, then this is an interlaced format. - If
overscanis given, then this is an overscanned format. I.e., margins are required. - If
secondaryis given, then the secondary GTF is used for reduced blanking, where<c>,<m>,<k>and<j>are parameters for the secondary curve. If none of the secondary curve parameters were set, and an EDID file is passed as a command line option, then the secondary curve parameters are read from that EDID. It's giving "read the roomβ¦ and the file" πβ¨ - The default secondary curve parameters are
40for<c>,600for<m>,128for<k>and20for<j>. These values correspond to the normal curve that GTF uses.
--ovt (rid=<rid>|w=<width>,h=<height>),fps=<fps>β calculates the OVT timings for the given format. Either specify a<rid>or specify<width>and<height>(pick a lane, bestie π).<fps>is frames per second.--list-established-timingsβ lists all known Established Timings π--list-dmtsβ lists all known DMTs π--list-vicsβ lists all known VICs π--list-hdmi-vicsβ lists all known HDMI VICs π--list-ridsβ lists all known CTA-861 RIDs π--list-rid-timings <rid>β lists all timings for the specified<rid>, or all known RIDs if<rid>is0. Zero means "give me everything" and honestly same π
π«Ά NOTES π«Ά
Not all fields are decoded, or decoded completely. Not every part of the vibe gets its moment π edid-decode does attempt to validate its input against the relevant standards, but its opinions have not been double-checked with the relevant standards bodies, so they may be wrong.
Do not rely on the output format, because it will likely change in future versions of the tool as additional fields and extensions are added. It's giving "don't get attached, it's a phase" π
π SEE ALSO π
Xorg(1), xrandr(1), cec-ctl(1), xorg.conf(5), fb.modes(5)
The whole friend group, honestly. Go say hi π
π AUTHORS π
edid-decode was written by Adam Jackson, with contributions from Eric Anholt, Damien Lespiau, Hans Verkuil and others. Legends only, fr fr π
Bug reports or questions about this utility should be sent to the linux-media@vger.kernel.org mailinglist. Don't be shy, they want to hear from you π«Ά
And that's a wrap on EDID-DECODE(1), bestie!! πβ¨ This page is from v4l-utils 1.32.0, dated November 2024 β yes, a certified fresh drop, we love to see it π
πΈ Go forth and decode those EDIDs, you absolute icon ππ
π¦ where this page comes from
- alpine 3.24: v4l-utils-doc 1.32.0-r1 Β· LGPL-2.0-or-later
- arch rolling: v4l-utils 1.32.0-2 Β· LGPL
- fedora 43: v4l-utils 1.32.0-1.fc43 Β· GPL-2.0-or-later AND GPL-2.0-only AND (GPL-2.0-only OR BSD-3-Clause) AND LicenseRef-Fedora-Public-Domain AND HPND-sell-variant
- fedora 44: v4l-utils 1.32.0-3.fc44 Β· GPL-2.0-or-later AND GPL-2.0-only AND (GPL-2.0-only OR BSD-3-Clause) AND LicenseRef-Fedora-Public-Domain AND HPND-sell-variant
- nixos 26.05: v4l-utils 1.32.0
- nixpkgs unstable: v4l-utils 1.32.0
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms