1 ///*****************************************
\r
2 // Copyright (C) 2009-2014
\r
3 // ITE Tech. Inc. All Rights Reserved
\r
4 // Proprietary and Confidential
\r
5 ///*****************************************
\r
6 // @file <hdmitx_sys.c>
\r
7 // @author Jau-Chih.Tseng@ite.com.tw
\r
9 // @fileversion: ITE_HDMITX_SAMPLE_3.14
\r
10 //******************************************/
\r
12 ///////////////////////////////////////////////////////////////////////////////
\r
13 // This is the sample program for CAT6611 driver usage.
\r
14 ///////////////////////////////////////////////////////////////////////////////
\r
15 #include <linux/kernel.h>
\r
16 #include <linux/delay.h>
\r
19 #include "hdmitx_sys.h"
\r
21 _CODE HDMITXDEV InstanceData =
\r
24 0, // BYTE I2C_DEV ;
\r
25 HDMI_TX_I2C_SLAVE_ADDR, // BYTE I2C_ADDR ;
\r
27 /////////////////////////////////////////////////
\r
29 /////////////////////////////////////////////////
\r
30 0x40, // BYTE bIntType ; // = 0 ;
\r
31 /////////////////////////////////////////////////
\r
33 /////////////////////////////////////////////////
\r
34 INPUT_SIGNAL_TYPE ,// BYTE bInputVideoSignalType ; // for Sync Embedded,CCIR656,InputDDR
\r
36 /////////////////////////////////////////////////
\r
38 /////////////////////////////////////////////////
\r
39 I2S_FORMAT, // BYTE bOutputAudioMode ; // = 0 ;
\r
40 FALSE , // BYTE bAudioChannelSwap ; // = 0 ;
\r
41 0x01, // BYTE bAudioChannelEnable ;
\r
42 INPUT_SAMPLE_FREQ ,// BYTE bAudFs ;
\r
43 0, // unsigned long TMDSClock ;
\r
44 FALSE, // BYTE bAuthenticated:1 ;
\r
45 FALSE, // BYTE bHDMIMode: 1;
\r
46 FALSE, // BYTE bIntPOL:1 ; // 0 = Low Active
\r
47 FALSE, // BYTE bHPD:1 ;
\r
50 #ifdef HDMITX_INPUT_INFO
\r
51 // HDMI_VTiming currVTiming ;
\r
52 ////////////////////////////////////////////////////////////////////////////////
\r
54 ////////////////////////////////////////////////////////////////////////////////
\r
55 static HDMI_VTiming _CODE s_VMTable[] = {
\r
57 { 1,0,640,480,800,525,25175000L,0x89,16,96,48,10,2,33,PROG,Vneg,Hneg},//640x480@60Hz
\r
58 { 2,0,720,480,858,525,27000000L,0x80,16,62,60,9,6,30,PROG,Vneg,Hneg},//720x480@60Hz
\r
59 { 3,0,720,480,858,525,27000000L,0x80,16,62,60,9,6,30,PROG,Vneg,Hneg},//720x480@60Hz
\r
60 { 4,0,1280,720,1650,750,74250000L,0x2E,110,40,220,5,5,20,PROG,Vpos,Hpos},//1280x720@60Hz
\r
61 { 5,0,1920,540,2200,562,74250000L,0x2E,88,44,148,2,5,15,INTERLACE,Vpos,Hpos},//1920x1080(I)@60Hz
\r
62 { 6,1,720,240,858,262,13500000L,0x100,19,62,57,4,3,15,INTERLACE,Vneg,Hneg},//720x480(I)@60Hz
\r
63 { 7,1,720,240,858,262,13500000L,0x100,19,62,57,4,3,15,INTERLACE,Vneg,Hneg},//720x480(I)@60Hz
\r
64 { 8,1,720,240,858,262,13500000L,0x100,19,62,57,4,3,15,PROG,Vneg,Hneg},//720x480(I)@60Hz
\r
65 { 9,1,720,240,858,262,13500000L,0x100,19,62,57,4,3,15,PROG,Vneg,Hneg},//720x480(I)@60Hz
\r
66 {10,2,720,240,858,262,54000000L,0x40,19,62,57,4,3,15,INTERLACE,Vneg,Hneg},//720x480(I)@60Hz
\r
67 {11,2,720,240,858,262,54000000L,0x40,19,62,57,4,3,15,INTERLACE,Vneg,Hneg},//720x480(I)@60Hz
\r
68 {12,2,720,240,858,262,54000000L,0x40,19,62,57,4,3,15,PROG,Vneg,Hneg},//720x480(I)@60Hz
\r
69 {13,2,720,240,858,262,54000000L,0x40,19,62,57,4,3,15,PROG,Vneg,Hneg},//720x480(I)@60Hz
\r
70 {14,1,1440,480,1716,525,54000000L,0x40,32,124,120,9,6,30,PROG,Vneg,Hneg},//1440x480@60Hz
\r
71 {15,1,1440,480,1716,525,54000000L,0x40,32,124,120,9,6,30,PROG,Vneg,Hneg},//1440x480@60Hz
\r
72 {16,0,1920,1080,2200,1125,148500000L,0x17,88,44,148,4,5,36,PROG,Vpos,Hpos},//1920x1080@60Hz
\r
73 {17,0,720,576,864,625,27000000L,0x80,12,64,68,5,5,39,PROG,Vneg,Hneg},//720x576@50Hz
\r
74 {18,0,720,576,864,625,27000000L,0x80,12,64,68,5,5,39,PROG,Vneg,Hneg},//720x576@50Hz
\r
75 {19,0,1280,720,1980,750,74250000L,0x2E,440,40,220,5,5,20,PROG,Vpos,Hpos},//1280x720@50Hz
\r
76 {20,0,1920,540,2640,562,74250000L,0x2E,528,44,148,2,5,15,INTERLACE,Vpos,Hpos},//1920x1080(I)@50Hz
\r
77 {21,1,720,288,864,312,13500000L,0x100,12,63,69,2,3,19,INTERLACE,Vneg,Hneg},//1440x576(I)@50Hz
\r
78 {22,1,720,288,864,312,13500000L,0x100,12,63,69,2,3,19,INTERLACE,Vneg,Hneg},//1440x576(I)@50Hz
\r
79 {23,1,720,288,864,312,13500000L,0x100,12,63,69,2,3,19,PROG,Vneg,Hneg},//1440x288@50Hz
\r
80 {24,1,720,288,864,312,13500000L,0x100,12,63,69,2,3,19,PROG,Vneg,Hneg},//1440x288@50Hz
\r
81 {25,2,720,288,864,312,13500000L,0x100,12,63,69,2,3,19,INTERLACE,Vneg,Hneg},//1440x576(I)@50Hz
\r
82 {26,2,720,288,864,312,13500000L,0x100,12,63,69,2,3,19,INTERLACE,Vneg,Hneg},//1440x576(I)@50Hz
\r
83 {27,2,720,288,864,312,13500000L,0x100,12,63,69,2,3,19,PROG,Vneg,Hneg},//1440x288@50Hz
\r
84 {28,2,720,288,864,312,13500000L,0x100,12,63,69,2,3,19,PROG,Vneg,Hneg},//1440x288@50Hz
\r
85 {29,1,1440,576,1728,625,54000000L,0x40,24,128,136,5,5,39,PROG,Vpos,Hneg},//1440x576@50Hz
\r
86 {30,1,1440,576,1728,625,54000000L,0x40,24,128,136,5,5,39,PROG,Vpos,Hneg},//1440x576@50Hz
\r
87 {31,0,1920,1080,2640,1125,148500000L,0x17,528,44,148,4,5,36,PROG,Vpos,Hpos},//1920x1080@50Hz
\r
88 {32,0,1920,1080,2750,1125,74250000L,0x2E,638,44,148,4,5,36,PROG,Vpos,Hpos},//1920x1080@24Hz
\r
89 {33,0,1920,1080,2640,1125,74250000L,0x2E,528,44,148,4,5,36,PROG,Vpos,Hpos},//1920x1080@25Hz
\r
90 {34,0,1920,1080,2200,1125,74250000L,0x2E,88,44,148,4,5,36,PROG,Vpos,Hpos},//1920x1080@30Hz
\r
92 {35,2,2880,480,1716*2,525,108000000L,0x20,32*2,124*2,120*2,9,6,30,PROG,Vneg,Hneg},//2880x480@60Hz
\r
93 {36,2,2880,480,1716*2,525,108000000L,0x20,32*2,124*2,120*2,9,6,30,PROG,Vneg,Hneg},//2880x480@60Hz
\r
94 {37,1,2880,576,3456,625,108000000L,0x20,24*2,128*2,136*2,5,5,39,PROG,Vneg,Hneg},//2880x576@50Hz
\r
95 {38,2,2880,576,3456,625,108000000L,0x20,24*2,128*2,136*2,5,5,39,PROG,Vneg,Hneg},//2880x576@50Hz
\r
97 {39,0,1920,540,2304,625,72000000L,0x17,32,168,184,23,5,57,INTERLACE,Vneg,Hpos},//1920x1080@50Hz
\r
99 {40,0,1920,540,2640,562,148500000L,0x17,528,44,148,2,5,15,INTERLACE,Vpos,Hpos},//1920x1080(I)@100Hz
\r
100 {41,0,1280,720,1980,750,148500000L,0x17,440,40,220,5,5,20,PROG,Vpos,Hpos},//1280x720@100Hz
\r
101 {42,0,720,576,864,625, 54000000L,0x40,12,64,68,5,5,39,PROG,Vneg,Hneg},//720x576@100Hz
\r
102 {43,0,720,576,864,625, 54000000L,0x40,12,64,68,5,5,39,PROG,Vneg,Hneg},//720x576@100Hz
\r
103 {44,1,720,288,864,312, 27000000L,0x80,12,63,69,2,3,19,INTERLACE,Vneg,Hneg},//1440x576(I)@100Hz
\r
104 {45,1,720,288,864,312, 27000000L,0x80,12,63,69,2,3,19,INTERLACE,Vneg,Hneg},//1440x576(I)@100Hz
\r
106 {46,0,1920,540,2200,562,148500000L,0x17,88,44,148,2,5,15,INTERLACE,Vpos,Hpos},//1920x1080(I)@120Hz
\r
107 {47,0,1280,720,1650,750,148500000L,0x17,110,40,220,5,5,20,PROG,Vpos,Hpos},//1280x720@120Hz
\r
108 {48,0, 720,480, 858,525, 54000000L,0x40,16,62,60,9,6,30,PROG,Vneg,Hneg},//720x480@120Hz
\r
109 {49,0, 720,480, 858,525, 54000000L,0x40,16,62,60,9,6,30,PROG,Vneg,Hneg},//720x480@120Hz
\r
110 {50,1, 720,240, 858,262, 27000000L,0x80,19,62,57,4,3,15,INTERLACE,Vneg,Hneg},//720x480(I)@120Hz
\r
111 {51,1, 720,240, 858,262, 27000000L,0x80,19,62,57,4,3,15,INTERLACE,Vneg,Hneg},//720x480(I)@120Hz
\r
114 {52,0,720,576,864,625,108000000L,0x20,12,64,68,5,5,39,PROG,Vneg,Hneg},//720x576@200Hz
\r
115 {53,0,720,576,864,625,108000000L,0x20,12,64,68,5,5,39,PROG,Vneg,Hneg},//720x576@200Hz
\r
116 {54,1,720,288,864,312, 54000000L,0x40,12,63,69,2,3,19,INTERLACE,Vneg,Hneg},//1440x576(I)@200Hz
\r
117 {55,1,720,288,864,312, 54000000L,0x40,12,63,69,2,3,19,INTERLACE,Vneg,Hneg},//1440x576(I)@200Hz
\r
119 {56,0,720,480,858,525,108000000L,0x20,16,62,60,9,6,30,PROG,Vneg,Hneg},//720x480@120Hz
\r
120 {57,0,720,480,858,525,108000000L,0x20,16,62,60,9,6,30,PROG,Vneg,Hneg},//720x480@120Hz
\r
121 {58,1,720,240,858,262, 54000000L,0x40,19,62,57,4,3,15,INTERLACE,Vneg,Hneg},//720x480(I)@120Hz
\r
122 {59,1,720,240,858,262, 54000000L,0x40,19,62,57,4,3,15,INTERLACE,Vneg,Hneg},//720x480(I)@120Hz
\r
123 // 720p low resolution
\r
124 {60,0,1280, 720,3300, 750, 59400000L,0x3A,1760,40,220,5,5,20,PROG,Vpos,Hpos},//1280x720@24Hz
\r
125 {61,0,1280, 720,3960, 750, 74250000L,0x2E,2420,40,220,5,5,20,PROG,Vpos,Hpos},//1280x720@25Hz
\r
126 {62,0,1280, 720,3300, 750, 74250000L,0x2E,1760,40,220,5,5,20,PROG,Vpos,Hpos},//1280x720@30Hz
\r
127 // 1080p high refresh rate
\r
128 {63,0,1920,1080,2200,1125,297000000L,0x0B, 88,44,148,4,5,36,PROG,Vpos,Hpos},//1920x1080@120Hz
\r
129 {64,0,1920,1080,2640,1125,297000000L,0x0B,528,44,148,4,5,36,PROG,Vpos,Hpos},//1920x1080@100Hz
\r
131 {0,0,640,350,832,445,31500000L,0x6D,32,64,96,32,3,60,PROG,Vneg,Hpos},// 640x350@85
\r
132 {0,0,640,400,832,445,31500000L,0x6D,32,64,96,1,3,41,PROG,Vneg,Hneg},// 640x400@85
\r
133 {0,0,832,624,1152,667,57283000L,0x3C,32,64,224,1,3,39,PROG,Vneg,Hneg},// 832x624@75Hz
\r
134 {0,0,720,350,900,449,28322000L,0x7A,18,108,54,59,2,38,PROG,Vneg,Hneg},// 720x350@70Hz
\r
135 {0,0,720,400,900,449,28322000L,0x7A,18,108,54,13,2,34,PROG,Vpos,Hneg},// 720x400@70Hz
\r
136 {0,0,720,400,936,446,35500000L,0x61,36,72,108,1,3,42,PROG,Vpos,Hneg},// 720x400@85
\r
137 {0,0,640,480,800,525,25175000L,0x89,16,96,48,10,2,33,PROG,Vneg,Hneg},// 640x480@60
\r
138 {0,0,640,480,832,520,31500000L,0x6D,24,40,128,9,3,28,PROG,Vneg,Hneg},// 640x480@72
\r
139 {0,0,640,480,840,500,31500000L,0x6D,16,64,120,1,3,16,PROG,Vneg,Hneg},// 640x480@75
\r
140 {0,0,640,480,832,509,36000000L,0x60,56,56,80,1,3,25,PROG,Vneg,Hneg},// 640x480@85
\r
141 {0,0,800,600,1024,625,36000000L,0x60,24,72,128,1,2,22,PROG,Vpos,Hpos},// 800x600@56
\r
142 {0,0,800,600,1056,628,40000000L,0x56,40,128,88,1,4,23,PROG,Vpos,Hpos},// 800x600@60
\r
143 {0,0,800,600,1040,666,50000000L,0x45,56,120,64,37,6,23,PROG,Vpos,Hpos},// 800x600@72
\r
144 {0,0,800,600,1056,625,49500000L,0x45,16,80,160,1,3,21,PROG,Vpos,Hpos},// 800x600@75
\r
145 {0,0,800,600,1048,631,56250000L,0x3D,32,64,152,1,3,27,PROG,Vpos,Hpos},// 800X600@85
\r
146 {0,0,848,480,1088,517,33750000L,0x66,16,112,112,6,8,23,PROG,Vpos,Hpos},// 840X480@60
\r
147 {0,0,1024,384,1264,408,44900000L,0x4C,8,176,56,0,4,20,INTERLACE,Vpos,Hpos},//1024x768(I)@87Hz
\r
148 {0,0,1024,768,1344,806,65000000L,0x35,24,136,160,3,6,29,PROG,Vneg,Hneg},// 1024x768@60
\r
149 {0,0,1024,768,1328,806,75000000L,0x2E,24,136,144,3,6,29,PROG,Vneg,Hneg},// 1024x768@70
\r
150 {0,0,1024,768,1312,800,78750000L,0x2B,16,96,176,1,3,28,PROG,Vpos,Hpos},// 1024x768@75
\r
151 {0,0,1024,768,1376,808,94500000L,0x24,48,96,208,1,3,36,PROG,Vpos,Hpos},// 1024x768@85
\r
152 {0,0,1152,864,1600,900,108000000L,0x20,64,128,256,1,3,32,PROG,Vpos,Hpos},// 1152x864@75
\r
153 {0,0,1280,768,1440,790,68250000L,0x32,48,32,80,3,7,12,PROG,Vneg,Hpos},// 1280x768@60-R
\r
154 {0,0,1280,768,1664,798,79500000L,0x2B,64,128,192,3,7,20,PROG,Vpos,Hneg},// 1280x768@60
\r
155 {0,0,1280,768,1696,805,102250000L,0x21,80,128,208,3,7,27,PROG,Vpos,Hneg},// 1280x768@75
\r
156 {0,0,1280,768,1712,809,117500000L,0x1D,80,136,216,3,7,31,PROG,Vpos,Hneg},// 1280x768@85
\r
158 {0,0,1280,800,1440, 823, 71000000L,0x31, 48, 32, 80,3,6,14,PROG,Vpos,Hneg},// 1280x800@60Hz
\r
159 {0,0,1280,800,1680, 831, 83500000L,0x29, 72,128,200,3,6,22,PROG,Vpos,Hneg},// 1280x800@60Hz
\r
160 {0,0,1280,800,1696, 838,106500000L,0x20, 80,128,208,3,6,29,PROG,Vpos,Hneg},// 1280x800@75Hz
\r
161 {0,0,1280,800,1712, 843,122500000L,0x1C, 80,136,216,3,6,34,PROG,Vpos,Hneg},// 1280x800@85Hz
\r
164 {0,0,1280,960,1800,1000,108000000L,0x20,96,112,312,1,3,36,PROG,Vpos,Hpos},// 1280x960@60
\r
165 {0,0,1280,960,1728,1011,148500000L,0x17,64,160,224,1,3,47,PROG,Vpos,Hpos},// 1280x960@85
\r
166 {0,0,1280,1024,1688,1066,108000000L,0x20,48,112,248,1,3,38,PROG,Vpos,Hpos},// 1280x1024@60
\r
167 {0,0,1280,1024,1688,1066,135000000L,0x19,16,144,248,1,3,38,PROG,Vpos,Hpos},// 1280x1024@75
\r
168 {0,0,1280,1024,1728,1072,157500000L,0x15,64,160,224,1,3,44,PROG,Vpos,Hpos},// 1280X1024@85
\r
169 {0,0,1360,768,1792,795,85500000L,0x28,64,112,256,3,6,18,PROG,Vpos,Hpos},// 1360X768@60
\r
171 {0,0,1366,768,1792,798,85500000L,0x28, 70,143,213,3,3,24,PROG,Vpos,Hpos},// 1366X768@60
\r
172 {0,0,1366,768,1500,800,72000000L,0x30, 14, 56, 64,1,3,28,PROG,Vpos,Hpos},// 1360X768@60
\r
173 {0,0,1400,1050,1560,1080,101000000L,0x22,48,32,80,3,4,23,PROG,Vneg,Hpos},// 1400x768@60-R
\r
174 {0,0,1400,1050,1864,1089,121750000L,0x1C,88,144,232,3,4,32,PROG,Vpos,Hneg},// 1400x768@60
\r
175 {0,0,1400,1050,1896,1099,156000000L,0x16,104,144,248,3,4,42,PROG,Vpos,Hneg},// 1400x1050@75
\r
176 {0,0,1400,1050,1912,1105,179500000L,0x13,104,152,256,3,4,48,PROG,Vpos,Hneg},// 1400x1050@85
\r
177 {0,0,1440,900,1600,926,88750000L,0x26,48,32,80,3,6,17,PROG,Vneg,Hpos},// 1440x900@60-R
\r
178 {0,0,1440,900,1904,934,106500000L,0x20,80,152,232,3,6,25,PROG,Vpos,Hneg},// 1440x900@60
\r
179 {0,0,1440,900,1936,942,136750000L,0x19,96,152,248,3,6,33,PROG,Vpos,Hneg},// 1440x900@75
\r
180 {0,0,1440,900,1952,948,157000000L,0x16,104,152,256,3,6,39,PROG,Vpos,Hneg},// 1440x900@85
\r
181 {0,0,1600,1200,2160,1250,162000000L,0x15,64,192,304,1,3,46,PROG,Vpos,Hpos},// 1600x1200@60
\r
182 {0,0,1600,1200,2160,1250,175500000L,0x13,64,192,304,1,3,46,PROG,Vpos,Hpos},// 1600x1200@65
\r
183 {0,0,1600,1200,2160,1250,189000000L,0x12,64,192,304,1,3,46,PROG,Vpos,Hpos},// 1600x1200@70
\r
184 {0,0,1600,1200,2160,1250,202500000L,0x11,64,192,304,1,3,46,PROG,Vpos,Hpos},// 1600x1200@75
\r
185 {0,0,1600,1200,2160,1250,229500000L,0x0F,64,192,304,1,3,46,PROG,Vpos,Hpos},// 1600x1200@85
\r
186 {0,0,1680,1050,1840,1080,119000000L,0x1D,48,32,80,3,6,21,PROG,Vneg,Hpos},// 1680x1050@60-R
\r
187 {0,0,1680,1050,2240,1089,146250000L,0x17,104,176,280,3,6,30,PROG,Vpos,Hneg},// 1680x1050@60
\r
188 {0,0,1680,1050,2272,1099,187000000L,0x12,120,176,296,3,6,40,PROG,Vpos,Hneg},// 1680x1050@75
\r
189 {0,0,1680,1050,2288,1105,214750000L,0x10,128,176,304,3,6,46,PROG,Vpos,Hneg},// 1680x1050@85
\r
190 {0,0,1792,1344,2448,1394,204750000L,0x10,128,200,328,1,3,46,PROG,Vpos,Hneg},// 1792x1344@60
\r
191 {0,0,1792,1344,2456,1417,261000000L,0x0D,96,216,352,1,3,69,PROG,Vpos,Hneg},// 1792x1344@75
\r
192 {0,0,1856,1392,2528,1439,218250000L,0x0F,96,224,352,1,3,43,PROG,Vpos,Hneg},// 1856x1392@60
\r
193 {0,0,1856,1392,2560,1500,288000000L,0x0C,128,224,352,1,3,104,PROG,Vpos,Hneg},// 1856x1392@75
\r
194 {0,0,1920,1200,2080,1235,154000000L,0x16,48,32,80,3,6,26,PROG,Vneg,Hpos},// 1920x1200@60-R
\r
195 {0,0,1920,1200,2592,1245,193250000L,0x11,136,200,336,3,6,36,PROG,Vpos,Hneg},// 1920x1200@60
\r
196 {0,0,1920,1200,2608,1255,245250000L,0x0E,136,208,344,3,6,46,PROG,Vpos,Hneg},// 1920x1200@75
\r
197 {0,0,1920,1200,2624,1262,281250000L,0x0C,144,208,352,3,6,53,PROG,Vpos,Hneg},// 1920x1200@85
\r
198 {0,0,1920,1440,2600,1500,234000000L,0x0E,128,208,344,1,3,56,PROG,Vpos,Hneg},// 1920x1440@60
\r
199 {0,0,1920,1440,2640,1500,297000000L,0x0B,144,224,352,1,3,56,PROG,Vpos,Hneg},// 1920x1440@75
\r
201 #define SizeofVMTable (sizeof(s_VMTable)/sizeof(HDMI_VTiming))
\r
203 void HDMITX_MonitorInputVideoChange();
\r
204 void HDMITX_MonitorInputAudioChange();
\r
207 #define SizeofVMTable 0
\r
210 #define DIFF(a,b) (((a)>(b))?((a)-(b)):((b)-(a)))
\r
212 ////////////////////////////////////////////////////////////////////////////////
\r
214 ////////////////////////////////////////////////////////////////////////////////
\r
215 static _XDATA RX_CAP RxCapability ;
\r
216 static BOOL bChangeMode = FALSE ;
\r
217 static BOOL bChangeAudio = FALSE ;
\r
219 _XDATA unsigned char CommunBuff[128] ;
\r
220 // _XDATA AVI_InfoFrame AviInfo;
\r
221 // _XDATA Audio_InfoFrame AudioInfo ;
\r
222 // _XDATA VendorSpecific_InfoFrame VS_Info;
\r
223 _CODE BYTE CA[] = { 0,0,0, 02, 0x3, 0x7, 0xB, 0xF, 0x1F } ;
\r
224 ////////////////////////////////////////////////////////////////////////////////
\r
225 // Program utility.
\r
226 ////////////////////////////////////////////////////////////////////////////////
\r
229 BYTE bInputColorMode = INPUT_COLOR_MODE;
\r
230 BYTE OutputColorDepth = INPUT_COLOR_DEPTH ;
\r
231 BYTE bOutputColorMode = OUTPUT_COLOR_MODE ;
\r
233 BYTE iVideoModeSelect=0 ;
\r
235 ULONG VideoPixelClock ;
\r
236 BYTE VIC ; // 480p60
\r
237 BYTE pixelrep ; // no pixelrepeating
\r
239 HDMI_Colorimetry Colorimetry ;
\r
241 ULONG ulAudioSampleFS = INPUT_SAMPLE_FREQ_HZ ;
\r
242 // BYTE bAudioSampleFreq = INPUT_SAMPLE_FREQ ;
\r
243 BYTE bOutputAudioChannel = OUTPUT_CHANNEL ;
\r
246 BYTE bAudioEnable ;
\r
247 BYTE HPDStatus = FALSE;
\r
248 BYTE HPDChangeStatus = FALSE;
\r
249 BYTE bOutputAudioType=CNOFIG_INPUT_AUDIO_TYPE;
\r
250 ////////////////////////////////////////////////////////////////////////////////
\r
251 // Function Prototype.
\r
252 ////////////////////////////////////////////////////////////////////////////////
\r
254 static BOOL ParseCEAEDID(BYTE *pCEAEDID);
\r
255 void ConfigAVIInfoFrame(BYTE VIC, BYTE pixelrep);
\r
256 void ConfigAudioInfoFrm();
\r
257 void Config_GeneralPurpose_Infoframe(BYTE *p3DInfoFrame);
\r
258 void ConfigfHdmiVendorSpecificInfoFrame(BYTE _3D_Stru);
\r
259 void InitHDMITX_Variable();
\r
260 void HDMITX_ChangeDisplayOption(HDMI_Video_Type VideoMode, HDMI_OutputColorMode OutputColorMode);
\r
261 void HDMITX_SetOutput();
\r
262 int HDMITX_DevLoopProc();
\r
263 ////////////////////////////////////////////////////////////////////////////////
\r
265 ////////////////////////////////////////////////////////////////////////////////
\r
267 void InitHDMITX_Variable()
\r
269 printk( "[%s]\n", __FUNCTION__);
\r
270 HDMITX_InitTxDev(&InstanceData);
\r
272 HPDChangeStatus = FALSE;
\r
275 BOOL AudioModeDetect(void)
\r
277 setHDMITX_AudioChannelEnable(bAudioEnable);
\r
281 void HDMITX_ChangeColorDepth(BYTE colorDepth)
\r
284 HDMITX_DEBUG_PRINTF(("OHDMITX_ChangeColorDepth(%02X)\n",(int)colorDepth)) ;
\r
285 OutputColorDepth = colorDepth ;
\r
287 OutputColorDepth = 0 ;
\r
291 void HDMITX_SetOutput()
\r
293 VIDEOPCLKLEVEL level ;
\r
294 unsigned long TMDSClock = VideoPixelClock*(pixelrep+1);
\r
295 HDMITX_DisableAudioOutput();
\r
296 HDMITX_EnableHDCP(FALSE);
\r
298 if( TMDSClock>80000000L )
\r
300 level = PCLK_HIGH ;
\r
302 else if(TMDSClock>20000000L)
\r
304 level = PCLK_MEDIUM ;
\r
311 HDMITX_DEBUG_PRINTF(("OutputColorDepth = %02X\n",(int)OutputColorDepth)) ;
\r
312 setHDMITX_ColorDepthPhase(OutputColorDepth,0);
\r
315 setHDMITX_VideoSignalType(InstanceData.bInputVideoSignalType);
\r
316 #ifdef SUPPORT_SYNCEMBEDDED
\r
317 if(InstanceData.bInputVideoSignalType & T_MODE_SYNCEMB)
\r
319 setHDMITX_SyncEmbeddedByVIC(VIC,InstanceData.bInputVideoSignalType);
\r
323 HDMITX_DEBUG_PRINTF(("level = %d, ,bInputColorMode=%x,bOutputColorMode=%x,bHDMIMode=%x\n",(int)level,(int)bInputColorMode,(int)bOutputColorMode ,(int)bHDMIMode)) ;
\r
324 HDMITX_EnableVideoOutput(level,bInputColorMode,bOutputColorMode ,bHDMIMode);
\r
328 #ifdef OUTPUT_3D_MODE
\r
329 ConfigfHdmiVendorSpecificInfoFrame(OUTPUT_3D_MODE);
\r
331 //HDMITX_EnableHDCP(TRUE);
\r
332 ConfigAVIInfoFrame(VIC, pixelrep);
\r
334 HDMITX_SetAudioOutput();
\r
336 // if( bAudioEnable )
\r
338 // ConfigAudioInfoFrm();
\r
339 // #ifdef SUPPORT_HBR_AUDIO
\r
340 // HDMITX_EnableAudioOutput(T_AUDIO_HBR, CONFIG_INPUT_AUDIO_SPDIF, 768000L,8,NULL,TMDSClock);
\r
342 // // HDMITX_EnableAudioOutput(T_AUDIO_LPCM, FALSE, ulAudioSampleFS,OUTPUT_CHANNEL,NULL,TMDSClock);
\r
343 // HDMITX_EnableAudioOutput(CNOFIG_INPUT_AUDIO_TYPE, CONFIG_INPUT_AUDIO_SPDIF, ulAudioSampleFS,bOutputAudioChannel,NULL,TMDSClock);
\r
350 HDMITX_EnableAVIInfoFrame(FALSE ,NULL);
\r
351 HDMITX_EnableVSInfoFrame(FALSE,NULL);
\r
353 setHDMITX_AVMute(FALSE);
\r
354 bChangeMode = FALSE ;
\r
358 void HDMITX_ChangeAudioOption(BYTE Option, BYTE channelNum, BYTE AudioFs)
\r
364 bOutputAudioType = T_AUDIO_HBR ;
\r
365 ulAudioSampleFS = 768000L ;
\r
366 bOutputAudioChannel = 8 ;
\r
368 case T_AUDIO_NLPCM :
\r
369 bOutputAudioType = T_AUDIO_NLPCM ;
\r
370 bOutputAudioChannel = 2 ;
\r
373 bOutputAudioType = T_AUDIO_LPCM ;
\r
374 if( channelNum < 1 )
\r
376 bOutputAudioChannel = 1 ;
\r
378 else if( channelNum > 8 )
\r
380 bOutputAudioChannel = 8 ;
\r
384 bOutputAudioChannel = channelNum ;
\r
391 case AUDFS_44p1KHz:
\r
392 ulAudioSampleFS = 44100L ;
\r
394 case AUDFS_88p2KHz:
\r
395 ulAudioSampleFS = 88200L ;
\r
397 case AUDFS_176p4KHz:
\r
398 ulAudioSampleFS = 176400L ;
\r
402 ulAudioSampleFS = 48000L ;
\r
405 ulAudioSampleFS = 96000L ;
\r
408 ulAudioSampleFS = 192000L ;
\r
412 ulAudioSampleFS = 768000L ;
\r
416 ulAudioSampleFS = 32000L ;
\r
419 ulAudioSampleFS = 48000L ;
\r
422 HDMITX_DEBUG_PRINTF(("HDMITX_ChangeAudioOption():bOutputAudioType = %02X, ulAudioSampleFS = %8ld, bOutputAudioChannel = %d\n",(int)bOutputAudioType,ulAudioSampleFS,(int)bOutputAudioChannel)) ;
\r
423 bChangeAudio = TRUE ;
\r
426 void HDMITX_SetAudioOutput()
\r
430 ConfigAudioInfoFrm();
\r
431 // HDMITX_EnableAudioOutput(T_AUDIO_LPCM, FALSE, ulAudioSampleFS,OUTPUT_CHANNEL,NULL,TMDSClock);
\r
432 HDMITX_EnableAudioOutput(
\r
433 //CNOFIG_INPUT_AUDIO_TYPE,
\r
435 CONFIG_INPUT_AUDIO_SPDIF,
\r
437 bOutputAudioChannel,
\r
438 NULL, // pointer to cahnnel status.
\r
439 VideoPixelClock*(pixelrep+1));
\r
440 // if you have channel status , set here.
\r
441 // setHDMITX_ChStat(BYTE ucIEC60958ChStat[]);
\r
442 bChangeAudio = FALSE ;
\r
446 int HDMITX_DevLoopProc()
\r
448 static BYTE DevLoopCount = 0 ;
\r
449 CheckHDMITX(&HPDStatus,&HPDChangeStatus);
\r
451 if( HPDChangeStatus )
\r
457 bOutputColorMode = F_MODE_RGB444;
\r
459 if( RxCapability.ValidHDMI )
\r
463 if(RxCapability.VideoMode & (1<<6))
\r
465 bAudioEnable = TRUE ;
\r
467 if( RxCapability.VideoMode & (1<<5))
\r
469 bOutputColorMode &= ~F_MODE_CLRMOD_MASK ;
\r
470 bOutputColorMode |= F_MODE_YUV444;
\r
472 else if (RxCapability.VideoMode & (1<<4))
\r
474 bOutputColorMode &= ~F_MODE_CLRMOD_MASK ;
\r
475 bOutputColorMode |= F_MODE_YUV422 ;
\r
477 bOutputColorMode = F_MODE_RGB444;
\r
481 if(RxCapability.dc.uc & (HDMI_DC_SUPPORT_36|HDMI_DC_SUPPORT_30))
\r
483 setHDMITX_ColorDepthPhase(OutputColorDepth,0);
\r
487 OutputColorDepth = B_TX_CD_NODEF;
\r
490 OutputColorDepth = B_TX_CD_NODEF;
\r
495 bHDMIMode = FALSE ;
\r
496 bAudioEnable = FALSE ;
\r
497 OutputColorDepth = B_TX_CD_NODEF;
\r
498 // HDMITX_DisableAudioOutput();
\r
499 // HDMITX_DisableVideoOutput();
\r
500 #ifdef SUPPORT_HDCP
\r
501 HDMITX_EnableHDCP(FALSE);
\r
504 HDMITX_DEBUG_PRINTF(("HPD change HDMITX_SetOutput();\n"));
\r
505 //HDMITX_SetOutput();
\r
507 bChangeAudio = TRUE ;
\r
511 // unplug mode, ...
\r
512 HDMITX_DEBUG_PRINTF(("HPD OFF HDMITX_DisableVideoOutput()\n"));
\r
513 HDMITX_DisableVideoOutput();
\r
514 HDMITX_PowerDown();
\r
515 bChangeAudio = FALSE ;
\r
518 else // no stable but need to process mode change procedure
\r
520 if( DevLoopCount >= 20 )
\r
525 #ifdef HDMITX_AUTO_MONITOR_INPUT
\r
526 if( DevLoopCount == 0 )
\r
528 HDMITX_MonitorInputVideoChange();
\r
529 HDMITX_MonitorInputAudioChange();
\r
535 #ifdef HDMITX_AUTO_MONITOR_INPUT
\r
536 if( bChangeMode && ( VIC > 0 ) )
\r
541 HDMITX_DEBUG_PRINTF(("Mode change HDMITX_SetOutput();\n"));
\r
542 HDMITX_SetOutput();
\r
543 // HDMITX_EnableHDCP(TRUE);
\r
545 bChangeMode = FALSE ;
\r
547 if(getHDMITX_LinkStatus())
\r
549 // AudioModeDetect();
\r
550 #ifdef SUPPORT_HDCP
\r
551 if(getHDMITX_AuthenticationDone() ==FALSE)
\r
553 HDMITX_DEBUG_PRINTF(("getHDMITX_AuthenticationDone() ==FALSE\n") );
\r
554 HDMITX_EnableHDCP(TRUE);
\r
555 setHDMITX_AVMute(FALSE);
\r
562 HDMITX_SetAudioOutput() ;
\r
571 #ifdef HDMITX_AUTO_MONITOR_INPUT
\r
573 void HDMITX_MonitorInputAudioChange()
\r
575 static ULONG prevAudioSampleFS = 0 ;
\r
578 if( !bAudioEnable )
\r
580 prevAudioSampleFS = 0 ;
\r
584 AudioFS = CalcAudFS() ;
\r
585 HDMITX_DEBUG_PRINTF1(("Audio Chagne, Audio clock = %ldHz\n",AudioFS)) ;
\r
586 if( AudioFS > 188000L ) // 192KHz
\r
588 ulAudioSampleFS = 192000L ;
\r
590 else if( AudioFS > 144000L ) // 176.4KHz
\r
592 ulAudioSampleFS = 176400L ;
\r
594 else if( AudioFS > 93000L ) // 96KHz
\r
596 ulAudioSampleFS = 96000L ;
\r
598 else if( AudioFS > 80000L ) // 88.2KHz
\r
600 ulAudioSampleFS = 88200L ;
\r
602 else if( AudioFS > 45000L ) // 48 KHz
\r
604 ulAudioSampleFS = 48000L ;
\r
606 else if( AudioFS > 36000L ) // 44.1KHz
\r
608 ulAudioSampleFS = 44100L ;
\r
612 ulAudioSampleFS = 32000L ;
\r
617 if( ulAudioSampleFS != prevAudioSampleFS )
\r
619 HDMITX_DEBUG_PRINTF(("ulAudioSampleFS = %ldHz -> %ldHz\n",ulAudioSampleFS,ulAudioSampleFS)) ;
\r
620 ConfigAudioInfoFrm();
\r
621 HDMITX_EnableAudioOutput(CNOFIG_INPUT_AUDIO_TYPE, CONFIG_INPUT_AUDIO_SPDIF, ulAudioSampleFS,OUTPUT_CHANNEL,NULL,0);
\r
622 // HDMITX_EnableAudioOutput(T_AUDIO_LPCM, FALSE, ulAudioSampleFS,OUTPUT_CHANNEL,NULL,0);
\r
627 prevAudioSampleFS = ulAudioSampleFS ;
\r
632 int HDMITX_SearchVICIndex( ULONG PCLK, USHORT HTotal, USHORT VTotal, BYTE ScanMode )
\r
634 #define SEARCH_COUNT 4
\r
635 unsigned long pclkDiff;
\r
638 int iMax[SEARCH_COUNT]={0};
\r
639 char hitMax[SEARCH_COUNT]={0};
\r
642 for( i = 0 ; i < SizeofVMTable; i++ )
\r
644 if( s_VMTable[i].VIC == 0 ) break ;
\r
648 if( ScanMode == s_VMTable[i].ScanMode )
\r
652 if( ScanMode == INTERLACE )
\r
654 if( DIFF(VTotal/2, s_VMTable[i].VTotal) < 10 )
\r
661 if( DIFF(VTotal, s_VMTable[i].VTotal) < 10 )
\r
667 if( hit == 2 ) // match scan mode and v-total
\r
669 if( DIFF(HTotal, s_VMTable[i].HTotal) < 40 )
\r
673 pclkDiff = DIFF(PCLK, s_VMTable[i].PCLK);
\r
674 pclkDiff = (pclkDiff * 100) / s_VMTable[i].PCLK;
\r
676 if( pclkDiff < 100 )
\r
678 hit += ( 100 - pclkDiff );
\r
684 HDMITX_DEBUG_PRINTF(("i = %d, hit = %d\n",i,(int)hit));
\r
688 for( i2=0 ; i2<SEARCH_COUNT ; i2++ )
\r
690 if( hitMax[i2] < hit )
\r
692 HDMITX_DEBUG_PRINTF(("replace iMax[%d] = %d => %d\n",(int)i2, iMax[i2], i ));
\r
703 for( i2=0 ; i2<SEARCH_COUNT ; i2++ )
\r
705 HDMITX_DEBUG_PRINTF(("[%d] i = %d, hit = %d\n",(int)i2, iMax[i2],(int)hitMax[i2]));
\r
706 if( hitMax[i2] > hit )
\r
715 HDMITX_DEBUG_PRINTF(("i = %d, hit = %d\n",i,(int)hit));
\r
716 HDMITX_DEBUG_PRINTF((">> mode : %d %u x %u @%lu (%s)\n", (int)s_VMTable[i].VIC, s_VMTable[i].HActive, s_VMTable[i].VActive, s_VMTable[i].PCLK, (s_VMTable[i].ScanMode==0)?"i":"p" ));
\r
721 HDMITX_DEBUG_PRINTF(("no matched\n"));
\r
727 void HDMITX_MonitorInputVideoChange()
\r
729 static ULONG prevPCLK = 0 ;
\r
730 static USHORT prevHTotal = 0 ;
\r
731 static USHORT prevVTotal = 0 ;
\r
732 static BYTE prevScanMode ;
\r
735 USHORT currHTotal, currVTotal ;
\r
736 BYTE currScanMode ;
\r
739 currPCLK = CalcPCLK() ;
\r
740 currHTotal = hdmitx_getInputHTotal() ;
\r
741 currVTotal = hdmitx_getInputVTotal() ;
\r
742 currScanMode = hdmitx_isInputInterlace() ? INTERLACE:PROG ;
\r
743 diff = DIFF(currPCLK,prevPCLK);
\r
745 HDMITX_DEBUG_PRINTF(("HDMITX_MonitorInputVideoChange : pclk=%lu, ht=%u, vt=%u, dif=%lu\n", currPCLK, currHTotal, currVTotal, diff ));
\r
747 if( currHTotal == 0 || currVTotal == 0 || currPCLK == 0 )
\r
749 bChangeMode = FALSE;
\r
753 if( diff > currPCLK/20) // 5% torrenlance
\r
755 bChangeMode = TRUE ;
\r
759 diff = DIFF(currHTotal, prevHTotal) ;
\r
762 bChangeMode = TRUE ;
\r
764 diff = DIFF(currVTotal, prevVTotal) ;
\r
767 bChangeMode = TRUE ;
\r
773 HDMITX_DEBUG_PRINTF(("PCLK = %ld -> %ld\n",prevPCLK, currPCLK));
\r
774 HDMITX_DEBUG_PRINTF(("HTotal = %d -> %d\n",prevHTotal, currHTotal));
\r
775 HDMITX_DEBUG_PRINTF(("VTotal = %d -> %d\n",prevVTotal, currVTotal));
\r
776 HDMITX_DEBUG_PRINTF(("ScanMode = %s -> %s\n",prevScanMode?"P":"I", currScanMode?"P":"I"));
\r
778 HDMITX_DEBUG_PRINTF(("PCLK = %ld,(%dx%d) %s %s\n",currPCLK, currHTotal,currVTotal, (currScanMode==INTERLACE)?"INTERLACED":"PROGRESS",bChangeMode?"CHANGE MODE":"NO CHANGE MODE"));
\r
780 setHDMITX_AVMute(TRUE);
\r
783 for( i = 0 ; (i < SizeofVMTable) && ( s_VMTable[i].VIC != 0 ); i++ )
\r
785 if( s_VMTable[i].VIC == 0 ) break ;
\r
786 if( DIFF(currPCLK, s_VMTable[i].PCLK) > (s_VMTable[i].PCLK/20))
\r
790 if( DIFF(currHTotal, s_VMTable[i].HTotal) > 40 )
\r
794 if( currScanMode != s_VMTable[i].ScanMode )
\r
798 if( currScanMode == INTERLACE )
\r
800 if( DIFF(currVTotal/2, s_VMTable[i].VTotal) > 10 )
\r
807 if( DIFF(currVTotal, s_VMTable[i].VTotal) > 10 )
\r
812 printf("i = %d, VIC = %d\n",i,(int)s_VMTable[i].VIC) ;
\r
817 i = HDMITX_SearchVICIndex( currPCLK, currHTotal, currVTotal, currScanMode );
\r
822 VIC = s_VMTable[i].VIC;
\r
823 pixelrep = s_VMTable[i].PixelRep ;
\r
824 VideoPixelClock = currPCLK ;
\r
830 VideoPixelClock = 0 ;
\r
834 prevPCLK = currPCLK ;
\r
835 prevHTotal = currHTotal ;
\r
836 prevVTotal = currVTotal ;
\r
837 prevScanMode = currScanMode ;
\r
840 #endif // HDMITX_AUTO_MONITOR_INPUT
\r
842 void HDMITX_ChangeDisplayOption(HDMI_Video_Type OutputVideoTiming, HDMI_OutputColorMode OutputColorMode)
\r
844 printk( "[%s] Vic=%d\n", __FUNCTION__,OutputVideoTiming);
\r
845 //HDMI_Video_Type t=HDMI_480i60_16x9;
\r
846 if((F_MODE_RGB444)==(bOutputColorMode&F_MODE_CLRMOD_MASK))//Force output RGB in RGB only case
\r
848 OutputColorMode=F_MODE_RGB444;
\r
850 else if ((F_MODE_YUV422)==(bOutputColorMode&F_MODE_CLRMOD_MASK))//YUV422 only
\r
852 if(OutputColorMode==HDMI_YUV444){OutputColorMode=F_MODE_YUV422;}
\r
854 else if ((F_MODE_YUV444)==(bOutputColorMode&F_MODE_CLRMOD_MASK))//YUV444 only
\r
856 if(OutputColorMode==HDMI_YUV422){OutputColorMode=F_MODE_YUV444;}
\r
858 switch(OutputVideoTiming)
\r
860 case HDMI_640x480p60:
\r
862 VideoPixelClock = 25000000 ;
\r
865 Colorimetry = HDMI_ITU601 ;
\r
869 VideoPixelClock = 27000000 ;
\r
872 Colorimetry = HDMI_ITU601 ;
\r
874 case HDMI_480p60_16x9:
\r
876 VideoPixelClock = 27000000 ;
\r
878 aspec = HDMI_16x9 ;
\r
879 Colorimetry = HDMI_ITU601 ;
\r
883 VideoPixelClock = 74250000 ;
\r
885 aspec = HDMI_16x9 ;
\r
886 Colorimetry = HDMI_ITU709 ;
\r
890 VideoPixelClock = 74250000 ;
\r
892 aspec = HDMI_16x9 ;
\r
893 Colorimetry = HDMI_ITU709 ;
\r
897 VideoPixelClock = 13500000 ;
\r
900 Colorimetry = HDMI_ITU601 ;
\r
902 case HDMI_480i60_16x9:
\r
904 VideoPixelClock = 13500000 ;
\r
906 aspec = HDMI_16x9 ;
\r
907 Colorimetry = HDMI_ITU601 ;
\r
911 VideoPixelClock = 148500000 ;
\r
913 aspec = HDMI_16x9 ;
\r
914 Colorimetry = HDMI_ITU709 ;
\r
918 VideoPixelClock = 27000000 ;
\r
921 Colorimetry = HDMI_ITU601 ;
\r
923 case HDMI_576p50_16x9:
\r
925 VideoPixelClock = 27000000 ;
\r
927 aspec = HDMI_16x9 ;
\r
928 Colorimetry = HDMI_ITU601 ;
\r
932 VideoPixelClock = 74250000 ;
\r
934 aspec = HDMI_16x9 ;
\r
935 Colorimetry = HDMI_ITU709 ;
\r
939 VideoPixelClock = 74250000 ;
\r
941 aspec = HDMI_16x9 ;
\r
942 Colorimetry = HDMI_ITU709 ;
\r
946 VideoPixelClock = 13500000 ;
\r
949 Colorimetry = HDMI_ITU601 ;
\r
951 case HDMI_576i50_16x9:
\r
953 VideoPixelClock = 13500000 ;
\r
955 aspec = HDMI_16x9 ;
\r
956 Colorimetry = HDMI_ITU601 ;
\r
960 VideoPixelClock = 148500000 ;
\r
962 aspec = HDMI_16x9 ;
\r
963 Colorimetry = HDMI_ITU709 ;
\r
967 VideoPixelClock = 74250000 ;
\r
969 aspec = HDMI_16x9 ;
\r
970 Colorimetry = HDMI_ITU709 ;
\r
974 VideoPixelClock = 74250000 ;
\r
976 aspec = HDMI_16x9 ;
\r
977 Colorimetry = HDMI_ITU709 ;
\r
981 VideoPixelClock = 74250000 ;
\r
983 aspec = HDMI_16x9 ;
\r
984 Colorimetry = HDMI_ITU709 ;
\r
989 VideoPixelClock = 74250000 ;
\r
991 aspec = HDMI_16x9 ;
\r
992 Colorimetry = HDMI_ITU709 ;
\r
994 #ifdef SUPPORT_SYNCEMBEDDED
\r
996 VTiming.HActive=1280 ;
\r
997 VTiming.VActive=720 ;
\r
998 VTiming.HTotal=3300 ;
\r
999 VTiming.VTotal=750 ;
\r
1000 VTiming.PCLK=VideoPixelClock ;
\r
1001 VTiming.xCnt=0x2E ;
\r
1002 VTiming.HFrontPorch= 1760;
\r
1003 VTiming.HSyncWidth= 40 ;
\r
1004 VTiming.HBackPorch= 220 ;
\r
1005 VTiming.VFrontPorch= 5;
\r
1006 VTiming.VSyncWidth= 5 ;
\r
1007 VTiming.VBackPorch= 20 ;
\r
1008 VTiming.ScanMode=PROG ;
\r
1009 VTiming.VPolarity=Vneg ;
\r
1010 VTiming.HPolarity=Hneg ;
\r
1015 bChangeMode = FALSE ;
\r
1018 switch(OutputColorMode)
\r
1021 bOutputColorMode = F_MODE_YUV444 ;
\r
1024 bOutputColorMode = F_MODE_YUV422 ;
\r
1028 bOutputColorMode = F_MODE_RGB444 ;
\r
1031 if( Colorimetry == HDMI_ITU709 )
\r
1033 bInputColorMode |= F_VIDMODE_ITU709 ;
\r
1037 bInputColorMode &= ~F_VIDMODE_ITU709 ;
\r
1039 // if( Colorimetry != HDMI_640x480p60)
\r
1040 if( OutputVideoTiming != HDMI_640x480p60)
\r
1042 bInputColorMode |= F_VIDMODE_16_235 ;
\r
1046 bInputColorMode &= ~F_VIDMODE_16_235 ;
\r
1048 bChangeMode = TRUE ;
\r
1051 void ConfigAVIInfoFrame(BYTE VIC, BYTE pixelrep)
\r
1053 AVI_InfoFrame *AviInfo;
\r
1054 AviInfo = (AVI_InfoFrame *)CommunBuff ;
\r
1056 AviInfo->pktbyte.AVI_HB[0] = AVI_INFOFRAME_TYPE|0x80 ;
\r
1057 AviInfo->pktbyte.AVI_HB[1] = AVI_INFOFRAME_VER ;
\r
1058 AviInfo->pktbyte.AVI_HB[2] = AVI_INFOFRAME_LEN ;
\r
1060 switch(bOutputColorMode)
\r
1062 case F_MODE_YUV444:
\r
1063 // AviInfo->info.ColorMode = 2 ;
\r
1064 AviInfo->pktbyte.AVI_DB[0] = (2<<5)|(1<<4);
\r
1066 case F_MODE_YUV422:
\r
1067 // AviInfo->info.ColorMode = 1 ;
\r
1068 AviInfo->pktbyte.AVI_DB[0] = (1<<5)|(1<<4);
\r
1070 case F_MODE_RGB444:
\r
1072 // AviInfo->info.ColorMode = 0 ;
\r
1073 AviInfo->pktbyte.AVI_DB[0] = (0<<5)|(1<<4);
\r
1076 AviInfo->pktbyte.AVI_DB[1] = 8 ;
\r
1077 AviInfo->pktbyte.AVI_DB[1] |= (aspec != HDMI_16x9)?(1<<4):(2<<4); // 4:3 or 16:9
\r
1078 AviInfo->pktbyte.AVI_DB[1] |= (Colorimetry != HDMI_ITU709)?(1<<6):(2<<6); // 4:3 or 16:9
\r
1079 AviInfo->pktbyte.AVI_DB[2] = 0 ;
\r
1080 AviInfo->pktbyte.AVI_DB[3] = VIC ;
\r
1081 AviInfo->pktbyte.AVI_DB[4] = pixelrep & 3 ;
\r
1082 AviInfo->pktbyte.AVI_DB[5] = 0 ;
\r
1083 AviInfo->pktbyte.AVI_DB[6] = 0 ;
\r
1084 AviInfo->pktbyte.AVI_DB[7] = 0 ;
\r
1085 AviInfo->pktbyte.AVI_DB[8] = 0 ;
\r
1086 AviInfo->pktbyte.AVI_DB[9] = 0 ;
\r
1087 AviInfo->pktbyte.AVI_DB[10] = 0 ;
\r
1088 AviInfo->pktbyte.AVI_DB[11] = 0 ;
\r
1089 AviInfo->pktbyte.AVI_DB[12] = 0 ;
\r
1091 HDMITX_EnableAVIInfoFrame(TRUE, (unsigned char *)AviInfo);
\r
1094 ////////////////////////////////////////////////////////////////////////////////
\r
1095 // Function: ConfigAudioInfoFrm
\r
1096 // Parameter: NumChannel, number from 1 to 8
\r
1097 // Return: ER_SUCCESS for successfull.
\r
1098 // Remark: Evaluate. The speakerplacement is only for reference.
\r
1099 // For production, the caller of hdmitx_SetAudioInfoFrame should program
\r
1100 // Speaker placement by actual status.
\r
1102 ////////////////////////////////////////////////////////////////////////////////
\r
1104 void ConfigAudioInfoFrm()
\r
1108 Audio_InfoFrame *AudioInfo ;
\r
1109 AudioInfo = (Audio_InfoFrame *)CommunBuff ;
\r
1111 HDMITX_DEBUG_PRINTF(("ConfigAudioInfoFrm(%d)\n",2));
\r
1113 AudioInfo->pktbyte.AUD_HB[0] = AUDIO_INFOFRAME_TYPE ;
\r
1114 AudioInfo->pktbyte.AUD_HB[1] = 1 ;
\r
1115 AudioInfo->pktbyte.AUD_HB[2] = AUDIO_INFOFRAME_LEN ;
\r
1116 AudioInfo->pktbyte.AUD_DB[0] = 1 ;
\r
1117 for( i = 1 ;i < AUDIO_INFOFRAME_LEN ; i++ )
\r
1119 AudioInfo->pktbyte.AUD_DB[i] = 0 ;
\r
1121 HDMITX_EnableAudioInfoFrame(TRUE, (unsigned char *)AudioInfo);
\r
1124 void ConfigfHdmiVendorSpecificInfoFrame(BYTE _3D_Stru)
\r
1126 VendorSpecific_InfoFrame *VS_Info;
\r
1128 VS_Info=(VendorSpecific_InfoFrame *)CommunBuff ;
\r
1130 VS_Info->pktbyte.VS_HB[0] = VENDORSPEC_INFOFRAME_TYPE|0x80;
\r
1131 VS_Info->pktbyte.VS_HB[1] = VENDORSPEC_INFOFRAME_VER;
\r
1132 VS_Info->pktbyte.VS_HB[2] = (_3D_Stru == Side_by_Side)?6:5;
\r
1133 VS_Info->pktbyte.VS_DB[0] = 0x03;
\r
1134 VS_Info->pktbyte.VS_DB[1] = 0x0C;
\r
1135 VS_Info->pktbyte.VS_DB[2] = 0x00;
\r
1136 VS_Info->pktbyte.VS_DB[3] = 0x40;
\r
1139 case Side_by_Side:
\r
1140 case Frame_Pcaking:
\r
1141 case Top_and_Botton:
\r
1142 VS_Info->pktbyte.VS_DB[4] = (_3D_Stru<<4);
\r
1145 VS_Info->pktbyte.VS_DB[4] = (Frame_Pcaking<<4);
\r
1148 VS_Info->pktbyte.VS_DB[5] = 0x00;
\r
1149 HDMITX_EnableVSInfoFrame(TRUE,(BYTE *)VS_Info);
\r
1152 /////////////////////////////////////////////////////////////////////
\r
1154 // Check EDID check sum and EDID 1.3 extended segment.
\r
1155 /////////////////////////////////////////////////////////////////////
\r
1159 // collect the EDID ucdata of segment 0
\r
1160 _XDATA unsigned char *EDID_Buf;
\r
1164 BYTE bValidCEA = FALSE ;
\r
1168 #endif // Debug_message
\r
1170 EDID_Buf = CommunBuff;
\r
1171 RxCapability.ValidCEA = FALSE ;
\r
1172 RxCapability.ValidHDMI = FALSE ;
\r
1173 RxCapability.dc.uc = 0;
\r
1175 getHDMITX_EDIDBlock(0, EDID_Buf);
\r
1177 for( i = 0, CheckSum = 0 ; i < 128 ; i++ )
\r
1179 CheckSum += EDID_Buf[i] ; CheckSum &= 0xFF ;
\r
1181 //Eep_Write(0x80, 0x80, EDID_Buf);
\r
1182 if( CheckSum != 0 )
\r
1186 if( EDID_Buf[0] != 0x00 ||
\r
1187 EDID_Buf[1] != 0xFF ||
\r
1188 EDID_Buf[2] != 0xFF ||
\r
1189 EDID_Buf[3] != 0xFF ||
\r
1190 EDID_Buf[4] != 0xFF ||
\r
1191 EDID_Buf[5] != 0xFF ||
\r
1192 EDID_Buf[6] != 0xFF ||
\r
1193 EDID_Buf[7] != 0x00)
\r
1198 for( i = 0 ; i < 128 ; i++ )
\r
1200 HDMITX_DEBUG_PRINTF(("%02X%c",(int)EDID_Buf[i],(7 == (i&7))?'\n':' '));
\r
1204 BlockCount = EDID_Buf[0x7E] ;
\r
1206 if( BlockCount == 0 )
\r
1208 return TRUE ; // do nothing.
\r
1210 else if ( BlockCount > 4 )
\r
1214 // read all segment for test
\r
1215 for( i = 1 ; i <= BlockCount ; i++ )
\r
1217 err = getHDMITX_EDIDBlock(i, EDID_Buf);
\r
1220 for( j = 0 ; j < 128 ; j++ )
\r
1222 EDID_DEBUG_PRINTF(("%02X%c",(int)EDID_Buf[j],(7 == (j&7))?'\n':' '));
\r
1224 #endif // Debug_message
\r
1228 if( !bValidCEA && EDID_Buf[0] == 0x2 && EDID_Buf[1] == 0x3 )
\r
1230 err = ParseCEAEDID(EDID_Buf);
\r
1231 EDID_DEBUG_PRINTF(("err = %s\n",err?"SUCCESS":"FAIL"));
\r
1234 EDID_DEBUG_PRINTF(("RxCapability.IEEEOUI = %lx\n",RxCapability.IEEEOUI));
\r
1236 if(RxCapability.IEEEOUI==0x0c03)
\r
1238 RxCapability.ValidHDMI = TRUE ;
\r
1239 bValidCEA = TRUE ;
\r
1243 RxCapability.ValidHDMI = FALSE ;
\r
1252 static BOOL ParseCEAEDID(BYTE *pCEAEDID)
\r
1259 if( pCEAEDID[0] != 0x02 || pCEAEDID[1] != 0x03 ) return FALSE ; // not a CEA BLOCK.
\r
1260 End = pCEAEDID[2] ; // CEA description.
\r
1262 RxCapability.VDOMode[0] = 0x00 ;
\r
1263 RxCapability.VDOMode[1] = 0x00 ;
\r
1264 RxCapability.VDOMode[2] = 0x00 ;
\r
1265 RxCapability.VDOMode[3] = 0x00 ;
\r
1266 RxCapability.VDOMode[4] = 0x00 ;
\r
1267 RxCapability.VDOMode[5] = 0x00 ;
\r
1268 RxCapability.VDOMode[6] = 0x00 ;
\r
1269 RxCapability.VDOMode[7] = 0x00 ;
\r
1270 RxCapability.PA[0] = 0x00 ;
\r
1271 RxCapability.PA[1] = 0x00 ;
\r
1273 RxCapability.VideoMode = pCEAEDID[3] ;
\r
1275 RxCapability.NativeVDOMode = 0xff ;
\r
1277 for( offset = 4 ; offset < End ; )
\r
1279 tag = pCEAEDID[offset] >> 5 ;
\r
1280 count = pCEAEDID[offset] & 0x1f ;
\r
1283 case 0x01: // Audio Data Block ;
\r
1284 RxCapability.AUDDesCount = count/3 ;
\r
1285 EDID_DEBUG_PRINTF(("RxCapability.AUDDesCount = %d\n",(int)RxCapability.AUDDesCount));
\r
1287 for( i = 0 ; i < RxCapability.AUDDesCount && i < MAX_AUDDES_COUNT ; i++ )
\r
1289 RxCapability.AUDDes[i].uc[0] = pCEAEDID[offset+i*3] ;
\r
1290 RxCapability.AUDDes[i].uc[1] = pCEAEDID[offset+i*3+1] ;
\r
1291 RxCapability.AUDDes[i].uc[2] = pCEAEDID[offset+i*3+2] ;
\r
1296 case 0x02: // Video Data Block ;
\r
1298 for( i = 0,RxCapability.NativeVDOMode = 0xff ; i < count ; i++)
\r
1301 VIC = pCEAEDID[offset+i] & (~0x80);
\r
1302 // if( FindModeTableEntryByVIC(VIC) != -1 )
\r
1305 RxCapability.VDOMode[VIC/8] |= (1<<(VIC%8));
\r
1306 EDID_DEBUG_PRINTF(("VIC = %d, RxCapability.VDOMode[%d]=%02X\n",(int)VIC,(int)VIC/8,(int)RxCapability.VDOMode[VIC/8] ));
\r
1307 if(( pCEAEDID[offset+i] & 0x80 )&&(RxCapability.NativeVDOMode==0xFF))
\r
1309 RxCapability.NativeVDOMode = VIC ;
\r
1310 EDID_DEBUG_PRINTF(("native = %d\n",RxCapability.NativeVDOMode));
\r
1317 case 0x03: // Vendor Specific Data Block ;
\r
1319 RxCapability.IEEEOUI = (ULONG)pCEAEDID[offset+2] ;
\r
1320 RxCapability.IEEEOUI <<= 8 ;
\r
1321 RxCapability.IEEEOUI += (ULONG)pCEAEDID[offset+1] ;
\r
1322 RxCapability.IEEEOUI <<= 8 ;
\r
1323 RxCapability.IEEEOUI += (ULONG)pCEAEDID[offset] ;
\r
1324 EDID_DEBUG_PRINTF(("IEEEOUI = %02X %02X %02X %lx",(int)pCEAEDID[offset+2],(int)pCEAEDID[offset+1],(int)pCEAEDID[offset],RxCapability.IEEEOUI));
\r
1325 if( RxCapability.IEEEOUI== 0x0C03)
\r
1328 RxCapability.PA[0] = pCEAEDID[offset+3] ;
\r
1329 RxCapability.PA[1] = pCEAEDID[offset+4] ;
\r
1332 RxCapability.dc.uc = pCEAEDID[offset+5]&0x70;
\r
1336 RxCapability.MaxTMDSClock = pCEAEDID[offset+6];
\r
1341 if(pCEAEDID[offset+7] & 0x80) { nextoffset += 2 ; } // latency
\r
1342 if(pCEAEDID[offset+7] & 0x40) { nextoffset += 2 ; } // interlace latency
\r
1343 if(pCEAEDID[offset+7] & 0x20) {
\r
1344 EDID_DEBUG_PRINTF(("next offset = %d",(int)nextoffset));
\r
1345 RxCapability.Valid3D = (pCEAEDID[offset+nextoffset] & 0x80)?TRUE:FALSE ;
\r
1346 } // interlace latency
\r
1350 offset += count ; // ignore the remaind.
\r
1354 case 0x04: // Speaker Data Block ;
\r
1356 RxCapability.SpeakerAllocBlk.uc[0] = pCEAEDID[offset] ;
\r
1357 RxCapability.SpeakerAllocBlk.uc[1] = pCEAEDID[offset+1] ;
\r
1358 RxCapability.SpeakerAllocBlk.uc[2] = pCEAEDID[offset+2] ;
\r
1361 case 0x05: // VESA Data Block ;
\r
1362 offset += count+1 ;
\r
1364 case 0x07: // Extended Data Block ;
\r
1365 offset += count+1 ; //ignore
\r
1368 offset += count+1 ; // ignore
\r
1371 RxCapability.ValidCEA = TRUE ;
\r