e0dfd4b659df05cddbe9bcac6944d540806b0edb
[firefly-linux-kernel-4.4.55.git] / drivers / video / rockchip / hdmi / chips / cat66121 / hdmitx_sys.c
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
8 //   @date   2012/12/20\r
9 //   @fileversion: ITE_HDMITX_SAMPLE_3.14\r
10 //******************************************/\r
11 \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
17 \r
18 #include "hdmitx.h"\r
19 #include "hdmitx_sys.h"\r
20 \r
21 _CODE HDMITXDEV InstanceData =\r
22 {\r
23 \r
24     0,      // BYTE I2C_DEV ;\r
25     HDMI_TX_I2C_SLAVE_ADDR,    // BYTE I2C_ADDR ;\r
26 \r
27     /////////////////////////////////////////////////\r
28     // Interrupt Type\r
29     /////////////////////////////////////////////////\r
30     0x40,      // BYTE bIntType ; // = 0 ;\r
31     /////////////////////////////////////////////////\r
32     // Video Property\r
33     /////////////////////////////////////////////////\r
34     INPUT_SIGNAL_TYPE ,// BYTE bInputVideoSignalType ; // for Sync Embedded,CCIR656,InputDDR\r
35 \r
36     /////////////////////////////////////////////////\r
37     // Audio Property\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
48 };\r
49 \r
50 #ifdef HDMITX_INPUT_INFO\r
51 // HDMI_VTiming currVTiming ;\r
52 ////////////////////////////////////////////////////////////////////////////////\r
53 // HDMI VTable\r
54 ////////////////////////////////////////////////////////////////////////////////\r
55 static HDMI_VTiming _CODE s_VMTable[] = {\r
56 \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
91 \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
96 \r
97     {39,0,1920,540,2304,625,72000000L,0x17,32,168,184,23,5,57,INTERLACE,Vneg,Hpos},//1920x1080@50Hz\r
98     // 100Hz\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
105     // 120Hz\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
112 \r
113     // 200Hz\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
118     // 240Hz\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
130     // VESA mode\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
157 \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
162 \r
163 \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
170 \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
200 };\r
201 #define     SizeofVMTable   (sizeof(s_VMTable)/sizeof(HDMI_VTiming))\r
202 \r
203 void HDMITX_MonitorInputVideoChange();\r
204 void HDMITX_MonitorInputAudioChange();\r
205 \r
206 #else\r
207 #define     SizeofVMTable    0\r
208 #endif\r
209 \r
210 #define DIFF(a,b) (((a)>(b))?((a)-(b)):((b)-(a)))\r
211 \r
212 ////////////////////////////////////////////////////////////////////////////////\r
213 // EDID\r
214 ////////////////////////////////////////////////////////////////////////////////\r
215 static _XDATA RX_CAP RxCapability ;\r
216 static BOOL bChangeMode = FALSE ;\r
217 static BOOL bChangeAudio = FALSE ;\r
218 \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
227 \r
228 \r
229 BYTE bInputColorMode = INPUT_COLOR_MODE;\r
230 BYTE OutputColorDepth = INPUT_COLOR_DEPTH ;\r
231 BYTE bOutputColorMode = OUTPUT_COLOR_MODE ;\r
232 \r
233 BYTE iVideoModeSelect=0 ;\r
234 \r
235 ULONG VideoPixelClock ;\r
236 BYTE VIC ; // 480p60\r
237 BYTE pixelrep ; // no pixelrepeating\r
238 HDMI_Aspec aspec ;\r
239 HDMI_Colorimetry Colorimetry ;\r
240 \r
241 ULONG ulAudioSampleFS = INPUT_SAMPLE_FREQ_HZ ;\r
242 // BYTE bAudioSampleFreq = INPUT_SAMPLE_FREQ ;\r
243 BYTE bOutputAudioChannel = OUTPUT_CHANNEL ;\r
244 \r
245 BOOL bHDMIMode;\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
253 BYTE ParseEDID();\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
264 // Function Body.\r
265 ////////////////////////////////////////////////////////////////////////////////\r
266 \r
267 void InitHDMITX_Variable()\r
268 {\r
269         printk( "[%s]\n", __FUNCTION__);\r
270     HDMITX_InitTxDev(&InstanceData);\r
271         HPDStatus = FALSE;\r
272         HPDChangeStatus = FALSE;\r
273 }\r
274 \r
275 BOOL AudioModeDetect(void)\r
276 {\r
277     setHDMITX_AudioChannelEnable(bAudioEnable);\r
278     return  TRUE;\r
279 }\r
280 \r
281 void HDMITX_ChangeColorDepth(BYTE colorDepth)\r
282 {\r
283 #ifdef IT6615\r
284         HDMITX_DEBUG_PRINTF(("OHDMITX_ChangeColorDepth(%02X)\n",(int)colorDepth)) ;\r
285     OutputColorDepth = colorDepth ;\r
286 #else\r
287     OutputColorDepth = 0 ;\r
288 #endif\r
289 }\r
290 \r
291 void HDMITX_SetOutput()\r
292 {\r
293     VIDEOPCLKLEVEL level ;\r
294     unsigned long TMDSClock = VideoPixelClock*(pixelrep+1);\r
295     HDMITX_DisableAudioOutput();\r
296         HDMITX_EnableHDCP(FALSE);\r
297 \r
298     if( TMDSClock>80000000L )\r
299     {\r
300         level = PCLK_HIGH ;\r
301     }\r
302     else if(TMDSClock>20000000L)\r
303     {\r
304         level = PCLK_MEDIUM ;\r
305     }\r
306     else\r
307     {\r
308         level = PCLK_LOW ;\r
309     }\r
310 #ifdef IT6615\r
311         HDMITX_DEBUG_PRINTF(("OutputColorDepth = %02X\n",(int)OutputColorDepth)) ;\r
312     setHDMITX_ColorDepthPhase(OutputColorDepth,0);\r
313 #endif\r
314 \r
315         setHDMITX_VideoSignalType(InstanceData.bInputVideoSignalType);\r
316     #ifdef SUPPORT_SYNCEMBEDDED\r
317         if(InstanceData.bInputVideoSignalType & T_MODE_SYNCEMB)\r
318         {\r
319             setHDMITX_SyncEmbeddedByVIC(VIC,InstanceData.bInputVideoSignalType);\r
320         }\r
321     #endif\r
322 \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
325 \r
326     if( bHDMIMode )\r
327     {\r
328         #ifdef OUTPUT_3D_MODE\r
329         ConfigfHdmiVendorSpecificInfoFrame(OUTPUT_3D_MODE);\r
330         #endif\r
331         //HDMITX_EnableHDCP(TRUE);\r
332         ConfigAVIInfoFrame(VIC, pixelrep);\r
333 \r
334         HDMITX_SetAudioOutput();\r
335 \r
336         // if( bAudioEnable )\r
337         // {\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
341         // #else\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
344         // #endif\r
345         // }\r
346 \r
347     }\r
348         else\r
349         {\r
350                 HDMITX_EnableAVIInfoFrame(FALSE ,NULL);\r
351         HDMITX_EnableVSInfoFrame(FALSE,NULL);\r
352         }\r
353     setHDMITX_AVMute(FALSE);\r
354     bChangeMode = FALSE ;\r
355     DumpHDMITXReg() ;\r
356 }\r
357 \r
358 void HDMITX_ChangeAudioOption(BYTE Option, BYTE channelNum, BYTE AudioFs)\r
359 {\r
360 \r
361     switch(Option )\r
362     {\r
363     case T_AUDIO_HBR :\r
364         bOutputAudioType = T_AUDIO_HBR ;\r
365         ulAudioSampleFS = 768000L ;\r
366         bOutputAudioChannel = 8 ;\r
367         return ;\r
368     case T_AUDIO_NLPCM :\r
369         bOutputAudioType = T_AUDIO_NLPCM ;\r
370         bOutputAudioChannel = 2 ;\r
371         break ;\r
372     default:\r
373         bOutputAudioType = T_AUDIO_LPCM ;\r
374         if( channelNum < 1 )\r
375         {\r
376             bOutputAudioChannel = 1 ;\r
377         }\r
378         else if( channelNum > 8 )\r
379         {\r
380             bOutputAudioChannel = 8 ;\r
381         }\r
382         else\r
383         {\r
384             bOutputAudioChannel = channelNum ;\r
385         }\r
386         break ;\r
387     }\r
388 \r
389     switch(AudioFs)\r
390     {\r
391     case AUDFS_44p1KHz:\r
392         ulAudioSampleFS =  44100L ;\r
393         break ;\r
394     case AUDFS_88p2KHz:\r
395         ulAudioSampleFS =  88200L ;\r
396         break ;\r
397     case AUDFS_176p4KHz:\r
398         ulAudioSampleFS = 176400L ;\r
399         break ;\r
400 \r
401     case AUDFS_48KHz:\r
402         ulAudioSampleFS =  48000L ;\r
403         break ;\r
404     case AUDFS_96KHz:\r
405         ulAudioSampleFS =  96000L ;\r
406         break ;\r
407     case AUDFS_192KHz:\r
408         ulAudioSampleFS = 192000L ;\r
409         break ;\r
410 \r
411     case AUDFS_768KHz:\r
412         ulAudioSampleFS = 768000L ;\r
413         break ;\r
414 \r
415     case AUDFS_32KHz:\r
416         ulAudioSampleFS =  32000L ;\r
417         break ;\r
418     default:\r
419         ulAudioSampleFS =  48000L ;\r
420         break ;\r
421     }\r
422     HDMITX_DEBUG_PRINTF(("HDMITX_ChangeAudioOption():bOutputAudioType = %02X, ulAudioSampleFS = %8ld, bOutputAudioChannel = %d\n",(int)bOutputAudioType,ulAudioSampleFS,(int)bOutputAudioChannel)) ;\r
423     bChangeAudio = TRUE ;\r
424 }\r
425 \r
426 void HDMITX_SetAudioOutput()\r
427 {\r
428         if( bAudioEnable )\r
429         {\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
434             bOutputAudioType,\r
435             CONFIG_INPUT_AUDIO_SPDIF,\r
436             ulAudioSampleFS,\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
443         }\r
444 }\r
445 \r
446 int HDMITX_DevLoopProc()\r
447 {\r
448     static BYTE DevLoopCount = 0 ;\r
449     CheckHDMITX(&HPDStatus,&HPDChangeStatus);\r
450 \r
451     if( HPDChangeStatus )\r
452     {\r
453         if( HPDStatus )\r
454         {\r
455             HDMITX_PowerOn();\r
456             ParseEDID();\r
457             bOutputColorMode = F_MODE_RGB444;\r
458 \r
459                         if( RxCapability.ValidHDMI )\r
460                         {\r
461                                 bHDMIMode = TRUE ;\r
462 \r
463                                 if(RxCapability.VideoMode & (1<<6))\r
464                                 {\r
465                                         bAudioEnable = TRUE ;\r
466                                 }\r
467                                 if( RxCapability.VideoMode & (1<<5))\r
468                                 {\r
469                                         bOutputColorMode &= ~F_MODE_CLRMOD_MASK ;\r
470                                         bOutputColorMode |= F_MODE_YUV444;\r
471                                 }\r
472                                 else if (RxCapability.VideoMode & (1<<4))\r
473                                 {\r
474                                         bOutputColorMode &= ~F_MODE_CLRMOD_MASK ;\r
475                                         bOutputColorMode |= F_MODE_YUV422 ;\r
476                                 }\r
477                                 bOutputColorMode = F_MODE_RGB444;\r
478 \r
479 \r
480             #ifdef IT6615\r
481                 if(RxCapability.dc.uc & (HDMI_DC_SUPPORT_36|HDMI_DC_SUPPORT_30))\r
482                 {\r
483                     setHDMITX_ColorDepthPhase(OutputColorDepth,0);\r
484                 }\r
485                 else\r
486                 {\r
487                     OutputColorDepth = B_TX_CD_NODEF;\r
488                 }\r
489             #else\r
490                 OutputColorDepth = B_TX_CD_NODEF;\r
491             #endif\r
492                         }\r
493                         else\r
494                         {\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
502             #endif\r
503                         }\r
504                 HDMITX_DEBUG_PRINTF(("HPD change HDMITX_SetOutput();\n"));\r
505             //HDMITX_SetOutput();\r
506             bChangeMode=TRUE;\r
507             bChangeAudio = TRUE ;\r
508         }\r
509         else\r
510         {\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
516         }\r
517     }\r
518     else // no stable but need to process mode change procedure\r
519     {\r
520         if( DevLoopCount >= 20 )\r
521         {\r
522             DevLoopCount = 0 ;\r
523         }\r
524 \r
525         #ifdef HDMITX_AUTO_MONITOR_INPUT\r
526         if( DevLoopCount == 0 )\r
527         {\r
528             HDMITX_MonitorInputVideoChange();\r
529             HDMITX_MonitorInputAudioChange();\r
530         }\r
531         #endif\r
532 \r
533         if(HPDStatus)\r
534         {\r
535             #ifdef HDMITX_AUTO_MONITOR_INPUT\r
536             if( bChangeMode && ( VIC > 0 ) )\r
537             #else\r
538             if( bChangeMode )\r
539             #endif\r
540             {\r
541                         HDMITX_DEBUG_PRINTF(("Mode change HDMITX_SetOutput();\n"));\r
542                 HDMITX_SetOutput();\r
543                 // HDMITX_EnableHDCP(TRUE);\r
544 \r
545                 bChangeMode = FALSE ;\r
546             }\r
547             if(getHDMITX_LinkStatus())\r
548             {\r
549                 // AudioModeDetect();\r
550                 #ifdef SUPPORT_HDCP\r
551                 if(getHDMITX_AuthenticationDone() ==FALSE)\r
552                 {\r
553                     HDMITX_DEBUG_PRINTF(("getHDMITX_AuthenticationDone() ==FALSE\n") );\r
554                     HDMITX_EnableHDCP(TRUE);\r
555                     setHDMITX_AVMute(FALSE);\r
556                 }\r
557                 #endif\r
558             }\r
559 \r
560             if(bChangeAudio)\r
561             {\r
562                 HDMITX_SetAudioOutput() ;\r
563             }\r
564         }\r
565     }\r
566 \r
567     DevLoopCount ++ ;\r
568     return HPDStatus;\r
569 }\r
570 \r
571 #ifdef HDMITX_AUTO_MONITOR_INPUT\r
572 \r
573 void HDMITX_MonitorInputAudioChange()\r
574 {\r
575     static ULONG prevAudioSampleFS = 0 ;\r
576     LONG AudioFS ;\r
577 \r
578     if( !bAudioEnable )\r
579     {\r
580         prevAudioSampleFS = 0 ;\r
581     }\r
582     else\r
583     {\r
584         AudioFS = CalcAudFS() ;\r
585         HDMITX_DEBUG_PRINTF1(("Audio Chagne, Audio clock = %ldHz\n",AudioFS)) ;\r
586         if( AudioFS > 188000L ) // 192KHz\r
587         {\r
588             ulAudioSampleFS = 192000L ;\r
589         }\r
590         else if( AudioFS > 144000L ) // 176.4KHz\r
591         {\r
592             ulAudioSampleFS = 176400L ;\r
593         }\r
594         else if( AudioFS >  93000L ) // 96KHz\r
595         {\r
596             ulAudioSampleFS = 96000L ;\r
597         }\r
598         else if( AudioFS >  80000L ) // 88.2KHz\r
599         {\r
600             ulAudioSampleFS = 88200L ;\r
601         }\r
602         else if( AudioFS >  45000L ) // 48 KHz\r
603         {\r
604             ulAudioSampleFS = 48000L ;\r
605         }\r
606         else if( AudioFS >  36000L ) // 44.1KHz\r
607         {\r
608             ulAudioSampleFS = 44100L ;\r
609         }\r
610         else                         // 32KHz\r
611         {\r
612             ulAudioSampleFS = 32000L ;\r
613         }\r
614 \r
615         if(!bChangeMode)\r
616         {\r
617             if( ulAudioSampleFS != prevAudioSampleFS )\r
618             {\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
623 \r
624             }\r
625         }\r
626 \r
627         prevAudioSampleFS = ulAudioSampleFS ;\r
628 \r
629     }\r
630 }\r
631 \r
632 int HDMITX_SearchVICIndex( ULONG PCLK, USHORT HTotal, USHORT VTotal, BYTE ScanMode )\r
633 {\r
634     #define SEARCH_COUNT 4\r
635     unsigned long  pclkDiff;\r
636     int i;\r
637     char hit;\r
638     int iMax[SEARCH_COUNT]={0};\r
639     char hitMax[SEARCH_COUNT]={0};\r
640     char i2;\r
641 \r
642     for( i = 0 ; i < SizeofVMTable; i++ )\r
643     {\r
644         if( s_VMTable[i].VIC == 0 ) break ;\r
645 \r
646         hit=0;\r
647 \r
648         if( ScanMode == s_VMTable[i].ScanMode )\r
649         {\r
650             hit++;\r
651 \r
652             if( ScanMode == INTERLACE )\r
653             {\r
654                 if( DIFF(VTotal/2, s_VMTable[i].VTotal) < 10 )\r
655                 {\r
656                     hit++;\r
657                 }\r
658             }\r
659             else\r
660             {\r
661                 if( DIFF(VTotal, s_VMTable[i].VTotal) < 10 )\r
662                 {\r
663                     hit++;\r
664                 }\r
665             }\r
666 \r
667             if( hit == 2 ) // match scan mode and v-total\r
668             {\r
669                 if( DIFF(HTotal, s_VMTable[i].HTotal) < 40 )\r
670                 {\r
671                     hit++;\r
672 \r
673                     pclkDiff = DIFF(PCLK, s_VMTable[i].PCLK);\r
674                     pclkDiff = (pclkDiff * 100) / s_VMTable[i].PCLK;\r
675 \r
676                     if( pclkDiff < 100 )\r
677                     {\r
678                         hit += ( 100 - pclkDiff );\r
679                     }\r
680                 }\r
681             }\r
682         }\r
683 \r
684         HDMITX_DEBUG_PRINTF(("i = %d, hit = %d\n",i,(int)hit));\r
685 \r
686         if( hit )\r
687         {\r
688             for( i2=0 ; i2<SEARCH_COUNT ; i2++ )\r
689             {\r
690                 if( hitMax[i2] < hit )\r
691                 {\r
692                     HDMITX_DEBUG_PRINTF(("replace iMax[%d] = %d => %d\n",(int)i2, iMax[i2], i ));\r
693                     hitMax[i2] = hit;\r
694                     iMax[i2]=i;\r
695                     break;\r
696                 }\r
697             }\r
698         }\r
699     }\r
700 \r
701     i=-1;\r
702     hit=0;\r
703     for( i2=0 ; i2<SEARCH_COUNT ; i2++ )\r
704     {\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
707         {\r
708             hit = hitMax[i2];\r
709             i = iMax[i2];\r
710         }\r
711     }\r
712 \r
713     if( hit > 2 )\r
714     {\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
717     }\r
718     else\r
719     {\r
720         i=-1;\r
721         HDMITX_DEBUG_PRINTF(("no matched\n"));\r
722     }\r
723 \r
724     return i;\r
725 }\r
726 \r
727 void HDMITX_MonitorInputVideoChange()\r
728 {\r
729     static ULONG prevPCLK = 0 ;\r
730     static USHORT prevHTotal = 0 ;\r
731     static USHORT prevVTotal = 0 ;\r
732     static BYTE prevScanMode ;\r
733     ULONG currPCLK ;\r
734     ULONG diff ;\r
735     USHORT currHTotal, currVTotal ;\r
736     BYTE currScanMode ;\r
737         int i ;\r
738 \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
744 \r
745     HDMITX_DEBUG_PRINTF(("HDMITX_MonitorInputVideoChange : pclk=%lu, ht=%u, vt=%u, dif=%lu\n", currPCLK, currHTotal, currVTotal, diff ));\r
746 \r
747     if( currHTotal == 0 || currVTotal == 0 || currPCLK == 0 )\r
748     {\r
749         bChangeMode = FALSE;\r
750                 return ;\r
751     }\r
752 \r
753     if( diff > currPCLK/20) // 5% torrenlance\r
754     {\r
755         bChangeMode = TRUE ;\r
756     }\r
757     else\r
758     {\r
759         diff = DIFF(currHTotal, prevHTotal) ;\r
760         if( diff > 20 )\r
761         {\r
762             bChangeMode = TRUE ;\r
763         }\r
764         diff = DIFF(currVTotal, prevVTotal) ;\r
765         if( diff > 20 )\r
766         {\r
767             bChangeMode = TRUE ;\r
768         }\r
769     }\r
770 \r
771     if( bChangeMode )\r
772     {\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
777 \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
779 \r
780         setHDMITX_AVMute(TRUE);\r
781 \r
782         #if 0\r
783         for( i = 0 ; (i < SizeofVMTable) && ( s_VMTable[i].VIC != 0 ); i++ )\r
784         {\r
785             if( s_VMTable[i].VIC == 0 ) break ;\r
786             if( DIFF(currPCLK, s_VMTable[i].PCLK) > (s_VMTable[i].PCLK/20))\r
787             {\r
788                 continue ;\r
789             }\r
790             if( DIFF(currHTotal, s_VMTable[i].HTotal) > 40 )\r
791             {\r
792                 continue ;\r
793             }\r
794             if( currScanMode != s_VMTable[i].ScanMode )\r
795             {\r
796                 continue ;\r
797             }\r
798             if( currScanMode == INTERLACE )\r
799             {\r
800                 if( DIFF(currVTotal/2, s_VMTable[i].VTotal) > 10 )\r
801                 {\r
802                     continue ;\r
803                 }\r
804             }\r
805             else\r
806             {\r
807                 if( DIFF(currVTotal, s_VMTable[i].VTotal) > 10 )\r
808                 {\r
809                     continue ;\r
810                 }\r
811             }\r
812             printf("i = %d, VIC = %d\n",i,(int)s_VMTable[i].VIC) ;\r
813 \r
814             break ;\r
815         }\r
816         #else\r
817         i = HDMITX_SearchVICIndex( currPCLK, currHTotal, currVTotal, currScanMode );\r
818         #endif\r
819 \r
820         if( i >= 0 )\r
821         {\r
822             VIC = s_VMTable[i].VIC;\r
823             pixelrep = s_VMTable[i].PixelRep ;\r
824             VideoPixelClock = currPCLK ;\r
825         }\r
826         else\r
827         {\r
828             VIC = 0;\r
829             pixelrep = 0;\r
830             VideoPixelClock = 0 ;\r
831         }\r
832     }\r
833 \r
834     prevPCLK = currPCLK ;\r
835     prevHTotal = currHTotal ;\r
836     prevVTotal = currVTotal ;\r
837     prevScanMode = currScanMode ;\r
838 \r
839 }\r
840 #endif // HDMITX_AUTO_MONITOR_INPUT\r
841 \r
842 void HDMITX_ChangeDisplayOption(HDMI_Video_Type OutputVideoTiming, HDMI_OutputColorMode OutputColorMode)\r
843 {\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
847     {\r
848         OutputColorMode=F_MODE_RGB444;\r
849     }\r
850     else if ((F_MODE_YUV422)==(bOutputColorMode&F_MODE_CLRMOD_MASK))//YUV422 only\r
851     {\r
852         if(OutputColorMode==HDMI_YUV444){OutputColorMode=F_MODE_YUV422;}\r
853     }\r
854     else if ((F_MODE_YUV444)==(bOutputColorMode&F_MODE_CLRMOD_MASK))//YUV444 only\r
855     {\r
856         if(OutputColorMode==HDMI_YUV422){OutputColorMode=F_MODE_YUV444;}\r
857     }\r
858     switch(OutputVideoTiming)\r
859         {\r
860     case HDMI_640x480p60:\r
861         VIC = 1 ;\r
862         VideoPixelClock = 25000000 ;\r
863         pixelrep = 0 ;\r
864         aspec = HDMI_4x3 ;\r
865         Colorimetry = HDMI_ITU601 ;\r
866         break ;\r
867     case HDMI_480p60:\r
868         VIC = 2 ;\r
869         VideoPixelClock = 27000000 ;\r
870         pixelrep = 0 ;\r
871         aspec = HDMI_4x3 ;\r
872         Colorimetry = HDMI_ITU601 ;\r
873         break ;\r
874     case HDMI_480p60_16x9:\r
875         VIC = 3 ;\r
876         VideoPixelClock = 27000000 ;\r
877         pixelrep = 0 ;\r
878         aspec = HDMI_16x9 ;\r
879         Colorimetry = HDMI_ITU601 ;\r
880         break ;\r
881     case HDMI_720p60:\r
882         VIC = 4 ;\r
883         VideoPixelClock = 74250000 ;\r
884         pixelrep = 0 ;\r
885         aspec = HDMI_16x9 ;\r
886         Colorimetry = HDMI_ITU709 ;\r
887         break ;\r
888     case HDMI_1080i60:\r
889         VIC = 5 ;\r
890         VideoPixelClock = 74250000 ;\r
891         pixelrep = 0 ;\r
892         aspec = HDMI_16x9 ;\r
893         Colorimetry = HDMI_ITU709 ;\r
894         break ;\r
895     case HDMI_480i60:\r
896         VIC = 6 ;\r
897         VideoPixelClock = 13500000 ;\r
898         pixelrep = 1 ;\r
899         aspec = HDMI_4x3 ;\r
900         Colorimetry = HDMI_ITU601 ;\r
901         break ;\r
902     case HDMI_480i60_16x9:\r
903         VIC = 7 ;\r
904         VideoPixelClock = 13500000 ;\r
905         pixelrep = 1 ;\r
906         aspec = HDMI_16x9 ;\r
907         Colorimetry = HDMI_ITU601 ;\r
908         break ;\r
909     case HDMI_1080p60:\r
910         VIC = 16 ;\r
911         VideoPixelClock = 148500000 ;\r
912         pixelrep = 0 ;\r
913         aspec = HDMI_16x9 ;\r
914         Colorimetry = HDMI_ITU709 ;\r
915         break ;\r
916     case HDMI_576p50:\r
917         VIC = 17 ;\r
918         VideoPixelClock = 27000000 ;\r
919         pixelrep = 0 ;\r
920         aspec = HDMI_4x3 ;\r
921         Colorimetry = HDMI_ITU601 ;\r
922         break ;\r
923     case HDMI_576p50_16x9:\r
924         VIC = 18 ;\r
925         VideoPixelClock = 27000000 ;\r
926         pixelrep = 0 ;\r
927         aspec = HDMI_16x9 ;\r
928         Colorimetry = HDMI_ITU601 ;\r
929         break ;\r
930     case HDMI_720p50:\r
931         VIC = 19 ;\r
932         VideoPixelClock = 74250000 ;\r
933         pixelrep = 0 ;\r
934         aspec = HDMI_16x9 ;\r
935         Colorimetry = HDMI_ITU709 ;\r
936         break ;\r
937     case HDMI_1080i50:\r
938         VIC = 20 ;\r
939         VideoPixelClock = 74250000 ;\r
940         pixelrep = 0 ;\r
941         aspec = HDMI_16x9 ;\r
942         Colorimetry = HDMI_ITU709 ;\r
943         break ;\r
944     case HDMI_576i50:\r
945         VIC = 21 ;\r
946         VideoPixelClock = 13500000 ;\r
947         pixelrep = 1 ;\r
948         aspec = HDMI_4x3 ;\r
949         Colorimetry = HDMI_ITU601 ;\r
950         break ;\r
951     case HDMI_576i50_16x9:\r
952         VIC = 22 ;\r
953         VideoPixelClock = 13500000 ;\r
954         pixelrep = 1 ;\r
955         aspec = HDMI_16x9 ;\r
956         Colorimetry = HDMI_ITU601 ;\r
957         break ;\r
958     case HDMI_1080p50:\r
959         VIC = 31 ;\r
960         VideoPixelClock = 148500000 ;\r
961         pixelrep = 0 ;\r
962         aspec = HDMI_16x9 ;\r
963         Colorimetry = HDMI_ITU709 ;\r
964         break ;\r
965     case HDMI_1080p24:\r
966         VIC = 32 ;\r
967         VideoPixelClock = 74250000 ;\r
968         pixelrep = 0 ;\r
969         aspec = HDMI_16x9 ;\r
970         Colorimetry = HDMI_ITU709 ;\r
971         break ;\r
972     case HDMI_1080p25:\r
973         VIC = 33 ;\r
974         VideoPixelClock = 74250000 ;\r
975         pixelrep = 0 ;\r
976         aspec = HDMI_16x9 ;\r
977         Colorimetry = HDMI_ITU709 ;\r
978         break ;\r
979     case HDMI_1080p30:\r
980         VIC = 34 ;\r
981         VideoPixelClock = 74250000 ;\r
982         pixelrep = 0 ;\r
983         aspec = HDMI_16x9 ;\r
984         Colorimetry = HDMI_ITU709 ;\r
985         break ;\r
986 \r
987     case HDMI_720p30:\r
988         VIC = 0 ;\r
989         VideoPixelClock = 74250000 ;\r
990         pixelrep = 0 ;\r
991         aspec = HDMI_16x9 ;\r
992         Colorimetry = HDMI_ITU709 ;\r
993 \r
994     #ifdef SUPPORT_SYNCEMBEDDED\r
995     /*\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
1011     */\r
1012     #endif\r
1013         break ;\r
1014     default:\r
1015         bChangeMode = FALSE ;\r
1016         return ;\r
1017     }\r
1018     switch(OutputColorMode)\r
1019     {\r
1020     case HDMI_YUV444:\r
1021         bOutputColorMode = F_MODE_YUV444 ;\r
1022         break ;\r
1023     case HDMI_YUV422:\r
1024         bOutputColorMode = F_MODE_YUV422 ;\r
1025         break ;\r
1026     case HDMI_RGB444:\r
1027     default:\r
1028         bOutputColorMode = F_MODE_RGB444 ;\r
1029         break ;\r
1030     }\r
1031     if( Colorimetry == HDMI_ITU709 )\r
1032     {\r
1033         bInputColorMode |= F_VIDMODE_ITU709 ;\r
1034     }\r
1035     else\r
1036     {\r
1037         bInputColorMode &= ~F_VIDMODE_ITU709 ;\r
1038     }\r
1039     // if( Colorimetry != HDMI_640x480p60)\r
1040     if( OutputVideoTiming != HDMI_640x480p60)\r
1041     {\r
1042         bInputColorMode |= F_VIDMODE_16_235 ;\r
1043     }\r
1044     else\r
1045     {\r
1046         bInputColorMode &= ~F_VIDMODE_16_235 ;\r
1047     }\r
1048     bChangeMode = TRUE ;\r
1049 }\r
1050 \r
1051 void ConfigAVIInfoFrame(BYTE VIC, BYTE pixelrep)\r
1052 {\r
1053     AVI_InfoFrame *AviInfo;\r
1054     AviInfo = (AVI_InfoFrame *)CommunBuff ;\r
1055 \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
1059 \r
1060     switch(bOutputColorMode)\r
1061     {\r
1062     case F_MODE_YUV444:\r
1063         // AviInfo->info.ColorMode = 2 ;\r
1064         AviInfo->pktbyte.AVI_DB[0] = (2<<5)|(1<<4);\r
1065         break ;\r
1066     case F_MODE_YUV422:\r
1067         // AviInfo->info.ColorMode = 1 ;\r
1068         AviInfo->pktbyte.AVI_DB[0] = (1<<5)|(1<<4);\r
1069         break ;\r
1070     case F_MODE_RGB444:\r
1071     default:\r
1072         // AviInfo->info.ColorMode = 0 ;\r
1073         AviInfo->pktbyte.AVI_DB[0] = (0<<5)|(1<<4);\r
1074         break ;\r
1075     }\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
1090 \r
1091     HDMITX_EnableAVIInfoFrame(TRUE, (unsigned char *)AviInfo);\r
1092 }\r
1093 \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
1101 // Side-Effect:\r
1102 ////////////////////////////////////////////////////////////////////////////////\r
1103 \r
1104 void ConfigAudioInfoFrm()\r
1105 {\r
1106     int i ;\r
1107 \r
1108     Audio_InfoFrame *AudioInfo ;\r
1109     AudioInfo = (Audio_InfoFrame *)CommunBuff ;\r
1110 \r
1111     HDMITX_DEBUG_PRINTF(("ConfigAudioInfoFrm(%d)\n",2));\r
1112 \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
1118     {\r
1119         AudioInfo->pktbyte.AUD_DB[i] = 0 ;\r
1120     }\r
1121     HDMITX_EnableAudioInfoFrame(TRUE, (unsigned char *)AudioInfo);\r
1122 }\r
1123 \r
1124 void ConfigfHdmiVendorSpecificInfoFrame(BYTE _3D_Stru)\r
1125 {\r
1126     VendorSpecific_InfoFrame *VS_Info;\r
1127 \r
1128     VS_Info=(VendorSpecific_InfoFrame *)CommunBuff ;\r
1129 \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
1137     switch(_3D_Stru)\r
1138     {\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
1143         break;\r
1144     default:\r
1145         VS_Info->pktbyte.VS_DB[4] = (Frame_Pcaking<<4);\r
1146         break ;\r
1147     }\r
1148     VS_Info->pktbyte.VS_DB[5] = 0x00;\r
1149     HDMITX_EnableVSInfoFrame(TRUE,(BYTE *)VS_Info);\r
1150 }\r
1151 \r
1152 /////////////////////////////////////////////////////////////////////\r
1153 // ParseEDID()\r
1154 // Check EDID check sum and EDID 1.3 extended segment.\r
1155 /////////////////////////////////////////////////////////////////////\r
1156 \r
1157 BYTE ParseEDID()\r
1158 {\r
1159     // collect the EDID ucdata of segment 0\r
1160     _XDATA unsigned char *EDID_Buf;\r
1161     BYTE CheckSum ;\r
1162     BYTE BlockCount ;\r
1163     BYTE err ;\r
1164     BYTE bValidCEA = FALSE ;\r
1165     BYTE i;\r
1166     #if Debug_message\r
1167         BYTE j ;\r
1168     #endif // Debug_message\r
1169 \r
1170     EDID_Buf = CommunBuff;\r
1171     RxCapability.ValidCEA = FALSE ;\r
1172     RxCapability.ValidHDMI = FALSE ;\r
1173     RxCapability.dc.uc = 0;\r
1174 \r
1175     getHDMITX_EDIDBlock(0, EDID_Buf);\r
1176 \r
1177     for( i = 0, CheckSum = 0 ; i < 128 ; i++ )\r
1178     {\r
1179         CheckSum += EDID_Buf[i] ; CheckSum &= 0xFF ;\r
1180     }\r
1181                         //Eep_Write(0x80, 0x80, EDID_Buf);\r
1182         if( CheckSum != 0 )\r
1183         {\r
1184                 return FALSE ;\r
1185         }\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
1194     {\r
1195         return FALSE ;\r
1196     }\r
1197     /*\r
1198     for( i = 0 ; i < 128 ; i++ )\r
1199     {\r
1200         HDMITX_DEBUG_PRINTF(("%02X%c",(int)EDID_Buf[i],(7 == (i&7))?'\n':' '));\r
1201     }\r
1202     */\r
1203 \r
1204     BlockCount = EDID_Buf[0x7E] ;\r
1205 \r
1206     if( BlockCount == 0 )\r
1207     {\r
1208         return TRUE ; // do nothing.\r
1209     }\r
1210     else if ( BlockCount > 4 )\r
1211     {\r
1212         BlockCount = 4 ;\r
1213     }\r
1214      // read all segment for test\r
1215     for( i = 1 ; i <= BlockCount ; i++ )\r
1216     {\r
1217         err = getHDMITX_EDIDBlock(i, EDID_Buf);\r
1218 \r
1219         #if Debug_message\r
1220         for( j = 0 ; j < 128 ; j++ )\r
1221         {\r
1222             EDID_DEBUG_PRINTF(("%02X%c",(int)EDID_Buf[j],(7 == (j&7))?'\n':' '));\r
1223         }\r
1224         #endif // Debug_message\r
1225 \r
1226         if( err )\r
1227         {\r
1228            if( !bValidCEA && EDID_Buf[0] == 0x2 && EDID_Buf[1] == 0x3 )\r
1229             {\r
1230                 err = ParseCEAEDID(EDID_Buf);\r
1231                 EDID_DEBUG_PRINTF(("err = %s\n",err?"SUCCESS":"FAIL"));\r
1232                 if( err )\r
1233                 {\r
1234                     EDID_DEBUG_PRINTF(("RxCapability.IEEEOUI = %lx\n",RxCapability.IEEEOUI));\r
1235 \r
1236                                     if(RxCapability.IEEEOUI==0x0c03)\r
1237                                     {\r
1238                                         RxCapability.ValidHDMI = TRUE ;\r
1239                                         bValidCEA = TRUE ;\r
1240                                         }\r
1241                                     else\r
1242                                     {\r
1243                                         RxCapability.ValidHDMI = FALSE ;\r
1244                                     }\r
1245                 }\r
1246             }\r
1247         }\r
1248     }\r
1249     return err ;\r
1250 }\r
1251 \r
1252 static BOOL ParseCEAEDID(BYTE *pCEAEDID)\r
1253 {\r
1254     BYTE offset,End ;\r
1255     BYTE count ;\r
1256     BYTE tag ;\r
1257     int i ;\r
1258 \r
1259     if( pCEAEDID[0] != 0x02 || pCEAEDID[1] != 0x03 ) return FALSE ; // not a CEA BLOCK.\r
1260     End = pCEAEDID[2]  ; // CEA description.\r
1261 \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
1272 \r
1273     RxCapability.VideoMode = pCEAEDID[3] ;\r
1274 \r
1275     RxCapability.NativeVDOMode = 0xff ;\r
1276 \r
1277     for( offset = 4 ; offset < End ; )\r
1278     {\r
1279         tag = pCEAEDID[offset] >> 5 ;\r
1280         count = pCEAEDID[offset] & 0x1f ;\r
1281         switch( tag )\r
1282         {\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
1286             offset++ ;\r
1287             for( i = 0 ; i < RxCapability.AUDDesCount && i < MAX_AUDDES_COUNT ; i++ )\r
1288             {\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
1292             }\r
1293             offset += count ;\r
1294             break ;\r
1295 \r
1296         case 0x02: // Video Data Block ;\r
1297             offset ++ ;\r
1298             for( i = 0,RxCapability.NativeVDOMode = 0xff ; i < count ; i++)\r
1299             {\r
1300                 BYTE VIC ;\r
1301                 VIC = pCEAEDID[offset+i] & (~0x80);\r
1302                 // if( FindModeTableEntryByVIC(VIC) != -1 )\r
1303                 if(VIC<64)\r
1304                 {\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
1308                         {\r
1309                             RxCapability.NativeVDOMode = VIC ;\r
1310                             EDID_DEBUG_PRINTF(("native = %d\n",RxCapability.NativeVDOMode));\r
1311                         }\r
1312                 }\r
1313             }\r
1314             offset += count ;\r
1315             break ;\r
1316 \r
1317         case 0x03: // Vendor Specific Data Block ;\r
1318             offset ++ ;\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
1326                         {\r
1327                                 BYTE nextoffset ;\r
1328                                 RxCapability.PA[0] = pCEAEDID[offset+3] ;\r
1329                                 RxCapability.PA[1] = pCEAEDID[offset+4] ;\r
1330                     if(count>5)\r
1331                     {\r
1332                         RxCapability.dc.uc = pCEAEDID[offset+5]&0x70;\r
1333                     }\r
1334                     if(count>6)\r
1335                     {\r
1336                         RxCapability.MaxTMDSClock = pCEAEDID[offset+6];\r
1337                     }\r
1338                                 if(count>7)\r
1339                                 {\r
1340                                         nextoffset = 8 ;\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
1347 \r
1348                                 }\r
1349                         }\r
1350             offset += count ; // ignore the remaind.\r
1351 \r
1352             break ;\r
1353 \r
1354         case 0x04: // Speaker Data Block ;\r
1355             offset ++ ;\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
1359             offset += 3 ;\r
1360             break ;\r
1361         case 0x05: // VESA Data Block ;\r
1362             offset += count+1 ;\r
1363             break ;\r
1364         case 0x07: // Extended Data Block ;\r
1365             offset += count+1 ; //ignore\r
1366             break ;\r
1367         default:\r
1368             offset += count+1 ; // ignore\r
1369         }\r
1370     }\r
1371     RxCapability.ValidCEA = TRUE ;\r
1372     return TRUE ;\r
1373 }\r