linux/include/linux/hdmi.h
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2012 Avionic Design GmbH
   3 *
   4 * This program is free software; you can redistribute it and/or modify
   5 * it under the terms of the GNU General Public License version 2 as
   6 * published by the Free Software Foundation.
   7 */
   8
   9#ifndef __LINUX_HDMI_H_
  10#define __LINUX_HDMI_H_
  11
  12#include <linux/types.h>
  13
  14enum hdmi_infoframe_type {
  15        HDMI_INFOFRAME_TYPE_VENDOR = 0x81,
  16        HDMI_INFOFRAME_TYPE_AVI = 0x82,
  17        HDMI_INFOFRAME_TYPE_SPD = 0x83,
  18        HDMI_INFOFRAME_TYPE_AUDIO = 0x84,
  19};
  20
  21#define HDMI_IEEE_OUI 0x000c03
  22#define HDMI_INFOFRAME_HEADER_SIZE  4
  23#define HDMI_AVI_INFOFRAME_SIZE    13
  24#define HDMI_SPD_INFOFRAME_SIZE    25
  25#define HDMI_AUDIO_INFOFRAME_SIZE  10
  26
  27#define HDMI_INFOFRAME_SIZE(type)       \
  28        (HDMI_INFOFRAME_HEADER_SIZE + HDMI_ ## type ## _INFOFRAME_SIZE)
  29
  30struct hdmi_any_infoframe {
  31        enum hdmi_infoframe_type type;
  32        unsigned char version;
  33        unsigned char length;
  34};
  35
  36enum hdmi_colorspace {
  37        HDMI_COLORSPACE_RGB,
  38        HDMI_COLORSPACE_YUV422,
  39        HDMI_COLORSPACE_YUV444,
  40};
  41
  42enum hdmi_scan_mode {
  43        HDMI_SCAN_MODE_NONE,
  44        HDMI_SCAN_MODE_OVERSCAN,
  45        HDMI_SCAN_MODE_UNDERSCAN,
  46};
  47
  48enum hdmi_colorimetry {
  49        HDMI_COLORIMETRY_NONE,
  50        HDMI_COLORIMETRY_ITU_601,
  51        HDMI_COLORIMETRY_ITU_709,
  52        HDMI_COLORIMETRY_EXTENDED,
  53};
  54
  55enum hdmi_picture_aspect {
  56        HDMI_PICTURE_ASPECT_NONE,
  57        HDMI_PICTURE_ASPECT_4_3,
  58        HDMI_PICTURE_ASPECT_16_9,
  59};
  60
  61enum hdmi_active_aspect {
  62        HDMI_ACTIVE_ASPECT_16_9_TOP = 2,
  63        HDMI_ACTIVE_ASPECT_14_9_TOP = 3,
  64        HDMI_ACTIVE_ASPECT_16_9_CENTER = 4,
  65        HDMI_ACTIVE_ASPECT_PICTURE = 8,
  66        HDMI_ACTIVE_ASPECT_4_3 = 9,
  67        HDMI_ACTIVE_ASPECT_16_9 = 10,
  68        HDMI_ACTIVE_ASPECT_14_9 = 11,
  69        HDMI_ACTIVE_ASPECT_4_3_SP_14_9 = 13,
  70        HDMI_ACTIVE_ASPECT_16_9_SP_14_9 = 14,
  71        HDMI_ACTIVE_ASPECT_16_9_SP_4_3 = 15,
  72};
  73
  74enum hdmi_extended_colorimetry {
  75        HDMI_EXTENDED_COLORIMETRY_XV_YCC_601,
  76        HDMI_EXTENDED_COLORIMETRY_XV_YCC_709,
  77        HDMI_EXTENDED_COLORIMETRY_S_YCC_601,
  78        HDMI_EXTENDED_COLORIMETRY_ADOBE_YCC_601,
  79        HDMI_EXTENDED_COLORIMETRY_ADOBE_RGB,
  80};
  81
  82enum hdmi_quantization_range {
  83        HDMI_QUANTIZATION_RANGE_DEFAULT,
  84        HDMI_QUANTIZATION_RANGE_LIMITED,
  85        HDMI_QUANTIZATION_RANGE_FULL,
  86};
  87
  88/* non-uniform picture scaling */
  89enum hdmi_nups {
  90        HDMI_NUPS_UNKNOWN,
  91        HDMI_NUPS_HORIZONTAL,
  92        HDMI_NUPS_VERTICAL,
  93        HDMI_NUPS_BOTH,
  94};
  95
  96enum hdmi_ycc_quantization_range {
  97        HDMI_YCC_QUANTIZATION_RANGE_LIMITED,
  98        HDMI_YCC_QUANTIZATION_RANGE_FULL,
  99};
 100
 101enum hdmi_content_type {
 102        HDMI_CONTENT_TYPE_NONE,
 103        HDMI_CONTENT_TYPE_PHOTO,
 104        HDMI_CONTENT_TYPE_CINEMA,
 105        HDMI_CONTENT_TYPE_GAME,
 106};
 107
 108struct hdmi_avi_infoframe {
 109        enum hdmi_infoframe_type type;
 110        unsigned char version;
 111        unsigned char length;
 112        enum hdmi_colorspace colorspace;
 113        enum hdmi_scan_mode scan_mode;
 114        enum hdmi_colorimetry colorimetry;
 115        enum hdmi_picture_aspect picture_aspect;
 116        enum hdmi_active_aspect active_aspect;
 117        bool itc;
 118        enum hdmi_extended_colorimetry extended_colorimetry;
 119        enum hdmi_quantization_range quantization_range;
 120        enum hdmi_nups nups;
 121        unsigned char video_code;
 122        enum hdmi_ycc_quantization_range ycc_quantization_range;
 123        enum hdmi_content_type content_type;
 124        unsigned char pixel_repeat;
 125        unsigned short top_bar;
 126        unsigned short bottom_bar;
 127        unsigned short left_bar;
 128        unsigned short right_bar;
 129};
 130
 131int hdmi_avi_infoframe_init(struct hdmi_avi_infoframe *frame);
 132ssize_t hdmi_avi_infoframe_pack(struct hdmi_avi_infoframe *frame, void *buffer,
 133                                size_t size);
 134
 135enum hdmi_spd_sdi {
 136        HDMI_SPD_SDI_UNKNOWN,
 137        HDMI_SPD_SDI_DSTB,
 138        HDMI_SPD_SDI_DVDP,
 139        HDMI_SPD_SDI_DVHS,
 140        HDMI_SPD_SDI_HDDVR,
 141        HDMI_SPD_SDI_DVC,
 142        HDMI_SPD_SDI_DSC,
 143        HDMI_SPD_SDI_VCD,
 144        HDMI_SPD_SDI_GAME,
 145        HDMI_SPD_SDI_PC,
 146        HDMI_SPD_SDI_BD,
 147        HDMI_SPD_SDI_SACD,
 148        HDMI_SPD_SDI_HDDVD,
 149        HDMI_SPD_SDI_PMP,
 150};
 151
 152struct hdmi_spd_infoframe {
 153        enum hdmi_infoframe_type type;
 154        unsigned char version;
 155        unsigned char length;
 156        char vendor[8];
 157        char product[16];
 158        enum hdmi_spd_sdi sdi;
 159};
 160
 161int hdmi_spd_infoframe_init(struct hdmi_spd_infoframe *frame,
 162                            const char *vendor, const char *product);
 163ssize_t hdmi_spd_infoframe_pack(struct hdmi_spd_infoframe *frame, void *buffer,
 164                                size_t size);
 165
 166enum hdmi_audio_coding_type {
 167        HDMI_AUDIO_CODING_TYPE_STREAM,
 168        HDMI_AUDIO_CODING_TYPE_PCM,
 169        HDMI_AUDIO_CODING_TYPE_AC3,
 170        HDMI_AUDIO_CODING_TYPE_MPEG1,
 171        HDMI_AUDIO_CODING_TYPE_MP3,
 172        HDMI_AUDIO_CODING_TYPE_MPEG2,
 173        HDMI_AUDIO_CODING_TYPE_AAC_LC,
 174        HDMI_AUDIO_CODING_TYPE_DTS,
 175        HDMI_AUDIO_CODING_TYPE_ATRAC,
 176        HDMI_AUDIO_CODING_TYPE_DSD,
 177        HDMI_AUDIO_CODING_TYPE_EAC3,
 178        HDMI_AUDIO_CODING_TYPE_DTS_HD,
 179        HDMI_AUDIO_CODING_TYPE_MLP,
 180        HDMI_AUDIO_CODING_TYPE_DST,
 181        HDMI_AUDIO_CODING_TYPE_WMA_PRO,
 182};
 183
 184enum hdmi_audio_sample_size {
 185        HDMI_AUDIO_SAMPLE_SIZE_STREAM,
 186        HDMI_AUDIO_SAMPLE_SIZE_16,
 187        HDMI_AUDIO_SAMPLE_SIZE_20,
 188        HDMI_AUDIO_SAMPLE_SIZE_24,
 189};
 190
 191enum hdmi_audio_sample_frequency {
 192        HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM,
 193        HDMI_AUDIO_SAMPLE_FREQUENCY_32000,
 194        HDMI_AUDIO_SAMPLE_FREQUENCY_44100,
 195        HDMI_AUDIO_SAMPLE_FREQUENCY_48000,
 196        HDMI_AUDIO_SAMPLE_FREQUENCY_88200,
 197        HDMI_AUDIO_SAMPLE_FREQUENCY_96000,
 198        HDMI_AUDIO_SAMPLE_FREQUENCY_176400,
 199        HDMI_AUDIO_SAMPLE_FREQUENCY_192000,
 200};
 201
 202enum hdmi_audio_coding_type_ext {
 203        HDMI_AUDIO_CODING_TYPE_EXT_STREAM,
 204        HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC,
 205        HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC_V2,
 206        HDMI_AUDIO_CODING_TYPE_EXT_MPEG_SURROUND,
 207};
 208
 209struct hdmi_audio_infoframe {
 210        enum hdmi_infoframe_type type;
 211        unsigned char version;
 212        unsigned char length;
 213        unsigned char channels;
 214        enum hdmi_audio_coding_type coding_type;
 215        enum hdmi_audio_sample_size sample_size;
 216        enum hdmi_audio_sample_frequency sample_frequency;
 217        enum hdmi_audio_coding_type_ext coding_type_ext;
 218        unsigned char channel_allocation;
 219        unsigned char level_shift_value;
 220        bool downmix_inhibit;
 221
 222};
 223
 224int hdmi_audio_infoframe_init(struct hdmi_audio_infoframe *frame);
 225ssize_t hdmi_audio_infoframe_pack(struct hdmi_audio_infoframe *frame,
 226                                  void *buffer, size_t size);
 227
 228enum hdmi_3d_structure {
 229        HDMI_3D_STRUCTURE_INVALID = -1,
 230        HDMI_3D_STRUCTURE_FRAME_PACKING = 0,
 231        HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE,
 232        HDMI_3D_STRUCTURE_LINE_ALTERNATIVE,
 233        HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL,
 234        HDMI_3D_STRUCTURE_L_DEPTH,
 235        HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH,
 236        HDMI_3D_STRUCTURE_TOP_AND_BOTTOM,
 237        HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF = 8,
 238};
 239
 240
 241struct hdmi_vendor_infoframe {
 242        enum hdmi_infoframe_type type;
 243        unsigned char version;
 244        unsigned char length;
 245        unsigned int oui;
 246        u8 vic;
 247        enum hdmi_3d_structure s3d_struct;
 248        unsigned int s3d_ext_data;
 249};
 250
 251int hdmi_vendor_infoframe_init(struct hdmi_vendor_infoframe *frame);
 252ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
 253                                   void *buffer, size_t size);
 254
 255union hdmi_vendor_any_infoframe {
 256        struct {
 257                enum hdmi_infoframe_type type;
 258                unsigned char version;
 259                unsigned char length;
 260                unsigned int oui;
 261        } any;
 262        struct hdmi_vendor_infoframe hdmi;
 263};
 264
 265/**
 266 * union hdmi_infoframe - overall union of all abstract infoframe representations
 267 * @any: generic infoframe
 268 * @avi: avi infoframe
 269 * @spd: spd infoframe
 270 * @vendor: union of all vendor infoframes
 271 * @audio: audio infoframe
 272 *
 273 * This is used by the generic pack function. This works since all infoframes
 274 * have the same header which also indicates which type of infoframe should be
 275 * packed.
 276 */
 277union hdmi_infoframe {
 278        struct hdmi_any_infoframe any;
 279        struct hdmi_avi_infoframe avi;
 280        struct hdmi_spd_infoframe spd;
 281        union hdmi_vendor_any_infoframe vendor;
 282        struct hdmi_audio_infoframe audio;
 283};
 284
 285ssize_t
 286hdmi_infoframe_pack(union hdmi_infoframe *frame, void *buffer, size_t size);
 287
 288#endif /* _DRM_HDMI_H */
 289