From: Damien Lespiau <damien.lespiau at intel.com> Those infoframes are programmed when using stereo 3D modes. Signed-off-by: Damien Lespiau <damien.lespiau at intel.com> --- tools/intel_infoframes.c | 63 +++++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 62 insertions(+), 1 deletions(-) diff --git a/tools/intel_infoframes.c b/tools/intel_infoframes.c index d74df64..66351ac 100644 --- a/tools/intel_infoframes.c +++ b/tools/intel_infoframes.c @@ -125,6 +125,8 @@ typedef enum { #define SPD_INFOFRAME_VERSION 0x01 #define SPD_INFOFRAME_LENGTH 0x19 +#define VENDOR_ID_HDMI 0x000c03 + typedef struct { uint8_t type; uint8_t version; @@ -175,6 +177,21 @@ typedef union { } __attribute__((packed)) spd; struct { DipInfoFrameHeader header; + uint8_t checksum; + + uint8_t id[3]; + + uint8_t Rsvd0 :5; + uint8_t video_format :3; + + uint8_t Rsvd1 :4; + uint8_t s3d_structure :4; + + uint8_t Rsvd2 :4; + uint8_t s3d_ext_data :4; + } __attribute__((packed)) vendor; + struct { + DipInfoFrameHeader header; uint8_t body[27]; } generic; uint8_t data8[128]; @@ -424,10 +441,45 @@ static void dump_avi_info(Transcoder transcoder) printf("Invalid InfoFrame checksum!\n"); } +static const char *vendor_id_to_string(uint32_t id) +{ + switch (id) { + case VENDOR_ID_HDMI: + return "HDMI"; + default: + return "Unknown"; + } +} + +static const char *s3d_structure_to_string(int format) +{ + switch (format) { + case 0: + return "Frame Packing"; + case 6: + return "Top Bottom"; + case 8: + return "Side By Side (half)"; + default: + return "Reserved"; + } +} + +static void dump_vendor_hdmi(DipInfoFrame *frame) +{ + int s3d_present = frame->vendor.video_format & 0x2; + + printf("- video format: 0x%03x %s\n", frame->vendor.video_format, + s3d_present ? "(3D)" : ""); + if (s3d_present) + printf("- 3D Format: %s\n", + s3d_structure_to_string(frame->vendor.s3d_structure)); +} + static void dump_vendor_info(Transcoder transcoder) { Register reg = get_dip_ctl_reg(transcoder); - uint32_t val; + uint32_t val, vendor_id; DipFrequency freq; DipInfoFrame frame; @@ -446,6 +498,15 @@ static void dump_vendor_info(Transcoder transcoder) dump_raw_infoframe(&frame); + vendor_id = frame.vendor.id[2] << 16 | frame.vendor.id[1] << 8 | + frame.vendor.id[0]; + + printf("- vendor Id: 0x%06x (%s)\n", vendor_id, + vendor_id_to_string(vendor_id)); + + if (vendor_id == VENDOR_ID_HDMI) + dump_vendor_hdmi(&frame); + if (!infoframe_valid_checksum(&frame)) printf("Invalid InfoFrame checksum!\n"); } -- 1.7.7.5