1
+ #include " hdmi.h"
2
+
3
+ using namespace maix ;
4
+ using namespace maix ::sys;
5
+ using namespace maix ::peripheral;
6
+ i2c::I2C LT6911_i2c (4 , i2c::Mode::MASTER);
7
+
8
+ void lt6911_enable ()
9
+ {
10
+ uint8_t buf[2 ];
11
+ buf[0 ] = 0xff ;
12
+ buf[1 ] = 0x80 ;
13
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 2 );
14
+
15
+ buf[0 ] = 0xee ;
16
+ buf[1 ] = 0x01 ;
17
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 2 );
18
+ }
19
+
20
+ void lt6911_disable ()
21
+ {
22
+ uint8_t buf[2 ];
23
+ buf[0 ] = 0xff ;
24
+ buf[1 ] = 0x80 ;
25
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 2 );
26
+
27
+ buf[0 ] = 0xee ;
28
+ buf[1 ] = 0x00 ;
29
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 2 );
30
+ }
31
+
32
+ void lt6911_start ()
33
+ {
34
+ uint8_t buf[2 ];
35
+
36
+ buf[0 ] = 0xff ;
37
+ buf[1 ] = 0x80 ;
38
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 2 );
39
+
40
+ buf[0 ] = 0x5A ;
41
+ buf[1 ] = 0x80 ;
42
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 2 );
43
+ }
44
+
45
+ void lt6911_stop ()
46
+ {
47
+ uint8_t buf[2 ];
48
+
49
+ buf[0 ] = 0xff ;
50
+ buf[1 ] = 0x80 ;
51
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 2 );
52
+
53
+ buf[0 ] = 0x5A ;
54
+ buf[1 ] = 0x88 ;
55
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 2 );
56
+ }
57
+
58
+ void lt6911_reset ()
59
+ {
60
+ lt6911_stop ();
61
+ time::sleep_ms (1 );
62
+ lt6911_start ();
63
+ }
64
+
65
+ void lt6911_get_hdmi_errer ()
66
+ {
67
+ uint8_t buf[6 ];
68
+
69
+ buf[0 ] = 0xff ;
70
+ buf[1 ] = 0xC0 ;
71
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 2 );
72
+
73
+ buf[0 ] = 0x20 ;
74
+ buf[1 ] = 0x01 ;
75
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 2 );
76
+
77
+ time::sleep_ms (100 );
78
+
79
+ buf[0 ] = 0x24 ;
80
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 1 );
81
+
82
+ maix::Bytes *dat = LT6911_i2c.readfrom (LT6911_ADDR, 6 );
83
+
84
+ buf[0 ] = 0x20 ;
85
+ buf[1 ] = 0x07 ;
86
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 2 );
87
+
88
+ for (int i = 0 ; i < 6 ; i++){
89
+ buf[i] = (uint8_t )dat->data [i];
90
+ }
91
+ delete dat;
92
+
93
+ printf (" hdmi_errer_code = %x, %x, %x, %x, %x, %x\n " , buf[0 ], buf[1 ], buf[2 ], buf[3 ], buf[4 ], buf[5 ]);
94
+ }
95
+
96
+ uint8_t lt6911_get_hdmi_res ()
97
+ {
98
+ uint8_t buf[2 ];
99
+ uint8_t revbuf[4 ];
100
+ uint16_t Vactive;
101
+ uint16_t Hactive;
102
+
103
+ buf[0 ] = 0xff ;
104
+ buf[1 ] = 0xd2 ;
105
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 2 );
106
+
107
+ buf[0 ] = 0x83 ;
108
+ buf[1 ] = 0x11 ;
109
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 2 );
110
+
111
+ time::sleep_ms (100 );
112
+
113
+ // Vactive
114
+ buf[0 ] = 0x96 ;
115
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 1 );
116
+ maix::Bytes *dat0 = LT6911_i2c.readfrom (LT6911_ADDR, 2 );
117
+
118
+ // Hactive
119
+ buf[0 ] = 0x8b ;
120
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 1 );
121
+ maix::Bytes *dat1 = LT6911_i2c.readfrom (LT6911_ADDR, 2 );
122
+
123
+ revbuf[0 ] = (uint8_t )dat0->data [0 ];
124
+ revbuf[1 ] = (uint8_t )dat0->data [1 ];
125
+ revbuf[2 ] = (uint8_t )dat1->data [0 ];
126
+ revbuf[3 ] = (uint8_t )dat1->data [1 ];
127
+
128
+ Vactive = (revbuf[0 ] << 8 )|revbuf[1 ];
129
+ Hactive = (revbuf[2 ] << 8 )|revbuf[3 ];
130
+ Hactive *= 2 ;
131
+
132
+ printf (" HDMI res modification event\n " );
133
+ printf (" new res: %d * %d\n " , Hactive, Vactive);
134
+
135
+ delete dat0;
136
+ delete dat1;
137
+
138
+ if (Vactive != 0 && Hactive != 0 ){
139
+ return 1 ;
140
+ } else {
141
+ return 0 ;
142
+ }
143
+ }
144
+
145
+ void lt6911_get_hdmi_clk ()
146
+ {
147
+ uint8_t buf[2 ];
148
+ uint8_t revbuf[3 ];
149
+ uint32_t clk;
150
+
151
+ buf[0 ] = 0xff ;
152
+ buf[1 ] = 0xa0 ;
153
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 2 );
154
+
155
+ buf[0 ] = 0x34 ;
156
+ buf[1 ] = 0x0b ;
157
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 2 );
158
+
159
+ time::sleep_ms (50 );
160
+
161
+ // clk
162
+ buf[0 ] = 0xff ;
163
+ buf[1 ] = 0xb8 ;
164
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 2 );
165
+
166
+ buf[0 ] = 0xb1 ;
167
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 1 );
168
+ maix::Bytes *dat0 = LT6911_i2c.readfrom (LT6911_ADDR, 3 );
169
+
170
+ revbuf[0 ] = (uint8_t )dat0->data [0 ];
171
+ revbuf[1 ] = (uint8_t )dat0->data [1 ];
172
+ revbuf[2 ] = (uint8_t )dat0->data [2 ];
173
+ revbuf[0 ] &= 0x07 ;
174
+
175
+ clk = revbuf[0 ];
176
+ clk <<= 8 ;
177
+ clk |= revbuf[1 ];
178
+ clk <<= 8 ;
179
+ clk |= revbuf[2 ];
180
+
181
+ printf (" HDMI CLK = %d\n " , clk);
182
+
183
+ delete dat0;
184
+ }
185
+
186
+ uint8_t lt6911_get_csi_res ()
187
+ {
188
+ uint8_t ret = 0 ;
189
+ uint8_t buf[2 ];
190
+ uint8_t revbuf[4 ];
191
+ static uint16_t old_Vactive;
192
+ static uint16_t old_Hactive;
193
+ uint16_t Vactive;
194
+ uint16_t Hactive;
195
+ char Cmd[100 ]={0 };
196
+
197
+ buf[0 ] = 0xff ;
198
+ buf[1 ] = 0xc2 ;
199
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 2 );
200
+
201
+ // Vactive
202
+ buf[0 ] = 0x06 ;
203
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 1 );
204
+ maix::Bytes *dat0 = LT6911_i2c.readfrom (LT6911_ADDR, 2 );
205
+
206
+ // Hactive
207
+ buf[0 ] = 0x38 ;
208
+ LT6911_i2c.writeto (LT6911_ADDR, buf, 1 );
209
+ maix::Bytes *dat1 = LT6911_i2c.readfrom (LT6911_ADDR, 2 );
210
+
211
+ revbuf[0 ] = (uint8_t )dat0->data [0 ];
212
+ revbuf[1 ] = (uint8_t )dat0->data [1 ];
213
+ revbuf[2 ] = (uint8_t )dat1->data [0 ];
214
+ revbuf[3 ] = (uint8_t )dat1->data [1 ];
215
+
216
+ Vactive = (revbuf[0 ] << 8 )|revbuf[1 ];
217
+ Hactive = (revbuf[2 ] << 8 )|revbuf[3 ];
218
+
219
+ if (old_Hactive != Hactive || old_Vactive != Vactive){
220
+ old_Hactive = Hactive;
221
+ old_Vactive = Vactive;
222
+ ret = 1 ;
223
+ }
224
+
225
+ printf (" CSI res: %d * %d\n " , Hactive, Vactive);
226
+ // setenv("KVM_CSI_HEIGHT", to_string(Hactive).c_str(), 1);
227
+ // setenv("KVM_CSI_WIDTH", to_string(Vactive).c_str(), 1);
228
+
229
+ sprintf (Cmd, " echo %d > /kvmapp/kvm/width" , Hactive);
230
+ system (Cmd);
231
+ sprintf (Cmd, " echo %d > /kvmapp/kvm/height" , Vactive);
232
+ system (Cmd);
233
+
234
+ delete dat0;
235
+ delete dat1;
236
+
237
+ return ret;
238
+ }
0 commit comments