1 //<MStar Software>
2 //******************************************************************************
3 // MStar Software
4 // Copyright (c) 2010 - 2012 MStar Semiconductor, Inc. All rights reserved.
5 // All software, firmware and related documentation herein ("MStar Software") are
6 // intellectual property of MStar Semiconductor, Inc. ("MStar") and protected by
7 // law, including, but not limited to, copyright law and international treaties.
8 // Any use, modification, reproduction, retransmission, or republication of all
9 // or part of MStar Software is expressly prohibited, unless prior written
10 // permission has been granted by MStar.
11 //
12 // By accessing, browsing and/or using MStar Software, you acknowledge that you
13 // have read, understood, and agree, to be bound by below terms ("Terms") and to
14 // comply with all applicable laws and regulations:
15 //
16 // 1. MStar shall retain any and all right, ownership and interest to MStar
17 // Software and any modification/derivatives thereof.
18 // No right, ownership, or interest to MStar Software and any
19 // modification/derivatives thereof is transferred to you under Terms.
20 //
21 // 2. You understand that MStar Software might include, incorporate or be
22 // supplied together with third party`s software and the use of MStar
23 // Software may require additional licenses from third parties.
24 // Therefore, you hereby agree it is your sole responsibility to separately
25 // obtain any and all third party right and license necessary for your use of
26 // such third party`s software.
27 //
28 // 3. MStar Software and any modification/derivatives thereof shall be deemed as
29 // MStar`s confidential information and you agree to keep MStar`s
30 // confidential information in strictest confidence and not disclose to any
31 // third party.
32 //
33 // 4. MStar Software is provided on an "AS IS" basis without warranties of any
34 // kind. Any warranties are hereby expressly disclaimed by MStar, including
35 // without limitation, any warranties of merchantability, non-infringement of
36 // intellectual property rights, fitness for a particular purpose, error free
37 // and in conformity with any international standard. You agree to waive any
38 // claim against MStar for any loss, damage, cost or expense that you may
39 // incur related to your use of MStar Software.
40 // In no event shall MStar be liable for any direct, indirect, incidental or
41 // consequential damages, including without limitation, lost of profit or
42 // revenues, lost or damage of data, and unauthorized system use.
43 // You agree that this Section 4 shall still apply without being affected
44 // even if MStar Software has been modified by MStar in accordance with your
45 // request or instruction for your use, except otherwise agreed by both
46 // parties in writing.
47 //
48 // 5. If requested, MStar may from time to time provide technical supports or
49 // services in relation with MStar Software to you for your use of
50 // MStar Software in conjunction with your or your customer`s product
51 // ("Services").
52 // You understand and agree that, except otherwise agreed by both parties in
53 // writing, Services are provided on an "AS IS" basis and the warranty
54 // disclaimer set forth in Section 4 above shall apply.
55 //
56 // 6. Nothing contained herein shall be construed as by implication, estoppels
57 // or otherwise:
58 // (a) conferring any license or right to use MStar name, trademark, service
59 // mark, symbol or any other identification;
60 // (b) obligating MStar or any of its affiliates to furnish any person,
61 // including without limitation, you and your customers, any assistance
62 // of any kind whatsoever, or any information; or
63 // (c) conferring any license or right under any intellectual property right.
64 //
65 // 7. These terms shall be governed by and construed in accordance with the laws
66 // of Taiwan, R.O.C., excluding its conflict of law rules.
67 // Any and all dispute arising out hereof or related hereto shall be finally
68 // settled by arbitration referred to the Chinese Arbitration Association,
69 // Taipei in accordance with the ROC Arbitration Law and the Arbitration
70 // Rules of the Association by three (3) arbitrators appointed in accordance
71 // with the said Rules.
72 // The place of arbitration shall be in Taipei, Taiwan and the language shall
73 // be English.
74 // The arbitration award shall be final and binding to both parties.
75 //
76 //******************************************************************************
77 //<MStar Software>
78 #ifndef _HAL_PNL_C_
79 #define _HAL_PNL_C_
80
81 //-------------------------------------------------------------------------------------------------
82 // Include Files
83 //-------------------------------------------------------------------------------------------------
84
85 #include "MsCommon.h"
86 #include "MsTypes.h"
87 #include "utopia.h"
88 #include "utopia_dapi.h"
89 #include "apiPNL.h"
90 #include "apiPNL_v2.h"
91 #include "drvPNL.h"
92 #include "halPNL.h"
93 #include "PNL_private.h"
94 #include "pnl_hwreg_utility2.h"
95 #include "Maserati_pnl_lpll_tbl.h"
96 #include "Maserati_pnl_lpll_ext_tbl.h"
97
98 #ifdef MSOS_TYPE_LINUX_KERNEL
99 #include <linux/string.h>
100 #include <linux/delay.h>
101 #include <asm/div64.h>
102 #else
103 #include "string.h"
104 #define do_div(x,y) ((x)/=(y))
105 #endif
106
107 //-------------------------------------------------------------------------------------------------
108 // Driver Compiler Options
109 //-------------------------------------------------------------------------------------------------
110
111 //-------------------------------------------------------------------------------------------------
112 // Local Defines
113 //-------------------------------------------------------------------------------------------------
114
115 #define UNUSED(x) (x=x)
116 #if 1
117 #define HAL_PNL_DBG(_dbgSwitch_, _fmt, _args...) { if((_dbgSwitch_ & _u16PnlDbgSwitch) != 0) printf("PNL:"_fmt, ##_args); }
118 #define HAL_MOD_CAL_DBG(x) //x
119 #else
120 #define HAL_PNL_DBG(_dbgSwitch_, _fmt, _args...) { }
121 #endif
122
123 #define DAC_LPLL_ICTRL 0x0002
124 #define LVDS_LPLL_ICTRL 0x0001
125
126 //Get MOD calibration time
127 #define MOD_CAL_TIMER FALSE
128
129 //if mboot read eFuse and fill the register, then add this define to mark utopia efuse code flow
130 #define MOD_EFUSE_IN_MBOOT
131
132 //for LVDS HW Calibration ICON limitation
133 #define MOD_LVDS_ICON_HIGH_LIMIT 0x2E
134 #define MOD_LVDS_ICON_LOW_LIMIT 0x06
135 #define MOD_LVDS_ICON_DEFAULT 0x19
136
137 //for LVDS HW Calibration timeout (i.e. retry times after hw calibration failed)
138 #define MOD_LVDS_HW_CALI_TIME_OUT 0
139 //-------------------------------------------------------------------------------------------------
140 // Local Structurs
141 //-------------------------------------------------------------------------------------------------
142 #define CLK_GEN0_REG_VIDEO_NUM 4
143 #define CLK_GEN0_REG_OSD_NUM 3
144 #define CLK_GEN2_REG_VIDEO_NUM 2
145 #define CLK_GEN2_REG_OSD_NUM 1
146
147 typedef enum
148 {
149 E_PNL_SUPPORTED_CLK_TTL, // 0
150 E_PNL_SUPPORTED_CLK_LVDS_1CH, // 1
151 E_PNL_SUPPORTED_CLK_LVDS_2CH, // 2
152 E_PNL_SUPPORTED_CLK_HS_LVDS_1CH, // 3
153 E_PNL_SUPPORTED_CLK_HS_LVDS_2CH, // 4
154 E_PNL_SUPPORTED_CLK_VBY1_1CH_10BIT, // 5
155 E_PNL_SUPPORTED_CLK_VBY1_1CH_8BIT, // 6
156 E_PNL_SUPPORTED_CLK_VBY1_2CH_10BIT, // 7
157 E_PNL_SUPPORTED_CLK_VBY1_2CH_8BIT, // 8
158 E_PNL_SUPPORTED_CLK_VBY1_4CH_10BIT, // 9
159 E_PNL_SUPPORTED_CLK_VBY1_4CH_8BIT, // 10
160 E_PNL_SUPPORTED_CLK_VBY1_8CH_10BIT, // 11
161 E_PNL_SUPPORTED_CLK_VBY1_8CH_8BIT, // 12
162 E_PNL_SUPPORTED_CLK_VBY1_16CH_10BIT, // 13
163 E_PNL_SUPPORTED_CLK_VBY1_16CH_8BIT, // 14
164 E_PNL_SUPPORTED_CLK_EPI_24_10BIT_12PAIR_X_1, // 15
165 E_PNL_SUPPORTED_CLK_EPI_28_8BIT_12PAIR_X_1, // 16
166 E_PNL_SUPPORTED_CLK_CMPI_27_8BIT_12PAIR_X_1, // 17
167 E_PNL_SUPPORTED_CLK_CMPI_24_10BIT_12PAIR_X_1, // 18
168 E_PNL_SUPPORTED_CLK_USIT_8BIT_12PAIR_X_1, // 19
169 E_PNL_SUPPORTED_CLK_USIT_10BIT_12PAIR_X_1, // 20
170 E_PNL_SUPPORTED_ISP_9_8BIT_12PAIR_X_1, // 21
171 E_PNL_SUPPORTED_ISP_9_8BIT_6PAIR_X_1, // 22
172 E_PNL_SUPPORTED_CLK_VBY1_8V4O_10BIT, // 23
173 E_PNL_SUPPORTED_CLK_VBY1_8V4O_8BIT, // 24
174 E_PNL_SUPPORTED_CLK_VBY1_4V4O_10BIT, // 25
175 E_PNL_SUPPORTED_CLK_VBY1_4V4O_8BIT, // 26
176 E_PNL_SUPPORTED_CLK_VBY1_4V2O_10BIT, // 27
177 E_PNL_SUPPORTED_CLK_VBY1_4V2O_8BIT, // 28
178 E_PNL_SUPPORTED_CLK_MAX, // 29
179 } E_PNL_SUPPORTED_CLK_TYPE;
180
181 TBLStruct CLKGEN2SettingTBL_Video[E_PNL_SUPPORTED_CLK_MAX][CLK_GEN2_REG_VIDEO_NUM]=
182 {
183 { //E_PNL_SUPPORTED_CLK_TTL NO.0
184 //Address,Value,Mask
185 {0x44,0x0014,0x001F},//clk_odclk
186 {0x09,0x0001,0x000F},//clk_vby1
187 },
188
189 { //E_PNL_SUPPORTED_CLK_LVDS_1CH NO.1
190 //Address,Value,Mask
191 {0x44,0x0014,0x001F},//clk_odclk
192 {0x09,0x0001,0x000F},//clk_vby1
193 },
194
195 { //E_PNL_SUPPORTED_CLK_LVDS_2CH NO.2
196 //Address,Value,Mask
197 {0x44,0x0004,0x001F},//clk_odclk
198 {0x09,0x0001,0x000F},//clk_vby1
199 },
200
201 { //E_PNL_SUPPORTED_CLK_HS_LVDS_1CH NO.3
202 //Address,Value,Mask
203 {0x44,0x0014,0x001F},//clk_odclk
204 {0x09,0x0001,0x000F},//clk_vby1
205 },
206
207 { //E_PNL_SUPPORTED_CLK_HS_LVDS_2CH NO.4
208 //Address,Value,Mask
209 {0x44,0x0004,0x001F},//clk_odclk
210 {0x09,0x0001,0x000F},//clk_vby1
211 },
212
213 { //E_PNL_SUPPORTED_CLK_VBY1_1CH_10BIT NO.5
214 //Address,Value,Mask
215 {0x44,0x0014,0x001F},//clk_odclk
216 {0x09,0x0000,0x000F},//clk_vby1
217 },
218
219 { //E_PNL_SUPPORTED_CLK_VBY1_1CH_8BIT NO.6
220 //Address,Value,Mask
221 {0x44,0x0014,0x001F},//clk_odclk
222 {0x09,0x0000,0x000F},//clk_vby1
223 },
224
225 { //E_PNL_SUPPORTED_CLK_VBY1_2CH_10BIT NO.7
226 //Address,Value,Mask
227 {0x44,0x0004,0x001F},//clk_odclk
228 {0x09,0x0000,0x000F},//clk_vby1
229 },
230
231 { //E_PNL_SUPPORTED_CLK_VBY1_2CH_8BIT NO.8
232 //Address,Value,Mask
233 {0x44,0x0004,0x001F},//clk_odclk
234 {0x09,0x0000,0x000F},//clk_vby1
235 },
236
237 { //E_PNL_SUPPORTED_CLK_VBY1_4CH_10BIT NO.9
238 //Address,Value,Mask
239 {0x44,0x0004,0x001F},//clk_odclk
240 {0x09,0x0000,0x000F},//clk_vby1
241 },
242
243 { //E_PNL_SUPPORTED_CLK_VBY1_4CH_8BIT NO.10
244 //Address,Value,Mask
245 {0x44,0x0004,0x001F},//clk_odclk
246 {0x09,0x0000,0x000F},//clk_vby1
247 },
248
249 { //E_PNL_SUPPORTED_CLK_VBY1_8CH_10BIT NO.11
250 //Address,Value,Mask
251 {0x44,0x0004,0x001F},//clk_odclk
252 {0x09,0x0000,0x000F},//clk_vby1
253 },
254
255 { //E_PNL_SUPPORTED_CLK_VBY1_8CH_8BIT NO.12
256 //Address,Value,Mask
257 {0x44,0x0004,0x001F},//clk_odclk
258 {0x09,0x0000,0x000F},//clk_vby1
259 },
260
261 { //E_PNL_SUPPORTED_CLK_VBY1_16CH_10BIT NO.13
262 //Address,Value,Mask
263 {0x44,0x000C,0x001F},//clk_odclk
264 {0x09,0x0000,0x000F},//clk_vby1
265 },
266
267 { //E_PNL_SUPPORTED_CLK_VBY1_16CH_8BIT NO.14
268 //Address,Value,Mask
269 {0x44,0x000C,0x001F},//clk_odclk
270 {0x09,0x0000,0x000F},//clk_vby1
271 },
272
273 { //E_PNL_SUPPORTED_CLK_EPI_24_10BIT_12PAIR_X_1 NO.15
274 //Address,Value,Mask
275 {0x44,0x0004,0x001F},//clk_odclk
276 {0x09,0x0001,0x000F},//clk_vby1
277 },
278
279 { //E_PNL_SUPPORTED_CLK_EPI_28_8BIT_12PAIR_X_1 NO.16
280 //Address,Value,Mask
281 {0x44,0x0004,0x001F},//clk_odclk
282 {0x09,0x0001,0x000F},//clk_vby1
283 },
284
285 { //E_PNL_SUPPORTED_CLK_CMPI_27_8BIT_12PAIR_X_1 NO.17
286 //Address,Value,Mask
287 {0x44,0x0004,0x001F},//clk_odclk
288 {0x09,0x0001,0x000F},//clk_vby1
289 },
290
291 { //E_PNL_SUPPORTED_CLK_CMPI_24_10BIT_12PAIR_X_1 NO.18
292 //Address,Value,Mask
293 {0x44,0x0004,0x001F},//clk_odclk
294 {0x09,0x0001,0x000F},//clk_vby1
295 },
296
297 { //E_PNL_SUPPORTED_CLK_USIT_8BIT_12PAIR_X_1 NO.19
298 //Address,Value,Mask
299 {0x44,0x0004,0x001F},//clk_odclk
300 {0x09,0x0001,0x000F},//clk_vby1
301 },
302
303 { //E_PNL_SUPPORTED_CLK_USIT_10BIT_12PAIR_X_1 NO.20
304 //Address,Value,Mask
305 {0x44,0x0004,0x001F},//clk_odclk
306 {0x09,0x0001,0x000F},//clk_vby1
307 },
308
309 { //E_PNL_SUPPORTED_ISP_9_8BIT_12PAIR_X_1 NO.21
310 //Address,Value,Mask
311 {0x44,0x0004,0x001F},//clk_odclk
312 {0x09,0x0001,0x000F},//clk_vby1
313 },
314
315 { //E_PNL_SUPPORTED_ISP_9_8BIT_6PAIR_X_1 NO.22
316 //Address,Value,Mask
317 {0x44,0x0004,0x001F},//clk_odclk
318 {0x09,0x0001,0x000F},//clk_vby1
319 },
320
321 { //E_PNL_SUPPORTED_CLK_VBY1_8V4O_10BIT NO.23
322 //Address,Value,Mask
323 {0x44,0x0004,0x001F},//clk_odclk
324 {0x09,0x0000,0x000F},//clk_vby1
325 },
326
327 { //E_PNL_SUPPORTED_CLK_VBY1_8V4O_8BIT NO.24
328 //Address,Value,Mask
329 {0x44,0x0004,0x001F},//clk_odclk
330 {0x09,0x0000,0x000F},//clk_vby1
331 },
332
333 { //E_PNL_SUPPORTED_CLK_VBY1_4V4O_10BIT NO.25
334 //Address,Value,Mask
335 {0x44,0x0004,0x001F},//clk_odclk
336 {0x09,0x0000,0x000F},//clk_vby1
337 },
338
339 { //E_PNL_SUPPORTED_CLK_VBY1_4V4O_8BIT NO.26
340 //Address,Value,Mask
341 {0x44,0x0004,0x001F},//clk_odclk
342 {0x09,0x0000,0x000F},//clk_vby1
343 },
344
345 { //E_PNL_SUPPORTED_CLK_VBY1_4V2O_10BIT NO.27
346 //Address,Value,Mask
347 {0x44,0x0004,0x001F},//clk_odclk
348 {0x09,0x0000,0x000F},//clk_vby1
349 },
350
351 { //E_PNL_SUPPORTED_CLK_VBY1_4V2O_8BIT NO.28
352 //Address,Value,Mask
353 {0x44,0x0004,0x001F},//clk_odclk
354 {0x09,0x0000,0x000F},//clk_vby1
355 },
356 };
357
358 TBLStruct CLKGEN2SettingTBL_OSD[E_PNL_SUPPORTED_CLK_MAX][CLK_GEN2_REG_OSD_NUM]=
359 {
360 { //E_PNL_SUPPORTED_CLK_TTL NO.0
361 //Address,Value,Mask
362 {0x09,0x0100,0x3F00},//clk_vby1_osd (wclk)
363 },
364
365 { //E_PNL_SUPPORTED_CLK_LVDS_1CH NO.1
366 //Address,Value,Mask
367 {0x09,0x0100,0x3F00},//clk_vby1_osd (wclk)
368 },
369
370 { //E_PNL_SUPPORTED_CLK_LVDS_2CH NO.2
371 //Address,Value,Mask
372 {0x09,0x0000,0x3F00},//clk_vby1_osd (wclk)
373 },
374
375 { //E_PNL_SUPPORTED_CLK_HS_LVDS_1CH NO.3
376 //Address,Value,Mask
377 {0x09,0x0100,0x3F00},//clk_vby1_osd (wclk)
378 },
379
380 { //E_PNL_SUPPORTED_CLK_HS_LVDS_2CH NO.4
381 //Address,Value,Mask
382 {0x09,0x0000,0x3F00},//clk_vby1_osd (wclk)
383 },
384
385 { //E_PNL_SUPPORTED_CLK_VBY1_1CH_10BIT NO.5
386 //Address,Value,Mask
387 {0x09,0x0000,0x3F00},//clk_vby1_osd (wclk)
388 },
389
390 { //E_PNL_SUPPORTED_CLK_VBY1_1CH_8BIT NO.6
391 //Address,Value,Mask
392 {0x09,0x0000,0x3F00},//clk_vby1_osd (wclk)
393 },
394
395 { //E_PNL_SUPPORTED_CLK_VBY1_2CH_10BIT NO.7
396 //Address,Value,Mask
397 {0x09,0x0000,0x3F00},//clk_vby1_osd (wclk)
398 },
399
400 { //E_PNL_SUPPORTED_CLK_VBY1_2CH_8BIT NO.8
401 //Address,Value,Mask
402 {0x09,0x0000,0x3F00},//clk_vby1_osd (wclk)
403 },
404
405 { //E_PNL_SUPPORTED_CLK_VBY1_4CH_10BIT NO.9
406 //Address,Value,Mask
407 {0x09,0x0800,0x3F00},//clk_vby1_osd (wclk)
408 },
409
410 { //E_PNL_SUPPORTED_CLK_VBY1_4CH_8BIT NO.10
411 //Address,Value,Mask
412 {0x09,0x0800,0x3F00},//clk_vby1_osd (wclk)
413 },
414
415 { //E_PNL_SUPPORTED_CLK_VBY1_8CH_10BIT NO.11
416 //Address,Value,Mask
417 {0x09,0x0800,0x3F00},//clk_vby1_osd (wclk)
418 },
419
420 { //E_PNL_SUPPORTED_CLK_VBY1_8CH_8BIT NO.12
421 //Address,Value,Mask
422 {0x09,0x0800,0x3F00},//clk_vby1_osd (wclk)
423 },
424
425 { //E_PNL_SUPPORTED_CLK_VBY1_16CH_10BIT NO.13
426 //Address,Value,Mask
427 {0x09,0x0800,0x3F00},//clk_vby1_osd (wclk)
428 },
429
430 { //E_PNL_SUPPORTED_CLK_VBY1_16CH_8BIT NO.14
431 //Address,Value,Mask
432 {0x09,0x0800,0x3F00},//clk_vby1_osd (wclk)
433 },
434
435 { //E_PNL_SUPPORTED_CLK_EPI_24_10BIT_12PAIR_X_1 NO.15
436 //Address,Value,Mask
437 {0x09,0x0000,0x3F00},//clk_vby1_osd (wclk)
438 },
439
440 { //E_PNL_SUPPORTED_CLK_EPI_28_8BIT_12PAIR_X_1 NO.16
441 //Address,Value,Mask
442 {0x09,0x0000,0x3F00},//clk_vby1_osd (wclk)
443 },
444
445 { //E_PNL_SUPPORTED_CLK_CMPI_27_8BIT_12PAIR_X_1 NO.17
446 //Address,Value,Mask
447 {0x09,0x0000,0x3F00},//clk_vby1_osd (wclk)
448 },
449
450 { //E_PNL_SUPPORTED_CLK_CMPI_24_10BIT_12PAIR_X_1 NO.18
451 //Address,Value,Mask
452 {0x09,0x0000,0x3F00},//clk_vby1_osd (wclk)
453 },
454
455 { //E_PNL_SUPPORTED_CLK_USIT_8BIT_12PAIR_X_1 NO.19
456 //Address,Value,Mask
457 {0x09,0x0800,0x3F00},//clk_vby1_osd (wclk)
458 },
459
460 { //E_PNL_SUPPORTED_CLK_USIT_10BIT_12PAIR_X_1 NO.20
461 //Address,Value,Mask
462 {0x09,0x0800,0x3F00},//clk_vby1_osd (wclk)
463 },
464
465 { //E_PNL_SUPPORTED_ISP_9_8BIT_12PAIR_X_1 NO.21
466 //Address,Value,Mask
467 {0x09,0x0800,0x3F00},//clk_vby1_osd (wclk)
468 },
469
470 { //E_PNL_SUPPORTED_ISP_9_8BIT_6PAIR_X_1 NO.22
471 //Address,Value,Mask
472 {0x09,0x0800,0x3F00},//clk_vby1_osd (wclk)
473 },
474
475 { //E_PNL_SUPPORTED_CLK_VBY1_8V4O_10BIT NO.23
476 //Address,Value,Mask
477 {0x09,0x1800,0x3F00},//clk_vby1_osd (wclk)
478 },
479
480 { //E_PNL_SUPPORTED_CLK_VBY1_8V4O_8BIT NO.24
481 //Address,Value,Mask
482 {0x09,0x1800,0x3F00},//clk_vby1_osd (wclk)
483 },
484
485 { //E_PNL_SUPPORTED_CLK_VBY1_4V4O_10BIT NO.25
486 //Address,Value,Mask
487 {0x09,0x1800,0x3F00},//clk_vby1_osd (wclk)
488 },
489
490 { //E_PNL_SUPPORTED_CLK_VBY1_4V4O_8BIT NO.26
491 //Address,Value,Mask
492 {0x09,0x1800,0x3F00},//clk_vby1_osd (wclk)
493 },
494
495 { //E_PNL_SUPPORTED_CLK_VBY1_4V2O_10BIT NO.27
496 //Address,Value,Mask
497 {0x09,0x1800,0x3F00},//clk_vby1_osd (wclk)
498 },
499
500 { //E_PNL_SUPPORTED_CLK_VBY1_4V2O_8BIT NO.28
501 //Address,Value,Mask
502 {0x09,0x1800,0x3F00},//clk_vby1_osd (wclk)
503 },
504 };
505
506 TBLStruct CLKGEN0SettingTBL_Video[E_PNL_SUPPORTED_CLK_MAX][CLK_GEN0_REG_VIDEO_NUM]=
507 {
508 { //E_PNL_SUPPORTED_CLK_TTL NO.0
509 //Address,Value,Mask
510 {0x5A,0x0000,0x0F00},//Vmode
511 {0x53,0x0C00,0x3F00},//clk_odclk_mft
512 {0x57,0x0000,0x000F},//wclk
513 {0x58,0x0000,0x000F},//rclk
514 },
515
516 { //E_PNL_SUPPORTED_CLK_LVDS_1CH NO.1
517 //Address,Value,Mask
518 {0x5A,0x0000,0x0F00},//Vmode
519 {0x53,0x0C00,0x3F00},//clk_odclk_mft
520 {0x57,0x0000,0x000F},//wclk
521 {0x58,0x0000,0x000F},//rclk
522 },
523
524 { //E_PNL_SUPPORTED_CLK_LVDS_2CH NO.2
525 //Address,Value,Mask
526 {0x5A,0x0000,0x0F00},//Vmode
527 {0x53,0x0C00,0x3F00},//clk_odclk_mft
528 {0x57,0x0000,0x000F},//wclk
529 {0x58,0x0000,0x000F},//rclk
530 },
531
532 { //E_PNL_SUPPORTED_CLK_HS_LVDS_1CH NO.3
533 //Address,Value,Mask
534 {0x5A,0x0000,0x0F00},//Vmode
535 {0x53,0x0C00,0x3F00},//clk_odclk_mft
536 {0x57,0x0000,0x000F},//wclk
537 {0x58,0x0000,0x000F},//rclk
538 },
539
540 { //E_PNL_SUPPORTED_CLK_HS_LVDS_2CH NO.4
541 //Address,Value,Mask
542 {0x5A,0x0000,0x0F00},//Vmode
543 {0x53,0x0C00,0x3F00},//clk_odclk_mft
544 {0x57,0x0000,0x000F},//wclk
545 {0x58,0x0000,0x000F},//rclk
546 },
547
548 { //E_PNL_SUPPORTED_CLK_VBY1_1CH_10BIT NO.5
549 //Address,Value,Mask
550 {0x5A,0x0A00,0x0F00},//Vmode
551 {0x53,0x0C00,0x3F00},//clk_odclk_mft
552 {0x57,0x000C,0x000F},//wclk
553 {0x58,0x0000,0x000F},//rclk
554 },
555
556 { //E_PNL_SUPPORTED_CLK_VBY1_1CH_8BIT NO.6
557 //Address,Value,Mask
558 {0x5A,0x0000,0x0F00},//Vmode
559 {0x53,0x0C00,0x3F00},//clk_odclk_mft
560 {0x57,0x000C,0x000F},//wclk
561 {0x58,0x0000,0x000F},//rclk
562 },
563
564 { //E_PNL_SUPPORTED_CLK_VBY1_2CH_10BIT NO.7
565 //Address,Value,Mask
566 {0x5A,0x0A00,0x0F00},//Vmode
567 {0x53,0x0C00,0x3F00},//clk_odclk_mft
568 {0x57,0x000C,0x000F},//wclk
569 {0x58,0x0000,0x000F},//rclk
570 },
571
572 { //E_PNL_SUPPORTED_CLK_VBY1_2CH_8BIT NO.8
573 //Address,Value,Mask
574 {0x5A,0x0000,0x0F00},//Vmode
575 {0x53,0x0C00,0x3F00},//clk_odclk_mft
576 {0x57,0x000C,0x000F},//wclk
577 {0x58,0x0000,0x000F},//rclk
578 },
579
580 { //E_PNL_SUPPORTED_CLK_VBY1_4CH_10BIT NO.9
581 //Address,Value,Mask
582 {0x5A,0x0900,0x0F00},//Vmode
583 {0x53,0x0400,0x3F00},//clk_odclk_mft
584 {0x57,0x000C,0x000F},//wclk
585 {0x58,0x0000,0x000F},//rclk
586 },
587
588 { //E_PNL_SUPPORTED_CLK_VBY1_4CH_8BIT NO.10
589 //Address,Value,Mask
590 {0x5A,0x0000,0x0F00},//Vmode
591 {0x53,0x0400,0x3F00},//clk_odclk_mft
592 {0x57,0x000C,0x000F},//wclk
593 {0x58,0x0000,0x000F},//rclk
594 },
595
596 { //E_PNL_SUPPORTED_CLK_VBY1_8CH_10BIT NO.11
597 //Address,Value,Mask
598 {0x5A,0x0800,0x0F00},//Vmode
599 {0x53,0x0400,0x3F00},//clk_odclk_mft
600 {0x57,0x000C,0x000F},//wclk
601 {0x58,0x0000,0x000F},//rclk
602 },
603
604 { //E_PNL_SUPPORTED_CLK_VBY1_8CH_8BIT NO.12
605 //Address,Value,Mask
606 {0x5A,0x0000,0x0F00},//Vmode
607 {0x53,0x0400,0x3F00},//clk_odclk_mft
608 {0x57,0x000C,0x000F},//wclk
609 {0x58,0x0000,0x000F},//rclk
610 },
611
612 { //E_PNL_SUPPORTED_CLK_VBY1_16CH_10BIT NO.13
613 //Address,Value,Mask
614 {0x5A,0x0800,0x0F00},//Vmode
615 {0x53,0x0C00,0x3F00},//clk_odclk_mft
616 {0x57,0x000C,0x000F},//wclk
617 {0x58,0x0000,0x000F},//rclk
618 },
619
620 { //E_PNL_SUPPORTED_CLK_VBY1_16CH_8BIT NO.14
621 //Address,Value,Mask
622 {0x5A,0x0000,0x0F00},//Vmode
623 {0x53,0x0C00,0x3F00},//clk_odclk_mft
624 {0x57,0x000C,0x000F},//wclk
625 {0x58,0x0000,0x000F},//rclk
626 },
627
628 { //E_PNL_SUPPORTED_CLK_EPI_24_10BIT_12PAIR_X_1 NO.15
629 //Address,Value,Mask
630 {0x5A,0x0000,0x0F00},//Vmode
631 {0x53,0x0C00,0x3F00},//clk_odclk_mft
632 {0x57,0x0000,0x000F},//wclk
633 {0x58,0x0000,0x000F},//rclk
634 },
635
636 { //E_PNL_SUPPORTED_CLK_EPI_28_8BIT_12PAIR_X_1 NO.16
637 //Address,Value,Mask
638 {0x5A,0x0000,0x0F00},//Vmode
639 {0x53,0x0C00,0x3F00},//clk_odclk_mft
640 {0x57,0x0000,0x000F},//wclk
641 {0x58,0x0000,0x000F},//rclk
642 },
643
644 { //E_PNL_SUPPORTED_CLK_CMPI_27_8BIT_12PAIR_X_1 NO.17
645 //Address,Value,Mask
646 {0x5A,0x0000,0x0F00},//Vmode
647 {0x53,0x0C00,0x3F00},//clk_odclk_mft
648 {0x57,0x0000,0x000F},//wclk
649 {0x58,0x0000,0x000F},//rclk
650 },
651
652 { //E_PNL_SUPPORTED_CLK_CMPI_24_10BIT_12PAIR_X_1 NO.18
653 //Address,Value,Mask
654 {0x5A,0x0000,0x0F00},//Vmode
655 {0x53,0x0C00,0x3F00},//clk_odclk_mft
656 {0x57,0x0000,0x000F},//wclk
657 {0x58,0x0000,0x000F},//rclk
658 },
659
660 { //E_PNL_SUPPORTED_CLK_USIT_8BIT_12PAIR_X_1 NO.19
661 //Address,Value,Mask
662 {0x5A,0x0000,0x0F00},//Vmode
663 {0x53,0x0C00,0x3F00},//clk_odclk_mft
664 {0x57,0x000C,0x000F},//wclk
665 {0x58,0x0000,0x000F},//rclk
666 },
667
668 { //E_PNL_SUPPORTED_CLK_USIT_10BIT_12PAIR_X_1 NO.20
669 //Address,Value,Mask
670 {0x5A,0x0000,0x0F00},//Vmode
671 {0x53,0x0C00,0x3F00},//clk_odclk_mft
672 {0x57,0x000C,0x000F},//wclk
673 {0x58,0x0000,0x000F},//rclk
674 },
675
676 { //E_PNL_SUPPORTED_ISP_9_8BIT_12PAIR_X_1 NO.21
677 //Address,Value,Mask
678 {0x5A,0x0000,0x0F00},//Vmode
679 {0x53,0x0C00,0x3F00},//clk_odclk_mft
680 {0x57,0x000C,0x000F},//wclk
681 {0x58,0x0000,0x000F},//rclk
682 },
683
684 { //E_PNL_SUPPORTED_ISP_9_8BIT_6PAIR_X_1 NO.22
685 //Address,Value,Mask
686 {0x5A,0x0000,0x0F00},//Vmode
687 {0x53,0x0C00,0x3F00},//clk_odclk_mft
688 {0x57,0x000C,0x000F},//wclk
689 {0x58,0x0000,0x000F},//rclk
690 },
691
692 { //E_PNL_SUPPORTED_CLK_VBY1_8V4O_10BIT NO.23
693 //Address,Value,Mask
694 {0x5A,0x0800,0x0F00},//Vmode
695 {0x53,0x0400,0x3F00},//clk_odclk_mft
696 {0x57,0x000C,0x000F},//wclk
697 {0x58,0x0000,0x000F},//rclk
698 },
699
700 { //E_PNL_SUPPORTED_CLK_VBY1_8V4O_8BIT NO.24
701 //Address,Value,Mask
702 {0x5A,0x0000,0x0F00},//Vmode
703 {0x53,0x0400,0x3F00},//clk_odclk_mft
704 {0x57,0x000C,0x000F},//wclk
705 {0x58,0x0000,0x000F},//rclk
706 },
707
708 { //E_PNL_SUPPORTED_CLK_VBY1_4V4O_10BIT NO.25
709 //Address,Value,Mask
710 {0x5A,0x0900,0x0F00},//Vmode
711 {0x53,0x0400,0x3F00},//clk_odclk_mft
712 {0x57,0x000C,0x000F},//wclk
713 {0x58,0x0000,0x000F},//rclk
714 },
715
716 { //E_PNL_SUPPORTED_CLK_VBY1_4V4O_8BIT NO.26
717 //Address,Value,Mask
718 {0x5A,0x0000,0x0F00},//Vmode
719 {0x53,0x0400,0x3F00},//clk_odclk_mft
720 {0x57,0x000C,0x000F},//wclk
721 {0x58,0x0000,0x000F},//rclk
722 },
723
724 { //E_PNL_SUPPORTED_CLK_VBY1_4V2O_10BIT NO.27
725 //Address,Value,Mask
726 {0x5A,0x0900,0x0F00},//Vmode
727 {0x53,0x0400,0x3F00},//clk_odclk_mft
728 {0x57,0x000C,0x000F},//wclk
729 {0x58,0x0000,0x000F},//rclk
730 },
731
732 { //E_PNL_SUPPORTED_CLK_VBY1_4V2O_8BIT NO.28
733 //Address,Value,Mask
734 {0x5A,0x0000,0x0F00},//Vmode
735 {0x53,0x0400,0x3F00},//clk_odclk_mft
736 {0x57,0x000C,0x000F},//wclk
737 {0x58,0x0000,0x000F},//rclk
738 },
739 };
740
741 TBLStruct CLKGEN0SettingTBL_OSD[E_PNL_SUPPORTED_CLK_MAX][CLK_GEN0_REG_OSD_NUM]=
742 {
743 { //E_PNL_SUPPORTED_CLK_TTL NO.0
744 //Address,Value,Mask
745 {0x5A,0x0000,0xF000},//Omode
746 {0x63,0x0001,0x003F},//clk_osd2mod
747 {0x63,0x0100,0x0F00},//osd_rclk
748 },
749
750 { //E_PNL_SUPPORTED_CLK_LVDS_1CH NO.1
751 //Address,Value,Mask
752 {0x5A,0x0000,0xF000},//Omode
753 {0x63,0x0000,0x003F},//clk_osd2mod//{0x63,0x0001,0x003F},//clk_osd2mod
754 {0x63,0x0000,0x0F00},//osd_rclk//{0x63,0x0100,0x0F00},//osd_rclk
755 },
756
757 { //E_PNL_SUPPORTED_CLK_LVDS_2CH NO.2
758 //Address,Value,Mask
759 {0x5A,0x0000,0xF000},//Omode
760 {0x63,0x0000,0x003F},//clk_osd2mod
761 {0x63,0x0000,0x0F00},//osd_rclk
762 },
763
764 { //E_PNL_SUPPORTED_CLK_HS_LVDS_1CH NO.3
765 //Address,Value,Mask
766 {0x5A,0x0000,0xF000},//Omode
767 {0x63,0x0001,0x003F},//clk_osd2mod
768 {0x63,0x0100,0x0F00},//osd_rclk
769 },
770
771 { //E_PNL_SUPPORTED_CLK_HS_LVDS_2CH NO.4
772 //Address,Value,Mask
773 {0x5A,0x0000,0xF000},//Omode
774 {0x63,0x0000,0x003F},//clk_osd2mod
775 {0x63,0x0000,0x0F00},//osd_rclk
776 },
777
778 { //E_PNL_SUPPORTED_CLK_VBY1_2CH_10BIT NO.5
779 //Address,Value,Mask
780 {0x5A,0x0000,0xF000},//Omode
781 {0x63,0x0001,0x003F},//clk_osd2mod
782 {0x63,0x0000,0x0F00},//osd_rclk
783 },
784
785 { //E_PNL_SUPPORTED_CLK_VBY1_2CH_8BIT NO.6
786 //Address,Value,Mask
787 {0x5A,0x0000,0xF000},//Omode
788 {0x63,0x0001,0x003F},//clk_osd2mod
789 {0x63,0x0000,0x0F00},//osd_rclk
790 },
791
792
793 { //E_PNL_SUPPORTED_CLK_VBY1_2CH_10BIT NO.7
794 //Address,Value,Mask
795 {0x5A,0x0000,0xF000},//Omode
796 {0x63,0x0001,0x003F},//clk_osd2mod
797 {0x63,0x0000,0x0F00},//osd_rclk
798 },
799
800 { //E_PNL_SUPPORTED_CLK_VBY1_2CH_8BIT NO.8
801 //Address,Value,Mask
802 {0x5A,0x0000,0xF000},//Omode
803 {0x63,0x0001,0x003F},//clk_osd2mod
804 {0x63,0x0000,0x0F00},//osd_rclk
805 },
806
807 { //E_PNL_SUPPORTED_CLK_VBY1_4CH_10BIT NO.9
808 //Address,Value,Mask
809 {0x5A,0x0000,0xF000},//Omode
810 {0x63,0x0001,0x003F},//clk_osd2mod
811 {0x63,0x0000,0x0F00},//osd_rclk
812 },
813
814 { //E_PNL_SUPPORTED_CLK_VBY1_4CH_8BIT NO.10
815 //Address,Value,Mask
816 {0x5A,0x0000,0xF000},//Omode
817 {0x63,0x0001,0x003F},//clk_osd2mod
818 {0x63,0x0000,0x0F00},//osd_rclk
819 },
820
821 { //E_PNL_SUPPORTED_CLK_VBY1_8CH_10BIT NO.11
822 //Address,Value,Mask
823 {0x5A,0x0000,0xF000},//Omode
824 {0x63,0x0001,0x003F},//clk_osd2mod
825 {0x63,0x0000,0x0F00},//osd_rclk
826 },
827
828 { //E_PNL_SUPPORTED_CLK_VBY1_8CH_8BIT NO.12
829 //Address,Value,Mask
830 {0x5A,0x0000,0xF000},//Omode
831 {0x63,0x0001,0x003F},//clk_osd2mod
832 {0x63,0x0000,0x0F00},//osd_rclk
833 },
834
835 { //E_PNL_SUPPORTED_CLK_VBY1_16CH_10BIT NO.13
836 //Address,Value,Mask
837 {0x5A,0x0000,0xF000},//Omode
838 {0x63,0x0001,0x003F},//clk_osd2mod
839 {0x63,0x0000,0x0F00},//osd_rclk
840 },
841
842 { //E_PNL_SUPPORTED_CLK_VBY1_16CH_8BIT NO.14
843 //Address,Value,Mask
844
845 {0x5A,0x0000,0xF000},//Omode
846 {0x63,0x0001,0x003F},//clk_osd2mod
847 {0x63,0x0000,0x0F00},//osd_rclk
848 },
849
850 { //E_PNL_SUPPORTED_CLK_EPI_24_10BIT_12PAIR_X_1 NO.15
851 //Address,Value,Mask
852 {0x5A,0x0000,0xF000},//Omode
853 {0x63,0x0001,0x003F},//clk_osd2mod
854 {0x63,0x0000,0x0F00},//osd_rclk
855 },
856
857 { //E_PNL_SUPPORTED_CLK_EPI_28_8BIT_12PAIR_X_1 NO.16
858 //Address,Value,Mask
859 {0x5A,0x0000,0xF000},//Omode
860 {0x63,0x0001,0x003F},//clk_osd2mod
861 {0x63,0x0000,0x0F00},//osd_rclk
862 },
863
864 { //E_PNL_SUPPORTED_CLK_CMPI_27_8BIT_12PAIR_X_1 NO.17
865 //Address,Value,Mask
866 {0x5A,0x0000,0xF000},//Omode
867 {0x63,0x0001,0x003F},//clk_osd2mod
868 {0x63,0x0000,0x0F00},//osd_rclk
869 },
870
871 { //E_PNL_SUPPORTED_CLK_CMPI_24_10BIT_12PAIR_X_1 NO.18
872 //Address,Value,Mask
873 {0x5A,0x0000,0xF000},//Omode
874 {0x63,0x0001,0x003F},//clk_osd2mod
875 {0x63,0x0000,0x0F00},//osd_rclk
876 },
877
878 { //E_PNL_SUPPORTED_CLK_USIT_8BIT_12PAIR_X_1 NO.19
879 //Address,Value,Mask
880 {0x5A,0x0000,0xF000},//Omode
881 {0x63,0x0001,0x003F},//clk_osd2mod
882 {0x63,0x0000,0x0F00},//osd_rclk
883 },
884
885 { //E_PNL_SUPPORTED_CLK_USIT_10BIT_12PAIR_X_1 NO.20
886 //Address,Value,Mask
887 {0x5A,0x0000,0xF000},//Omode
888 {0x63,0x0001,0x003F},//clk_osd2mod
889 {0x63,0x0000,0x0F00},//osd_rclk
890 },
891
892 { //E_PNL_SUPPORTED_ISP_9_8BIT_12PAIR_X_1 NO.21
893 //Address,Value,Mask
894 {0x5A,0x0000,0xF000},//Omode
895 {0x63,0x0001,0x003F},//clk_osd2mod
896 {0x63,0x0000,0x0F00},//osd_rclk
897 },
898
899 { //E_PNL_SUPPORTED_ISP_9_8BIT_6PAIR_X_1 NO.22
900 //Address,Value,Mask
901 {0x5A,0x0000,0xF000},//Omode
902 {0x63,0x0001,0x003F},//clk_osd2mod
903 {0x63,0x0000,0x0F00},//osd_rclk
904 },
905
906 { //E_PNL_SUPPORTED_CLK_VBY1_8V4O_10BIT NO.23
907 //Address,Value,Mask
908 {0x5A,0x8000,0xF000},//Omode
909 {0x63,0x0010,0x003F},//clk_osd2mod
910 {0x63,0x0400,0x0F00},//osd_rclk
911 },
912
913 { //E_PNL_SUPPORTED_CLK_VBY1_8V4O_8BIT NO.24
914 //Address,Value,Mask
915 {0x5A,0x0000,0xF000},//Omode
916 {0x63,0x0010,0x003F},//clk_osd2mod
917 {0x63,0x0400,0x0F00},//osd_rclk
918 },
919
920 { //E_PNL_SUPPORTED_CLK_VBY1_4V4O_10BIT NO.25
921 //Address,Value,Mask
922 {0x5A,0x8000,0xF000},//Omode
923 {0x63,0x0010,0x003F},//clk_osd2mod
924 {0x63,0x0400,0x0F00},//osd_rclk
925 },
926
927 { //E_PNL_SUPPORTED_CLK_VBY1_4V4O_8BIT NO.26
928 //Address,Value,Mask
929 {0x5A,0x0000,0xF000},//Omode
930 {0x63,0x0010,0x003F},//clk_osd2mod
931 {0x63,0x0400,0x0F00},//osd_rclk
932 },
933
934 { //E_PNL_SUPPORTED_CLK_VBY1_4V2O_10BIT NO.27
935 //Address,Value,Mask
936 {0x5A,0x9000,0xF000},//Omode
937 {0x63,0x0010,0x003F},//clk_osd2mod
938 {0x63,0x0400,0x0F00},//osd_rclk
939 },
940
941 { //E_PNL_SUPPORTED_CLK_VBY1_4V2O_8BIT NO.28
942 //Address,Value,Mask
943 {0x5A,0x0000,0xF000},//Omode
944 {0x63,0x0010,0x003F},//clk_osd2mod
945 {0x63,0x0400,0x0F00},//osd_rclk
946 },
947 };
948 //-------------------------------------------------------------------------------------------------
949 // Global Variables
950 //-------------------------------------------------------------------------------------------------
951 #define LANE_NUM_EACH_PINMAPPING_GROUP1 4
952 #define LANE_NUM_EACH_PINMAPPING_GROUP2 4
953 #define LANE_NUM_EACH_PINMAPPING_GROUP3 4
954 #define LANE_NUM_EACH_PINMAPPING_GROUP4 4
955
956 #define PINMAPPING_EXP 16
957
958 #define PINMAPPING_MAX_LANE (0xF)
959 //-------------------------------------------------------------------------------------------------
960 // Local Variables
961 //-------------------------------------------------------------------------------------------------
962 MS_U8 LANE_AND_CLK_TBL[VBY1_CLK_TBL_ROW][3]=
963 { //lane(from) lane(to) bit(mask)
964 { 0, 3, 0x01, },
965 { 4, 7, 0x02, },
966 { 8, 11,0x04, },
967 { 12,15,0x08, }
968 };
969
970 extern MS_BOOL MDrv_XC_IsSupportPipPatchUsingSc1MainAsSc0Sub(void);
971 //-------------------------------------------------------------------------------------------------
972 // Debug Functions
973 //-------------------------------------------------------------------------------------------------
974
975 //-------------------------------------------------------------------------------------------------
976 // Local Functions
977 //-------------------------------------------------------------------------------------------------
978 static MS_BOOL _Hal_MOD_External_eFuse(void);
979 static void _Hal_MOD_VB1_CH_SWICH(PNL_TYPE eLPLL_Type_Ext);
980 static MS_U16 _Hal_MOD_Refine_ICON(MS_U16 u16ICON);
981 static E_PNL_SUPPORTED_CLK_TYPE _MHal_Transfer_PanelType_To_CLKType(PNL_TYPE eLPLL_Type, PNL_MODE eLPLL_Mode);
982 static E_PNL_SUPPORTED_CLK_TYPE _MHal_Transfer_PanelType_To_CLKType_OSD(PNL_TYPE eLPLL_OSD_Type,PNL_TYPE eLPLL_Video_Type,PNL_MODE eLPLL_Mode);
983 static void _MHal_PNL_DumpVideoClkTable(MS_U8 u8CLKTblIndex);
984 static void _MHal_PNL_DumpOSDClkTable(MS_U8 u8CLKTblIndex);
985 static void _MHal_PNL_Init_MFT(void *pInstance, PNL_InitData *pstPanelInitData);
986
987 static void _MHal_PNL_Auto_Set_Config(void *pInstance,
988 MS_U16 u16OutputOrder0_3,
989 MS_U16 u16OutputOrder4_7,
990 MS_U16 u16OutputOrder8_11,
991 MS_U16 u16OutputOrder12_15);
992
993 static void _MHal_PNL_Set_Clk(void *pInstance,
994 MS_U8 u8LaneNum,
995 MS_U16 u16OutputOrder0_3,
996 MS_U16 u16OutputOrder4_7,
997 MS_U16 u16OutputOrder8_11,
998 MS_U16 u16OutputOrder12_15);
999
1000 static MS_U8 _MHal_PNL_Get_LaneNum(void *pInstance);
1001 //-------------------------------------------------------------------------------------------------
1002 // Global Function
1003 //-------------------------------------------------------------------------------------------------
1004 /**
1005 * @brief: Power On MOD. but not mutex protected
1006 *
1007 */
1008 #define OUTPUT_CHANNEL_HALF_L 0x0055
1009 #define OUTPUT_CHANNEL_HALF_H 0x5500
1010
MHal_MOD_PowerOn(void * pInstance,MS_BOOL bEn,MS_U8 u8LPLL_Type,MS_U8 DualModeType,MS_U16 u16OutputCFG0_7,MS_U16 u16OutputCFG8_15,MS_U16 u16OutputCFG16_21)1011 MS_U8 MHal_MOD_PowerOn(void *pInstance, MS_BOOL bEn, MS_U8 u8LPLL_Type,MS_U8 DualModeType, MS_U16 u16OutputCFG0_7, MS_U16 u16OutputCFG8_15, MS_U16 u16OutputCFG16_21)
1012 {
1013 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1014 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
1015 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1016 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
1017
1018 MS_U16 u16ChannelClk_En = 0;
1019
1020 if( bEn )
1021 {
1022 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_10_L, 0x00, BIT(4)); //reg_ck1x_4dig_phsel_path2
1023
1024 //analog MOD power down. 1: power down, 0: power up
1025 // For Mod2 no output signel
1026 ///////////////////////////////////////////////////
1027
1028 //2. Power on MOD (current and regulator)
1029 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, BIT(1) , BIT(1)); //reg_gcr_en_reg: enable clk tree pwr
1030 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x00 , BIT(0)); //reg_pd_ib_mod: power down mod atop
1031
1032 //enable ib, enable ck
1033 // [0]:ch0_3 [1]:ch4_7 [2]:ch8_11 [3]:ch12_15
1034 if(u16OutputCFG0_7 & OUTPUT_CHANNEL_HALF_L)
1035 u16ChannelClk_En |= BIT(0);
1036 if(u16OutputCFG0_7 & OUTPUT_CHANNEL_HALF_H)
1037 u16ChannelClk_En |= BIT(1);
1038 if(u16OutputCFG8_15 & OUTPUT_CHANNEL_HALF_L)
1039 u16ChannelClk_En |= BIT(2);
1040 if(u16OutputCFG8_15 & OUTPUT_CHANNEL_HALF_H)
1041 u16ChannelClk_En |= BIT(3);
1042
1043 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, u16ChannelClk_En, 0x001F);
1044
1045 // clock gen of dot-mini
1046 if(u8LPLL_Type == E_PNL_TYPE_MINILVDS)
1047 {
1048 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_76_L, 0x0400, 0x0FFF);
1049 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6F_L, 0x0444, 0x0FFF);
1050 }
1051 else if( (u8LPLL_Type == E_PNL_LPLL_VBY1_10BIT_16LANE)||
1052 (u8LPLL_Type == E_PNL_LPLL_VBY1_8BIT_16LANE))
1053 {
1054 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_76_L, 0x0000, 0x0FFF);
1055 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6F_L, 0x0000, 0x0FFF);
1056 }
1057 else if(u8LPLL_Type == E_PNL_LPLL_VBY1_10BIT_8LANE)
1058 {
1059 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_76_L, 0x0000, 0x0FFF);
1060 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6F_L, 0x0000, 0x0FFF);
1061 }
1062 else if((u8LPLL_Type == E_PNL_LPLL_VBY1_10BIT_4LANE)||
1063 (u8LPLL_Type == E_PNL_LPLL_VBY1_10BIT_2LANE)||
1064 (u8LPLL_Type == E_PNL_LPLL_VBY1_8BIT_4LANE) ||
1065 (u8LPLL_Type == E_PNL_LPLL_VBY1_8BIT_2LANE))
1066
1067 {
1068 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_76_L, 0x0000, 0x0FFF);
1069 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6F_L, 0x0000, 0x0FFF);
1070 }
1071 //// for osd dedicated output port, 1 port for video and 1 port for osd
1072 else if((u8LPLL_Type == E_PNL_TYPE_HS_LVDS)&&
1073 (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Mode == E_PNL_MODE_SINGLE))
1074 {
1075 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_76_L, 0x0044, 0x0FFF);
1076 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6F_L, 0x0400, 0x0FFF);
1077 }
1078 else
1079 {
1080 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_76_L, 0x0000, 0x0FFF);
1081 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6F_L, 0x0000, 0x0FFF);
1082 }
1083
1084 // 3. 4. 5.
1085 MHal_Output_LVDS_Pair_Setting(pInstance, DualModeType, u16OutputCFG0_7, u16OutputCFG8_15, u16OutputCFG16_21);
1086 }
1087 else
1088 {
1089 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_10_L, BIT(4), BIT(4));// reg_ck1x_4dig_phsel_path2: test phase
1090 if(u8LPLL_Type !=E_PNL_TYPE_MINILVDS)
1091 {
1092 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, BIT(0), BIT(0)); //analog MOD power down. 1: power down, 0: power up
1093 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x00, BIT(1)); //reg_gcr_en_reg: enable clk tree pwr
1094 }
1095
1096 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, 0x0000, 0x001F); //enable ib, enable ck
1097
1098 // clock gen of dot-mini
1099 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_76_L, 0x0100, 0x0FFF);
1100 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6F_L, 0x0111, 0x0FFF);
1101
1102 if( IsVBY1(u8LPLL_Type) )
1103 {
1104 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x2000,0x2000);
1105 MsOS_DelayTask(1);
1106 MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0x0000);
1107 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0000);
1108 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x0000,0x2000);
1109 }
1110 }
1111 return 1;
1112 }
1113
1114 /**
1115 * @brief: Setup the PVDD power 1:2.5V, 0:3.3V
1116 *
1117 */
MHal_MOD_PVDD_Power_Setting(void * pInstance,MS_BOOL bIs2p5)1118 void MHal_MOD_PVDD_Power_Setting(void *pInstance, MS_BOOL bIs2p5)
1119 {
1120 //MOD_A_W2BYTEMSK(REG_MOD_A_BK00_39_L, ((bIs2p5)? BIT(6):0), BIT(6)); //MOD PVDD=1: 0.9
1121 }
1122
MHal_PNL_TCON_Init(void * pInstance)1123 void MHal_PNL_TCON_Init(void *pInstance)
1124 {
1125
1126 }
1127
MHal_Shift_LVDS_Pair(void * pInstance,MS_U8 Type)1128 void MHal_Shift_LVDS_Pair(void *pInstance, MS_U8 Type)
1129 {
1130 UNUSED(Type);
1131 }
1132
MHal_Output_LVDS_Pair_Setting(void * pInstance,MS_U8 Type,MS_U16 u16OutputCFG0_7,MS_U16 u16OutputCFG8_15,MS_U16 u16OutputCFG16_21)1133 void MHal_Output_LVDS_Pair_Setting(void *pInstance, MS_U8 Type, MS_U16 u16OutputCFG0_7, MS_U16 u16OutputCFG8_15, MS_U16 u16OutputCFG16_21)
1134 {
1135
1136 if(Type == LVDS_DUAL_OUTPUT_SPECIAL )
1137 {
1138 MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0x0555);
1139 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x1554);
1140 }
1141 else if(Type == LVDS_SINGLE_OUTPUT_A)
1142 {
1143 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_18_L, 0x5550, 0xFFF0);
1144 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0555);
1145 }
1146 else if( Type == LVDS_SINGLE_OUTPUT_B)
1147 {
1148 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_18_L, 0x5550, 0xFFF0);
1149 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0555);
1150 }
1151 else if( Type == LVDS_OUTPUT_User)
1152 {
1153 MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, u16OutputCFG0_7);
1154 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, u16OutputCFG8_15);
1155 }
1156 else
1157 {
1158 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_18_L, 0x5550, 0xFFF0);
1159 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0555);
1160 }
1161
1162 MsOS_DelayTask(2);
1163
1164 }
1165
MHal_Output_Channel_Order(void * pInstance,MS_U8 Type,MS_U16 u16OutputOrder0_3,MS_U16 u16OutputOrder4_7,MS_U16 u16OutputOrder8_11,MS_U16 u16OutputOrder12_13)1166 void MHal_Output_Channel_Order(void *pInstance,
1167 MS_U8 Type,
1168 MS_U16 u16OutputOrder0_3,
1169 MS_U16 u16OutputOrder4_7,
1170 MS_U16 u16OutputOrder8_11,
1171 MS_U16 u16OutputOrder12_13)
1172 {
1173 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1174 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
1175 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1176 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
1177
1178 if(Type == APIPNL_OUTPUT_CHANNEL_ORDER_USER )
1179 {
1180 MOD_W2BYTE(REG_MOD_BK00_55_L, u16OutputOrder0_3);
1181 MOD_W2BYTE(REG_MOD_BK00_56_L, u16OutputOrder4_7);
1182 MOD_W2BYTE(REG_MOD_BK00_57_L, u16OutputOrder8_11);
1183 MOD_W2BYTE(REG_MOD_BK00_58_L, u16OutputOrder12_13);
1184 }
1185 else
1186 {
1187 if( (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE)
1188 ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_8LANE))
1189 {
1190 if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16MOD_CTRLA & BIT(1)) // 2 Divisoin
1191 {//APN 8V setting
1192 MOD_W2BYTE(REG_MOD_BK00_55_L, 0x3210);
1193 MOD_W2BYTE(REG_MOD_BK00_56_L, 0xBA98);
1194 MOD_W2BYTE(REG_MOD_BK00_57_L, 0xFFFF);
1195 MOD_W2BYTE(REG_MOD_BK00_58_L, 0xFFFF);
1196 }
1197 else
1198 {//APN 8V setting
1199 MOD_W2BYTE(REG_MOD_BK00_55_L, 0x9810);
1200 MOD_W2BYTE(REG_MOD_BK00_56_L, 0xBA32);
1201 MOD_W2BYTE(REG_MOD_BK00_57_L, 0xFFFF);
1202 MOD_W2BYTE(REG_MOD_BK00_58_L, 0xFFFF);
1203 }
1204 }
1205 else if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_LVDS)
1206 {//LVDS
1207 if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Mode==E_PNL_MODE_SINGLE)
1208 {
1209 MOD_W2BYTE(REG_MOD_BK00_55_L, 0x76FF);
1210 MOD_W2BYTE(REG_MOD_BK00_56_L, 0xBA98);
1211 MOD_W2BYTE(REG_MOD_BK00_57_L, 0x3210);
1212 MOD_W2BYTE(REG_MOD_BK00_58_L, 0xFF54);
1213 }
1214 else
1215 {
1216 MOD_W2BYTE(REG_MOD_BK00_55_L, 0x10FF);
1217 MOD_W2BYTE(REG_MOD_BK00_56_L, 0x5432);
1218 MOD_W2BYTE(REG_MOD_BK00_57_L, 0x9876);
1219 MOD_W2BYTE(REG_MOD_BK00_58_L, 0xFFBA);
1220 }
1221 }
1222 else if( (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)
1223 ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE))
1224 {
1225 if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16MOD_CTRLA & BIT(1))
1226 { // 4 Divisoin
1227 MOD_W2BYTE(REG_MOD_BK00_55_L, 0x6420);
1228 MOD_W2BYTE(REG_MOD_BK00_56_L, 0x7531);
1229 MOD_W2BYTE(REG_MOD_BK00_57_L, 0xECA8);
1230 MOD_W2BYTE(REG_MOD_BK00_58_L, 0xFDB9);
1231 }
1232 else
1233 { // 2 division
1234 MOD_W2BYTE(REG_MOD_BK00_55_L, 0x3210);
1235 MOD_W2BYTE(REG_MOD_BK00_56_L, 0x7654);
1236 MOD_W2BYTE(REG_MOD_BK00_57_L, 0xBA98);
1237 MOD_W2BYTE(REG_MOD_BK00_58_L, 0xFEDC);
1238 }
1239 }
1240 else if( (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_4LANE)
1241 ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_4LANE))
1242 {// APN just video setting
1243 MOD_W2BYTE(REG_MOD_BK00_55_L, 0x9810);
1244 MOD_W2BYTE(REG_MOD_BK00_56_L, 0xFFFF);
1245 MOD_W2BYTE(REG_MOD_BK00_57_L, 0xFFFF);
1246 MOD_W2BYTE(REG_MOD_BK00_58_L, 0xFFFF);
1247 }
1248 else if( (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_2LANE)
1249 ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_2LANE))
1250 {//APN just video setting
1251 MOD_W2BYTE(REG_MOD_BK00_55_L, 0xFF10);
1252 MOD_W2BYTE(REG_MOD_BK00_56_L, 0xFFFF);
1253 MOD_W2BYTE(REG_MOD_BK00_57_L, 0xFFFF);
1254 MOD_W2BYTE(REG_MOD_BK00_58_L, 0xFFFF);
1255 }
1256 else if((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_1LANE)
1257 ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_1LANE))
1258 {
1259 MOD_W2BYTE(REG_MOD_BK00_55_L, 0xFFF0);
1260 MOD_W2BYTE(REG_MOD_BK00_56_L, 0xFFF0);
1261 MOD_W2BYTE(REG_MOD_BK00_57_L, 0xFFFF);
1262 MOD_W2BYTE(REG_MOD_BK00_58_L, 0xFFFF);
1263 }
1264 else
1265 {
1266 MOD_W2BYTE(REG_MOD_BK00_55_L, 0x76DC);
1267 MOD_W2BYTE(REG_MOD_BK00_56_L, 0xBA98);
1268 MOD_W2BYTE(REG_MOD_BK00_57_L, 0x3210);
1269 MOD_W2BYTE(REG_MOD_BK00_58_L, 0x0054);
1270 }
1271 }
1272
1273 }
1274
MHal_PQ_Clock_Gen_For_Gamma(void * pInstance)1275 void MHal_PQ_Clock_Gen_For_Gamma(void *pInstance)
1276 {
1277 W2BYTEMSK(REG_CLKGEN0_52_L, 0x00, 0x07);
1278 }
1279
MHal_VOP_SetGammaMappingMode(void * pInstance,MS_U8 u8Mapping)1280 void MHal_VOP_SetGammaMappingMode(void *pInstance, MS_U8 u8Mapping)
1281 {
1282 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1283 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1284
1285 if(u8Mapping & GAMMA_MAPPING)
1286 {
1287 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_74_L, (u8Mapping & GAMMA_10BIT_MAPPING)? BIT(15):0, BIT(15));
1288 }
1289 else
1290 {
1291 PNL_ASSERT(0, "Invalid eSupportGammaMapMode [%d] Passed to [%s], please make sure the u8Mapping[%d] is valid\n.",
1292 u8Mapping, __FUNCTION__, u8Mapping);
1293 }
1294 }
1295
Hal_VOP_Is_GammaMappingMode_enable(void * pInstance)1296 MS_BOOL Hal_VOP_Is_GammaMappingMode_enable(void *pInstance)
1297 {
1298 // Only support 1024 entry
1299 return TRUE;
1300 }
1301
1302 // After A5, 8 bit mode only support burst write!!!
Hal_VOP_Is_GammaSupportSignalWrite(void * pInstance,DRVPNL_GAMMA_MAPPEING_MODE u8Mapping)1303 MS_BOOL Hal_VOP_Is_GammaSupportSignalWrite(void *pInstance, DRVPNL_GAMMA_MAPPEING_MODE u8Mapping)
1304 {
1305 if( u8Mapping == E_DRVPNL_GAMMA_10BIT_MAPPING )
1306 return TRUE;
1307 else
1308 return FALSE;
1309 }
1310
1311
1312 /////////////////////////////////////////////////////////////////////////////
1313 // Gamma format (12 bit LUT)
1314 // 0, 1, 2, 3, ..., NumOfLevel, totally N Sets of tNormalGammaR/G/B[],
1315 // 1 set uses 2 bytes of memory.
1316 //
1317 // [T2 and before ] N = 256
1318 // [T3] N = 256 or 1024
1319 // ______________________________________________________________________________
1320 // Byte | 0 1 2 n-1 n
1321 // [G1|G0] [G0] [G1] . ...... . [Gmax] [Gmax]
1322 // 3:0 3:0 11:4 11:4 3:0 11:4
1323 //
1324 #ifdef MONACO_SC2
Hal_PNL_Set12BitGammaPerChannel_SC2(void * pInstance,MS_U8 u8Channel,MS_U8 * u8Tab,DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode)1325 void Hal_PNL_Set12BitGammaPerChannel_SC2(void *pInstance, MS_U8 u8Channel, MS_U8 * u8Tab, DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode )
1326 {
1327 MS_U16 u16Addr = 0;
1328 MS_U16 u16CodeTableIndex = u16Addr/2*3;
1329 MS_U16 u16GammaValue = 0;
1330 MS_U16 u16MaxGammaValue = 0;
1331 MS_U16 u16NumOfLevel = GammaMapMode == E_DRVPNL_GAMMA_8BIT_MAPPING ? 256 : 1024;
1332 MS_BOOL bUsingBurstWrite = !Hal_VOP_Is_GammaSupportSignalWrite(pInstance,GammaMapMode);
1333 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1334 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1335
1336 // Go to burst write if not support
1337 if ( bUsingBurstWrite )
1338 {
1339 // 1. initial burst write address, LUT_ADDR[7:0]
1340 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_6C_L, 0x00 , 0x3FF);
1341
1342 // 2. select burst write channel, REG_LUT_BW_CH_SEL[1:0]
1343 switch(u8Channel)
1344 {
1345 case 0: // Red
1346 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_6D_L, 0x00 , BIT(3) | BIT(2) );
1347 break;
1348
1349 case 1: // Green
1350 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_6D_L, BIT(2) , BIT(3) | BIT(2) );
1351 break;
1352
1353 case 2: // Blue
1354 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_6D_L, BIT(3) , BIT(3) | BIT(2) );
1355 break;
1356 }
1357
1358 // 3. enable burst write mode, REG_LUT_BW_MAIN_EN
1359 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_6D_L, BIT(0) , BIT(0)); // Burst write enable
1360
1361 }
1362
1363 //printf("\33[0;31m Gamma Mapping mode %d \n \33[m",GammaMapMode );
1364 // write gamma table per one channel
1365 for(; u16Addr < u16NumOfLevel; u16CodeTableIndex += 3)
1366 {
1367 // gamma x
1368 u16GammaValue = u8Tab[u16CodeTableIndex] & 0x0F;
1369 u16GammaValue |= u8Tab[u16CodeTableIndex+1] << 4;
1370
1371 PNL_DBG(PNL_DBGLEVEL_GAMMA,"Gamma x: SrcGTbl[%d] = 0x%x, [%d] = 0x%x, Gamma = 0x%x, GammaLvl=%d\n",
1372 u16CodeTableIndex, u8Tab[u16CodeTableIndex], u16CodeTableIndex+1, u8Tab[u16CodeTableIndex+1], u16GammaValue, u16NumOfLevel);
1373
1374 if(u16MaxGammaValue < u16GammaValue)
1375 {
1376 u16MaxGammaValue = u16GammaValue;
1377 }
1378
1379 // write gamma value
1380 hal_PNL_WriteGamma12Bit(pInstance,u8Channel,bUsingBurstWrite, u16Addr, u16GammaValue);
1381 u16Addr++;
1382
1383 // gamma x+1
1384 u16GammaValue = (u8Tab[u16CodeTableIndex] & 0xF0) >> 4;
1385 u16GammaValue |= u8Tab[u16CodeTableIndex+2] << 4;
1386
1387 PNL_DBG(PNL_DBGLEVEL_GAMMA, "Gamma x+1: SrcGTbl[%d] = 0x%x, [%d] = 0x%x, Gamma = 0x%x\n", u16CodeTableIndex, u8Tab[u16CodeTableIndex], u16CodeTableIndex+2, u8Tab[u16CodeTableIndex+2], u16GammaValue);
1388
1389 if(u16MaxGammaValue < u16GammaValue)
1390 {
1391 u16MaxGammaValue = u16GammaValue;
1392 }
1393
1394 // write gamma value
1395 hal_PNL_WriteGamma12Bit(pInstance,u8Channel,bUsingBurstWrite, u16Addr, u16GammaValue);
1396 u16Addr++;
1397 }
1398
1399 if ( bUsingBurstWrite )
1400 {
1401 // 5. after finish burst write data of one channel, disable burst write mode
1402 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_6D_L, 0x00 , BIT(0));
1403 }
1404
1405 hal_PNL_SetMaxGammaValue(pInstance,u8Channel, u16MaxGammaValue);
1406 }
1407 #endif
1408
1409 #ifdef USE_PANEL_GAMMA
_hal_PNL_WriteGamma12Bit_PanelGamma(void * pInstance,MS_U8 u8Channel,MS_BOOL bBurstWrite,MS_U16 u16Addr,MS_U16 u16GammaValue)1410 static void _hal_PNL_WriteGamma12Bit_PanelGamma(void *pInstance, MS_U8 u8Channel, MS_BOOL bBurstWrite, MS_U16 u16Addr, MS_U16 u16GammaValue)
1411 {
1412 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1413 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1414
1415 MS_U16 u16Delay = 0xFFFF;
1416
1417 PNL_DBG(PNL_DBGLEVEL_GAMMA, "Write [ch %d][addr 0x%x]: 0x%x \n", u8Channel, u16Addr, u16GammaValue);
1418
1419 if (!bBurstWrite )
1420 {
1421 while (SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1C_L, 0x0C) && (--u16Delay)); // Check whether the Write chanel is ready
1422 PNL_ASSERT(u16Delay > 0, "%s\n", "WriteGamma timeout");
1423
1424 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_1B_L, u16Addr, 0xFF); // set address port
1425 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, (REG_SC_BK24_1D_L + u8Channel *2), u16GammaValue, 0xFFF); // Set channel data
1426
1427 // kick off write
1428 switch(u8Channel)
1429 {
1430 case 0: // Red
1431 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1C_L, 0x00 , BIT(3) | BIT(2) );
1432 break;
1433
1434 case 1: // Green
1435 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1C_L, BIT(2) , BIT(3) | BIT(2) );
1436 break;
1437
1438 case 2: // Blue
1439 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1C_L, BIT(3) , BIT(3) | BIT(2) );
1440 break;
1441
1442 }
1443
1444 while (SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_1C_L, 0x0C) && (--u16Delay)); // Check whether the Write chanel is ready
1445 }
1446 else
1447 {
1448
1449 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1D_L, u16GammaValue, 0xFFF);
1450 SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK00_7F_L, 0x00); // make little time delay
1451 }
1452
1453
1454 PNL_ASSERT(u16Delay > 0, "%s\n", "WriteGamma timeout");
1455 }
1456
_hal_PNL_SetMaxGammaValue_PanelGamma(void * pInstance,MS_U8 u8Channel,MS_U16 u16MaxGammaValue)1457 static void _hal_PNL_SetMaxGammaValue_PanelGamma(void *pInstance, MS_U8 u8Channel, MS_U16 u16MaxGammaValue)
1458 {
1459 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1460 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1461
1462 PNL_DBG(PNL_DBGLEVEL_GAMMA, "Max gamma of SC%tu %d is 0x%x\n", (ptrdiff_t)pPNLInstancePrivate->u32DeviceID, u8Channel, u16MaxGammaValue);
1463 switch(u8Channel)
1464 {
1465 case 0: // max. Red
1466 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_2C_L , u16MaxGammaValue, 0xFFF); // max. base 0
1467 break;
1468
1469 case 1: // max. Green
1470 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_2E_L , u16MaxGammaValue, 0xFFF); // max. base 1
1471 break;
1472
1473 case 2: //max. Blue
1474 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_30_L , u16MaxGammaValue, 0xFFF); // max. base 1
1475 break;
1476 }
1477 }
1478
_Hal_PNL_Set12BitGammaPerChannel_PanelGamma(void * pInstance,MS_U8 u8Channel,MS_U8 * u8Tab,DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode)1479 static void _Hal_PNL_Set12BitGammaPerChannel_PanelGamma(void *pInstance, MS_U8 u8Channel, MS_U8 * u8Tab, DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode )
1480 {
1481 MS_U16 u16Addr = 0;
1482 MS_U16 u16CodeTableIndex = u16Addr/2*3;
1483 MS_U16 u16GammaValue = 0;
1484 MS_U16 u16MaxGammaValue = 0;
1485 MS_U16 u16NumOfLevel = GammaMapMode == E_DRVPNL_GAMMA_8BIT_MAPPING ? 256 : 1024;
1486 MS_BOOL bUsingBurstWrite = !Hal_VOP_Is_GammaSupportSignalWrite(pInstance,GammaMapMode);
1487 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1488 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1489
1490 // Go to burst write if not support
1491 if ( bUsingBurstWrite )
1492 {
1493 // 1. initial burst write address, LUT_ADDR[7:0]
1494 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1B_L, 0x00 , 0xFF);
1495
1496 // 2. select burst write channel, REG_LUT_BW_CH_SEL[1:0]
1497 switch(u8Channel)
1498 {
1499 case 0: // Red
1500 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1C_L, 0x00 , BIT(3) | BIT(2) );
1501 break;
1502
1503 case 1: // Green
1504 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1C_L, BIT(2) , BIT(3) | BIT(2) );
1505 break;
1506
1507 case 2: // Blue
1508 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1C_L, BIT(3) , BIT(3) | BIT(2) );
1509 break;
1510 }
1511
1512 // 3. enable burst write mode, REG_LUT_BW_MAIN_EN
1513 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1C_L, BIT(0) , BIT(0)); // Burst write enable
1514
1515 }
1516
1517 //printf("\33[0;31m Gamma Mapping mode %d \n \33[m",GammaMapMode );
1518 // write gamma table per one channel
1519 for(; u16Addr < u16NumOfLevel; u16CodeTableIndex += 3)
1520 {
1521 // gamma x
1522 u16GammaValue = u8Tab[u16CodeTableIndex] & 0x0F;
1523 u16GammaValue |= u8Tab[u16CodeTableIndex+1] << 4;
1524
1525 PNL_DBG(PNL_DBGLEVEL_GAMMA,"Gamma x: SrcGTbl[%d] = 0x%x, [%d] = 0x%x, Gamma = 0x%x, GammaLvl=%d\n",
1526 u16CodeTableIndex, u8Tab[u16CodeTableIndex], u16CodeTableIndex+1, u8Tab[u16CodeTableIndex+1], u16GammaValue, u16NumOfLevel);
1527
1528 if(u16MaxGammaValue < u16GammaValue)
1529 {
1530 u16MaxGammaValue = u16GammaValue;
1531 }
1532
1533 // write gamma value
1534 _hal_PNL_WriteGamma12Bit_PanelGamma(pInstance,u8Channel,bUsingBurstWrite, u16Addr, u16GammaValue);
1535 u16Addr++;
1536
1537 // gamma x+1
1538 u16GammaValue = (u8Tab[u16CodeTableIndex] & 0xF0) >> 4;
1539 u16GammaValue |= u8Tab[u16CodeTableIndex+2] << 4;
1540
1541 PNL_DBG(PNL_DBGLEVEL_GAMMA, "Gamma x+1: SrcGTbl[%d] = 0x%x, [%d] = 0x%x, Gamma = 0x%x\n", u16CodeTableIndex, u8Tab[u16CodeTableIndex], u16CodeTableIndex+2, u8Tab[u16CodeTableIndex+2], u16GammaValue);
1542
1543 if(u16MaxGammaValue < u16GammaValue)
1544 {
1545 u16MaxGammaValue = u16GammaValue;
1546 }
1547
1548 // write gamma value
1549 _hal_PNL_WriteGamma12Bit_PanelGamma(pInstance,u8Channel,bUsingBurstWrite, u16Addr, u16GammaValue);
1550 u16Addr++;
1551 }
1552
1553 if ( bUsingBurstWrite )
1554 {
1555 // 5. after finish burst write data of one channel, disable burst write mode
1556 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK24_1C_L, 0x00 , BIT(0));
1557 }
1558 _hal_PNL_SetMaxGammaValue_PanelGamma(pInstance,u8Channel, u16MaxGammaValue);
1559 }
1560
1561 #endif
1562
_hal_PNL_WriteGamma12Bit(void * pInstance,MS_U8 u8Channel,MS_BOOL bBurstWrite,MS_U16 u16Addr,MS_U16 u16GammaValue)1563 static void _hal_PNL_WriteGamma12Bit(void *pInstance, MS_U8 u8Channel, MS_BOOL bBurstWrite, MS_U16 u16Addr, MS_U16 u16GammaValue)
1564 {
1565 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1566 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1567
1568 MS_U16 u16Delay = 0xFFFF;
1569
1570 PNL_DBG(PNL_DBGLEVEL_GAMMA, "Write [ch %d][addr 0x%x]: 0x%x \n", u8Channel, u16Addr, u16GammaValue);
1571
1572 if (!bBurstWrite )
1573 {
1574 while (SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_6D_L, 0xE0) && (--u16Delay)); // Check whether the Write chanel is ready
1575 PNL_ASSERT(u16Delay > 0, "%s\n", "WriteGamma timeout");
1576
1577 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_6C_L, u16Addr, 0x3FF); // set address port
1578 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, (REG_SC_BK10_6E_L + u8Channel *2), u16GammaValue, 0xFFF); // Set channel data
1579
1580 // kick off write
1581 switch(u8Channel)
1582 {
1583 case 0: // Red
1584 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_6D_L, BIT(5), BIT(5));
1585 break;
1586
1587 case 1: // Green
1588 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_6D_L, BIT(6), BIT(6));
1589 break;
1590
1591 case 2: // Blue
1592 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_6D_L, BIT(7), BIT(7));
1593 break;
1594 }
1595
1596 while (SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_6D_L, 0xE0) && (--u16Delay)); // Check whether the Write chanel is ready
1597 }
1598 else
1599 {
1600
1601 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_72_L, u16GammaValue, 0xFFF);
1602 SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK00_7F_L, 0x00); // make little time delay
1603 }
1604
1605
1606 PNL_ASSERT(u16Delay > 0, "%s\n", "WriteGamma timeout");
1607 }
1608
1609
_hal_PNL_SetMaxGammaValue(void * pInstance,MS_U8 u8Channel,MS_U16 u16MaxGammaValue)1610 static void _hal_PNL_SetMaxGammaValue(void *pInstance, MS_U8 u8Channel, MS_U16 u16MaxGammaValue)
1611 {
1612 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1613 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1614
1615 PNL_DBG(PNL_DBGLEVEL_GAMMA, "Max gamma of SC%tu %d is 0x%x\n", (ptrdiff_t)pPNLInstancePrivate->u32DeviceID, u8Channel, u16MaxGammaValue);
1616 #ifdef MONACO_SC2
1617 if(pPNLInstancePrivate->u32DeviceID == 0)
1618 {
1619 #endif
1620 switch(u8Channel)
1621 {
1622 case 0: // max. Red
1623 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_7D_L , u16MaxGammaValue, 0xFFF); // max. base 0
1624 break;
1625
1626 case 1: // max. Green
1627 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_7E_L , u16MaxGammaValue, 0xFFF); // max. base 1
1628 break;
1629
1630 case 2: //max. Blue
1631 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_7F_L , u16MaxGammaValue, 0xFFF); // max. base 1
1632 break;
1633 }
1634 #ifdef MONACO_SC2
1635 }else //Nike
1636 {
1637 switch(u8Channel)
1638 {
1639 case 0: // max. Red
1640 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_7A_L , u16MaxGammaValue, 0xFFF); // max. base 0
1641 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_7B_L , u16MaxGammaValue, 0xFFF); // max. base 1
1642 break;
1643
1644 case 1: // max. Green
1645 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_7C_L , u16MaxGammaValue, 0xFFF); // max. base 0
1646 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_7D_L , u16MaxGammaValue, 0xFFF); // max. base 1
1647 break;
1648
1649 case 2: //max. Blue
1650 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_7E_L , u16MaxGammaValue, 0xFFF); // max. base 0
1651 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_7F_L , u16MaxGammaValue, 0xFFF); // max. base 1
1652 break;
1653 }
1654
1655 }
1656 #endif
1657 }
1658
1659 /////////////////////////////////////////////////////////////////////////////
1660 // Gamma format (12 bit LUT)
1661 // 0, 1, 2, 3, ..., NumOfLevel, totally N Sets of tNormalGammaR/G/B[],
1662 // 1 set uses 2 bytes of memory.
1663 //
1664 // [T2 and before ] N = 256
1665 // [T3] N = 256 or 1024
1666 // ______________________________________________________________________________
1667 // Byte | 0 1 2 n-1 n
1668 // [G1|G0] [G0] [G1] . ...... . [Gmax] [Gmax]
1669 // 3:0 3:0 11:4 11:4 3:0 11:4
1670 //
_Hal_PNL_Set12BitGammaPerChannel(void * pInstance,MS_U8 u8Channel,MS_U8 * u8Tab,DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode)1671 static void _Hal_PNL_Set12BitGammaPerChannel(void *pInstance, MS_U8 u8Channel, MS_U8 * u8Tab, DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode)
1672 {
1673 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
1674 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
1675
1676 MS_U16 u16Addr = 0;
1677 MS_U16 u16CodeTableIndex = u16Addr/2*3;
1678 MS_U16 u16GammaValue = 0;
1679 MS_U16 u16MaxGammaValue = 0;
1680 MS_U16 u16NumOfLevel = GammaMapMode == E_DRVPNL_GAMMA_8BIT_MAPPING ? 256 : 1024;
1681 MS_BOOL bUsingBurstWrite = !Hal_VOP_Is_GammaSupportSignalWrite(pInstance,GammaMapMode);
1682
1683 // Go to burst write if not support
1684 if ( bUsingBurstWrite )
1685 {
1686 // 1. initial burst write address, LUT_ADDR[7:0]
1687 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_71_L, 0x00 , 0x3FF);
1688
1689 // 2. select burst write channel, REG_LUT_BW_CH_SEL[1:0]
1690 switch(u8Channel)
1691 {
1692 case 0: // Red
1693 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_70_L, 0x00 , BIT(6) | BIT(5) );
1694 break;
1695
1696 case 1: // Green
1697 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_70_L, BIT(5) , BIT(6) | BIT(5) );
1698 break;
1699
1700 case 2: // Blue
1701 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_70_L, BIT(6) , BIT(6) | BIT(5) );
1702 break;
1703 }
1704
1705 // 3. enable burst write mode, REG_LUT_BW_MAIN_EN
1706 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_70_L, BIT(7) , BIT(7)); // Burst write enable
1707
1708 }
1709
1710 //printf("\33[0;31m Gamma Mapping mode %d \n \33[m",GammaMapMode );
1711 // write gamma table per one channel
1712 for(; u16Addr < u16NumOfLevel; u16CodeTableIndex += 3)
1713 {
1714 // gamma x
1715 u16GammaValue = u8Tab[u16CodeTableIndex] & 0x0F;
1716 u16GammaValue |= u8Tab[u16CodeTableIndex+1] << 4;
1717
1718 PNL_DBG(PNL_DBGLEVEL_GAMMA,"Gamma x: SrcGTbl[%d] = 0x%x, [%d] = 0x%x, Gamma = 0x%x, GammaLvl=%d\n",
1719 u16CodeTableIndex, u8Tab[u16CodeTableIndex], u16CodeTableIndex+1, u8Tab[u16CodeTableIndex+1], u16GammaValue, u16NumOfLevel);
1720
1721 if(u16MaxGammaValue < u16GammaValue)
1722 {
1723 u16MaxGammaValue = u16GammaValue;
1724 }
1725
1726 // write gamma value
1727 _hal_PNL_WriteGamma12Bit(pInstance,u8Channel,bUsingBurstWrite, u16Addr, u16GammaValue);
1728 u16Addr++;
1729
1730 // gamma x+1
1731 u16GammaValue = (u8Tab[u16CodeTableIndex] & 0xF0) >> 4;
1732 u16GammaValue |= u8Tab[u16CodeTableIndex+2] << 4;
1733
1734 PNL_DBG(PNL_DBGLEVEL_GAMMA, "Gamma x+1: SrcGTbl[%d] = 0x%x, [%d] = 0x%x, Gamma = 0x%x\n", u16CodeTableIndex, u8Tab[u16CodeTableIndex], u16CodeTableIndex+2, u8Tab[u16CodeTableIndex+2], u16GammaValue);
1735
1736 if(u16MaxGammaValue < u16GammaValue)
1737 {
1738 u16MaxGammaValue = u16GammaValue;
1739 }
1740
1741 // write gamma value
1742 _hal_PNL_WriteGamma12Bit(pInstance,u8Channel,bUsingBurstWrite, u16Addr, u16GammaValue);
1743 u16Addr++;
1744 }
1745
1746 if ( bUsingBurstWrite )
1747 {
1748 // 5. after finish burst write data of one channel, disable burst write mode
1749 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK10_70_L, 0x00 , BIT(7));
1750 }
1751
1752 _hal_PNL_SetMaxGammaValue(pInstance,u8Channel, u16MaxGammaValue);
1753 }
1754
hal_PNL_WriteGamma12Bit(void * pInstance,MS_U8 u8Channel,MS_BOOL bBurstWrite,MS_U16 u16Addr,MS_U16 u16GammaValue)1755 void hal_PNL_WriteGamma12Bit(void *pInstance, MS_U8 u8Channel, MS_BOOL bBurstWrite, MS_U16 u16Addr, MS_U16 u16GammaValue)
1756 {
1757 #ifdef USE_PANEL_GAMMA
1758 _hal_PNL_WriteGamma12Bit_PanelGamma(pInstance, u8Channel, bBurstWrite, u16Addr, u16GammaValue);
1759 #endif
1760 _hal_PNL_WriteGamma12Bit(pInstance, u8Channel, bBurstWrite, u16Addr, u16GammaValue);
1761
1762 }
1763
hal_PNL_SetMaxGammaValue(void * pInstance,MS_U8 u8Channel,MS_U16 u16MaxGammaValue)1764 void hal_PNL_SetMaxGammaValue(void *pInstance, MS_U8 u8Channel, MS_U16 u16MaxGammaValue)
1765 {
1766 #ifdef USE_PANEL_GAMMA
1767 _hal_PNL_SetMaxGammaValue_PanelGamma(pInstance, u8Channel, u16MaxGammaValue);
1768 #endif
1769 _hal_PNL_SetMaxGammaValue(pInstance, u8Channel, u16MaxGammaValue);
1770 }
1771
Hal_PNL_Set12BitGammaPerChannel(void * pInstance,MS_U8 u8Channel,MS_U8 * u8Tab,DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode)1772 void Hal_PNL_Set12BitGammaPerChannel(void *pInstance, MS_U8 u8Channel, MS_U8 * u8Tab, DRVPNL_GAMMA_MAPPEING_MODE GammaMapMode)
1773 {
1774 #ifdef USE_PANEL_GAMMA
1775 _Hal_PNL_Set12BitGammaPerChannel_PanelGamma(pInstance, u8Channel, u8Tab, GammaMapMode);
1776 #endif
1777 _Hal_PNL_Set12BitGammaPerChannel(pInstance, u8Channel, u8Tab, GammaMapMode);
1778 }
1779
1780 // src : 1 (scaler lpll)
1781 // src : 0 (frc lpll)
MHal_PNL_FRC_lpll_src_sel(void * pInstance,MS_U8 u8src)1782 MS_U8 MHal_PNL_FRC_lpll_src_sel(void *pInstance, MS_U8 u8src)
1783 {
1784 if (u8src > 1)
1785 {
1786 return FALSE;
1787 }
1788 else
1789 {
1790 //Not support two LPLL (frc lpll) for Manhattan
1791 #if 0
1792 W2BYTEMSK(L_BK_LPLL(0x00), 0x00, 0x0F);
1793 W2BYTEMSK(L_BK_LPLL(0x7F), u8src?BIT(8):0, BIT(8));
1794
1795 if(u8src==0)
1796 {
1797 W2BYTEMSK(L_BK_LPLL(0x00), 0x01, 0x0F);
1798 W2BYTEMSK(L_BK_LPLL(0x7F), BIT(8), BIT(8));
1799 W2BYTEMSK(L_BK_LPLL(0x00), 0x00, 0x0F); // restore to sub bnak 0
1800 }
1801 #endif
1802 return TRUE;
1803 }
1804
1805 }
1806
_MHal_PNL_GetSupportedLPLLIndex(void * pInstance,PNL_TYPE eLPLL_Type,PNL_MODE eLPLL_Mode,MS_U64 ldHz,PNL_LPLL_TYPE_SEL lpll_type_sel)1807 static MS_U8 _MHal_PNL_GetSupportedLPLLIndex(void *pInstance,
1808 PNL_TYPE eLPLL_Type,
1809 PNL_MODE eLPLL_Mode,
1810 MS_U64 ldHz, PNL_LPLL_TYPE_SEL lpll_type_sel)
1811 {
1812 MS_U8 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MAX;
1813 #if defined (__aarch64__)
1814 PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]eLPLL_Type=%u, eLPLL_Mode=%u, ldHz=%lu, lpll_type_sel=%u\n", __FUNCTION__, __LINE__, eLPLL_Type, eLPLL_Mode, ldHz, lpll_type_sel);
1815 #else
1816 PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]eLPLL_Type=%u, eLPLL_Mode=%u, ldHz=%llu, lpll_type_sel=%u\n", __FUNCTION__, __LINE__, eLPLL_Type, eLPLL_Mode, ldHz, lpll_type_sel);
1817 #endif
1818
1819 /// Mini LVDS, EPI34/28, LVDS_1CH, Vx1_1P are 1P structure
1820 if(!((eLPLL_Type == E_PNL_TYPE_TTL)||
1821 ((eLPLL_Type == E_PNL_TYPE_LVDS)&&(eLPLL_Mode==E_PNL_MODE_SINGLE))||
1822 ((eLPLL_Type == E_PNL_TYPE_HS_LVDS)&&(eLPLL_Mode==E_PNL_MODE_SINGLE))||
1823 (eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_1LANE)||(eLPLL_Type == E_PNL_LPLL_VBY1_8BIT_1LANE)||
1824 ((eLPLL_Type >= E_PNL_LPLL_MINILVDS_2CH_3P_8BIT)&&(eLPLL_Type <= E_PNL_LPLL_MINILVDS_1CH_6P_6BIT))||
1825 ((eLPLL_Type >= E_PNL_LPLL_EPI34_2P)&&(eLPLL_Type <= E_PNL_LPLL_EPI28_4P))))
1826 {
1827 ldHz/=2;
1828 }
1829
1830 switch(lpll_type_sel)
1831 {
1832 default:
1833 case E_PNL_LPLL_VIDEO:
1834 {
1835 switch (eLPLL_Type)
1836 {
1837 case E_PNL_TYPE_TTL:
1838 if (ldHz < 250000000UL)
1839 {
1840 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_TTL_25to25MHz;
1841 }
1842 else if ((ldHz >= 250000000UL) && (ldHz < 500000000UL))
1843 {
1844 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_TTL_25to50MHz;
1845 }
1846 else if((ldHz >= 500000000UL) && (ldHz < 1000000000UL))
1847 {
1848 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_TTL_50to100MHz;
1849 }
1850 else
1851 {
1852 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_TTL_100to150MHz;
1853 }
1854 break;
1855
1856 case E_PNL_TYPE_LVDS:
1857 switch (eLPLL_Mode)
1858 {
1859 case E_PNL_MODE_SINGLE:
1860 if (ldHz < 500000000UL)
1861 {
1862 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_LVDS_1CH_50to50MHz;
1863 }
1864 else
1865 {
1866 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_LVDS_1CH_50to80MHz;
1867 }
1868 break;
1869
1870 default:
1871 case E_PNL_MODE_DUAL:
1872 if (ldHz < 250000000UL)
1873 {
1874 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_LVDS_2CH_25to25MHz;
1875 }
1876 else if ((ldHz >= 250000000UL) && (ldHz < 500000000UL))
1877 {
1878 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_LVDS_2CH_25to50MHz;
1879 }
1880 else
1881 {
1882 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_LVDS_2CH_50to80MHz;
1883 }
1884 break;
1885 }
1886 break;
1887
1888 case E_PNL_TYPE_HS_LVDS:
1889
1890 switch (eLPLL_Mode)
1891 {
1892 case E_PNL_MODE_SINGLE:
1893 if(ldHz < 500000000UL)
1894 {
1895 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_HS_LVDS_1CH_50to50MHz;
1896 }
1897 else if((ldHz >= 500000000UL) && (ldHz < 1000000000UL))
1898 {
1899 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_HS_LVDS_1CH_50to100MHz;
1900 }
1901 else
1902 {
1903 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_HS_LVDS_1CH_100to150MHz;
1904 }
1905 break;
1906
1907 default:
1908 case E_PNL_MODE_DUAL:
1909 if(ldHz < 250000000UL)
1910 {
1911 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_HS_LVDS_2CH_25to25MHz;
1912 }
1913 else if((ldHz >= 250000000UL) && (ldHz < 500000000UL))
1914 {
1915 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_HS_LVDS_2CH_25to50MHz;
1916 }
1917 else if((ldHz >= 500000000UL) && (ldHz < 1000000000UL))
1918 {
1919 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_HS_LVDS_2CH_50to100MHz;
1920 }
1921 else
1922 {
1923 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_HS_LVDS_2CH_100to150MHz;
1924 }
1925 break;
1926 }
1927 break;
1928 ///Not Support
1929 #if 0
1930 case E_PNL_LPLL_MINILVDS_1CH_3P_8BIT:
1931 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_1CH_3PAIR_8BIT_50to80MHz;
1932 break;
1933
1934 case E_PNL_LPLL_MINILVDS_2CH_3P_8BIT:
1935 if((ldHz >= 500000000) && (ldHz < 1000000000))
1936 {
1937 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_3PAIR_8BIT_50to100MHz;
1938 }
1939 else
1940 {
1941 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_3PAIR_8BIT_100to150MHz;
1942 }
1943 break;
1944
1945 case E_PNL_LPLL_MINILVDS_2CH_6P_8BIT:
1946 if((ldHz >= 500000000) && (ldHz < 1000000000))
1947 {
1948 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_6PAIR_8BIT_50to100MHz;
1949 }
1950 else
1951 {
1952 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_6PAIR_8BIT_100to150MHz;
1953 }
1954 break;
1955
1956 case E_PNL_LPLL_MINILVDS_1CH_3P_6BIT:
1957 if((ldHz >= 500000000) && (ldHz < 666700000))
1958 {
1959 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_1CH_3PAIR_6BIT_50to66_67MHz;
1960 }
1961 else
1962 {
1963 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_1CH_3PAIR_6BIT_66_67to80MHz;
1964 }
1965 break;
1966
1967 case E_PNL_LPLL_MINILVDS_2CH_3P_6BIT:
1968 if ((ldHz <= 500000000) && (ldHz < 666700000))
1969 {
1970 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_3PAIR_6BIT_50to66_67MHz;
1971 }
1972 else if((ldHz >= 666700000) && (ldHz < 1333300000))
1973 {
1974 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_3PAIR_6BIT_66_67to133_33MHz;
1975 }
1976 else
1977 {
1978 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_3PAIR_6BIT_133_33to150MHz;
1979 }
1980 break;
1981
1982 case E_PNL_LPLL_MINILVDS_2CH_6P_6BIT:
1983 if ((ldHz <= 500000000) && (ldHz < 670000000))
1984 {
1985 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_6PAIR_6BIT_50to67MHz;
1986 }
1987 else if((ldHz >= 670000000) && (ldHz < 1330000000))
1988 {
1989 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_6PAIR_6BIT_67to133MHz;
1990 }
1991 else
1992 {
1993 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MINILVDS_2CH_6PAIR_6BIT_133to150MHz;
1994 }
1995 break;
1996
1997 case E_PNL_LPLL_EPI34_4P:
1998 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI34_10BIT_4PAIR_95to150MHz;
1999 break;
2000
2001 case E_PNL_LPLL_EPI34_6P:
2002 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI34_10BIT_6PAIR_80to150MHz;
2003 break;
2004
2005 case E_PNL_LPLL_EPI34_8P:
2006 if((ldHz >= 800000000) && (ldHz < 940000000))
2007 {
2008 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI34_10BIT_8PAIR_80to94MHz;
2009 }
2010 else if((ldHz >= 940000000) && (ldHz < 1880000000))
2011 {
2012 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI34_10BIT_8PAIR_94to188MHz;
2013 }
2014 else
2015 {
2016 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI34_10BIT_8PAIR_188to300MHz;
2017 }
2018 break;
2019
2020 case E_PNL_LPLL_EPI28_4P:
2021 if((ldHz >= 800000000) && (ldHz < 1140000000))
2022 {
2023 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI28_8BIT_4PAIR_80to114MHz;
2024 }
2025 else
2026 {
2027 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI28_8BIT_4PAIR_114to150MHz;
2028 }
2029 break;
2030 #endif
2031
2032 case E_PNL_LPLL_EPI28_6P:
2033 if(ldHz < 1500000000UL)
2034 {
2035 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_6P_150to150MHz;
2036 }
2037 else if((ldHz >= 1500000000UL) && (ldHz < 1800000000UL))
2038 {
2039 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_6P_150to180MHz;
2040 }
2041 else
2042 {
2043 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_6P_180to330MHz;
2044 }
2045 break;
2046
2047 case E_PNL_LPLL_EPI28_8P:
2048 if(ldHz < 1500000000UL)
2049 {
2050 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_8P_150to150MHz;
2051 }
2052 else if((ldHz >= 1500000000UL) && (ldHz < 2400000000UL))
2053 {
2054 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_8P_150to240MHz;
2055 }
2056 else
2057 {
2058 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_8P_240to330MHz;
2059 }
2060 break;
2061 case E_PNL_LPLL_EPI24_12P:
2062 if(ldHz < 1500000000UL)
2063 {
2064 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_24_12P_150to150MHz;
2065 }
2066 else
2067 {
2068 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_24_12P_150to330MHz;
2069 }
2070 break;
2071 case E_PNL_LPLL_EPI28_12P:
2072 if(ldHz < 1500000000UL)
2073 {
2074 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_12P_150to150MHz;
2075 }
2076 else
2077 {
2078 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EPI_28_12P_150to330MHz;
2079 }
2080 break;
2081 /*
2082 case E_PNL_LPLL_EPI34_12P:
2083 case E_PNL_LPLL_EPI24_12P:
2084 break;
2085 */
2086
2087 case E_PNL_LPLL_VBY1_10BIT_8LANE:
2088 if(ldHz < 1500000000UL)
2089 {
2090 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_10BIT_8LANE_150to150MHz;
2091 }
2092 else
2093 {
2094 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_10BIT_8LANE_150to300MHz;
2095 }
2096 printf("@@11=%u\n",u8SupportedLPLLIndex);
2097 break;
2098
2099 case E_PNL_LPLL_VBY1_10BIT_4LANE:
2100 if(ldHz < 750000000UL)
2101 {
2102 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_10BIT_4LANE_75to75MHz;
2103 }
2104 else
2105 {
2106 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_10BIT_4LANE_75to150MHz;
2107 }
2108 break;
2109
2110 case E_PNL_LPLL_VBY1_10BIT_2LANE:
2111 if(ldHz < 375000000UL)
2112 {
2113 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_10BIT_2LANE_37_5to37_5MHz;
2114 }
2115 else
2116 {
2117 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_10BIT_2LANE_37_5to75MHz;
2118 }
2119 break;
2120
2121 case E_PNL_LPLL_VBY1_10BIT_1LANE:
2122 if(ldHz < 400000000UL)
2123 {
2124 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_10BIT_1LANE_40to40MHz;
2125 }
2126 else
2127 {
2128 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_10BIT_1LANE_40to80MHz;
2129 }
2130 break;
2131
2132 case E_PNL_LPLL_VBY1_8BIT_8LANE:
2133 if(ldHz < 1500000000UL)
2134 {
2135 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_8LANE_150to150MHz;
2136 }
2137 else if((ldHz >= 1500000000UL) && (ldHz < 2200000000UL))
2138 {
2139 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_8LANE_150to200MHz;
2140 }
2141 else
2142 {
2143 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_8LANE_200to300MHz;
2144 }
2145 break;
2146
2147 case E_PNL_LPLL_VBY1_8BIT_4LANE:
2148 if(ldHz < 750000000UL)
2149 {
2150 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_4LANE_75to75MHz;
2151 }
2152 else if((ldHz >= 750000000UL) && (ldHz < 1000000000UL))
2153 {
2154 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_4LANE_75to100MHz;
2155 }
2156 else
2157 {
2158 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_4LANE_100to150MHz;
2159 }
2160 break;
2161
2162 case E_PNL_LPLL_VBY1_8BIT_2LANE:
2163 if(ldHz < 375000000UL)
2164 {
2165 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_2LANE_37_5to37_5MHz;
2166 }
2167 else if((ldHz >= 375000000UL) && (ldHz < 500000000UL))
2168 {
2169 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_2LANE_37_5to50MHz;
2170 }
2171 else
2172 {
2173 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_2LANE_50to75MHz;
2174 }
2175 break;
2176
2177 case E_PNL_LPLL_VBY1_8BIT_1LANE:
2178 if(ldHz < 400000000UL)
2179 {
2180 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_1LANE_40to40MHz;
2181 }
2182 else if((ldHz >= 400000000UL) && (ldHz < 500000000UL))
2183 {
2184 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_1LANE_40to50MHz;
2185 }
2186 else
2187 {
2188 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_1LANE_50to80MHz;
2189 }
2190 break;
2191
2192 case E_PNL_LPLL_VBY1_10BIT_16LANE:
2193 if(ldHz < 2000000000UL)
2194 {
2195 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_10BIT_16LANE_200to200MHz;
2196 }
2197 else
2198 {
2199 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_10BIT_16LANE_200to300MHz;
2200 }
2201 break;
2202 case E_PNL_LPLL_VBY1_8BIT_16LANE:
2203 if(ldHz < 2000000000UL)
2204 {
2205 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_16LANE_200to200MHz;
2206 }
2207 else
2208 {
2209 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_VBY1_8BIT_16LANE_200to300MHz;
2210 }
2211 break;
2212 case E_PNL_LPLL_USI_T_8BIT_12P:
2213 if(ldHz < 1500000000UL)
2214 {
2215 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_USI_T_8BIT_12PAIR_150to150MHz;
2216 }
2217 else
2218 {
2219 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_USI_T_8BIT_12PAIR_150to330MHz;
2220 }
2221 break;
2222 case E_PNL_LPLL_USI_T_10BIT_12P:
2223 if(ldHz < 1500000000UL)
2224 {
2225 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_USI_T_10BIT_12PAIR_150to150MHz;
2226 }
2227 else
2228 {
2229 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_USI_T_10BIT_12PAIR_150to330MHz;
2230 }
2231 break;
2232 case E_PNL_LPLL_ISP_8BIT_12P:
2233 if(ldHz < 1500000000UL)
2234 {
2235 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_ISP_8BIT_12PAIR_150to150MHz;
2236 }
2237 else
2238 {
2239 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_ISP_8BIT_12PAIR_150to330MHz;
2240 }
2241 break;
2242 case E_PNL_LPLL_ISP_8BIT_6P_D:
2243 if(ldHz < 1500000000UL)
2244 {
2245 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_ISP_8BIT_6PAIR_DUAL_150to150MHz;
2246 }
2247 else
2248 {
2249 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_ISP_8BIT_6PAIR_DUAL_150to330MHz;
2250 }
2251 break;
2252 default:
2253 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_MAX;
2254 break;
2255 }
2256 }
2257 break;
2258 case E_PNL_LPLL_OSD:
2259 {
2260 switch (eLPLL_Type)
2261 {
2262 case E_PNL_TYPE_HS_LVDS:
2263 {
2264 if(ldHz < 250000000UL)
2265 {
2266 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_HS_LVDS_1CH_25to25MHz;
2267 }
2268 else if((ldHz >= 250000000UL) && (ldHz < 500000000UL))
2269 {
2270 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_HS_LVDS_1CH_25to50MHz;
2271 }
2272 else if((ldHz >= 500000000UL) && (ldHz < 1000000000UL))
2273 {
2274 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_HS_LVDS_1CH_50to100MHz;
2275 }
2276 else
2277 {
2278 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_HS_LVDS_1CH_100to150MHz;
2279 }
2280 }
2281 break;
2282
2283 case E_PNL_LPLL_VBY1_10BIT_4LANE:
2284 if(ldHz < 1500000000UL)
2285 {
2286 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_10BIT_4LANE_150to150MHz;
2287 }
2288 else
2289 {
2290 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_10BIT_4LANE_150to340MHz;
2291 }
2292 break;
2293
2294 case E_PNL_LPLL_VBY1_10BIT_2LANE:
2295 if(ldHz < 750000000UL)
2296 {
2297 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_10BIT_2LANE_75to75MHz;
2298 }
2299 else
2300 {
2301 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_10BIT_2LANE_75to150MHz;
2302 }
2303 break;
2304
2305 case E_PNL_LPLL_VBY1_10BIT_1LANE:
2306 if(ldHz < 375000000UL)
2307 {
2308 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_10BIT_1LANE_37_5to37_5MHz;
2309 }
2310 else
2311 {
2312 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_10BIT_1LANE_37_5to75MHz;
2313 }
2314 break;
2315
2316 case E_PNL_LPLL_VBY1_8BIT_4LANE:
2317 if(ldHz < 1500000000UL)
2318 {
2319 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_8BIT_4LANE_150to150MHz;
2320 }
2321 else if((ldHz >= 1500000000UL) && (ldHz < 2200000000UL))
2322 {
2323 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_8BIT_4LANE_150to200MHz;
2324 }
2325 else
2326 {
2327 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_8BIT_4LANE_200to340MHz;
2328 }
2329 break;
2330
2331 case E_PNL_LPLL_VBY1_8BIT_2LANE:
2332 if(ldHz < 750000000UL)
2333 {
2334 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_8BIT_2LANE_75to75MHz;
2335 }
2336 else if((ldHz >= 750000000UL) && (ldHz < 1000000000UL))
2337 {
2338 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_8BIT_2LANE_75to100MHz;
2339 }
2340 else
2341 {
2342 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_8BIT_2LANE_100to150MHz;
2343 }
2344 break;
2345
2346 case E_PNL_LPLL_VBY1_8BIT_1LANE:
2347 if(ldHz < 375000000UL)
2348 {
2349 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_8BIT_1LANE_37_5to37_5MHz;
2350 }
2351 else if((ldHz >= 380000000UL) && (ldHz < 500000000UL))
2352 {
2353 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_8BIT_1LANE_37_5to50MHz;
2354 }
2355 else
2356 {
2357 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_VBY1_8BIT_1LANE_50to75MHz;
2358 }
2359 break;
2360
2361 default:
2362 u8SupportedLPLLIndex = E_PNL_SUPPORTED_LPLL_EXT_MAX;
2363 break;
2364 }
2365 }
2366 break;
2367 }
2368 return u8SupportedLPLLIndex;
2369 }
2370
_MHal_PNL_DumpLPLLTable(void * pInstance,MS_U8 LPLLTblIndex,PNL_LPLL_TYPE_SEL lpll_type_sel)2371 static void _MHal_PNL_DumpLPLLTable(void *pInstance, MS_U8 LPLLTblIndex, PNL_LPLL_TYPE_SEL lpll_type_sel)
2372 {
2373 if(lpll_type_sel == E_PNL_LPLL_VIDEO)
2374 {
2375 if (LPLLTblIndex == E_PNL_SUPPORTED_LPLL_MAX)
2376 {
2377 printf("[%s,%5d] Unspported LPLL Type, skip LPLL setting\n",__FUNCTION__,__LINE__);
2378 return;
2379 }
2380
2381 int indexCounter = 0;
2382
2383 for(indexCounter = 0 ; indexCounter<LPLL_REG_NUM; indexCounter++)
2384 {
2385 if (LPLLSettingTBL[LPLLTblIndex][indexCounter].address == 0xFF) //delay in micro second
2386 {
2387 MsOS_DelayTaskUs(LPLLSettingTBL[LPLLTblIndex][indexCounter].value);
2388 continue; // step forward to next register setting.
2389 }
2390
2391 W2BYTEMSK(L_BK_LPLL(LPLLSettingTBL[LPLLTblIndex][indexCounter].address),
2392 LPLLSettingTBL[LPLLTblIndex][indexCounter].value,
2393 LPLLSettingTBL[LPLLTblIndex][indexCounter].mask);
2394 }
2395 PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]LPLLTblIndex=%u\n", __FUNCTION__, __LINE__, LPLLTblIndex);
2396 }
2397 else
2398 {
2399 if (LPLLTblIndex == E_PNL_SUPPORTED_LPLL_EXT_MAX)
2400 {
2401 printf("[%s,%5d] Unspported LPLL Type, skip LPLL setting\n",__FUNCTION__,__LINE__);
2402 return;
2403 }
2404
2405 int indexCounter = 0;
2406
2407 for(indexCounter = 0 ; indexCounter<LPLL_EXT_REG_NUM; indexCounter++)
2408 {
2409 if (LPLLSettingTBL_Ext[LPLLTblIndex][indexCounter].address == 0xFF) //delay in micro second
2410 {
2411 MsOS_DelayTaskUs(LPLLSettingTBL_Ext[LPLLTblIndex][indexCounter].value);
2412 continue; // step forward to next register setting.
2413 }
2414
2415 W2BYTEMSK(L_BK_LPLL(LPLLSettingTBL_Ext[LPLLTblIndex][indexCounter].address),
2416 LPLLSettingTBL_Ext[LPLLTblIndex][indexCounter].value,
2417 LPLLSettingTBL_Ext[LPLLTblIndex][indexCounter].mask);
2418 }
2419 PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]LPLLTblIndex=%u\n", __FUNCTION__, __LINE__, LPLLTblIndex);
2420 }
2421 }
2422
MHal_PNL_Init_LPLL(void * pInstance,PNL_TYPE eLPLL_Type,PNL_MODE eLPLL_Mode,MS_U64 ldHz)2423 void MHal_PNL_Init_LPLL(void *pInstance, PNL_TYPE eLPLL_Type,PNL_MODE eLPLL_Mode,MS_U64 ldHz)
2424 {
2425 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
2426 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
2427 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
2428 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
2429 E_PNL_SUPPORTED_LPLL_TYPE u8SupportedLPLLLIndex = E_PNL_SUPPORTED_LPLL_MAX;
2430 PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]\n", __FUNCTION__, __LINE__);
2431
2432 u8SupportedLPLLLIndex = _MHal_PNL_GetSupportedLPLLIndex(pInstance, eLPLL_Type,eLPLL_Mode,ldHz, E_PNL_LPLL_VIDEO);
2433
2434 if (u8SupportedLPLLLIndex == E_PNL_SUPPORTED_LPLL_MAX)
2435 {
2436 printf("Not Supported LPLL Type, skip LPLL Init\n");
2437 return;
2438 }
2439
2440 _MHal_PNL_DumpLPLLTable(pInstance, u8SupportedLPLLLIndex, E_PNL_LPLL_VIDEO);
2441
2442 //for Maserati sync too fat, so frame lock fail
2443 W2BYTEMSK(L_BK_LPLL(0x3C),0x0000 ,BIT(12));
2444
2445 MHal_MOD_PVDD_Power_Setting(pInstance, pPNLResourcePrivate->sthalPNL._bPVDD_2V5); // Einstein is always use 3.3V PVDD Power.
2446 }
2447
MHal_PNL_Get_Loop_DIV(void * pInstance,MS_U8 u8LPLL_Mode,MS_U8 eLPLL_Type,MS_U64 ldHz)2448 MS_U8 MHal_PNL_Get_Loop_DIV(void *pInstance, MS_U8 u8LPLL_Mode, MS_U8 eLPLL_Type, MS_U64 ldHz)
2449 {
2450 MS_U16 u16loop_div = 0;
2451 E_PNL_SUPPORTED_LPLL_TYPE u8SupportedLPLLLIndex = E_PNL_SUPPORTED_LPLL_MAX;
2452 #if defined (__aarch64__)
2453 PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]E_PNL_LPLL_VIDEO : eLPLL_Type=%u, u8LPLL_Mode=%u, ldHz=%lu\n", __FUNCTION__, __LINE__, eLPLL_Type, u8LPLL_Mode, ldHz);
2454 #else
2455 PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]E_PNL_LPLL_VIDEO : eLPLL_Type=%u, u8LPLL_Mode=%u, ldHz=%llu\n", __FUNCTION__, __LINE__, eLPLL_Type, u8LPLL_Mode, ldHz);
2456 #endif
2457 u8SupportedLPLLLIndex = _MHal_PNL_GetSupportedLPLLIndex(pInstance, eLPLL_Type,u8LPLL_Mode,ldHz,E_PNL_LPLL_VIDEO);
2458
2459 if (u8SupportedLPLLLIndex == E_PNL_SUPPORTED_LPLL_MAX)
2460 {
2461 printf("[%s,%5d] Error LPLL type\n",__FUNCTION__,__LINE__);
2462 u16loop_div = 0 ;
2463 }
2464 else
2465 {
2466 u16loop_div = u16LoopDiv[u8SupportedLPLLLIndex];
2467 }
2468 PNL_DBG(PNL_DBGLEVEL_INIT, "E_PNL_LPLL_VIDEO : u16loop_div=%u\n", u16loop_div);
2469
2470 u16loop_div *= 2;
2471 return u16loop_div;
2472 }
2473
MHal_PNL_Get_LPLL_LoopGain(void * pInstance,MS_U8 eLPLL_Mode,MS_U8 eLPLL_Type,MS_U64 ldHz)2474 MS_U16 MHal_PNL_Get_LPLL_LoopGain(void *pInstance, MS_U8 eLPLL_Mode, MS_U8 eLPLL_Type, MS_U64 ldHz)
2475 {
2476 MS_U16 u16loop_gain = 0;
2477 E_PNL_SUPPORTED_LPLL_TYPE u8SupportedLPLLLIndex = E_PNL_SUPPORTED_LPLL_MAX;
2478 #if defined (__aarch64__)
2479 PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]E_PNL_LPLL_VIDEO : eLPLL_Type=%u, eLPLL_Mode=%u, ldHz=%lu\n", __FUNCTION__, __LINE__, eLPLL_Type, eLPLL_Mode, ldHz);
2480 #else
2481 PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]E_PNL_LPLL_VIDEO : eLPLL_Type=%u, eLPLL_Mode=%u, ldHz=%llu\n", __FUNCTION__, __LINE__, eLPLL_Type, eLPLL_Mode, ldHz);
2482 #endif
2483 u8SupportedLPLLLIndex = _MHal_PNL_GetSupportedLPLLIndex(pInstance, eLPLL_Type,eLPLL_Mode,ldHz,E_PNL_LPLL_VIDEO);
2484
2485 if (u8SupportedLPLLLIndex == E_PNL_SUPPORTED_LPLL_MAX)
2486 {
2487 printf("[%s,%5d] Error LPLL type\n",__FUNCTION__,__LINE__);
2488 u16loop_gain = 0 ;
2489 }
2490 else
2491 {
2492 u16loop_gain = u16LoopGain[u8SupportedLPLLLIndex];
2493 }
2494 PNL_DBG(PNL_DBGLEVEL_INIT, "E_PNL_LPLL_VIDEO : u16loop_gain=%u\n", u16loop_gain);
2495 return u16loop_gain;
2496 }
2497
2498 #define SKIP_TIMING_CHANGE_CAP TRUE
Hal_PNL_SkipTimingChange_GetCaps(void * pInstance)2499 MS_BOOL Hal_PNL_SkipTimingChange_GetCaps(void *pInstance)
2500 {
2501 #if (SKIP_TIMING_CHANGE_CAP)
2502 return TRUE;
2503 #else
2504 return FALSE;
2505 #endif
2506 }
2507
MHal_PNL_PreSetModeOn(void * pInstance,MS_BOOL bSetMode)2508 void MHal_PNL_PreSetModeOn(void *pInstance, MS_BOOL bSetMode)
2509 {
2510 if (bSetMode == TRUE)
2511 {
2512 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_77_L, 0, BIT(15)); //software reset, 0:reset
2513 }
2514 else
2515 {
2516 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_77_L, BIT(15), BIT(15));
2517 }
2518 }
2519
MHal_PNL_HWLVDSReservedtoLRFlag(void * pInstance,PNL_DrvHW_LVDSResInfo lvdsresinfo)2520 void MHal_PNL_HWLVDSReservedtoLRFlag(void *pInstance, PNL_DrvHW_LVDSResInfo lvdsresinfo)
2521 {
2522 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
2523 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
2524 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
2525 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
2526
2527 if (lvdsresinfo.bEnable)
2528 {
2529 if (lvdsresinfo.u16channel & BIT(0)) // Channel A
2530 {
2531 if (lvdsresinfo.u32pair & BIT(3)) // pair 3
2532 {
2533 MOD_W2BYTEMSK(REG_MOD_BK00_04_L, BIT(15), BIT(15));
2534 }
2535 if (lvdsresinfo.u32pair & BIT(4)) // pair 4
2536 {
2537 MOD_W2BYTEMSK(REG_MOD_BK00_04_L, BIT(14), BIT(14));
2538 }
2539 }
2540 if (lvdsresinfo.u16channel & BIT(1)) // Channel B
2541 {
2542 if (lvdsresinfo.u32pair & BIT(3)) // pair 3
2543 {
2544 MOD_W2BYTEMSK(REG_MOD_BK00_04_L, BIT(13), BIT(13));
2545 }
2546 if (lvdsresinfo.u32pair & BIT(4)) // pair 4
2547 {
2548 MOD_W2BYTEMSK(REG_MOD_BK00_04_L, BIT(12), BIT(12));
2549 }
2550 }
2551
2552 if( IsVBY1(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type) )
2553 {
2554 MOD_W2BYTEMSK(REG_MOD_BK00_54_L, BIT(10), BIT(10)); //reg_sel_ext_bit: sel extend bit, 0: osd_de 1: three_d_flag
2555 }
2556 }
2557 else
2558 {
2559 MOD_W2BYTEMSK(REG_MOD_BK00_04_L, 0x0000, (BIT(15) | BIT(14) | BIT(13) | BIT(12)));
2560
2561 if( IsVBY1(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type) )
2562 {
2563 MOD_W2BYTEMSK(REG_MOD_BK00_54_L, 0x00, BIT(10)); //reg_sel_ext_bit: sel extend bit, 0: osd_de 1: three_d_flag
2564 }
2565 }
2566 }
2567
2568 ////////////////////////////////////////////////////////////////////////
2569 // Turn OD function
2570 ////////////////////////////////////////////////////////////////////////
MHal_PNL_OverDriver_Init(void * pInstance,MS_PHY u32OD_MSB_Addr,MS_PHY u32OD_MSB_limit,MS_PHY u32OD_LSB_Addr,MS_PHY u32OD_LSB_limit,MS_U8 u8MIUSel)2571 void MHal_PNL_OverDriver_Init(void *pInstance, MS_PHY u32OD_MSB_Addr, MS_PHY u32OD_MSB_limit, MS_PHY u32OD_LSB_Addr, MS_PHY u32OD_LSB_limit, MS_U8 u8MIUSel)
2572 {
2573 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
2574 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
2575 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK16_61_L,u8MIUSel<<8,BIT(8)|BIT(9)); // OD MIU select
2576
2577 SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_15_L, (MS_U16)(u32OD_MSB_Addr & 0xFFFF)); // OD MSB request base address
2578 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_16_L, (MS_U16)((u32OD_MSB_Addr >> 16) & 0x00FF), 0x00FF); // OD MSB request base address
2579 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_60_L, (MS_U16)((u32OD_MSB_Addr >> 24) & 0x0003), 0x0003); // OD MSB request base address
2580 SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_17_L, (MS_U16)(u32OD_MSB_limit & 0xFFFF)); // OD MSB request address limit
2581 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_18_L, (MS_U16)((u32OD_MSB_limit >> 16) & 0x00FF), 0x00FF); // OD MSB request address limit
2582 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_60_L, (MS_U16)((u32OD_MSB_limit >> 24) & 0x0003)<<2, 0x000C); // OD MSB request address limit
2583 SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_39_L, (MS_U16)(u32OD_LSB_limit & 0xFFFF)); // OD frame buffer write address limit
2584 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_3A_L, (MS_U16)((u32OD_LSB_limit >> 16) & 0x00FF), 0x00FF); // OD frame buffer write address limit
2585 SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_3B_L, (MS_U16)(u32OD_LSB_limit & 0xFFFF)); // OD frame buffer read address limit
2586 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_3C_L, (MS_U16)((u32OD_LSB_limit >> 16) & 0x00FF), 0x00FF); // OD frame buffer read address limit
2587 SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_4F_L, (MS_U16)(u32OD_LSB_Addr & 0xFFFF)); // OD LSB request base address
2588 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_50_L, (MS_U16)((u32OD_LSB_Addr >> 16) & 0x00FF), 0x00FF); // OD LSB request base address
2589 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_50_L, (MS_U16)((u32OD_LSB_limit & 0x00FF) << 8), 0xFF00); // OD LSB request limit address
2590 SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_51_L, (MS_U16)((u32OD_LSB_limit >> 8) & 0xFFFF)); // OD LSB request limit address
2591
2592 SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_1A_L, 0x4020); // OD request rFIFO limit threshold, priority threshold
2593 SC_W2BYTE(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_1C_L, 0x4020); // OD request wFIFO limit threshold, priority threshold
2594 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_3A_L, 0x00, BIT(14)); // OD strength gradually bypass
2595 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_3A_L, 0x2F00, 0x3F00); // OD strength gradually slop
2596 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_12_L, 0x0C, 0xFF); // OD active threshold
2597
2598 }
2599
MHal_PNL_OverDriver_Enable(void * pInstance,MS_BOOL bEnable)2600 void MHal_PNL_OverDriver_Enable(void *pInstance, MS_BOOL bEnable)
2601 {
2602 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
2603 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
2604
2605 // When OD enable, disable OD/RGBW SRAM PowerDown.
2606 #ifdef CONFIG_MSTAR_SRAMPD
2607 if(pPNLInstancePrivate->u32DeviceID == 0)
2608 {
2609 if(bEnable)
2610 {
2611 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_10_L, 0, BIT(0)); //OD SRAM PD Enable : SC_SPD_BK3F_10[0]
2612 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_50_L, BIT(8), BIT(8)); //OD Clock gate : ~SC_SPD_BK3F_50[8]
2613 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, 0, BIT(15)); //OD Bypass Enable :SC_OD_BK16_6F[15]
2614 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_10_L, 0, BIT(1)); // RGBW SRAM PD Enable : SC_SPD_BK3F_10[1]
2615 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_50_L, BIT(9), BIT(9)); // RGBW Clock Gate : ~SC_SPD_BK3F_50[9]
2616 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, 0, BIT(12)); // RGBW bypass enable :SC_OD_BK16_6F[12]
2617 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, BIT(13), BIT(13)); // RGBW bypass enable : ~SC_OD_BK16_6F[13]
2618
2619 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_17_L, 0, BIT(0)); //M+ SRAM PD Enable : SC_SPD_BK3F_17[0]
2620 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_50_L, BIT(10), BIT(10)); //M+ Clock gate : ~SC_SPD_BK3F_50[10]
2621 //SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L,0 , BIT(12)); // M+ bypass enable :SC_OD_BK16_6F[12]
2622 //SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, 0, BIT(13)); // M+ bypass enable : ~SC_OD_BK16_6F[13]
2623
2624 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_0B_L, 0, BIT(4)); //Demura SRAM PD Enable : SC_SPD_BK3F_0B[4]
2625 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK77_26_L, 0, BIT(14)); //Demura Clock Gate : SC_BK77_26[14]
2626 W2BYTEMSK(REG_RVD_45_L, 0, BIT(0)); //Demura Clock gate : BK100A_CLKGEN2_45[0]
2627 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK77_26_L, 0, BIT(15)); //Demura Clock Gate : SC_BK77_26[15]
2628 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_0B_L, 0, BIT(5)); //DGA_GAMMA SRAM PD Enable : SC_SPD_BK3F_0B[5]
2629 }
2630 else
2631 {
2632 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_10_L, BIT(0), BIT(0)); //OD SRAM PD Enable : SC_SPD_BK3F_10[0]
2633 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_50_L, 0, BIT(8)); //OD Clock gate : ~SC_SPD_BK3F_50[8]
2634 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, BIT(15), BIT(15)); //OD Bypass Enable :SC_OD_BK16_6F[15]
2635 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_10_L, BIT(1), BIT(1)); // RGBW SRAM PD Enable : SC_SPD_BK3F_10[1]
2636 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_50_L, 0, BIT(9)); // RGBW Clock Gate : ~SC_SPD_BK3F_50[9]
2637 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, BIT(12), BIT(12)); // RGBW bypass enable :SC_OD_BK16_6F[12]
2638 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, 0, BIT(13)); // RGBW bypass enable : ~SC_OD_BK16_6F[13]
2639
2640 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_17_L, BIT(0), BIT(0)); //M+ SRAM PD Enable : SC_SPD_BK3F_17[0]
2641 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_50_L, 0, BIT(10)); //M+ Clock gate : ~SC_SPD_BK3F_50[10]
2642 //SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L,0 , BIT(12)); // M+ bypass enable :SC_OD_BK16_6F[12]
2643 //SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, 0, BIT(13)); // M+ bypass enable : ~SC_OD_BK16_6F[13]
2644
2645 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_0B_L, BIT(4), BIT(4)); //Demura SRAM PD Enable : SC_SPD_BK3F_0B[4]
2646 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK77_26_L, BIT(14), BIT(14)); //Demura Clock Gate : SC_BK77_26[14]
2647 W2BYTEMSK(REG_RVD_45_L, BIT(0), BIT(0)); //Demura Clock gate : BK100A_CLKGEN2_45[0]
2648 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK77_26_L, BIT(15), BIT(15)); //Demura Clock Gate : SC_BK77_26[15]
2649 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_0B_L, BIT(5), BIT(5)); //DGA_GAMMA SRAM PD Enable : SC_SPD_BK3F_0B[5]
2650 }
2651 }
2652 #endif
2653
2654 // OD mode
2655 // OD used user weight to output blending directly
2656 // OD Enable
2657 if (bEnable)
2658 {
2659 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_10_L, 0x2D, 0x2F);
2660 }
2661 else
2662 {
2663 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_10_L, 0x2C, 0x2F);
2664 }
2665 }
2666
MHal_PNL_OverDriver_TBL(void * pInstance,MS_U8 u8ODTbl[1056])2667 void MHal_PNL_OverDriver_TBL(void *pInstance, MS_U8 u8ODTbl[1056])
2668 {
2669 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
2670 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
2671
2672 MS_U16 i;
2673 MS_U8 u8target;
2674 MS_BOOL bEnable;
2675
2676 bEnable = SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_10_L, BIT(0));
2677 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_10_L, 0x00, BIT(0)); // OD enable
2678 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_01_L, 0x0E, 0x0E); // OD table SRAM enable, RGB channel
2679
2680 u8target= u8ODTbl[9];
2681 for (i=0; i<272; i++)
2682 {
2683 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_03_L, (i == 9)?u8target:(u8target ^ u8ODTbl[i]), 0x00FF);
2684 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_02_L, (i|0x8000), 0x81FF);
2685 while(SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_02_L, BIT(15)));
2686 }
2687
2688 u8target= u8ODTbl[(272+19)];
2689 for (i=0; i<272; i++)
2690 {
2691 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_06_L, (i == 19)?u8target:(u8target ^ u8ODTbl[(272+i)]), 0x00FF);
2692 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_05_L, (i|0x8000), 0x81FF);
2693 while(SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_05_L, BIT(15)));
2694 }
2695
2696 u8target= u8ODTbl[(272*2+29)];
2697 for (i=0; i<256; i++)
2698 {
2699 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_09_L, (i == 29)?u8target:(u8target ^ u8ODTbl[(272*2+i)]), 0x00FF);
2700 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_08_L, (i|0x8000), 0x81FF);
2701 while(SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_08_L, BIT(15)));
2702 }
2703
2704 u8target= u8ODTbl[(272*2+256+39)];
2705 for (i=0; i<256; i++)
2706 {
2707 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_0C_L, (i == 39)?u8target:(u8target ^ u8ODTbl[(272*2+256+i)]), 0x00FF);
2708 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_0B_L, (i|0x8000), 0x81FF);
2709 while(SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_0D_L, BIT(15)));
2710 }
2711
2712 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_01_L, 0x00, 0x0E); // OD table SRAM enable, RGB channel
2713 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_10_L, bEnable, BIT(0)); // OD enable
2714 }
2715
_MHal_PNL_MOD_Swing_Refactor_AfterCAL(void * pInstance,MS_U16 u16Swing_Level)2716 MS_U16 _MHal_PNL_MOD_Swing_Refactor_AfterCAL(void *pInstance, MS_U16 u16Swing_Level)
2717 {
2718 MS_U8 u8ibcal = 0x00;
2719 MS_U16 u16AfterCal_value = 0;
2720 MS_U16 u16Cus_value = 0;
2721
2722 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
2723 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
2724 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
2725 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
2726 // =========
2727 // GCR_CAL_LEVEL[1:0] : REG_MOD_A_BK00_70_L =>
2728 // 2'b00 250mV ' GCR_ICON_CHx[5:0]=2'h15 (decimal 21)
2729 // 2'b01 350mV ' GCR_ICON_CHx[5:0]=2'h1F (decimal 31)
2730 // 2'b10 300mV ' GCR_ICON_CHx[5:0]=2'h1A (decimal 26)
2731 // 2'b11 200mV ' GCR_ICON_CHx[5:0]=2'h10 (decimal 16)
2732 // =========
2733 switch(pPNLResourcePrivate->sthalPNL._u8MOD_CALI_TARGET)
2734 {
2735 default:
2736 case 0:
2737 u8ibcal = 0x15;
2738 break;
2739 case 1:
2740 u8ibcal = 0x1F;
2741 break;
2742 case 2:
2743 u8ibcal = 0x1A;
2744 break;
2745 case 3:
2746 u8ibcal = 0x10;
2747 break;
2748 }
2749 u16Cus_value = (u16Swing_Level) * (pPNLResourcePrivate->sthalPNL._u8MOD_CALI_VALUE + 4)/(u8ibcal + 4);
2750 u16AfterCal_value = (u16Cus_value-40)/10+2;
2751
2752 HAL_MOD_CAL_DBG(printf("\r\n--Swing value after refactor = %d\n", u16AfterCal_value));
2753
2754 return u16AfterCal_value;
2755 }
2756
MHal_PNL_MODSwingRegToRealLevelValue(void * pInstance,MS_U16 u16SwingRegValue)2757 MS_U16 MHal_PNL_MODSwingRegToRealLevelValue(void *pInstance, MS_U16 u16SwingRegValue)
2758 {
2759 MS_U8 u8ibcal = 0x00;
2760 MS_U16 u16SwingRealLevelValue = 0;
2761 MS_U16 u16CusValue = 0;
2762 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
2763 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
2764 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
2765 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
2766 // =========
2767 // GCR_CAL_LEVEL[1:0] : REG_MOD_A_BK00_70_L =>
2768 // 2'b00 250mV ' GCR_ICON_CHx[5:0]=2'h15 (decimal 21)
2769 // 2'b01 350mV ' GCR_ICON_CHx[5:0]=2'h1F (decimal 31)
2770 // 2'b10 300mV ' GCR_ICON_CHx[5:0]=2'h1A (decimal 26)
2771 // 2'b11 200mV ' GCR_ICON_CHx[5:0]=2'h10 (decimal 16)
2772 // =========
2773 switch(pPNLResourcePrivate->sthalPNL._u8MOD_CALI_TARGET)
2774 {
2775 default:
2776 case 0:
2777 u8ibcal = 0x15;
2778 break;
2779 case 1:
2780 u8ibcal = 0x1F;
2781 break;
2782 case 2:
2783 u8ibcal = 0x1A;
2784 break;
2785 case 3:
2786 u8ibcal = 0x10;
2787 break;
2788 }
2789
2790 u16CusValue = ((u16SwingRegValue-2)*10)+40;
2791 u16SwingRealLevelValue=(u16CusValue*(u8ibcal + 4))/(pPNLResourcePrivate->sthalPNL._u8MOD_CALI_VALUE + 4);
2792
2793 HAL_MOD_CAL_DBG(printf("\r\n--Swing Real Level Value = %d\n", u16SwingRealLevelValue));
2794
2795 return u16SwingRealLevelValue;
2796 }
2797
MHal_PNL_MOD_Control_Out_Swing(void * pInstance,MS_U16 u16Swing_Level)2798 MS_BOOL MHal_PNL_MOD_Control_Out_Swing(void *pInstance, MS_U16 u16Swing_Level)
2799 {
2800 MS_BOOL bStatus = FALSE;
2801
2802 MS_U16 u16ValidSwing = 0;
2803 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
2804 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
2805 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
2806 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
2807
2808 if((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_LVDS)||
2809 (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_HS_LVDS))
2810 {
2811 if(u16Swing_Level>600)
2812 u16Swing_Level=600;
2813 if(u16Swing_Level<40)
2814 u16Swing_Level=40;
2815
2816 u16ValidSwing = _MHal_PNL_MOD_Swing_Refactor_AfterCAL(pInstance, u16Swing_Level);
2817 }
2818 else
2819 {
2820 u16ValidSwing = u16Swing_Level;
2821 }
2822
2823 // Disable HW calibration keep mode first, to make SW icon value can write into register.
2824 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_7A_L, 0, BIT(15));
2825
2826 u16ValidSwing &=0x0F;
2827 // LVDS fill ICON
2828 // ch0+ch1+ch2+ch3
2829 MOD_A_W2BYTE(REG_MOD_A_BK00_50_L, (u16ValidSwing << 12 | u16ValidSwing << 8 | u16ValidSwing << 4 | u16ValidSwing));
2830 // ch4+ch5+ch6+ch7
2831 MOD_A_W2BYTE(REG_MOD_A_BK00_51_L, (u16ValidSwing << 12 | u16ValidSwing << 8 | u16ValidSwing << 4 | u16ValidSwing));
2832 // ch8+ch9+ch10+ch11
2833 MOD_A_W2BYTE(REG_MOD_A_BK00_52_L, (u16ValidSwing << 12 | u16ValidSwing << 8 | u16ValidSwing << 4 | u16ValidSwing));
2834 // ch12+ch13+ch14+ch15
2835 MOD_A_W2BYTE(REG_MOD_A_BK00_53_L, (u16ValidSwing << 12 | u16ValidSwing << 8 | u16ValidSwing << 4 | u16ValidSwing));
2836
2837 bStatus = TRUE;
2838
2839 return bStatus;
2840 }
2841
2842 ////////////////////////////////////////////////////////////////////////
2843 // Turn Pre-Emphasis Current function
2844 ////////////////////////////////////////////////////////////////////////
MHal_PNL_MOD_Control_Out_PE_Current(void * pInstance,MS_U16 u16Current_Level)2845 MS_BOOL MHal_PNL_MOD_Control_Out_PE_Current (void *pInstance, MS_U16 u16Current_Level)
2846 {
2847 MS_BOOL bStatus = FALSE;
2848 MS_U16 u16ValidCurrent = u16Current_Level & 0x0F;
2849
2850 MOD_A_W2BYTE(REG_MOD_A_BK00_22_L,
2851 ( (u16ValidCurrent ) |(u16ValidCurrent << 4 )|(u16ValidCurrent << 8 )
2852 |(u16ValidCurrent << 12 )));
2853
2854 MOD_A_W2BYTE(REG_MOD_A_BK00_23_L,
2855 ( (u16ValidCurrent ) |(u16ValidCurrent << 4 )|(u16ValidCurrent << 8 )
2856 |(u16ValidCurrent << 12 )));
2857
2858 MOD_A_W2BYTE(REG_MOD_A_BK00_24_L,
2859 ( (u16ValidCurrent ) |(u16ValidCurrent << 4 )|(u16ValidCurrent << 8 )
2860 |(u16ValidCurrent << 12 )));
2861
2862 MOD_A_W2BYTE(REG_MOD_A_BK00_25_L,
2863 ( (u16ValidCurrent ) |(u16ValidCurrent << 4 )|(u16ValidCurrent << 8 )
2864 |(u16ValidCurrent << 12 )));
2865
2866 bStatus = TRUE;
2867
2868 return bStatus;
2869 }
2870
MHal_PNL_MOD_PECurrent_Setting(void * pInstance,MS_U16 u16Current_Level,MS_U16 u16Channel_Select)2871 void MHal_PNL_MOD_PECurrent_Setting(void *pInstance, MS_U16 u16Current_Level, MS_U16 u16Channel_Select)
2872 {
2873 MS_U16 u16ValidCurrent = u16Current_Level & 0x0F;
2874 MS_U16 u16Ch00_03_mask,u16Ch04_07_mask,u16Ch08_11_mask,u16Ch12_15_mask = 0;
2875
2876 u16Ch00_03_mask = (((u16Channel_Select & BIT(0))? 0x000F:0x00)|((u16Channel_Select & BIT(1))? 0x00F0:0x00)
2877 |((u16Channel_Select & BIT(2))? 0x0F00:0x00)|((u16Channel_Select & BIT(3))? 0xF000:0x00));
2878 u16Ch04_07_mask = (((u16Channel_Select & BIT(4))? 0x000F:0x00)|((u16Channel_Select & BIT(5))? 0x00F0:0x00)
2879 |((u16Channel_Select & BIT(6))? 0x0F00:0x00)|((u16Channel_Select & BIT(7))? 0xF000:0x00));
2880 u16Ch08_11_mask = (((u16Channel_Select & BIT(8))? 0x000F:0x00)|((u16Channel_Select & BIT(9))? 0x00F0:0x00)
2881 |((u16Channel_Select & BIT(10))? 0x0F00:0x00)|((u16Channel_Select & BIT(11))? 0xF000:0x00));
2882 u16Ch12_15_mask = (((u16Channel_Select & BIT(12))? 0x000F:0x00)|((u16Channel_Select & BIT(13))? 0x00F0:0x00)
2883 |((u16Channel_Select & BIT(14))? 0x0F00:0x00)|((u16Channel_Select & BIT(15))? 0xF000:0x00));
2884
2885 if(u16Ch00_03_mask)
2886 {
2887 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_22_L,
2888 ((u16ValidCurrent)|(u16ValidCurrent << 4)|(u16ValidCurrent << 8)|(u16ValidCurrent << 12 )), u16Ch00_03_mask);
2889 }
2890 else
2891 {
2892 MOD_A_W2BYTE(REG_MOD_A_BK00_22_L,0x00);
2893 }
2894
2895 if(u16Ch04_07_mask)
2896 {
2897 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_23_L,
2898 ((u16ValidCurrent)|(u16ValidCurrent << 4)|(u16ValidCurrent << 8)|(u16ValidCurrent << 12 )), u16Ch04_07_mask);
2899 }
2900 else
2901 {
2902 MOD_A_W2BYTE(REG_MOD_A_BK00_23_L,0x00);
2903 }
2904
2905 if(u16Ch08_11_mask)
2906 {
2907 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_24_L,
2908 ((u16ValidCurrent)|(u16ValidCurrent << 4)|(u16ValidCurrent << 8)|(u16ValidCurrent << 12 )), u16Ch08_11_mask);
2909 }
2910 else
2911 {
2912 MOD_A_W2BYTE(REG_MOD_A_BK00_24_L,0x00);
2913 }
2914
2915 if(u16Ch12_15_mask)
2916 {
2917 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_25_L,
2918 ((u16ValidCurrent)|(u16ValidCurrent << 4)|(u16ValidCurrent << 8)|(u16ValidCurrent << 12 )), u16Ch12_15_mask);
2919 }
2920 else
2921 {
2922 MOD_A_W2BYTE(REG_MOD_A_BK00_25_L,0x00);
2923 }
2924 }
2925
2926 ////////////////////////////////////////////////////////////////////////
2927 // 1.Turn TTL low-power mode function
2928 // 2.Turn internal termination function
2929 // 3.Turn DRIVER BIAS OP function
2930 ////////////////////////////////////////////////////////////////////////
MHal_PNL_MOD_Control_Out_TTL_Resistor_OP(void * pInstance,MS_BOOL bEnble)2931 MS_BOOL MHal_PNL_MOD_Control_Out_TTL_Resistor_OP (void *pInstance, MS_BOOL bEnble)
2932 {
2933 MS_BOOL bStatus = FALSE;
2934 if(bEnble)
2935 {
2936 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_0A_L, 0xFFFF, 0xFFFF); //Enable TTL low-power mode
2937
2938 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_06_L, 0xFFFF, 0xFFFF); //GCR_EN_RINT (internal termination open)
2939
2940 //MOD_W2BYTEMSK(REG_MOD_BK00_76_L, 0x003F, 0x003F);// can not find in Manhattan register table
2941
2942 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_08_L, 0xFFFF, 0xFFFF); //Disable DRIVER BIAS OP
2943 MOD_W2BYTEMSK(REG_MOD_BK00_5E_L, 0x003F, 0x003F);
2944 }
2945 else
2946 {
2947 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_34_L, 0x0000, 0xFFFF); //Disable TTL low-power mode
2948 // MOD_A_W2BYTEMSK(REG_MOD_A_BK00_39_L, 0x0000, 0x001E);
2949
2950 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_06_L, 0x0000, 0xFFFF); //GCR_EN_RINT (internal termination close)
2951 MOD_W2BYTEMSK(REG_MOD_BK00_76_L, 0x0000, 0x003F);
2952
2953 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_08_L, 0x0000, 0xFFFF); //Enable DRIVER BIAS OP
2954 MOD_W2BYTEMSK(REG_MOD_BK00_5E_L, 0x0000, 0x003F);
2955 }
2956
2957 bStatus = TRUE;
2958 return bStatus;
2959 }
2960
MHal_PNL_PreInit(void * pInstance,PNL_OUTPUT_MODE eParam)2961 void MHal_PNL_PreInit(void *pInstance, PNL_OUTPUT_MODE eParam)
2962 {
2963 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
2964 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
2965 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
2966 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
2967 pPNLResourcePrivate->sthalPNL._eDrvPnlInitOptions = eParam;
2968 }
2969
MHal_PNL_Get_Output_MODE(void * pInstance)2970 PNL_OUTPUT_MODE MHal_PNL_Get_Output_MODE(void *pInstance)
2971 {
2972 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
2973 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
2974 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
2975 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
2976 PNL_OUTPUT_MODE eParam = pPNLResourcePrivate->sthalPNL._eDrvPnlInitOptions;
2977
2978 return eParam;
2979 }
2980
msReadEfuse(void * pInstance,MS_U8 u8Bank,MS_U32 u32Mask)2981 MS_U32 msReadEfuse(void *pInstance, MS_U8 u8Bank, MS_U32 u32Mask)
2982 {
2983 MS_U32 u32Result = 0;
2984 MS_U8 u8Count = 0;
2985
2986 W2BYTEMSK(0x2050, u8Bank<<2, BMASK(8:2)); /// reg28[8:2]Addr 6~0
2987 W2BYTEMSK(0x2050, BIT(13), BIT(13)); /// Reg28[13] Margin Read
2988 while(R2BYTEMSK(0x2050, BIT(13)) == BIT(13))
2989 {
2990 MsOS_DelayTask(1);
2991 u8Count ++;
2992
2993 if (u8Count >10)
2994 break;
2995 }
2996
2997 u32Result = (R4BYTE(0x2058)& u32Mask); /// reg2C,2D read value
2998 printf("[%s][%d]u32Result=%tx, after mask u32Result=%tx\n", __FUNCTION__, __LINE__,(ptrdiff_t) R4BYTE(0x2058), (ptrdiff_t)u32Result);
2999 return u32Result;
3000
3001 }
3002
msSetVBY1RconValue(void * pInstance)3003 void msSetVBY1RconValue(void *pInstance)
3004 {
3005 MS_U16 u16DefaultICON_Max = 40, u16DefaultICON_Min = 7;
3006 MS_U16 u16DefaultICON = 18;
3007 MS_U32 u32Mask = 0x3F;
3008 MS_BOOL bEfuseMode = FALSE;
3009 MS_U16 u16SwingOffset = 0; // by HW RD request
3010 MS_U16 u16temp = 0;
3011
3012 if(!(_Hal_MOD_External_eFuse()))
3013 {
3014 if (msReadEfuse(pInstance, 0x4E, BIT(6)) == BIT(6))
3015 bEfuseMode = TRUE;
3016
3017
3018 // Disable HW calibration keep mode first, to make SW icon value can write into register.
3019 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_7A_L, 0, BIT(15));
3020
3021 if (bEfuseMode)
3022 {
3023 if(((MS_U16)msReadEfuse(pInstance, 0x4E, u32Mask) + u16SwingOffset) > u16DefaultICON_Max)
3024 u16temp = u16DefaultICON;
3025 else if(((MS_U16)msReadEfuse(pInstance, 0x4E, u32Mask) + u16SwingOffset) < u16DefaultICON_Min)
3026 u16temp = u16DefaultICON;
3027 else
3028 u16temp = (MS_U16)msReadEfuse(pInstance, 0x4E, u32Mask) + u16SwingOffset;
3029 }
3030 else
3031 {
3032 u16temp = u16DefaultICON;
3033 }
3034
3035 //ch0~ch13 rcon setting
3036 u16temp &= (u16temp&(MS_U16)u32Mask);
3037 printf("[%s][%d]u16temp= %x\n", __FUNCTION__, __LINE__, u16temp);
3038
3039 MOD_A_W2BYTE(REG_MOD_A_BK00_40_L, (u16temp<<8|u16temp));
3040 MOD_A_W2BYTE(REG_MOD_A_BK00_41_L, (u16temp<<8|u16temp));
3041 MOD_A_W2BYTE(REG_MOD_A_BK00_42_L, (u16temp<<8|u16temp));
3042 MOD_A_W2BYTE(REG_MOD_A_BK00_43_L, (u16temp<<8|u16temp));
3043 MOD_A_W2BYTE(REG_MOD_A_BK00_44_L, (u16temp<<8|u16temp));
3044 MOD_A_W2BYTE(REG_MOD_A_BK00_45_L, (u16temp<<8|u16temp));
3045 MOD_A_W2BYTE(REG_MOD_A_BK00_46_L, (u16temp<<8|u16temp));
3046 MOD_A_W2BYTE(REG_MOD_A_BK00_47_L, (u16temp<<8|u16temp));
3047 }
3048 }
3049
MHal_PNL_SetOutputType(void * pInstance,PNL_OUTPUT_MODE eOutputMode,PNL_TYPE eLPLL_Type)3050 void MHal_PNL_SetOutputType(void *pInstance, PNL_OUTPUT_MODE eOutputMode, PNL_TYPE eLPLL_Type)
3051 {
3052 MS_U16 u16ValidSwing2 = 0;
3053 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
3054 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
3055 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
3056 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
3057 if( eLPLL_Type == E_PNL_TYPE_TTL)
3058 {
3059 // select pair output to be TTL
3060 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x2000,0x2000);
3061 MsOS_DelayTask(1);
3062 MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0x0000);
3063 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0000);
3064 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x0000,0x2000);
3065
3066 // other TTL setting
3067 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6B_L, 0x0000,0x0FF0);
3068 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_74_L, 0x0000,0xFF00);
3069
3070
3071 MOD_A_W2BYTE(REG_MOD_A_BK00_66_L, 0x0000);
3072 MOD_A_W2BYTE(REG_MOD_A_BK00_67_L, 0x0000);
3073 //MOD_W2BYTEMSK(REG_MOD_BK00_5D_L, 0x0000, 0xE000);//just debug status in Manhattan
3074
3075 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_74_L, (BIT(3)|BIT(2)), (BIT(3)|BIT(2))); // TTL skew: G
3076 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_74_L, (BIT(5)|BIT(4)), (BIT(5)|BIT(4))); // TTL skew: B
3077
3078 }
3079 else if(( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_16LANE)||
3080 ( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_8LANE)||
3081 ( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_4LANE)||
3082 ( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_2LANE)||
3083 ( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_1LANE))
3084 {
3085 // rcon
3086 if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.u32PNL_MISC & (MS_U32)E_APIPNL_MISC_SKIP_ICONVALUE)
3087 {
3088 HAL_MOD_CAL_DBG(printf("User define Swing Value=%u\n", __FUNCTION__, __LINE__, pPNLResourcePrivate->sthalPNL._u16PnlDefault_SwingLevel));
3089 MHal_PNL_MOD_Control_Out_Swing(pInstance, pPNLResourcePrivate->sthalPNL._u16PnlDefault_SwingLevel);
3090 }
3091 else
3092 {
3093 HAL_MOD_CAL_DBG(printf("Use RconValue\n", __FUNCTION__, __LINE__));
3094 msSetVBY1RconValue(pInstance);
3095 }
3096
3097 //reg_gcr_en_rint_ch: enable double termination function
3098 MOD_A_W2BYTE(REG_MOD_A_BK00_06_L, 0x0000);
3099
3100 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6B_L, 0x03F0,0x0FF0);
3101 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_74_L, 0x0000,0xFF00);
3102
3103 // manhattan: reg_1ms_cnt/when 12MHz xtal clock, count 12000 times is 1ms
3104 // maserati : reg_mod_dummy2
3105 MOD_A_W2BYTE(REG_MOD_A_BK00_7F_L, 0xFFFF);
3106
3107 // mod_a_77[1]: reg_vby1_ctrl_mode, select Hdtpn/Lockn is from Atop or PAD 1: from atop 0: from PAD
3108 //MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x0000,BIT(1)); // there is no data when soc change mod output timing, so mark this setting
3109
3110 MOD_W2BYTE(REG_MOD_BK00_61_L, 0x8F3F); //[15]all dk scr[13:8]aln_de_cnt [7:0] aln_pix_cnt
3111
3112 MOD_A_W2BYTE(REG_MOD_A_BK00_66_L, 0xFFFF);
3113 MOD_A_W2BYTE(REG_MOD_A_BK00_67_L, 0xFFFF);
3114 MOD_A_W2BYTE(REG_MOD_A_BK00_68_L, 0xFFFF);
3115 MOD_A_W2BYTE(REG_MOD_A_BK00_69_L, 0xFFFF);
3116
3117 // reg 60/61:reg_gpo_oez, Disable TTL output
3118 MOD_A_W2BYTE(REG_MOD_A_BK00_60_L, 0xFFFF);
3119 MOD_A_W2BYTE(REG_MOD_A_BK00_61_L, 0xFFFF);
3120
3121 // reg 62/63:reg_gpo_datain, general purpose output data
3122 MOD_A_W2BYTE(REG_MOD_A_BK00_62_L, 0xFFFF);
3123 MOD_A_W2BYTE(REG_MOD_A_BK00_63_L, 0xFFFF);
3124
3125 switch(eOutputMode)
3126 {
3127 case E_PNL_OUTPUT_NO_OUTPUT:
3128 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x2000,0x2000);
3129 MsOS_DelayTask(1);
3130 MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0x0000);
3131 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0000);
3132 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x0000,0x2000);
3133 if(1)//( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_4LANE)
3134 {
3135 //-------------------------------------
3136 //## icon (Swing)
3137 MOD_A_W2BYTE(REG_MOD_A_BK00_30_L, 0x0000);
3138 MOD_A_W2BYTE(REG_MOD_A_BK00_31_L, 0x0000);
3139
3140 //-------------------------------------
3141 //vby1
3142 MOD_W2BYTE(REG_MOD_BK00_61_L, 0x8f3f); //[15]all dk scr[13:8]aln_de_cnt [7:0] aln_pix_cnt
3143 }
3144 else if( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_2LANE)
3145 {
3146 //-------------------------------------
3147 //## icon (Swing)
3148 MOD_A_W2BYTE(REG_MOD_A_BK00_30_L, 0x0000);
3149 MOD_A_W2BYTE(REG_MOD_A_BK00_31_L, 0x0000);
3150
3151 //vby1
3152 MOD_W2BYTE(REG_MOD_BK00_61_L, 0x8f3f);
3153 }
3154 break;
3155
3156 case E_PNL_OUTPUT_CLK_ONLY:
3157 case E_PNL_OUTPUT_DATA_ONLY:
3158 case E_PNL_OUTPUT_CLK_DATA:
3159 default:
3160 if(eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_16LANE)
3161 {
3162 if( APIPNL_OUTPUT_CHANNEL_ORDER_USER == pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType )
3163 {
3164 _MHal_PNL_Auto_Set_Config(pInstance,
3165 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3166 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3167 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3168 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3169
3170 _MHal_PNL_Set_Clk(pInstance,
3171 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType,
3172 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3173 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3174 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3175 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3176 }
3177 else
3178 {
3179 MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0x5555); //[15:0]reg_output_conf[15:0]
3180 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x5555); //[15:0]reg_output_conf[15:0]
3181 }
3182 }
3183 else if(eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_8LANE)
3184 {
3185 //MOD_A_W2BYTE(REG_MOD_A_BK00_3A_L, 0xC100);
3186 if( APIPNL_OUTPUT_CHANNEL_ORDER_USER == pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType )
3187 {
3188 _MHal_PNL_Auto_Set_Config(pInstance,
3189 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3190 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3191 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3192 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3193
3194 _MHal_PNL_Set_Clk(pInstance,
3195 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType,
3196 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3197 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3198 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3199 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3200 }
3201 else
3202 {
3203 MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0x5555); //[15:0]reg_output_conf[15:0]
3204 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0000); //[15:0]reg_output_conf[15:0]
3205 }
3206 }
3207 else if( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_4LANE)
3208 {
3209 //ori Manhattan: MOD_W2BYTE(REG_MOD_BK00_4A_L, 0x0002);
3210 MOD_W2BYTEMSK(REG_MOD_BK00_52_L, 0x0000, 0xC000); //[15]:reg_abswitch_l [14]:reg_abswitch_r
3211 MOD_W2BYTEMSK(REG_MOD_BK00_05_L, 0x0000, BIT(1));
3212
3213 MOD_A_W2BYTE(REG_MOD_A_BK00_32_L, 0x7f7f);
3214 MOD_A_W2BYTE(REG_MOD_A_BK00_33_L, 0x7f7f);
3215
3216 if( APIPNL_OUTPUT_CHANNEL_ORDER_USER == pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType )
3217 {
3218 _MHal_PNL_Auto_Set_Config(pInstance,
3219 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3220 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3221 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3222 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3223
3224 _MHal_PNL_Set_Clk(pInstance,
3225 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType,
3226 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3227 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3228 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3229 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3230 }
3231 else
3232 {
3233 MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0x0055); //[15:0]reg_output_conf[15:0]
3234 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0000); //[15:0]reg_output_conf[15:0]
3235 }
3236 }
3237 else if( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_2LANE )
3238 {
3239 //ori Manhattan: MOD_W2BYTE(REG_MOD_BK00_4A_L, 0x0000);
3240 MOD_W2BYTEMSK(REG_MOD_BK00_52_L, 0x0000, 0xC000); //[15]:reg_abswitch_l [14]:reg_abswitch_r
3241 MOD_W2BYTEMSK(REG_MOD_BK00_05_L, 0x0000, BIT(1));
3242
3243 MOD_A_W2BYTE(REG_MOD_A_BK00_32_L, 0x7f7f);
3244 MOD_A_W2BYTE(REG_MOD_A_BK00_33_L, 0x0000);
3245
3246 if( APIPNL_OUTPUT_CHANNEL_ORDER_USER == pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType )
3247 {
3248 _MHal_PNL_Auto_Set_Config(pInstance,
3249 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3250 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3251 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3252 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3253
3254 _MHal_PNL_Set_Clk(pInstance,
3255 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType,
3256 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3257 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3258 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3259 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3260 }
3261 else
3262 {
3263 MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0x0005);
3264 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0000); //[15:0]reg_output_conf[15:0]
3265 }
3266 }
3267 else if( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_1LANE ) //Maserati Raptor output 576p/480p case
3268 {
3269 //ori Manhattan: MOD_W2BYTE(REG_MOD_BK00_4A_L, 0x0000);
3270 MOD_W2BYTEMSK(REG_MOD_BK00_52_L, 0x0000, 0xC000); //[15]:reg_abswitch_l [14]:reg_abswitch_r
3271 MOD_W2BYTEMSK(REG_MOD_BK00_05_L, 0x0000, BIT(1));
3272
3273 MOD_A_W2BYTE(REG_MOD_A_BK00_32_L, 0x7f7f);
3274 MOD_A_W2BYTE(REG_MOD_A_BK00_33_L, 0x0000);
3275
3276 if( APIPNL_OUTPUT_CHANNEL_ORDER_USER == pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType )
3277 {
3278 _MHal_PNL_Auto_Set_Config(pInstance,
3279 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3280 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3281 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3282 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3283
3284 _MHal_PNL_Set_Clk(pInstance,
3285 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType,
3286 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3287 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3288 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3289 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3290 }
3291 else
3292 {
3293 MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0x0101);
3294 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0000); //[15:0]reg_output_conf[15:0]
3295 }
3296 }
3297 break;
3298 }
3299 }
3300 //// for osd dedicated output port, 1 port for video and 1 port for osd
3301 else if((eLPLL_Type == E_PNL_TYPE_HS_LVDS)&&
3302 (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Mode == E_PNL_MODE_SINGLE))
3303 {
3304 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, 0x001F , 0x001F); // enable clk_dot_mini_pre_osd & clk_dot_mini_osd
3305 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_10_L, BIT(13),BIT(13));
3306
3307 // enable osd lvds path
3308 MOD_W2BYTEMSK(REG_MOD_BK00_54_L, 0x0000, BIT(14) );
3309 MOD_W2BYTEMSK(REG_MOD_BK00_2E_L, BIT(10), BIT(10) );
3310 MOD_W2BYTEMSK(REG_MOD_BK00_05_L, 0x0000, BIT(12) );
3311 MOD_W2BYTEMSK(REG_MOD_BK00_00_L, 0x0000, BIT(0) );
3312 MOD_W2BYTEMSK(REG_MOD_BK00_51_L, 0x0000, (BIT(2)|BIT(3)|BIT(4)) );
3313
3314 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_77_L, BIT(0), BIT(0)); //[15]sw_rst
3315 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_10_L, 0x0C00 , 0x1F00); // enable clk_dot_mini_pre_osd & clk_dot_mini_osd
3316 }
3317 else
3318 {
3319 switch(eOutputMode)
3320 {
3321 case E_PNL_OUTPUT_NO_OUTPUT:
3322 // if MOD_45[5:0] = 0x3F && XC_MOD_EXT_DATA_EN_L = 0x0,
3323 // then if XC_MOD_OUTPUT_CONF_L = 0x0 ---> output TTL as tri-state
3324 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x2000,0x2000);
3325 MsOS_DelayTask(1);
3326 MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0x0000);
3327 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0000);
3328 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x0000,0x2000);
3329
3330 //----------------------------------
3331 // Purpose: Set the output to be the GPO, and let it's level to Low
3332 // 1. External Enable, Pair 0~5
3333 // 2. GPIO Enable, pair 0~5
3334 // 3. GPIO Output data : All low, pair 0~5
3335 // 4. GPIO OEZ: output piar 0~5
3336 //----------------------------------
3337
3338 //1.External Enable, Pair 0~5
3339 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_66_L, 0x0FFF, 0x0FFF);
3340 //2.GPIO Enable, pair 0~5
3341 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_68_L, 0x0FFF, 0x0FFF);
3342 //3.GPIO Output data : All low, pair 0~5
3343 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_62_L, 0x0000, 0x0FFF);
3344 //4.GPIO OEZ: output piar 0~5
3345 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_60_L, 0x0000, 0x0FFF);
3346
3347 //1.External Enable, Pair 6~15
3348 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_66_L, 0xF000, 0xF000);
3349 MOD_A_W2BYTE(REG_MOD_A_BK00_67_L, 0xFFFF);
3350 //2.GPIO Enable, pair 6~15
3351 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_68_L, 0xF000, 0xF000);
3352 MOD_A_W2BYTE(REG_MOD_A_BK00_69_L, 0xFFFF);
3353 //3.GPIO Output data : All low, pair 6~15
3354 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_62_L, 0x0000, 0xF000);
3355 MOD_A_W2BYTE(REG_MOD_A_BK00_63_L, 0x0000);
3356 //4.GPIO OEZ: output piar 6~15
3357 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_60_L, 0x0000, 0xF000);
3358 MOD_A_W2BYTE(REG_MOD_A_BK00_61_L, 0x0000);
3359
3360 //1234.External Enable, Pair 16~17
3361 //MOD_W2BYTE(REG_MOD_BK00_7E_L, 0xFF00);//remove in Manhattan
3362
3363 //1.External Enable, Pair 18~20, 2.GPIO Enable, pair 18~20
3364 MOD_W2BYTEMSK(REG_MOD_BK00_5C_L, 0x3F00, 0x3F00);
3365 MOD_W2BYTEMSK(REG_MOD_BK00_64_L, 0x003F, 0x003F);
3366 //3.GPIO Output data : All low, pair 18~20
3367 MOD_W2BYTEMSK(REG_MOD_BK00_5E_L, 0x0000, 0x3F00);
3368 //4.GPIO OEZ: output piar 18~20
3369 //MOD_W2BYTEMSK(REG_MOD_BK00_7F_L, 0x0000, 0xFC00); //remove in Manhattan
3370 break;
3371
3372 case E_PNL_OUTPUT_CLK_ONLY:
3373 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_18_L, 0, 0xF000);
3374 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x4004);
3375 break;
3376
3377 case E_PNL_OUTPUT_DATA_ONLY:
3378 case E_PNL_OUTPUT_CLK_DATA:
3379 default:
3380
3381 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_68_L, 0x0000, 0xF000);
3382 MOD_A_W2BYTE(REG_MOD_A_BK00_69_L, 0x0000);
3383 //1. set GCR_PVDD_2P5=1¡¦b1; MOD PVDD power: 1: 2.5V
3384 //MOD_A_W2BYTEMSK(REG_MOD_A_BK00_39_L, 0, BIT(6));
3385 //2. set PD_IB_MOD=1¡¦b0;
3386 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_01_L, 0x00, BIT(0));
3387 // save ch6 init value
3388 u16ValidSwing2 = (MOD_A_R2BYTEMSK(REG_MOD_A_BK00_33_L, 0x3F00)>>8);
3389 //3. set Desired Pairs: GCR_ICON[5:0]=6h3f (current all open);
3390 MHal_PNL_MOD_Control_Out_Swing(pInstance, MHal_PNL_MODSwingRegToRealLevelValue(pInstance, 0x3F));
3391 //4. set Desired Pairs: GCR_PE_ADJ[2:0]=3h7 (pre-emphasis current all open )
3392 MHal_PNL_MOD_Control_Out_PE_Current (pInstance, 0x07);
3393 //5. Enable low-power modeinternal termination Open, Enable OP
3394 MHal_PNL_MOD_Control_Out_TTL_Resistor_OP (pInstance, 1);
3395
3396 MsOS_DelayTask(1);
3397
3398 //6. Enable low-power modeinternal termination Open, Enable OP
3399 MHal_Output_LVDS_Pair_Setting(pInstance,
3400 pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type,
3401 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG0_7,
3402 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG8_15,
3403 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG16_21);
3404 MHal_Shift_LVDS_Pair(pInstance, pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Shift);
3405
3406 //7. set Desired Pairs: GCR_PE_ADJ[2:0]=3¡¦h0 (pre-emphasis current all Close)
3407 MHal_PNL_MOD_Control_Out_PE_Current (pInstance, 0x00);
3408 //8. set Desired Pairs: GCR_ICON[5:0] (current all init);
3409 MHal_PNL_MOD_Control_Out_Swing(pInstance, MHal_PNL_MODSwingRegToRealLevelValue(pInstance, u16ValidSwing2));
3410 //9. Disable low-power modeinternal termination Close, Disable OP
3411 MHal_PNL_MOD_Control_Out_TTL_Resistor_OP (pInstance, 0);
3412
3413 // other TTL setting
3414 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6B_L, 0x03F0,0x0FF0);// LVDS output enable, [5:4] Output enable: PANEL_LVDS/ PANEL_miniLVDS/ PANEL_RSDS
3415 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_74_L, 0x0000,0xFF00);
3416
3417 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_66_L, 0x0000, 0xF000);
3418 MOD_A_W2BYTE(REG_MOD_A_BK00_67_L, 0x0000);
3419
3420 //MOD_W2BYTEMSK(REG_MOD_BK00_7E_L, 0x0000, 0x000F); //remove in Manhattan
3421
3422 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_74_L, 0x0000, (BIT(3)|BIT(2))); // TTL skew: G
3423 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_74_L, 0x0000, (BIT(5)|BIT(4))); // TTL skew: B
3424
3425 break;
3426 }
3427 }
3428
3429 // MHal_PNL_Bringup(pInstance);
3430 }
3431
Mhal_PNL_Flock_LPLLSet(void * pInstance,MS_U64 ldHz)3432 void Mhal_PNL_Flock_LPLLSet(void *pInstance, MS_U64 ldHz)
3433 {
3434 UNUSED(ldHz);
3435 }
3436
MHal_PNL_MISC_Control(void * pInstance,MS_U32 u32PNL_MISC)3437 void MHal_PNL_MISC_Control(void *pInstance, MS_U32 u32PNL_MISC)
3438 {
3439 UNUSED(u32PNL_MISC);
3440 }
3441
MHal_PNL_Init_XC_Clk(void * pInstance,PNL_InitData * pstPanelInitData)3442 void MHal_PNL_Init_XC_Clk(void *pInstance, PNL_InitData *pstPanelInitData)
3443 {
3444 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
3445 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
3446 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
3447 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
3448
3449 PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]\n", __FUNCTION__, __LINE__);
3450
3451 //load clk table: CLKGEN0SettingTBL / CLKGEN2SettingTBL
3452 E_PNL_SUPPORTED_CLK_TYPE eCLKType= _MHal_Transfer_PanelType_To_CLKType(pstPanelInitData->eLPLL_Type, pstPanelInitData->eLPLL_Mode);
3453 _MHal_PNL_DumpVideoClkTable(eCLKType);
3454
3455 if((pPNLResourcePrivate->stapiPNL._bSkipTimingChange == FALSE))
3456 {
3457 //load clk table: CLKGEN0SettingTBL / CLKGEN2SettingTBL
3458 E_PNL_SUPPORTED_CLK_TYPE eCLKType= _MHal_Transfer_PanelType_To_CLKType_OSD(0, pstPanelInitData->eLPLL_Type, pstPanelInitData->eLPLL_Mode);
3459 _MHal_PNL_DumpOSDClkTable(eCLKType);
3460 }
3461
3462
3463 //set XC CLK
3464 if( ( E_PNL_LPLL_VBY1_10BIT_16LANE == pstPanelInitData->eLPLL_Type)||
3465 ( E_PNL_LPLL_VBY1_8BIT_16LANE == pstPanelInitData->eLPLL_Type ) )
3466 {
3467 //16 lane
3468 // CLK GEN0
3469 W2BYTEMSK(L_CLKGEN0(0x53), DISABLE, CKG_ODCLK_GATED); // [0] disable clock
3470 W2BYTEMSK(L_CLKGEN0(0x53), DISABLE, CKG_ODCLK_INVERT); // [1] invert clock
3471 W2BYTEMSK(L_CLKGEN0(0x53), CKG_ODCLK_SEL_LPLL, CKG_ODCLK_SEL_SOURCE); // [2] select source tobe LPLL clock,
3472 // 0:synthetic clock out, 1:LPLL clock out
3473 W2BYTEMSK(L_CLKGEN0(0x53), CKG_ODCLK_XTAL, CKG_ODCLK_MASK); // [4..3] LPLL clock div
3474
3475 // CLK GEN2
3476 // CLK_ODCLK_2P clock setting
3477 // [0]:disable clock [1]:invert clock
3478 // [2]: select clock source, 0:synthetic clock out, 1:LPLL clock out
3479 // [3]: select clock source, 0:LPLL output clock, 1:LPLL output clk divN
3480 W2BYTEMSK(REG_RVD_43_L, 0x0C00, 0x1F00);
3481 W2BYTEMSK(REG_RVD_46_L, 0x0000, 0x1F1F); //odclk_freq div n/m, [4:0]reg_ckg_odclk_div_nm_m, [12:8]reg_ckg_odclk_div_nm_n,
3482 //set LPLL mux
3483
3484 W2BYTEMSK(L_CLKGEN0(0x7E), 0x0030, 0x00F0); //LPLL_ODCLK setting reg_ckg_odclk = reg_clkgen0_reserved0[7:2]
3485 //[0] : diable clock
3486 //[1] : invert clock
3487 //[4:2] : xx0 : floclk_odclk_synth_out
3488 // 011 / 111: LPLL output clock
3489 if (MDrv_XC_IsSupportPipPatchUsingSc1MainAsSc0Sub())
3490 {
3491 W2BYTEMSK(REG_RVD_63_L, 0x04, 0x0C);//sub oclck flow main odclk
3492 }
3493 }
3494 else if( ( E_PNL_LPLL_VBY1_10BIT_8LANE == pstPanelInitData->eLPLL_Type)||
3495 ( E_PNL_LPLL_VBY1_8BIT_8LANE == pstPanelInitData->eLPLL_Type ) )
3496 {
3497 // 8 lane
3498 // CLK GEN0
3499 W2BYTEMSK(L_CLKGEN0(0x53), DISABLE, CKG_ODCLK_GATED); // [0] disable clock
3500 W2BYTEMSK(L_CLKGEN0(0x53), DISABLE, CKG_ODCLK_INVERT); // [1] invert clock
3501 W2BYTEMSK(L_CLKGEN0(0x53), CKG_ODCLK_SEL_LPLL, CKG_ODCLK_SEL_SOURCE); // [2] select source tobe LPLL clock,
3502 // 0:synthetic clock out, 1:LPLL clock out
3503 W2BYTEMSK(L_CLKGEN0(0x53), CKG_ODCLK_XTAL, CKG_ODCLK_MASK); // [4..3] LPLL clock div
3504
3505 // CLK GEN2
3506 // CLK_ODCLK_2P clock setting
3507 // [0]:disable clock [1]:invert clock
3508 // [2]: select clock source, 0:synthetic clock out, 1:LPLL clock out
3509 // [3]: select clock source, 0:LPLL output clock, 1:LPLL output clk divN
3510 W2BYTEMSK(REG_RVD_43_L, 0x0400, 0x1F00);
3511 W2BYTEMSK(REG_RVD_46_L, 0x0000, 0x1F1F); //odclk_freq div n/m, [4:0]reg_ckg_odclk_div_nm_m, [12:8]reg_ckg_odclk_div_nm_n,
3512
3513 //set LPLL mux
3514
3515 W2BYTEMSK(L_CLKGEN0(0x7E), 0x0010, 0x00F0); //LPLL_ODCLK setting reg_ckg_odclk = reg_clkgen0_reserved0[7:2]
3516 //[0] : diable clock
3517 //[1] : invert clock
3518 //[4:2] : xx0 : floclk_odclk_synth_out
3519 //001 : LPLL output clock div2
3520 if (MDrv_XC_IsSupportPipPatchUsingSc1MainAsSc0Sub())
3521 {
3522 W2BYTEMSK(REG_RVD_63_L, 0x0C, 0x0C);//sub oclck flow main odclk
3523 }
3524
3525 }
3526 else
3527 {
3528 // 4 lane or LVDS
3529 // CLK GEN0
3530 W2BYTEMSK(L_CLKGEN0(0x53), DISABLE, CKG_ODCLK_GATED); // [0] disable clock
3531 W2BYTEMSK(L_CLKGEN0(0x53), DISABLE, CKG_ODCLK_INVERT); // [1] invert clock
3532 W2BYTEMSK(L_CLKGEN0(0x53), CKG_ODCLK_SEL_LPLL, CKG_ODCLK_SEL_SOURCE); // [2] select source tobe LPLL clock,
3533 // 0:synthetic clock out, 1:LPLL clock out
3534 W2BYTEMSK(L_CLKGEN0(0x53), CKG_ODCLK_XTAL, CKG_ODCLK_MASK); // [4..3] LPLL clock div
3535
3536 // CLK GEN2
3537 // CLK_ODCLK_2P clock setting
3538 // [0]:disable clock [1]:invert clock
3539 // [2]: select clock source, 0:synthetic clock out, 1:LPLL clock out
3540 // [3]: select clock source, 0:LPLL output clock, 1:LPLL output clk divN
3541 if( ( E_PNL_TYPE_TTL == pstPanelInitData->eLPLL_Type)||
3542 ((E_PNL_TYPE_LVDS == pstPanelInitData->eLPLL_Type)&&(E_PNL_MODE_SINGLE==pstPanelInitData->eLPLL_Mode))||
3543 ((E_PNL_TYPE_HS_LVDS == pstPanelInitData->eLPLL_Type)&&(E_PNL_MODE_SINGLE==pstPanelInitData->eLPLL_Mode)) ||
3544 ((E_PNL_LPLL_VBY1_8BIT_1LANE == pstPanelInitData->eLPLL_Type) || (E_PNL_LPLL_VBY1_10BIT_1LANE == pstPanelInitData->eLPLL_Type)))
3545 {
3546 W2BYTEMSK(REG_RVD_43_L, 0x0C00, 0x1F00); //[12:8]reg_ckg_odclk_2p, [11]Select clock source, 1: LPLL output clock divN (control by reg_ckg_odclk_div_nm)
3547 //[4:0]reg_ckg_clk_misc,
3548 W2BYTEMSK(REG_RVD_46_L, 0x0201, 0x1F1F); //odclk_freq div n/m, [4:0]reg_ckg_odclk_div_nm_m, [12:8]reg_ckg_odclk_div_nm_n,
3549
3550 if (MDrv_XC_IsSupportPipPatchUsingSc1MainAsSc0Sub())
3551 {
3552 W2BYTEMSK(REG_RVD_63_L, 0x04, 0x0C); //sub oclck flow main odclk
3553 }
3554 }
3555 else
3556 {
3557 W2BYTEMSK(REG_RVD_43_L, 0x0400, 0x1F00);
3558
3559 W2BYTEMSK(REG_RVD_46_L, 0x0000, 0x1F1F); //odclk_freq div n/m, [4:0]reg_ckg_odclk_div_nm_m, [12:8]reg_ckg_odclk_div_nm_n,
3560
3561 if (MDrv_XC_IsSupportPipPatchUsingSc1MainAsSc0Sub())
3562 {
3563 W2BYTEMSK(REG_RVD_63_L, 0x0C, 0x0C); //sub oclck flow main odclk
3564 }
3565 }
3566
3567 //set LPLL mux
3568 if( ( (E_PNL_TYPE_LVDS == pstPanelInitData->eLPLL_Type)&&(E_PNL_MODE_DUAL==pstPanelInitData->eLPLL_Mode))||
3569 ( (E_PNL_TYPE_HS_LVDS == pstPanelInitData->eLPLL_Type)&&(E_PNL_MODE_DUAL==pstPanelInitData->eLPLL_Mode))||
3570 ( E_PNL_LPLL_VBY1_10BIT_2LANE == pstPanelInitData->eLPLL_Type)||
3571 ( E_PNL_LPLL_VBY1_8BIT_2LANE == pstPanelInitData->eLPLL_Type)||
3572 ( E_PNL_LPLL_VBY1_10BIT_4LANE == pstPanelInitData->eLPLL_Type)||
3573 ( E_PNL_LPLL_VBY1_8BIT_4LANE == pstPanelInitData->eLPLL_Type)||
3574 ( E_PNL_LPLL_EPI24_12P == pstPanelInitData->eLPLL_Type)||
3575 ( E_PNL_LPLL_EPI28_12P == pstPanelInitData->eLPLL_Type)||
3576 ( E_PNL_LPLL_USI_T_8BIT_12P == pstPanelInitData->eLPLL_Type)||
3577 ( E_PNL_LPLL_USI_T_10BIT_12P == pstPanelInitData->eLPLL_Type)||
3578 ( E_PNL_LPLL_ISP_8BIT_12P == pstPanelInitData->eLPLL_Type)||
3579 ( (E_PNL_LPLL_ISP_8BIT_6P_D == pstPanelInitData->eLPLL_Type)&&(E_PNL_MODE_DUAL==pstPanelInitData->eLPLL_Mode)))
3580 {
3581 W2BYTEMSK(L_CLKGEN0(0x7E), 0x0010, 0x00F0); //LPLL_ODCLK setting reg_ckg_odclk = reg_clkgen0_reserved0[7:2]
3582 //[0] : diable clock
3583 //[1] : invert clock
3584 //[4:2] : xx0 : floclk_odclk_synth_out
3585 //001 : LPLL output clock div2
3586 }
3587 else if( ( E_PNL_TYPE_TTL == pstPanelInitData->eLPLL_Type)||
3588 ((E_PNL_TYPE_LVDS == pstPanelInitData->eLPLL_Type)&&(E_PNL_MODE_SINGLE==pstPanelInitData->eLPLL_Mode))||
3589 ((E_PNL_TYPE_HS_LVDS == pstPanelInitData->eLPLL_Type)&&(E_PNL_MODE_SINGLE==pstPanelInitData->eLPLL_Mode)))
3590 {
3591 W2BYTEMSK(L_CLKGEN0(0x7E), 0x0050, 0x00F0); //LPLL_ODCLK setting reg_ckg_odclk = reg_clkgen0_reserved0[7:2]
3592 //[0] : diable clock
3593 //[1] : invert clock
3594 //[4:2] : xx0 : floclk_odclk_synth_out
3595 // 101 : LPLL output clock div4
3596 }
3597
3598 }
3599
3600 if( IsVBY1(pstPanelInitData->eLPLL_Type_Ext) )
3601 {
3602 // [0]reg_vx1gpi_mode, refer to tmux table : pad_list: reg_vx1gpi_mode
3603 W2BYTEMSK(REG_CHIP_25_L, 0x0001, 0x0001);
3604 }
3605
3606 if( IsVBY1(pstPanelInitData->eLPLL_Type_Ext) )
3607 {
3608 W2BYTEMSK(L_BK_TCON(0x00), 0x0000, 0xFFFF);
3609 W2BYTEMSK(L_BK_TCON(0x69), 0x0400, 0x0400);
3610 }
3611
3612 // reg_ckg_odclk_2p invert
3613 // SW patch for Maserati only
3614 // For sub video flicker issue, need to invert clk by default
3615 W2BYTEMSK(REG_RVD_43_L, 0x0200, 0x0200); //FIXME:patch for PIP
3616
3617 #if 0
3618 // setup output dot clock
3619
3620 W2BYTEMSK(L_CLKGEN0(0x53), CKG_ODCLK_CLK_LPLL, CKG_ODCLK_MASK); // select source tobe LPLL clock
3621 W2BYTEMSK(L_CLKGEN0(0x53), DISABLE, CKG_ODCLK_INVERT); // clock not invert
3622 W2BYTEMSK(L_CLKGEN0(0x53), DISABLE, CKG_ODCLK_GATED); // enable clock
3623 W2BYTEMSK(L_CLKGEN0(0x53), 0xC0, 0xF0); // reg_ckg_odclk_mft
3624
3625 W2BYTE(L_CLKGEN0(0x58),0x0000); //[3:0]ckg_tx_mod
3626 W2BYTE(L_CLKGEN1(0x31), 0x0000); //[11:8]ckg_odclk_frc
3627
3628
3629
3630 if( IsVBY1(pstPanelInitData->eLPLL_Type) )
3631 {
3632
3633 W2BYTE(REG_CLKGEN0_57_L,0x0008); //[3:0]ckg_fifo
3634 W2BYTE(L_CLKGEN0(0x63), 0x0410); //[11:8]ckg_tx_mod_osd[4:0]osd2mod
3635 W2BYTE(REG_RVD_09_L, 0x1800); //[12:8]ckg_vby1_fifo_osd [3:0]clk_vby1_fifo
3636 W2BYTEMSK(L_CLKGEN0(0x55), 0x00, 0xF00); //[11:8] reg_ckg_osdc
3637 }
3638 else
3639 {
3640
3641 W2BYTE(REG_CLKGEN0_57_L,0x0000); //[3:0]ckg_fifo
3642 if((pstPanelInitData->eLPLL_Type == E_PNL_TYPE_HS_LVDS)&&(pstPanelInitData->eLPLL_Mode == E_PNL_MODE_SINGLE))
3643 {
3644 W2BYTE(L_CLKGEN0(0x63), 0x0410); //[11:8]ckg_tx_mod_osd[4:0]osd2mod
3645 W2BYTE(REG_RVD_09_L, 0x1000); //[12:8]ckg_vby1_fifo_osd [3:0]clk_vby1_fifo+
3646 }
3647 else
3648 {
3649 W2BYTE(L_CLKGEN0(0x63),0x0000); //[11:8]ckg_tx_mod [3:0]ckg_osd2mod
3650 W2BYTE(REG_RVD_09_L, 0x0000); //[12:8]ckg_vby1_fifo_osd [3:0]clk_vby1_fifo
3651 }
3652 }
3653 #endif
3654 }
3655
MHal_PNL_Init_MOD(void * pInstance,PNL_InitData * pstPanelInitData)3656 void MHal_PNL_Init_MOD(void *pInstance, PNL_InitData *pstPanelInitData)
3657 {
3658 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
3659 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
3660 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
3661 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
3662
3663 PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]\n", __FUNCTION__, __LINE__);
3664
3665 //------------------------------------------------------------------------
3666
3667 PNL_DBG(PNL_DBGLEVEL_INIT, "u16MOD_CTRL0 = %x\n", pstPanelInitData->u16MOD_CTRL0);
3668 PNL_DBG(PNL_DBGLEVEL_INIT, "u16MOD_CTRL9 = %x\n", pstPanelInitData->u16MOD_CTRL9);
3669 PNL_DBG(PNL_DBGLEVEL_INIT, "u16MOD_CTRLA = %x\n", pstPanelInitData->u16MOD_CTRLA);
3670 PNL_DBG(PNL_DBGLEVEL_INIT, "u8MOD_CTRLB = %x\n", pstPanelInitData->u8MOD_CTRLB);
3671
3672 //-------------------------------------------------------------------------
3673 // Set MOD registers
3674 //-------------------------------------------------------------------------
3675
3676 //reg_rsclk_testmd
3677 MOD_W2BYTEMSK(REG_MOD_BK00_05_L, ( pstPanelInitData->u16MOD_CTRL0 & (BIT(1)) )<<14, (BIT(15)) );
3678 //reg_lvds_ti:LVDS JEIDA/VESA mode select;l 0: JEIDAl 1: VESA
3679 MOD_W2BYTEMSK(REG_MOD_BK00_05_L, ( pstPanelInitData->u16MOD_CTRL0 & (BIT(2)) )<<12, (BIT(14)) );
3680 //reg_pdp_10bit:pdp_10bit
3681 MOD_W2BYTEMSK(REG_MOD_BK00_05_L, ( pstPanelInitData->u16MOD_CTRL0 & (BIT(3)) )<<10, (BIT(13)) );
3682 //reg_lvds_plasma:
3683 MOD_W2BYTEMSK(REG_MOD_BK00_05_L, ( pstPanelInitData->u16MOD_CTRL0 & (BIT(4)) )<<8 , (BIT(12)) );
3684 //reg_ch_polarity:polarity swap
3685 MOD_W2BYTEMSK(REG_MOD_BK00_05_L, ( pstPanelInitData->u16MOD_CTRL0 & (BIT(5)) )<<6 , (BIT(11)) );
3686 //reg_osd_on_de_a: PDP osd de on DE channel A
3687 MOD_W2BYTEMSK(REG_MOD_BK00_51_L, ( pstPanelInitData->u16MOD_CTRL0 & (BIT(7)) )>>5, (BIT(2)) ); //reg_rsclk_testmd
3688
3689 // GPIO is controlled in drvPadConf.c
3690 // MDrv_Write2Byte(L_BK_MOD(0x46), 0x0000); //EXT GPO disable
3691 // MDrv_Write2Byte(L_BK_MOD(0x47), 0x0000); //EXT GPO disable
3692
3693 //new setting from Masrati scripts
3694 MOD_W2BYTEMSK(REG_MOD_BK00_3C_L, 0x0000, 0xFFFF);
3695
3696 //MFT setting
3697 _MHal_PNL_Init_MFT(pInstance,pstPanelInitData);
3698
3699 if( IsVBY1(pstPanelInitData->eLPLL_Type_Ext) )
3700 {
3701 //new setting from Masrati scripts
3702 //reg_data_format: data format of digital serializer
3703 //0: LVDS 2: mini-LVDS 3: EPI-8bit 4: EPI-10bit(case2) 5: Vby1 7: EPI-10bit(case1) 8: CMPI-10bit 9: CMPI-8bit 10: USI-T 11: ISP
3704 MOD_W2BYTEMSK(REG_MOD_BK00_30_L, 0x5000, 0xF000);
3705
3706 //new setting from Masrati scripts
3707 //switch channel, i.e 16 lane / 8 lane / 4 lane
3708 _Hal_MOD_VB1_CH_SWICH(pstPanelInitData->eLPLL_Type_Ext);
3709
3710 //new setting from Masrati scripts
3711 // arrange MFT 4p output order
3712 if( (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_1LANE)||(pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_1LANE) )
3713 {
3714 MOD_W2BYTEMSK(REG_MOD_BK00_0F_L, 0xF800, 0xFF00 ); //reg_rsclk_testmd
3715 }
3716 else
3717 {
3718 MOD_W2BYTEMSK(REG_MOD_BK00_0F_L, 0xD800, 0xFF00 ); //reg_rsclk_testmd
3719 }
3720
3721 // sc4 62 [15]reg_vby1_proc_st: vby1 packer process start
3722 // sc4 62 [13..12]reg_vby1_byte_mode: vby1 packer byte mode;l 0x : 5 bytel 10: 4 bytel 11: 3 byte
3723 MOD_W2BYTEMSK(REG_MOD_BK00_62_L, ( BIT(15)|BIT(13) ), 0xFFFF);
3724
3725 // sc4 62 [5..4]reg_vby1_pair_mirror: mirror vby1 pairs
3726 MOD_W2BYTEMSK(REG_MOD_BK00_62_L, (pstPanelInitData->u16MOD_CTRL9 & (BIT(12)|BIT(11)))>>7, BIT(5)|BIT(4));
3727
3728 // sc4 62 [14]reg_vby1_8ch: vby1 8ch mode
3729 if( (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)||(pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE) )
3730 {
3731 MOD_W2BYTEMSK(REG_MOD_BK00_62_L, BIT(14), BIT(14));
3732 }
3733 else
3734 {
3735 MOD_W2BYTEMSK(REG_MOD_BK00_62_L, 0x0000, BIT(14));
3736 }
3737
3738 // sc4 00[9]: reg_quadmode, LVDS dual channel; 0: dual channel 1: quad channel
3739 if( (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)||(pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE)||
3740 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE)||(pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_8LANE))
3741 {
3742 MOD_W2BYTEMSK(REG_MOD_BK00_00_L, BIT(9), BIT(9));
3743 MOD_W2BYTEMSK(REG_MOD_BK00_00_L, BIT(0), BIT(0));
3744 }
3745 else
3746 {
3747 MOD_W2BYTEMSK(REG_MOD_BK00_00_L, 0x0000, BIT(9));
3748 MOD_W2BYTEMSK(REG_MOD_BK00_00_L, BIT(0), BIT(0));
3749 }
3750
3751
3752 if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16MOD_CTRLA & BIT(1)) // use Dual port to decide the Vx1 1 or 2 devision config
3753 {
3754 printf("\n[%s][%d]Vx1 2 division\n", __FUNCTION__, __LINE__);
3755 if(pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE)
3756 {
3757
3758 //Manhattan: MOD_W2BYTEMSK(REG_MOD_BK00_21_L, 0x1002, 0xFFFF); //[11:0]reg_dly_value
3759 //Maserati : do not to set reg_dly_value
3760 // mark for Maserati subbank
3761 //MOD_W2BYTEMSK(REG_MOD_BK00_7F_L, BIT(0), (BIT(1)|BIT(0))); // reg.7f[1:0]=reg_vfde_dly_mux
3762
3763 //Manhattan: MOD_W2BYTEMSK(REG_MOD_BK00_7F_L, 0x0002, 0xFFFF); //[2:0]reg_sram_usage
3764 //Maserati : MFT have sram, so we do not set any setting.
3765
3766 MOD_W2BYTEMSK(REG_MOD_BK00_54_L, 0x0000, BIT(12)); //[12]reg_vbi_en:vbi information on lvds enable
3767 MOD_W2BYTEMSK(REG_MOD_BK00_54_L, BIT(13), BIT(13)); //[13]reg_vfde_mask:mask vfde AND de
3768 }
3769 }
3770 else
3771 {
3772 printf("\n[%s][%d]Vx1 1 division\n", __FUNCTION__, __LINE__);
3773
3774 MOD_W2BYTEMSK(REG_MOD_BK00_54_L, 0x0000, BIT(12)); //[12]reg_vbi_en:vbi information on lvds enable
3775 MOD_W2BYTEMSK(REG_MOD_BK00_54_L, 0x0000, BIT(13)); //[13]reg_vfde_mask:mask vfde AND de
3776
3777 }
3778
3779 if((pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)||(pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE))
3780 {
3781 MOD_W2BYTEMSK(REG_MOD_BK00_62_L, BIT(14), BIT(14)); // [14] enable 8ch vx1 mode
3782 }
3783 else if((pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE)||(pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_8LANE))
3784 {
3785 MOD_W2BYTEMSK(REG_MOD_BK00_62_L, 0x0000, BIT(14)); // [14] enable 8ch vx1 mode
3786
3787 if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16MOD_CTRLA & BIT(1))
3788 {
3789 // 2 Divisoin
3790
3791 //be deleted in Maserati
3792 //MOD_W2BYTEMSK(REG_MOD_BK00_63_L, BIT(11), BIT(11)); // [11:10]reg_vby1_pair_mirror2
3793 }
3794 else
3795 {
3796 // 1 Division
3797
3798 //be deleted in Maserati
3799 //MOD_W2BYTEMSK(REG_MOD_BK00_63_L, 0x00, BIT(11)); // [11:10]reg_vby1_pair_mirror2
3800 }
3801 }
3802 else //if ///E_PNL_LPLL_VBY1_10BIT_4LANE, E_PNL_LPLL_VBY1_10BIT_2LANE
3803 {
3804 MOD_W2BYTEMSK(REG_MOD_BK00_62_L, 0x00, BIT(14)); // [14] enable 8ch vx1 mode
3805 }
3806
3807 MHal_Output_Channel_Order(pInstance,
3808 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType,
3809 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3810 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3811 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3812 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3813
3814 ////per RD's suggestion ---Start
3815 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_04_L, 0xFFFF, 0xFFFF); //reg_gcr_pe_en_ch: Differential output pre-emphasis enable
3816 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_06_L, 0x0000, 0xFFFF); //reg_gcr_en_rint_ch: enable double termination function
3817 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_08_L, 0xFFFF, 0xFFFF); //vby1 channel enable: vby1 channel enable
3818
3819 /// reg_gcr_pe_adj ch0~ch13: Differential output data/clock pre-emphasis level adjust of channel X
3820 MOD_A_W2BYTE(REG_MOD_A_BK00_22_L,0x2222);
3821 MOD_A_W2BYTE(REG_MOD_A_BK00_23_L,0x2222);
3822 MOD_A_W2BYTE(REG_MOD_A_BK00_24_L,0x2222);
3823 MOD_A_W2BYTE(REG_MOD_A_BK00_25_L,0x2222);
3824
3825 // [15] reg_vby1_hw_lock : set Vby1 lock sequence by HW mode
3826 // [13] reg_vby1_ext_fsm_en : config each vby1 set use same FSM state (split video/osd path)
3827 // [12] reg_vby1_proc_auto_fix : vby1 hw auto gen proc_st trig
3828 // [10] reg_vby1_ext_ptr_en : configure each vby1 fifo used same read/write pointer
3829 MOD_W2BYTEMSK(REG_MOD_BK00_63_L, (BIT(15)|BIT(13)|BIT(12)|BIT(10)), 0xFF00);
3830
3831 //disparity setting: for 8bits/10bits encode hw error
3832 MOD_W2BYTEMSK(REG_MOD_BK00_3A_L, BIT(7), BIT(7));
3833
3834 //The threshold value be set too strict ( ori: MOD_77/79 =0x0 )
3835 //And this reg should be set before enable serializer function
3836 //[15]reg_sw_rptr_fix_en: pointer fix by sw mode enable
3837 //[14:12]reg_sw_wptr_check: sw mode to decision write point check point
3838 //[10:8]reg_sw_rptr_fix_ini: sw mode to decision read point initial value
3839 //[6:4]reg_sw_rptr_fix_hi_th: sw mode to decision read pointer hi boundary
3840 //[2:0]reg_sw_rptr_fix_lo_th: sw mode to decision read pointer low boundary
3841 MOD_W2BYTEMSK(REG_MOD_BK00_79_L,0x8142,0xFFFF);
3842 MOD_W2BYTEMSK(REG_MOD_BK00_77_L,0x8142,0xFFFF);
3843
3844 //[13]reg_seri_auto_fix_osd : enable osd serializer auto fix read/write point mis-balance
3845 //[14]reg_seri_osd_mod:for OSD, switch chanel 8~13 as OSD path
3846 //[15]reg_dbg_status_switch:switch debug information(reg_dbg_status_sel/reg_dbg_status) between Video/OSD path 0: Video 1: OSD
3847 MOD_W2BYTEMSK(REG_MOD_BK00_76_L, (BIT(14)|BIT(13)) , (BIT(15)|BIT(14)|BIT(13)) );
3848
3849 //[0]reg_seri_enable:enable serializer function
3850 //[1]reg_seri_auto_fix:enable serializer auto fix read/write point mis-balance
3851 //[2]reg_fix_cnt_clr
3852 //[3]reg_dbg_status_sel:select debug status, read status from reg_dbg_status[15:0] 0: auto fix cnt 1: point diff value
3853 //[15..8]reg_tester_pix_ext: test pixel extension for 16bit serializer
3854 MOD_W2BYTEMSK(REG_MOD_BK00_78_L, 0x0003 , 0xFF0F);
3855 }
3856 else
3857 {
3858 if(pstPanelInitData->eLPLL_Type == E_PNL_TYPE_LVDS)
3859 {
3860 //new setting from Masrati scripts
3861 //reg_data_format: data format of digital serializer
3862 //0: LVDS 2: mini-LVDS 3: EPI-8bit 4: EPI-10bit(case2) 5: Vby1 7: EPI-10bit(case1) 8: CMPI-10bit 9: CMPI-8bit 10: USI-T 11: ISP
3863 MOD_W2BYTEMSK(REG_MOD_BK00_30_L, 0x0000, 0xF000);
3864
3865 //new setting from Masrati scripts
3866 // arrange MFT 4p output order (LVDS)
3867 if(pstPanelInitData->eLPLL_Mode == E_PNL_MODE_SINGLE)
3868 {
3869 MOD_W2BYTEMSK(REG_MOD_BK00_0F_L, 0xE400, 0xFF00 ); //reg_rsclk_testmd
3870 }
3871 else
3872 {
3873 MOD_W2BYTEMSK(REG_MOD_BK00_0F_L, 0xF800, 0xFF00 ); //reg_rsclk_testmd
3874 }
3875
3876 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_08_L, 0x0000, 0xFFFF); //vby1 channel enable: vby1 channel enable
3877
3878 // sc4 00[9]: reg_quadmode, LVDS dual channel; 0: dual channel 1: quad channel
3879 MOD_W2BYTEMSK(REG_MOD_BK00_00_L, 0x0000, BIT(9));
3880 MOD_W2BYTEMSK(REG_MOD_BK00_00_L, BIT(0), BIT(0));
3881 }
3882
3883 // [7,6] : output formate selction 10: 8bit, 01: 6bit :other 10bit, bit shift
3884 MOD_W2BYTEMSK(REG_MOD_BK00_00_L, (pstPanelInitData->u16MOD_CTRL9 & (BIT(7)|BIT(6)))<<8 , (BIT(15)|BIT(14)));
3885 MOD_W2BYTEMSK(REG_MOD_BK00_00_L, (pstPanelInitData->u16MOD_CTRL9 & BIT(8) )<<5 , BIT(13));
3886 MOD_W2BYTEMSK(REG_MOD_BK00_00_L, (pstPanelInitData->u16MOD_CTRL9 & BIT(9) )<<3 , BIT(12));
3887
3888 MHal_Output_Channel_Order(pInstance,
3889 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType,
3890 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3891 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3892 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3893 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3894 }
3895
3896 // Manhattan ori :MOD_W2BYTE(REG_MOD_BK00_4A_L, pstPanelInitData->u16MOD_CTRLA);
3897 //MOD_W2BYTEMSK(REG_MOD_BK00_52_L, (pstPanelInitData->u16MOD_CTRLA & BIT(0))<<14, BIT(14)); //[15]:reg_abswitch_l [14]:reg_abswitch_r
3898 //MOD_W2BYTEMSK(REG_MOD_BK00_52_L, (pstPanelInitData->u16MOD_CTRLA & BIT(0))<<15, BIT(15)); //[15]:reg_abswitch_l [14]:reg_abswitch_r
3899 MOD_W2BYTEMSK(REG_MOD_BK00_05_L, (pstPanelInitData->u16MOD_CTRLA & BIT(4))>>3 , BIT(1));// PANEL_INV_DCLK
3900 MOD_W2BYTEMSK(REG_MOD_BK00_00_L, (pstPanelInitData->u16MOD_CTRLA & BIT(12))>>7, BIT(5));// PANEL_INV_HSYNC
3901 MOD_W2BYTEMSK(REG_MOD_BK00_00_L, (pstPanelInitData->u16MOD_CTRLA & BIT(3))<<3, BIT(6)); // PANEL_INV_VSYNC
3902 MOD_W2BYTEMSK(REG_MOD_BK00_00_L, (pstPanelInitData->u16MOD_CTRLA & BIT(2))<<5, BIT(7)); // PANEL_INV_DE
3903
3904 MOD_W2BYTEMSK(REG_MOD_BK00_05_L, (pstPanelInitData->u8MOD_CTRLB & (BIT(0)|BIT(1)))<<2, (BIT(2)|BIT(3))); //for LVDS: [1:0]ti_bitmode / 10:8bit 11:6bit 0x:10bit
3905 MOD_W2BYTEMSK(REG_MOD_BK00_05_L, BIT(13), BIT(13)); // for LVDS: reg_pdp_10bit
3906
3907 //dual port lvds _start_//
3908 // output configure for 26 pair output 00: TTL, 01: LVDS/RSDS/mini-LVDS data differential pair, 10: mini-LVDS clock output, 11: RSDS clock output
3909 _MHal_PNL_Set_Clk(pInstance,
3910 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType,
3911 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder0_3,
3912 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder4_7,
3913 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder8_11,
3914 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputOrder12_13);
3915 //dual port lvds _end_//
3916
3917 //MOD_A_W2BYTEMSK(REG_MOD_A_BK00_3A_L, (_u8PnlDiffSwingLevel << 1), 0xFE); //differential output swing level
3918 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_10_L, 0x0000 , 0x1F00); //bank selection for skew clock
3919
3920 //if(!MHal_PNL_MOD_Control_Out_Swing(_u8PnlDiffSwingLevel))
3921 // printf(">>Swing Level setting error!!\n");
3922
3923 //mark in Maserati
3924 //if(pstPanelInitData->eLPLL_Type != E_PNL_TYPE_MINILVDS)
3925 //{
3926 // MOD_W2BYTEMSK(REG_MOD_A_BK00_78_L, 0x7, 0x07);
3927 //}
3928
3929 //// Patch for Vx1 and it should be control by panel ini
3930 if( IsVBY1(pstPanelInitData->eLPLL_Type_Ext) )
3931 {
3932 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_02_L, 0xFFFF, 0xFFFF);
3933 }
3934 else
3935 {
3936 MOD_A_W2BYTE(REG_MOD_A_BK00_02_L, pstPanelInitData->u16LVDSTxSwapValue);
3937 }
3938
3939 #ifdef CONFIG_MSTAR_SRAMPD
3940 // At initial step, if non TCON panel, enable OD/RGBW/M+/Demura/DGA_Gamma SRAM PD
3941 if((pstPanelInitData->eLPLL_Type_Ext != E_PNL_LPLL_EPI34_8P)&&
3942 (pstPanelInitData->eLPLL_Type_Ext != E_PNL_LPLL_EPI28_8P)&&
3943 (pstPanelInitData->eLPLL_Type_Ext != E_PNL_LPLL_EPI34_6P)&&
3944 (pstPanelInitData->eLPLL_Type_Ext != E_PNL_LPLL_EPI28_6P)&&
3945 (pstPanelInitData->eLPLL_Type_Ext != E_PNL_LPLL_EPI34_2P)&&
3946 (pstPanelInitData->eLPLL_Type_Ext != E_PNL_LPLL_EPI34_4P)&&
3947 (pstPanelInitData->eLPLL_Type_Ext != E_PNL_LPLL_EPI28_2P)&&
3948 (pstPanelInitData->eLPLL_Type_Ext != E_PNL_LPLL_EPI28_4P)&&
3949 (pstPanelInitData->eLPLL_Type_Ext != E_PNL_LPLL_EPI28_12P))
3950 {
3951 if(pPNLInstancePrivate->u32DeviceID == 0)
3952 {
3953 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_10_L, BIT(0), BIT(0)); //OD SRAM PD Enable : SC_SPD_BK3F_10[0]
3954 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_50_L, 0, BIT(8)); //OD Clock gate : ~SC_SPD_BK3F_50[8]
3955 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, BIT(15), BIT(15)); //OD Bypass Enable :SC_OD_BK16_6F[15]
3956
3957 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_10_L, BIT(1), BIT(1)); // RGBW SRAM PD Enable : SC_SPD_BK3F_10[1]
3958 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_50_L, 0, BIT(9)); // RGBW Clock Gate : ~SC_SPD_BK3F_50[9]
3959 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, BIT(12), BIT(12)); // RGBW bypass enable :SC_OD_BK16_6F[12]
3960 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, 0, BIT(13)); // RGBW bypass enable : ~SC_OD_BK16_6F[13]
3961
3962 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_17_L, BIT(0), BIT(0)); //M+ SRAM PD Enable : SC_SPD_BK3F_17[0]
3963 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_50_L, 0, BIT(10)); //M+ Clock gate : ~SC_SPD_BK3F_50[10]
3964 //SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L,0 , BIT(12)); // M+ bypass enable :SC_OD_BK16_6F[12]
3965 //SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK16_6F_L, 0, BIT(13)); // M+ bypass enable : ~SC_OD_BK16_6F[13]
3966
3967 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_0B_L, BIT(4), BIT(4)); //Demura SRAM PD Enable : SC_SPD_BK3F_0B[4]
3968 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK77_26_L, BIT(14), BIT(14)); //Demura Clock Gate : SC_BK77_26[14]
3969 W2BYTEMSK(REG_RVD_45_L, BIT(0), BIT(0)); //Demura Clock gate : BK100A_CLKGEN2_45[0]
3970 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK77_26_L, BIT(15), BIT(15)); //Demura Clock Gate : SC_BK77_26[15]
3971
3972 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK3F_0B_L, BIT(5), BIT(5)); //DGA_GAMMA SRAM PD Enable : SC_SPD_BK3F_0B[5]
3973 }
3974 }
3975
3976 // At initial step, SRAM PD for LD
3977 // To avoid mantis 1082875: boot logo flash issue, remove SRAM PD for LD from XC_init to PNL_init
3978 // only used it in mboot, to avoid panel auto detect if panel type changed.
3979 #if defined (MSOS_TYPE_NOS)
3980 if(pPNLInstancePrivate->u32DeviceID == 0)
3981 {
3982 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BKC9_65_L, (BIT(0)), 0x0001);
3983 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BKCE_01_L, (0x0000), 0x1000);
3984 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BKCE_37_L, (BIT(15)), 0x8000);
3985 //non-FO setting
3986 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK3F_12_L, (BIT(0)| BIT(1)), 0x0003);
3987 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK3F_50_L, (0x0000), 0x3800);
3988 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID,REG_SC_BK2E_37_L, (BIT(15)), 0x8000);
3989 }
3990 #endif
3991 #endif
3992
3993 // TODO: move from MDrv_Scaler_Init(), need to double check!
3994 //MOD_W2BYTEMSK(REG_MOD_BK00_53_L, BIT(0), BIT(0)); //can not find this register in Manhattan register table
3995
3996
3997 //--------------------------------------------------------------
3998 //Depend On Bitmode to set Dither
3999 //--------------------------------------------------------------
4000
4001
4002 // always enable noise dither and disable TAILCUT
4003 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_3F_L, ((pstPanelInitData->u8PanelNoiseDith ? XC_PAFRC_DITH_NOISEDITH_EN : (1 - XC_PAFRC_DITH_NOISEDITH_EN)) <<3) , BIT(3));
4004 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_3F_L, XC_PAFRC_DITH_TAILCUT_DISABLE, BIT(4));
4005
4006 switch(pstPanelInitData->u8MOD_CTRLB & 0x03)//[1:0]ti_bitmode b'10:8bit 11:6bit 0x:10bit
4007 {
4008 case HAL_TI_6BIT_MODE:
4009 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_3F_L, BIT(0), BIT(0));
4010 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_3F_L, BIT(2), BIT(2));
4011 break;
4012
4013 case HAL_TI_8BIT_MODE:
4014 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_3F_L, BIT(0), BIT(0));
4015 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_3F_L, 0x00, BIT(2));
4016 break;
4017
4018 case HAL_TI_10BIT_MODE:
4019 default:
4020 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_3F_L, 0x00, BIT(0));
4021 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK24_3F_L, 0x00, BIT(2));
4022 break;
4023 }
4024
4025
4026 //-----depend on bitmode to set Dither------------------------------
4027 MHal_PNL_SetOutputType(pInstance, pPNLResourcePrivate->sthalPNL._eDrvPnlInitOptions, pstPanelInitData->eLPLL_Type); // TTL to Ursa
4028 //MHal_PNL_Bringup(pInstance);
4029
4030 MHal_PNL_MISC_Control(pInstance, pstPanelInitData->u32PNL_MISC);
4031
4032 PNL_DBG(PNL_DBGLEVEL_INIT, "OutputType = %x, eLPLL_Type = %x\n", pPNLResourcePrivate->sthalPNL._eDrvPnlInitOptions, pstPanelInitData->eLPLL_Type);
4033 PNL_DBG(PNL_DBGLEVEL_INIT, "u32PNL_MISC = %tx\n", (ptrdiff_t)pstPanelInitData->u32PNL_MISC);
4034
4035 }
4036
MHal_PNL_DumpMODReg(void * pInstance,MS_U32 u32Addr,MS_U16 u16Value,MS_BOOL bHiByte,MS_U16 u16Mask)4037 void MHal_PNL_DumpMODReg(void *pInstance, MS_U32 u32Addr, MS_U16 u16Value, MS_BOOL bHiByte, MS_U16 u16Mask)
4038 {
4039 if (bHiByte)
4040 {
4041 MOD_W2BYTEMSK(u32Addr, (u16Value << 8), (u16Mask << 8));
4042 }
4043 else
4044 {
4045 MOD_W2BYTEMSK(u32Addr, u16Value, u16Mask);
4046 }
4047 }
4048
MHal_MOD_Calibration_Init(void * pInstance,PNL_ModCali_InitData * pstModCaliInitData)4049 void MHal_MOD_Calibration_Init(void *pInstance, PNL_ModCali_InitData *pstModCaliInitData)
4050 {
4051 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
4052 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
4053 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
4054 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
4055 // Setup the default swing level
4056 pPNLResourcePrivate->sthalPNL._u16PnlDefault_SwingLevel = pstModCaliInitData->u16ExpectSwingLevel; //mv
4057 #if 0
4058 // Pair setting
4059 // =========
4060 // Select calibration source pair, 00: ch2, 01: ch6, 10:ch8, 11:ch12
4061 //MOD_7D_L[3:2]
4062 // =========
4063 //in msModCurrentCalibration, it will transfer to the real data
4064
4065 switch(pstModCaliInitData->u8ModCaliPairSel)
4066 {
4067 default:
4068 case 0:
4069 //ch 2
4070 pPNLResourcePrivate->sthalPNL._u8MOD_CALI_PAIR_SEL = 0x00; // ch2
4071 break;
4072 case 1:
4073 //ch 6
4074 pPNLResourcePrivate->sthalPNL._u8MOD_CALI_PAIR_SEL = 0x01; // ch6, calibration initialized value
4075 break;
4076 case 2:
4077 //ch 8
4078 pPNLResourcePrivate->sthalPNL._u8MOD_CALI_PAIR_SEL = 0x02;
4079 break;
4080 case 3:
4081 //ch 12
4082 pPNLResourcePrivate->sthalPNL._u8MOD_CALI_PAIR_SEL = 0x03;
4083 break;
4084 }
4085 #endif
4086 // Target setting
4087 // =========
4088 // GCR_CAL_LEVEL[1:0] : REG_MOD_A_BK00_70_L =>
4089 // =========
4090 //in msModCurrentCalibration, it will transfer to the real data
4091 switch(pstModCaliInitData->u8ModCaliTarget)
4092 {
4093 default:
4094 case 0:
4095 pPNLResourcePrivate->sthalPNL._u8MOD_CALI_TARGET = 0;
4096 break;
4097 case 1:
4098 pPNLResourcePrivate->sthalPNL._u8MOD_CALI_TARGET = 1;
4099 break;
4100 case 2:
4101 pPNLResourcePrivate->sthalPNL._u8MOD_CALI_TARGET = 2;
4102 break;
4103 case 3:
4104 pPNLResourcePrivate->sthalPNL._u8MOD_CALI_TARGET = 3;
4105 break;
4106 }
4107 // Offset setting, for fine tune
4108 //_usMOD_CALI_OFFSET = pstModCaliInitData->s8ModCaliOffset;
4109 // _u8MOD_CALI_VALUE is a real value; the _u8MOD_CALI_VALUE is an idea value
4110 // Target value should be the same with _u8MOD_CALI_VALUE to be a default value
4111 pPNLResourcePrivate->sthalPNL._u8MOD_CALI_VALUE= pstModCaliInitData->u8ModCaliTarget;
4112 // PVDD setting
4113 pPNLResourcePrivate->sthalPNL._bPVDD_2V5 = pstModCaliInitData->bPVDD_2V5;
4114
4115 PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]\n", __FUNCTION__, __LINE__);
4116 PNL_DBG(PNL_DBGLEVEL_INIT, "u16ExpectSwingLevel = %u\n", pstModCaliInitData->u16ExpectSwingLevel);
4117 PNL_DBG(PNL_DBGLEVEL_INIT, "u8ModCaliTarget = %x\n", pstModCaliInitData->u8ModCaliTarget);
4118 PNL_DBG(PNL_DBGLEVEL_INIT, "_u8MOD_CALI_TARGET = %x\n", pPNLResourcePrivate->sthalPNL._u8MOD_CALI_TARGET);
4119 PNL_DBG(PNL_DBGLEVEL_INIT, "_u8MOD_CALI_VALUE = %x\n", pPNLResourcePrivate->sthalPNL._u8MOD_CALI_VALUE);
4120 PNL_DBG(PNL_DBGLEVEL_INIT, "bPVDD_2V5 = %x\n", pstModCaliInitData->bPVDD_2V5);
4121
4122 }
4123
MHal_BD_LVDS_Output_Type(void * pInstance,MS_U16 Type)4124 void MHal_BD_LVDS_Output_Type(void *pInstance, MS_U16 Type)
4125 {
4126 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
4127 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
4128 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
4129 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
4130 if(Type == LVDS_DUAL_OUTPUT_SPECIAL )
4131 {
4132 pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Shift = LVDS_DUAL_OUTPUT_SPECIAL;
4133 pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type = 1;
4134 }
4135 else
4136 {
4137 pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type = Type;
4138 }
4139 PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]\n", __FUNCTION__, __LINE__);
4140 PNL_DBG(PNL_DBGLEVEL_INIT, "_u8MOD_LVDS_Pair_Type = %u\n", pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type);
4141
4142 }
4143
msModCalDDAOUT(void)4144 MS_BOOL msModCalDDAOUT(void)
4145 {
4146 // W2BYTEMSK(BK_MOD(0x7D), ENABLE, 8:8);
4147 // MsOS_DelayTask(10); //10ms
4148 return (MS_BOOL)((MOD_R2BYTEMSK(REG_MOD_A_BK00_78_L, BIT(14))) >> 14);
4149 }
4150
msModCurrentCalibration(void * pInstance)4151 MS_U8 msModCurrentCalibration(void *pInstance)
4152 {
4153 #if MOD_CAL_TIMER
4154 MS_U32 delay_start_time;
4155 delay_start_time=MsOS_GetSystemTime();
4156 #endif
4157
4158 #if (!ENABLE_Auto_ModCurrentCalibration)
4159 return 0x60;
4160 #else
4161 MS_U8 u8cur_ibcal=0;
4162 MS_U16 u16reg_32da = 0, u16reg_32dc = 0;
4163 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
4164 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
4165 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
4166 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
4167 u16reg_32da = MOD_A_R2BYTE(REG_MOD_A_BK00_18_L);
4168 u16reg_32dc = MOD_A_R2BYTE(REG_MOD_A_BK00_19_L);
4169
4170 PNL_DBG(PNL_DBGLEVEL_CALIBRATION, "[%s][%d]\n", __FUNCTION__, __LINE__);
4171
4172 // (1) Set keep mode to auto write calibration result into register.
4173 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_7A_L, BIT(15), BIT(15));
4174
4175 // (2) Set calibration step waiting time
4176 MOD_A_W2BYTE(REG_MOD_A_BK00_7F_L, 0x0009); // (about 5us)
4177 //MOD_A_W2BYTEMSK(REG_MOD_A_BK00_7E_L, 0x0009, 0x00FF); //remove in Manhattan
4178
4179 // (3) Set calibration toggle time
4180 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_7A_L, 0x0500, 0x0F00);
4181
4182 // (4) Select calibration level (LVDS is 250mV)
4183 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_78_L, pPNLResourcePrivate->sthalPNL._u8MOD_CALI_TARGET, BIT(2)|BIT(1)|BIT(0)); // Select calibration target voltage, 00: 250mV, 01:350mV, 10: 300mV, 11: 200mV
4184
4185 // (5) Store output configuration value and Enable each pair test mode
4186 MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, 0xFFFF);
4187 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0xFFFF);
4188
4189 // (6) Enable Calibration mode
4190 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_78_L, BIT(15), BIT(15)); // Enable calibration function
4191
4192 MS_U8 u8CheckTimes = 0;
4193 while(1)
4194 {
4195 // (7) Enable Hardware calibration
4196 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_79_L, BIT(15), BIT(15));
4197
4198 // (8) Wait 3ms
4199 MsOS_DelayTask(3);
4200
4201 // mark this step in Maserati
4202 // (9) Disable Hardware calibration
4203 //MOD_A_W2BYTEMSK(REG_MOD_A_BK00_79_L, 0x0000, BIT(15));
4204
4205 // (9) Check Finish and Fail flag bit
4206 if (MOD_A_R2BYTEMSK(REG_MOD_A_BK00_79_L, 0x6000) == 0x4000)
4207 {
4208 //printf("\033[0;31m [%s][%d] cal ok, break \033[0m\n", __FUNCTION__, __LINE__);
4209 // (10)success, refine icon value
4210 MS_U16 u16ICONtempCH0_1 = 0;
4211 MS_U16 u16ICONtempCH2_3 = 0;
4212 MS_U16 u16ICONtempCH4_5 = 0;
4213 MS_U16 u16ICONtempCH6_7 = 0;
4214 MS_U16 u16ICONtempCH8_9 = 0;
4215 MS_U16 u16ICONtempCH10_11 = 0;
4216 MS_U16 u16ICONtempCH12_13 = 0;
4217 MS_U16 u16ICONtempCH14_15 = 0;
4218
4219 u16ICONtempCH0_1 = _Hal_MOD_Refine_ICON( MOD_A_R2BYTEMSK(REG_MOD_A_BK00_30_L, 0xFFFF) );
4220 u16ICONtempCH2_3 = _Hal_MOD_Refine_ICON( MOD_A_R2BYTEMSK(REG_MOD_A_BK00_31_L, 0xFFFF) );
4221 u16ICONtempCH4_5 = _Hal_MOD_Refine_ICON( MOD_A_R2BYTEMSK(REG_MOD_A_BK00_32_L, 0xFFFF) );
4222 u16ICONtempCH6_7 = _Hal_MOD_Refine_ICON( MOD_A_R2BYTEMSK(REG_MOD_A_BK00_33_L, 0xFFFF) );
4223 u16ICONtempCH8_9 = _Hal_MOD_Refine_ICON( MOD_A_R2BYTEMSK(REG_MOD_A_BK00_34_L, 0xFFFF) );
4224 u16ICONtempCH10_11 = _Hal_MOD_Refine_ICON( MOD_A_R2BYTEMSK(REG_MOD_A_BK00_35_L, 0xFFFF) );
4225 u16ICONtempCH12_13 = _Hal_MOD_Refine_ICON( MOD_A_R2BYTEMSK(REG_MOD_A_BK00_36_L, 0xFFFF) );
4226 u16ICONtempCH14_15 = _Hal_MOD_Refine_ICON( MOD_A_R2BYTEMSK(REG_MOD_A_BK00_37_L, 0xFFFF) );
4227
4228 //close reg_keep_cal_value
4229 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_7A_L, 0x0000, BIT(15));
4230
4231 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_30_L, u16ICONtempCH0_1, 0xFFFF);
4232 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_31_L, u16ICONtempCH2_3, 0xFFFF);
4233 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_32_L, u16ICONtempCH4_5, 0xFFFF);
4234 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_33_L, u16ICONtempCH6_7, 0xFFFF);
4235 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_34_L, u16ICONtempCH8_9, 0xFFFF);
4236 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_35_L, u16ICONtempCH10_11, 0xFFFF);
4237 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_36_L, u16ICONtempCH12_13, 0xFFFF);
4238 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_37_L, u16ICONtempCH14_15, 0xFFFF);
4239
4240 break;
4241 }
4242 else
4243 {
4244 u8CheckTimes ++;
4245 //printf("\033[0;31m [%s][%d] cal ng, u8CheckTimes: %d \033[0m\n", __FUNCTION__, __LINE__, u8CheckTimes);
4246 }
4247
4248 if (u8CheckTimes > MOD_LVDS_HW_CALI_TIME_OUT)
4249 {
4250 // (11)fail , set to default value
4251 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_7A_L, 0x00, BIT(15));
4252
4253 MS_U16 u16ICONtempDefault = ( (MOD_LVDS_ICON_DEFAULT<<8) | (MOD_LVDS_ICON_DEFAULT) );
4254 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_30_L, u16ICONtempDefault, 0xFFFF);
4255 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_31_L, u16ICONtempDefault, 0xFFFF);
4256 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_32_L, u16ICONtempDefault, 0xFFFF);
4257 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_33_L, u16ICONtempDefault, 0xFFFF);
4258 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_34_L, u16ICONtempDefault, 0xFFFF);
4259 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_35_L, u16ICONtempDefault, 0xFFFF);
4260 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_36_L, u16ICONtempDefault, 0xFFFF);
4261 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_37_L, u16ICONtempDefault, 0xFFFF);
4262 //printf("\033[0;31m [%s][%d] If 3 times all fail, set all pair to nominal value by disable keep mode \033[0m\n", __FUNCTION__, __LINE__);
4263 break;
4264 }
4265 }
4266
4267 if (u8CheckTimes <= MOD_LVDS_HW_CALI_TIME_OUT)
4268 {
4269 PNL_DBG(PNL_DBGLEVEL_CALIBRATION, "\r\n----- Calibration ok \n");
4270 }
4271 else
4272 {
4273 PNL_DBG(PNL_DBGLEVEL_CALIBRATION, "\r\n----- Calibration fail: 0x%x \n", MOD_R2BYTEMSK(REG_MOD_BK00_3D_L, 0x6000));
4274 }
4275
4276 // Wait 2ms to make sure HW auto write calibration result into register
4277 MsOS_DelayTask(2);
4278
4279 // (12) Restore each pair output configuration
4280 MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, u16reg_32da);
4281 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, u16reg_32dc);
4282
4283 // (13) Disable calibration mode
4284 MOD_W2BYTEMSK(REG_MOD_A_BK00_78_L, 0x00, BIT(15)); // Disable calibration function
4285
4286 // With HW calibration mode, HW would cal for each channel, and each channel would get different value
4287 // Return channel 2 vaule
4288 u8cur_ibcal = MOD_A_R2BYTEMSK(REG_MOD_A_BK00_31_L, 0x00FF); // return ch2 calibration result
4289
4290 #if MOD_CAL_TIMER
4291 PNL_DBG(PNL_DBGLEVEL_CALIBRATION, "[%s] takes %ld ms\n", __FUNCTION__, (MsOS_GetSystemTime()-delay_start_time));
4292 #endif
4293 PNL_DBG(PNL_DBGLEVEL_CALIBRATION, "\r\n Calibration result= %x\n", u8cur_ibcal);
4294
4295 return (u8cur_ibcal&0xFF);
4296 #endif
4297 }
4298
MHal_PNL_MOD_Calibration(void * pInstance)4299 PNL_Result MHal_PNL_MOD_Calibration(void *pInstance)
4300 {
4301 MS_U8 u8Cab;
4302 MS_U8 u8BackUSBPwrStatus;
4303 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
4304 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
4305 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
4306 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
4307
4308 u8BackUSBPwrStatus = R2BYTEMSK(L_BK_UTMI1(0x04), BIT(7));
4309
4310 W2BYTEMSK(L_BK_UTMI1(0x04), 0x00, BIT(7));
4311
4312 u8Cab = msModCurrentCalibration(pInstance);
4313
4314 W2BYTEMSK(L_BK_UTMI1(0x04), u8BackUSBPwrStatus, BIT(7));
4315
4316 if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type !=E_PNL_TYPE_MINILVDS)
4317 MOD_W2BYTEMSK(REG_MOD_A_BK00_78_L, u8Cab, 0x07);
4318
4319 return E_PNL_OK;
4320
4321 }
4322
MHal_PNL_PowerDownLPLL(void * pInstance,MS_BOOL bEnable)4323 static void MHal_PNL_PowerDownLPLL(void *pInstance, MS_BOOL bEnable)
4324 {
4325 if(bEnable)
4326 {
4327 W2BYTEMSK(L_BK_LPLL(0x03), BIT(5), BIT(5));
4328 }
4329 else
4330 {
4331 W2BYTEMSK(L_BK_LPLL(0x03), FALSE, BIT(5));
4332 }
4333 }
4334
MHal_PNL_En(void * pInstance,MS_BOOL bPanelOn,MS_BOOL bCalEn)4335 PNL_Result MHal_PNL_En(void *pInstance, MS_BOOL bPanelOn, MS_BOOL bCalEn)
4336 {
4337 MS_U8 u8Cab;
4338 MS_U8 u8BackUSBPwrStatus;
4339 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
4340 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
4341 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
4342 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
4343
4344 PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "[%s][%d]\n", __FUNCTION__, __LINE__);
4345
4346 PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u32PNL_MISC = %tx\n", (ptrdiff_t)pPNLResourcePrivate->stdrvPNL._stPnlInitData.u32PNL_MISC);
4347 PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "bPanelOn = %x\n", bPanelOn);
4348 PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "eLPLL_Type = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type);
4349 PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "_u8MOD_LVDS_Pair_Type = %x\n", pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type);
4350 PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u16OutputCFG0_7 = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG0_7);
4351 PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u16OutputCFG8_15 = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG8_15);
4352 PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u16OutputCFG16_21 = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG16_21);
4353
4354 MS_U16 u16PortA = MOD_A_R2BYTE(REG_MOD_A_BK00_18_L);
4355 MS_U16 u16PortB = MOD_A_R2BYTE(REG_MOD_A_BK00_19_L);
4356
4357 if((u16PortA!=0)||(u16PortB!=0))
4358 {
4359 MHal_BD_LVDS_Output_Type(pInstance, LVDS_OUTPUT_User);
4360 }
4361
4362 if(u16PortA!=0)
4363 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG0_7 = MOD_A_R2BYTE(REG_MOD_A_BK00_18_L);
4364 if(u16PortB!=0)
4365 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG8_15 = MOD_A_R2BYTE(REG_MOD_A_BK00_19_L);
4366
4367 PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "==========================\n\n");
4368 PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u16OutputCFG0_7 = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG0_7);
4369 PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u16OutputCFG8_15 = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG8_15);
4370 PNL_DBG(PNL_DBGLEVEL_PANEL_EN, "u16OutputCFG16_21 = %x\n", pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG16_21);
4371
4372
4373 if(bPanelOn)
4374 {
4375 // The order is PanelVCC -> delay pnlGetOnTiming1() -> VOP -> MOD
4376 // VOP
4377 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_46_L, 0x4000, HBMASK);
4378
4379 // For Napoli compatible
4380 // need to wait 1ms to wait LDO stable before MOD power on
4381 MsOS_DelayTask(1);
4382
4383 // turn on LPLL
4384 MHal_PNL_PowerDownLPLL(pInstance, FALSE);
4385
4386 // mod power on
4387 MHal_MOD_PowerOn(pInstance
4388 , ENABLE
4389 , pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type
4390 , pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type
4391 , pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG0_7
4392 , pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG8_15
4393 , pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG16_21);
4394
4395 if(bCalEn)
4396 {
4397
4398 u8BackUSBPwrStatus = R2BYTEMSK(L_BK_UTMI1(0x04), BIT(7));
4399
4400 W2BYTEMSK(L_BK_UTMI1(0x04), 0x00, BIT(7));
4401
4402 u8Cab = msModCurrentCalibration(pInstance);
4403
4404 W2BYTEMSK(L_BK_UTMI1(0x04), u8BackUSBPwrStatus, BIT(7));
4405
4406 }
4407 else
4408 {
4409 if( ( IsVBY1(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type) ) &&
4410 ((pPNLResourcePrivate->stdrvPNL._stPnlInitData.u32PNL_MISC & (MS_U32)E_APIPNL_MISC_SKIP_ICONVALUE) == FALSE))
4411 {
4412 HAL_MOD_CAL_DBG(printf("Use RCON value \n", __FUNCTION__, __LINE__));
4413 msSetVBY1RconValue(pInstance);
4414 }
4415 else
4416 {
4417 HAL_MOD_CAL_DBG(printf("User define Swing Value=%u\n", __FUNCTION__, __LINE__, pPNLResourcePrivate->sthalPNL._u16PnlDefault_SwingLevel));
4418
4419 if(!MHal_PNL_MOD_Control_Out_Swing(pInstance, pPNLResourcePrivate->sthalPNL._u16PnlDefault_SwingLevel))
4420 printf(">>Swing Level setting error!!\n");
4421 }
4422 }
4423
4424 if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.bVideo_HW_Training_En)
4425 MHal_PNL_VBY1_Hardware_TrainingMode_En(pInstance, TRUE, ENABLE);
4426 }
4427 else
4428 {
4429 // The order is LPLL -> MOD -> VOP -> delay for MOD power off -> turn off VCC
4430
4431 // LPLL
4432 // MHal_PNL_PowerDownLPLL(TRUE); //Remove to keep op vsync if panel off
4433
4434 MHal_MOD_PowerOn(pInstance
4435 , DISABLE
4436 , pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type
4437 , pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type
4438 , pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG0_7
4439 , pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG8_15
4440 , pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG16_21);
4441 // VOP
4442 if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_LVDS ||
4443 pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_DAC_I ||
4444 pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_DAC_P)//(bIsLVDS)
4445 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_46_L, 0xFF, LBMASK);
4446 else
4447 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_46_L, 0x00, 0xFF);
4448 }
4449
4450 return E_PNL_OK;
4451 }
4452
MHal_PNL_SetOutputPattern(void * pInstance,MS_BOOL bEnable,MS_U16 u16Red,MS_U16 u16Green,MS_U16 u16Blue)4453 void MHal_PNL_SetOutputPattern(void *pInstance, MS_BOOL bEnable, MS_U16 u16Red , MS_U16 u16Green, MS_U16 u16Blue)
4454 {
4455 if (bEnable)
4456 {
4457 MOD_W2BYTEMSK(REG_MOD_BK00_69_L, u16Red , 0x03FF);
4458 MOD_W2BYTEMSK(REG_MOD_BK00_6A_L, u16Green , 0x03FF);
4459 MOD_W2BYTEMSK(REG_MOD_BK00_6B_L, u16Blue , 0x03FF);
4460 MsOS_DelayTask(10);
4461 MOD_W2BYTEMSK(REG_MOD_BK00_68_L, BIT(12) , BIT(12));
4462 }
4463 else
4464 {
4465 MOD_W2BYTEMSK(REG_MOD_BK00_68_L, DISABLE , BIT(12));
4466 }
4467
4468 }
4469
MHal_PNL_Switch_LPLL_SubBank(void * pInstance,MS_U16 u16Bank)4470 void MHal_PNL_Switch_LPLL_SubBank(void *pInstance, MS_U16 u16Bank)
4471 {
4472 UNUSED(u16Bank);
4473 }
4474
MHal_PNL_Switch_TCON_SubBank(void * pInstance,MS_U16 u16Bank)4475 void MHal_PNL_Switch_TCON_SubBank(void *pInstance, MS_U16 u16Bank)
4476 {
4477 W2BYTEMSK(L_BK_TCON(0x00), u16Bank&0xff, 0xFF);
4478 }
4479
MHal_PNL_Read_TCON_SubBank(void * pInstance)4480 MS_U16 MHal_PNL_Read_TCON_SubBank(void *pInstance)
4481 {
4482 return (MS_U16)R2BYTEMSK(L_BK_TCON(0x00),0xFF);
4483 }
4484
MHal_PNL_Is_VBY1_Locked(void * pInstance)4485 MS_BOOL MHal_PNL_Is_VBY1_Locked(void *pInstance)
4486 {
4487 if (MOD_A_R2BYTEMSK(REG_MOD_A_BK00_47_L, 0x0300) == 0x00)
4488 {
4489 return TRUE;
4490 }
4491 else
4492 {
4493 return FALSE;
4494 }
4495 }
4496
MHal_PNL_Is_VBY1_LockN_Locked(void * pInstance)4497 MS_BOOL MHal_PNL_Is_VBY1_LockN_Locked(void *pInstance)
4498 {
4499 if (MOD_A_R2BYTEMSK(REG_MOD_A_BK00_47_L, 0x0100) == 0x00)
4500 {
4501 return TRUE;
4502 }
4503 else
4504 {
4505 return FALSE;
4506 }
4507 }
4508
MHal_PNL_VBY1_Handshake(void * pInstance)4509 MS_BOOL MHal_PNL_VBY1_Handshake(void *pInstance)
4510 {
4511 MS_BOOL bIsLock = FALSE;
4512
4513 if (MHal_PNL_Is_VBY1_Locked(pInstance) == FALSE)
4514 {
4515 MS_U16 u16CheckTimes = 0;
4516 //MS_U16 u16DeboundTimes = 0;
4517
4518 // need to toggle vby1 packer process start first
4519 MOD_W2BYTEMSK(REG_MOD_BK00_62_L, 0x00, BIT(11));
4520 MOD_W2BYTEMSK(REG_MOD_BK00_62_L, BIT(11), BIT(11));
4521
4522 MOD_W2BYTE(REG_MOD_BK00_60_L, 0x0F56); // set reg. initial value
4523 MOD_W2BYTEMSK(REG_MOD_BK00_60_L, 0xD6, 0x00FF); // after power on go to stand-by
4524 MOD_W2BYTEMSK(REG_MOD_BK00_60_L, 0x96, 0x00FF); // connection is established, go to Acquisition
4525 MOD_W2BYTEMSK(REG_MOD_BK00_60_L, 0xB6, 0x00FF); // when internal clock is stable, got to CDR training
4526 MOD_W2BYTEMSK(REG_MOD_BK00_60_L, 0xBE, 0x00FF); // enable encoder for DC blance
4527
4528 while(u16CheckTimes < 10)
4529 {
4530 #if 0
4531 u16DeboundTimes = 2;
4532 while ((!MHal_PNL_Is_VBY1_LockN_Locked()) && (u16DeboundTimes --))
4533 {
4534 MsOS_DelayTask(1); // can't remove
4535 }
4536 #endif
4537 if(MHal_PNL_Is_VBY1_LockN_Locked(pInstance))
4538 {
4539 //-------------------------------------------------------------------
4540 // step1. Toggle clock when training
4541 MOD_W2BYTE(REG_MOD_BK00_60_L, 0x0FAE);
4542 //--------------------------------------------------------------------
4543 bIsLock = TRUE;
4544 // pass 2 times debound to make sure VBY1 is locked
4545 break;
4546 }
4547
4548 u16CheckTimes++;
4549 MsOS_DelayTaskUs(40);
4550 }
4551
4552 if(bIsLock)
4553 {
4554 // step3. Disable HW check when lock done, Enable when loss lock
4555 //MOD_W2BYTEMSK(REG_MOD_BK00_33_L, 0x00, BIT15);
4556
4557 /// Add the delay to increase time to send
4558 //MDrv_TIMER_Delayms(10);
4559 }
4560 }
4561 else
4562 {
4563 if(MOD_R2BYTEMSK(REG_MOD_BK00_60_L, 0x0FFF) != 0x0FAE)
4564 {
4565 MOD_W2BYTE(REG_MOD_BK00_60_L, 0x0FAE);
4566 }
4567 bIsLock = TRUE;
4568 }
4569
4570 return bIsLock;
4571 }
4572
MHal_PNL_Is_VBY1_OC_Locked(void * pInstance)4573 MS_BOOL MHal_PNL_Is_VBY1_OC_Locked(void *pInstance)
4574 {
4575 if (MOD_A_R2BYTEMSK(REG_MOD_A_BK00_47_L, 0x0C00) == 0x00) // MOD_BK00_56_L[11:10] for OSD
4576 {
4577 return TRUE;
4578 }
4579 else
4580 {
4581 return FALSE;
4582 }
4583 }
4584
MHal_PNL_Is_VBY1_OC_LockN_Locked(void * pInstance)4585 MS_BOOL MHal_PNL_Is_VBY1_OC_LockN_Locked(void *pInstance)
4586 {
4587 if (MOD_A_R2BYTEMSK(REG_MOD_A_BK00_47_L, 0x0400) == 0x00) // MOD_BK00_56_L[11:10] for OSD
4588 {
4589 return TRUE;
4590 }
4591 else
4592 {
4593 return FALSE;
4594 }
4595 }
4596
MHal_PNL_VBY1_OC_Handshake(void * pInstance)4597 MS_BOOL MHal_PNL_VBY1_OC_Handshake(void *pInstance)
4598 {
4599 MS_BOOL bIsLock = FALSE;
4600
4601 if (MHal_PNL_Is_VBY1_OC_Locked(pInstance) == FALSE)
4602 {
4603 MS_U16 u16CheckTimes = 0;
4604 // MS_U16 u16DeboundTimes = 0;
4605
4606 // need to toggle vby1 packer process start first
4607 MOD_W2BYTEMSK(REG_MOD_BK00_66_L, 0x00, BIT(11));
4608 MOD_W2BYTEMSK(REG_MOD_BK00_66_L, BIT(11), BIT(11));
4609
4610
4611 MOD_W2BYTE(REG_MOD_BK00_64_L, 0x0F56); // set reg. initial value
4612 MOD_W2BYTEMSK(REG_MOD_BK00_64_L, 0xD6, 0x00FF); // after power on go to stand-by
4613 MOD_W2BYTEMSK(REG_MOD_BK00_64_L, 0x96, 0x00FF); // connection is established, go to Acquisition
4614 MOD_W2BYTEMSK(REG_MOD_BK00_64_L, 0xB6, 0x00FF); // when internal clock is stable, got to CDR training
4615 MOD_W2BYTEMSK(REG_MOD_BK00_64_L, 0xBE, 0x00FF); // enable encoder for DC blance
4616
4617 while(u16CheckTimes < 10)
4618 {
4619 #if 0
4620 u16DeboundTimes = 2;
4621 while ((!MHal_PNL_Is_VBY1_OC_LockN_Locked()) && (u16DeboundTimes --))
4622 {
4623 MsOS_DelayTask(1);
4624 }
4625 #endif
4626 if(MHal_PNL_Is_VBY1_OC_LockN_Locked(pInstance))
4627 {
4628 //-------------------------------------------------------------------
4629 // step1. Toggle clock when training
4630
4631 MOD_W2BYTE(REG_MOD_BK00_64_L, 0x0FAE);
4632 bIsLock = TRUE;
4633 // pass 2 times debound to make sure VBY1 is locked
4634 break;
4635 }
4636
4637 u16CheckTimes++;
4638 MsOS_DelayTaskUs(40);
4639 }
4640
4641 if(bIsLock)
4642 {
4643 // step3. Disable HW check when lock done, Enable when loss lock
4644 // MOD_W2BYTEMSK(REG_MOD_BK00_33_L, 0x00, BIT15);
4645 }
4646 }
4647 else
4648 {
4649 if(MOD_R2BYTEMSK(REG_MOD_BK00_64_L, 0x0FFF) != 0x0FAE)
4650 {
4651 MOD_W2BYTE(REG_MOD_BK00_64_L, 0x0FAE);
4652 }
4653 bIsLock = TRUE;
4654 }
4655
4656 return bIsLock;
4657 }
4658
MHal_PNL_IsYUVOutput(void * pInstance)4659 MS_BOOL MHal_PNL_IsYUVOutput(void *pInstance)
4660 {
4661 return FALSE;
4662 }
4663
MHal_PNL_SetOutputInterlaceTiming(void * pInstance,MS_BOOL bEnable)4664 MS_BOOL MHal_PNL_SetOutputInterlaceTiming(void *pInstance, MS_BOOL bEnable)
4665 {
4666 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
4667 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
4668
4669 if (bEnable == TRUE)
4670 {
4671 //interlace output vtotal modify
4672 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_21_L, BIT(9), BIT(9));
4673
4674 // two different interlace information through channel A reserved bit
4675 MOD_W2BYTEMSK(REG_MOD_BK00_05_L, BIT(12), BIT(12));
4676 MOD_W2BYTEMSK(REG_MOD_BK00_51_L, BIT(2), BIT(2));
4677 // two different interlace information through channel B reserved bit
4678 MOD_W2BYTEMSK(REG_MOD_BK00_51_L, BIT(3), BIT(3));
4679 }
4680 else
4681 {
4682 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_21_L , 0, BIT(9));
4683 // two different interlace information through channel A reserved bit
4684 MOD_W2BYTEMSK(REG_MOD_BK00_05_L, 0x0000, BIT(12));
4685 MOD_W2BYTEMSK(REG_MOD_BK00_51_L, 0x0000, BIT(2));
4686 // two different interlace information through channel B reserved bit
4687 MOD_W2BYTEMSK(REG_MOD_BK00_51_L, 0x0000, BIT(3));
4688 }
4689
4690 return TRUE;
4691 }
4692
MHal_PNL_GetOutputInterlaceTiming(void * pInstance)4693 MS_BOOL MHal_PNL_GetOutputInterlaceTiming(void *pInstance)
4694 {
4695 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
4696 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
4697
4698 MS_BOOL bIsInterlaceOutput = FALSE;
4699 //interlace output vtotal modify
4700 if (SC_R2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK10_21_L, BIT(9)) == BIT(9))
4701 {
4702 if ( (MOD_R2BYTEMSK(REG_MOD_BK00_05_L, BIT(12)) == (BIT(12)))
4703 || (MOD_R2BYTEMSK(REG_MOD_BK00_51_L, (BIT(2) | BIT(3))) == (BIT(2)|BIT(3))))
4704 {
4705 bIsInterlaceOutput = TRUE;
4706 }
4707 }
4708 else
4709 {
4710 bIsInterlaceOutput = FALSE;
4711 }
4712 return bIsInterlaceOutput;
4713 }
4714
4715 ////Ext LPLL setting
_MHal_PNL_Init_ExtLPLL(void * pInstance,PNL_TYPE eLPLL_Type,PNL_MODE eLPLL_Mode,MS_U64 ldHz)4716 static void _MHal_PNL_Init_ExtLPLL(void *pInstance, PNL_TYPE eLPLL_Type,PNL_MODE eLPLL_Mode,MS_U64 ldHz)
4717 {
4718 E_PNL_SUPPORTED_LPLL_EXT_TYPE u8SupportedLPLLLIndex = E_PNL_SUPPORTED_LPLL_EXT_MAX;
4719
4720 u8SupportedLPLLLIndex = _MHal_PNL_GetSupportedLPLLIndex(pInstance, eLPLL_Type,eLPLL_Mode,ldHz, E_PNL_LPLL_OSD);
4721
4722 if (u8SupportedLPLLLIndex == E_PNL_SUPPORTED_LPLL_EXT_MAX)
4723 {
4724 printf("Not Supported LPLL Type, skip LPLL Init\n");
4725 return;
4726 }
4727
4728 _MHal_PNL_DumpLPLLTable(pInstance, u8SupportedLPLLLIndex, E_PNL_LPLL_OSD);
4729 }
4730
_MHal_PNL_Get_ExtLPLL_LoopDIV(void * pInstance,MS_U8 u8LPLL_Mode,MS_U8 eLPLL_Type,MS_U64 ldHz)4731 static MS_U8 _MHal_PNL_Get_ExtLPLL_LoopDIV(void *pInstance, MS_U8 u8LPLL_Mode, MS_U8 eLPLL_Type, MS_U64 ldHz)
4732 {
4733 MS_U16 u16loop_div = 0;
4734 E_PNL_SUPPORTED_LPLL_EXT_TYPE u8SupportedLPLLLIndex = E_PNL_SUPPORTED_LPLL_EXT_MAX;
4735 u8SupportedLPLLLIndex = _MHal_PNL_GetSupportedLPLLIndex(pInstance, eLPLL_Type,u8LPLL_Mode,ldHz,E_PNL_LPLL_OSD);
4736
4737 if (u8SupportedLPLLLIndex == E_PNL_SUPPORTED_LPLL_EXT_MAX)
4738 {
4739 u16loop_div = 0 ;
4740 }
4741 else
4742 {
4743 u16loop_div = u16EXT_LoopDiv[u8SupportedLPLLLIndex];
4744 }
4745
4746 u16loop_div *= 2;
4747 return u16loop_div;
4748 }
4749
_MHal_PNL_Get_ExtLPLL_LoopGain(void * pInstance,MS_U8 eLPLL_Mode,MS_U8 eLPLL_Type,MS_U64 ldHz)4750 static MS_U8 _MHal_PNL_Get_ExtLPLL_LoopGain(void *pInstance, MS_U8 eLPLL_Mode, MS_U8 eLPLL_Type, MS_U64 ldHz)
4751 {
4752 MS_U16 u16loop_gain = 0;
4753 E_PNL_SUPPORTED_LPLL_EXT_TYPE u8SupportedLPLLLIndex = E_PNL_SUPPORTED_LPLL_EXT_MAX;
4754 u8SupportedLPLLLIndex = _MHal_PNL_GetSupportedLPLLIndex(pInstance, eLPLL_Type,eLPLL_Mode,ldHz,E_PNL_LPLL_OSD);
4755
4756 if (u8SupportedLPLLLIndex == E_PNL_SUPPORTED_LPLL_EXT_MAX)
4757 {
4758 u16loop_gain = 0 ;
4759 }
4760 else
4761 {
4762 u16loop_gain = u16EXT_LoopGain[u8SupportedLPLLLIndex];
4763 }
4764 return u16loop_gain;
4765 }
4766
4767
4768 // Output Dclk
MHal_PNL_CalExtLPLLSETbyDClk(void * pInstance,MS_U8 u8LPLL_Mode,MS_U8 u8LPLL_Type,MS_U64 ldHz)4769 void MHal_PNL_CalExtLPLLSETbyDClk(void *pInstance, MS_U8 u8LPLL_Mode, MS_U8 u8LPLL_Type, MS_U64 ldHz)
4770 {
4771
4772 MS_U64 u64LdPllSet = 0;
4773 MS_U64 u64DclkFactor = 0;
4774 MS_U32 u32Div = 0;
4775 // loop div and loop gain use default parameters to avoid dclk floating out of range and getting wrong value
4776 MS_U32 u32Factor = 10;
4777
4778 _MHal_PNL_Init_ExtLPLL(pInstance, u8LPLL_Type, u8LPLL_Mode, ldHz);
4779
4780 //the first " *2 " is from the dual mode
4781 u32Div=(MS_U32)(_MHal_PNL_Get_ExtLPLL_LoopDIV(pInstance, u8LPLL_Mode, u8LPLL_Type, ldHz));
4782 u64DclkFactor=((MS_U64)LVDS_MPLL_CLOCK_MHZ * (MS_U64)524288 * (MS_U64)_MHal_PNL_Get_ExtLPLL_LoopGain(pInstance, u8LPLL_Mode, u8LPLL_Type, ldHz));
4783 u64LdPllSet = (u64DclkFactor * 1000000 * u32Factor *2) + ((ldHz * u32Div) >> 1);
4784 do_div(u64LdPllSet, ldHz);
4785 do_div(u64LdPllSet, u32Div);
4786
4787 W4BYTE(L_BK_LPLL(0x48), (MS_U32)u64LdPllSet);
4788 //printf("MHal_PNL_CalExtLPLLSETbyDClk u32KHz = %u, u32LpllSet = %x\n", ldHz, (MS_U32)u64LdPllSet);
4789
4790 }
4791
MHal_PNL_SetOSDCOutputType(void * pInstance,PNL_TYPE eLPLL_Type,E_PNL_OSDC_OUTPUT_FORMAT eOC_OutputFormat)4792 void MHal_PNL_SetOSDCOutputType(void *pInstance, PNL_TYPE eLPLL_Type, E_PNL_OSDC_OUTPUT_FORMAT eOC_OutputFormat)
4793 {
4794 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
4795 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
4796 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
4797 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
4798
4799 PNL_TYPE eVideo_LPLL_Type = pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type;
4800
4801 //load clk table: CLKGEN0SettingTBL / CLKGEN2SettingTBL
4802 // in Maserati : the OSD path just in VBY1
4803 if(( E_PNL_LPLL_VBY1_10BIT_4LANE == eLPLL_Type ) ||
4804 ( E_PNL_LPLL_VBY1_8BIT_4LANE == eLPLL_Type ) ||
4805 ( E_PNL_LPLL_VBY1_10BIT_2LANE == eLPLL_Type ) ||
4806 ( E_PNL_LPLL_VBY1_8BIT_2LANE == eLPLL_Type ))
4807 {
4808 E_PNL_SUPPORTED_CLK_TYPE eCLKType= _MHal_Transfer_PanelType_To_CLKType_OSD(eLPLL_Type, 0, 0);
4809 _MHal_PNL_DumpOSDClkTable(eCLKType);
4810 }
4811
4812 // VBy1 co-registers
4813 if( IsVBY1(eLPLL_Type) )
4814 {
4815 MOD_W2BYTEMSK(REG_MOD_BK00_2E_L, BIT(10), BIT(10)); //[10]enable osd lvds path
4816 MOD_W2BYTEMSK(REG_MOD_BK00_00_L, BIT(0), BIT(0)); //sw reset
4817 MOD_W2BYTEMSK(REG_MOD_BK00_54_L, 0x0000, BIT(14));
4818 MOD_W2BYTEMSK(REG_MOD_BK00_51_L, 0x0000, (BIT(2)|BIT(3)|BIT(4)) );
4819
4820 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_77_L, BIT(0), BIT(0)); //[0]sw_rst
4821
4822 // swith osd lpllset source
4823 // 0: osd with video lpllset
4824 // 1: osd with osd lpllset
4825 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_10_L, BIT(10), BIT(10));
4826
4827 // DIG clk en(OSD)
4828 // reg.6F [3:0]: reg_ckg_mod_sr_rclk_osd
4829 // reg.6F [7:4]: reg_ckg_mod_sr_rclk_pre_osd
4830 // reg.6F [11:8]: reg_ckg_mod_sr_rclk_final_osd
4831 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_6F_L, 0x0444, 0x0FFF);
4832
4833 //-------------------------------------
4834 //## pe
4835 // MOD_A_W2BYTE(REG_MOD_A_BK00_30_L, 0x3fff);
4836 // MOD_W2BYTE(REG_MOD_BK00_23_L, 0x7000);
4837 // MOD_W2BYTE(REG_MOD_BK00_24_L, 0x7fff);
4838 // MOD_W2BYTE(REG_MOD_BK00_25_L, 0x003f);
4839
4840 MOD_W2BYTE(REG_MOD_BK00_5A_L, 0x8f3f); //[15]all dk scr[13:8]aln_de_cnt [7:0] aln_pix_cnt
4841
4842 // maserati only
4843 // HW force setting free swap in OSD
4844 // in case of 8v4o: 0 1 2 3 8 9 A B ( video ) OSD0 OSD1 OSD2 OSD3 (OSD)
4845 // in case of 4v2o: 0 1 x x 8 9 x x ( video ) OSD0 OSD1 x x (OSD)
4846 // so 4v2o: need to add free swap setting ( 0x5410 0xffff ) to put video lane together
4847 // 4v2o: 0 1 8 9 x x x x ( video ) OSD0 OSD1 x x (OSD)
4848 MOD_W2BYTEMSK(REG_MOD_BK00_7C_L, BIT(0), BIT(0));
4849
4850 }
4851
4852 if( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_4LANE)
4853 {
4854 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_10_L, BIT(13),BIT(13));
4855
4856 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0055); //[7:0]reg_output_conf[27:16]
4857
4858 MOD_W2BYTEMSK(REG_MOD_BK00_2E_L, 0x0000, BIT(10)); //[10]enable osd lvds path
4859 MOD_W2BYTEMSK(REG_MOD_BK00_00_L, BIT(0), BIT(0)); //sw reset
4860 MOD_W2BYTEMSK(REG_MOD_BK00_54_L, 0x0000, BIT(14));
4861 MOD_W2BYTEMSK(REG_MOD_BK00_51_L, 0x0000, (BIT(2)|BIT(3)|BIT(4)) );
4862
4863 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_10_L, BIT(13),BIT(13));
4864
4865 //MOD_W2BYTE(REG_MOD_BK00_71_L, 0xffff); //can not find in Manhattan register table
4866
4867 //[13]reg_seri_auto_fix_osd : enable osd serializer auto fix read/write point mis-balance
4868 //[14]reg_seri_osd_mod:for OSD, switch chanel 8~13 as OSD path
4869 //[15]reg_dbg_status_switch:switch debug information(reg_dbg_status_sel/reg_dbg_status) between Video/OSD path 0: Video 1: OSD
4870 MOD_W2BYTEMSK(REG_MOD_BK00_76_L, (BIT(14)|BIT(13)) , (BIT(15)|BIT(14)|BIT(13)) );
4871
4872 //[0]reg_seri_enable:enable serializer function
4873 //[1]reg_seri_auto_fix:enable serializer auto fix read/write point mis-balance
4874 //[2]reg_fix_cnt_clr
4875 //[3]reg_dbg_status_sel:select debug status, read status from reg_dbg_status[15:0] 0: auto fix cnt 1: point diff value
4876 //[15..8]reg_tester_pix_ext: test pixel extension for 16bit serializer
4877 MOD_W2BYTEMSK(REG_MOD_BK00_78_L, 0x0003 , 0xFF0F);
4878
4879 MOD_W2BYTE(REG_MOD_BK00_5A_L, 0x8f3f);
4880 //-------------------------------------
4881 //## icon (Swing)
4882 MOD_A_W2BYTE(REG_MOD_A_BK00_34_L, 0x7f7f);
4883 MOD_A_W2BYTE(REG_MOD_A_BK00_35_L, 0x7f7f);
4884 MOD_A_W2BYTE(REG_MOD_A_BK00_36_L, 0x0000);
4885
4886 // vby1 osd 4 lane
4887 //[15]proc_st[13:12]byte_mode 4 byte mode[6]2ch_vby1_osd[9]swap
4888 MOD_W2BYTEMSK(REG_MOD_BK00_5B_L, 0xa260 , 0xFFE0);
4889 }
4890 else if( eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_2LANE)
4891 {
4892 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_10_L, BIT(13),BIT(13));
4893 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, 0x0005);
4894
4895 //-------------------------------------
4896 //## icon (Swing)
4897 MOD_A_W2BYTE(REG_MOD_A_BK00_34_L, 0x7f7f);
4898 MOD_A_W2BYTE(REG_MOD_A_BK00_35_L, 0x0000);
4899 MOD_A_W2BYTE(REG_MOD_A_BK00_36_L, 0x0000);
4900
4901 //vby1 osd 2 lane
4902 //[15]proc_st[13:12]byte_mode 4 byte mode[6]2ch_vby1_osd[9]swap
4903 MOD_W2BYTEMSK(REG_MOD_BK00_5B_L, 0xa240 , 0xFFE0);
4904 }
4905
4906 // Control VBY1 output format and bit orders
4907 switch(eOC_OutputFormat)
4908 {
4909 case E_PNL_OSDC_OUTPUT_FORMAT_VBY1_ARGB1:
4910 MOD_W2BYTEMSK(REG_MOD_BK00_64_L, 0x0000, BIT(10));
4911 break;
4912
4913 case E_PNL_OSDC_OUTPUT_FORMAT_VBY1_ARGB2:
4914 MOD_W2BYTEMSK(REG_MOD_BK00_64_L, BIT(10), BIT(10));
4915 break;
4916
4917 default:
4918 printf("OSDC output format uses default value\n");
4919 MOD_W2BYTEMSK(REG_MOD_BK00_64_L, 0x0000, BIT(10));
4920 break;
4921 }
4922
4923 //maserati : force set VBY1 OSD default free swap
4924 if( (IsVBY1(eLPLL_Type)) && ( APIPNL_OUTPUT_CHANNEL_ORDER_DEFAULT == pPNLResourcePrivate->stdrvPNL._stPnlInitData.u8OutputOrderType ) )
4925 {
4926 if(( E_PNL_LPLL_VBY1_10BIT_8LANE == eVideo_LPLL_Type ) || ( E_PNL_LPLL_VBY1_8BIT_8LANE == eVideo_LPLL_Type ))
4927 {
4928 if(( E_PNL_LPLL_VBY1_10BIT_4LANE == eLPLL_Type ) || ( E_PNL_LPLL_VBY1_8BIT_4LANE == eLPLL_Type ))
4929 {
4930 // 8v4o
4931 MHal_Output_Channel_Order(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0x5410,0x7632,0xBA98,0xFFFF);
4932 _MHal_PNL_Set_Clk(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0x5410,0x7632,0xBA98,0xFFFF);
4933 }
4934 else if(( E_PNL_LPLL_VBY1_10BIT_2LANE == eLPLL_Type ) || ( E_PNL_LPLL_VBY1_8BIT_2LANE == eLPLL_Type ))
4935 {
4936 // 8v2o
4937 MHal_Output_Channel_Order(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0x5410,0x7632,0xFF98,0xFFFF);
4938 _MHal_PNL_Set_Clk(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0x5410,0x7632,0xFF98,0xFFFF);
4939 }
4940 }
4941 else if(( E_PNL_LPLL_VBY1_10BIT_4LANE == eVideo_LPLL_Type ) || ( E_PNL_LPLL_VBY1_8BIT_4LANE == eVideo_LPLL_Type ))
4942 {
4943 if(( E_PNL_LPLL_VBY1_10BIT_4LANE == eLPLL_Type ) || ( E_PNL_LPLL_VBY1_8BIT_4LANE == eLPLL_Type ))
4944 {
4945 // 4v4o
4946 MHal_Output_Channel_Order(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0x5410,0xFFFF,0xBA98,0xFFFF);
4947 _MHal_PNL_Set_Clk(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0x5410,0xFFFF,0xBA98,0xFFFF);
4948 }
4949 else if(( E_PNL_LPLL_VBY1_10BIT_2LANE == eLPLL_Type ) || ( E_PNL_LPLL_VBY1_8BIT_2LANE == eLPLL_Type ))
4950 {
4951 // 4v2o
4952 MHal_Output_Channel_Order(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0x5410,0xFFFF,0xFF98,0xFFFF);
4953 _MHal_PNL_Set_Clk(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0x5410,0xFFFF,0xFF98,0xFFFF);
4954 }
4955 }
4956 else if(( E_PNL_LPLL_VBY1_10BIT_2LANE == eLPLL_Type ) || ( E_PNL_LPLL_VBY1_8BIT_2LANE == eLPLL_Type ))
4957 {
4958 if(( E_PNL_LPLL_VBY1_10BIT_4LANE == eLPLL_Type ) || ( E_PNL_LPLL_VBY1_8BIT_4LANE == eLPLL_Type ))
4959 {
4960 // 2v4o
4961 MHal_Output_Channel_Order(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0xFF10,0xFFFF,0xBA98,0xFFFF);
4962 _MHal_PNL_Set_Clk(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0xFF10,0xFFFF,0xBA98,0xFFFF);
4963 }
4964 else if(( E_PNL_LPLL_VBY1_10BIT_2LANE == eLPLL_Type ) || ( E_PNL_LPLL_VBY1_8BIT_2LANE == eLPLL_Type ))
4965 {
4966 // 2v2o
4967 MHal_Output_Channel_Order(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0xFF10,0xFFFF,0xFF98,0xFFFF);
4968 _MHal_PNL_Set_Clk(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0xFF10,0xFFFF,0xFF98,0xFFFF);
4969 }
4970 }
4971 else
4972 {
4973 // error
4974 MHal_Output_Channel_Order(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0xFFFF,0xFFFF,0xFFFF,0xFFFF);
4975 _MHal_PNL_Set_Clk(pInstance,APIPNL_OUTPUT_CHANNEL_ORDER_USER,0xFFFF,0xFFFF,0xFFFF,0xFFFF);
4976 }
4977 }
4978 }
4979
MHal_PNL_SetOSDSSC(void * pInstance,MS_U16 u16Fmodulation,MS_U16 u16Rdeviation,MS_BOOL bEnable)4980 MS_BOOL MHal_PNL_SetOSDSSC(void *pInstance, MS_U16 u16Fmodulation, MS_U16 u16Rdeviation, MS_BOOL bEnable)
4981 {
4982 MS_U16 u16Span;
4983 MS_U16 u16Step;
4984 MS_U32 u32PLL_SET;/// = MDrv_Read3Byte(L_BK_LPLL(0x0F));
4985
4986 MHal_PNL_Switch_LPLL_SubBank(pInstance, 0x00);
4987 u32PLL_SET = R4BYTE(L_BK_LPLL(0x48));
4988 // Set SPAN
4989 if(u16Fmodulation < 200 || u16Fmodulation > 400)
4990 u16Fmodulation = 300;
4991 u16Span =( ( (((MS_U32)LVDS_MPLL_CLOCK_MHZ*LVDS_SPAN_FACTOR ) / (u16Fmodulation) ) * 10000) / ((MS_U32)u32PLL_SET) ) ;
4992
4993 // Set STEP
4994 if(u16Rdeviation > 300)
4995 u16Rdeviation = 300;
4996 u16Step = ((MS_U32)u32PLL_SET*u16Rdeviation) / ((MS_U32)u16Span*10000);
4997
4998 W2BYTE(L_BK_LPLL(0x4E), u16Step & 0x0FFF);// LPLL_STEP
4999 W2BYTE(L_BK_LPLL(0x4F), u16Span & 0x3FFF);// LPLL_SPAN
5000 W2BYTEMSK((L_BK_LPLL(0x4E)), (bEnable << 15), BIT(15)); // Enable ssc
5001
5002
5003 return TRUE;
5004 }
5005
MHal_PNL_SetOSDSSC_En(void * pInstance,MS_BOOL bEnable)5006 void MHal_PNL_SetOSDSSC_En(void *pInstance, MS_BOOL bEnable)
5007 {
5008 //printf("bEnable = %d\n", bEnable);
5009 MHal_PNL_Switch_LPLL_SubBank(pInstance, 0x00);
5010 W2BYTEMSK((L_BK_LPLL(0x4E)), (bEnable << 15), BIT(15)); // Enable ssc
5011 }
5012
MHal_PNL_Set_T3D_Setting(void * pInstance)5013 void MHal_PNL_Set_T3D_Setting(void *pInstance)
5014 {
5015 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
5016 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
5017 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
5018 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
5019
5020 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK63_55_L, pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16Width, 0x1FFF);//pixel width
5021 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK63_66_L, pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16Height, 0x1FFF);//reg_col_height
5022 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK63_51_L, pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16Width, 0x1FFF);//reg_ln_width
5023 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK63_52_L, pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16Height, 0x1FFF);//reg_col_height
5024 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK62_61_L, pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16Width, 0x3FFF);//reg_ln_width
5025 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK62_62_L, pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16Height, 0x1FFF);//reg_col_height
5026
5027 //per designer, should always enable t3d, since it will affect osd/video's pipeline
5028 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK63_61_L, BIT(0), BIT(0));//Enable Depth Render, for osd pipe line adjustment
5029 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK62_08_L, BIT(4), BIT(4));//mtv bypass mode
5030 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK63_57_L,(BIT(0)|BIT(1)),(BIT(0)|BIT(1)));//T3D fix subde enable, fix for T3D/PIP conflict issue (bit 0) Bug Fix miu eco (bit 1)
5031
5032 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK62_63_L, 0x00, BIT(0)); // default disable T3D SRAM
5033 }
5034
MHal_PNL_Set_Device_Bank_Offset(void * pInstance)5035 void MHal_PNL_Set_Device_Bank_Offset(void *pInstance)
5036 {
5037 UNUSED(pInstance);
5038 memset(u32PNL_XCDeviceBankOffset, 0, sizeof(MS_U32)*E_PNL_DEVICE_ID_NUM);
5039 u32PNL_XCDeviceBankOffset[E_PNL_DEVICE_ID_0] = E_HALPNL_DEVICE0_XC_BANK_OFFSET; // Set SC0 reg bank offset
5040 u32PNL_XCDeviceBankOffset[E_PNL_DEVICE_ID_1] = E_HALPNL_DEVICE1_XC_BANK_OFFSET; // Set SC2 reg bank offset
5041 }
5042
MHal_PNL_Init(void * pInstance)5043 void MHal_PNL_Init(void *pInstance)
5044 {
5045 // Do nothing
5046 //UNUSED(pInstance);
5047 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
5048 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
5049
5050 // STGEN reset
5051 SC_W2BYTEMSK(pPNLInstancePrivate->u32DeviceID, REG_SC_BK68_50_L, BIT(3), BIT(3));
5052 }
5053
MHal_PNL_Bringup(void * pInstance)5054 void MHal_PNL_Bringup(void *pInstance)
5055 {
5056 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
5057 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
5058 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
5059 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
5060
5061 ///patch for bring up
5062 if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_LVDS)
5063 {
5064 }
5065 else if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_LPLL_VBY1_10BIT_8LANE)
5066 {
5067 }
5068
5069 }
5070
MHal_PNL_GetPanelVStart(void)5071 MS_U16 MHal_PNL_GetPanelVStart(void)
5072 {
5073 return 8;
5074 }
5075
MHal_PNL_Check_VBY1_Handshake_Status(void * pInstance)5076 MS_BOOL MHal_PNL_Check_VBY1_Handshake_Status(void *pInstance)
5077 {
5078 if(MOD_R2BYTEMSK(REG_MOD_BK00_60_L, 0x0FFF) != 0xFAE)
5079 {
5080 //printf("VBY1 handshake return because the reg value is 0x%u, not 0xFAE.\n", MOD_R2BYTEMSK(REG_MOD_BK00_60_L, 0x0FFF));
5081 return FALSE;
5082 }
5083 else
5084 {
5085 //printf("VBY handshake check success.\n");
5086 return TRUE;
5087 }
5088 }
5089
MHal_PNL_ChannelFIFOPointerADjust(void * pInstance)5090 void MHal_PNL_ChannelFIFOPointerADjust(void *pInstance)
5091 {
5092 //do not support in Maserati
5093 }
5094
MHal_PNL_VBY1_Hardware_TrainingMode_En(void * pInstance,MS_BOOL bIsVideoMode,MS_BOOL bEnable)5095 void MHal_PNL_VBY1_Hardware_TrainingMode_En(void *pInstance, MS_BOOL bIsVideoMode ,MS_BOOL bEnable)
5096 {
5097 if(bIsVideoMode)
5098 {
5099 if(bEnable)
5100 {
5101 MOD_W2BYTE(REG_MOD_BK00_60_L, 0x0AAE);
5102 }
5103 else
5104 {
5105 MOD_W2BYTE(REG_MOD_BK00_60_L, 0x0AA6);
5106 }
5107 }
5108 else
5109 {
5110 if(bEnable)
5111 {
5112 MOD_W2BYTE(REG_MOD_BK00_59_L, 0x0AAE);
5113 }
5114 else
5115 {
5116 MOD_W2BYTE(REG_MOD_BK00_59_L, 0x0AA6);
5117 }
5118 }
5119 }
5120
MHal_PNL_VBY1_IsSupport_Hardware_TrainingMode(void * pInstance)5121 MS_BOOL MHal_PNL_VBY1_IsSupport_Hardware_TrainingMode(void *pInstance)
5122 {
5123 #ifdef SUPPORT_VBY1_HWTRAINING_MODE
5124 return TRUE;
5125 #else
5126 return FALSE;
5127 #endif
5128 }
5129
MHal_PNL_TCON_Patch(void)5130 void MHal_PNL_TCON_Patch(void)
5131 {
5132 // MOD sw reset
5133 MOD_W2BYTEMSK(REG_MOD_BK00_00_L, 0x0000, BIT(0)); //sw reset
5134 MOD_W2BYTEMSK(REG_MOD_BK00_2E_L, 0x0000, BIT(10)); //[10]enable osd lvds path
5135 MOD_W2BYTEMSK(REG_MOD_BK00_54_L, 0x0000, BIT(14));
5136 MOD_W2BYTEMSK(REG_MOD_BK00_51_L, 0x0000, (BIT(2)|BIT(3)|BIT(4)) );
5137
5138 MOD_W2BYTEMSK(REG_MOD_BK00_00_L, BIT(0), BIT(0)); //sw reset
5139
5140
5141 // Setting TCON signal through MOD PAD
5142 MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x1818);
5143 MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x9818);
5144 MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x0000);
5145 MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x1928);
5146 MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x9928);
5147 MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x0000);
5148 MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x1a38);
5149 MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x9a38);
5150 MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x0000);
5151 MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x1b78);
5152 MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x9b78);
5153 MOD_A_W2BYTE(REG_MOD_A_BK00_6A_L,0x0000);
5154 }
5155
_Hal_MOD_External_eFuse(void)5156 static MS_BOOL _Hal_MOD_External_eFuse(void)
5157 {
5158 #ifdef MOD_EFUSE_IN_MBOOT
5159 return TRUE;
5160 #else
5161 return FALSE;
5162 #endif
5163 }
5164
_Hal_MOD_VB1_CH_SWICH(PNL_TYPE eLPLL_Type_Ext)5165 static void _Hal_MOD_VB1_CH_SWICH(PNL_TYPE eLPLL_Type_Ext)
5166 {
5167 //SC4 7C[11]:reg_vby1_4ch / enable 4ch vx1mode
5168 //SC4 7C[12]:reg_vby1_16v4o / vby1 16 vedio 4 osd mode
5169 //SC4 7C[13]:reg_vby1_8v4o_mode / vby1 8 vedio 4 osd mode
5170 //SC4 7C[14]:reg_vby1_8ch / enable 8ch vx1mode
5171 //SC4 7C[15]:reg_vby1_16ch / enable 16ch vx1mode
5172 if( (eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_4LANE) || (eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_4LANE) )
5173 {// 4 lane
5174 MOD_W2BYTEMSK(REG_MOD_BK00_7C_L, BIT(11), 0xF800);
5175 }
5176 else if( (eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE) || (eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_8LANE) )
5177 {// 8 lane
5178 MOD_W2BYTEMSK(REG_MOD_BK00_7C_L, BIT(14), 0xF800);
5179 }
5180 else if( (eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE) || (eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE) )
5181 {// 16 lane
5182 MOD_W2BYTEMSK(REG_MOD_BK00_7C_L, BIT(15), 0xF800);
5183 }
5184 else
5185 {// 2 lane
5186 MOD_W2BYTEMSK(REG_MOD_BK00_7C_L, 0x0000, 0xF800);
5187 }
5188 }
5189
_Hal_MOD_Refine_ICON(MS_U16 u16ICON)5190 static MS_U16 _Hal_MOD_Refine_ICON(MS_U16 u16ICON)
5191 {
5192 MS_U16 u16ICON_L = (u16ICON & 0x00FF);
5193 MS_U16 u16ICON_H = ((u16ICON & 0xFF00)>>8);
5194 MS_U16 u16Result = 0;
5195 if( (u16ICON_L > MOD_LVDS_ICON_HIGH_LIMIT) || (u16ICON_L < MOD_LVDS_ICON_LOW_LIMIT) )
5196 {
5197 u16Result = MOD_LVDS_ICON_DEFAULT;
5198 }
5199 else
5200 {
5201 u16Result = u16ICON_L;
5202 }
5203
5204 if( (u16ICON_H > MOD_LVDS_ICON_HIGH_LIMIT) || (u16ICON_H < MOD_LVDS_ICON_LOW_LIMIT) )
5205 {
5206 u16Result |= (MOD_LVDS_ICON_DEFAULT<<8);
5207 }
5208 else
5209 {
5210 u16Result |= (u16ICON_H<<8);
5211 }
5212 return u16Result;
5213 }
5214
_MHal_PNL_DumpVideoClkTable(MS_U8 u8CLKTblIndex)5215 static void _MHal_PNL_DumpVideoClkTable(MS_U8 u8CLKTblIndex)
5216 {
5217 // step1. load CLK GEN0 table
5218 if (u8CLKTblIndex == E_PNL_SUPPORTED_CLK_MAX)
5219 {
5220 printf("[%s,%5d] Unspported LPLL Type, skip LPLL setting\n",__FUNCTION__,__LINE__);
5221 return;
5222 }
5223
5224 int indexCounter = 0;
5225
5226 for(indexCounter = 0 ; indexCounter<CLK_GEN0_REG_VIDEO_NUM; indexCounter++)
5227 {
5228 if (CLKGEN0SettingTBL_Video[u8CLKTblIndex][indexCounter].address == 0xFF) //delay in micro second
5229 {
5230 MsOS_DelayTaskUs(CLKGEN0SettingTBL_Video[u8CLKTblIndex][indexCounter].value);
5231 continue; // step forward to next register setting.
5232 }
5233
5234 W2BYTEMSK(L_CLKGEN0(CLKGEN0SettingTBL_Video[u8CLKTblIndex][indexCounter].address),
5235 CLKGEN0SettingTBL_Video[u8CLKTblIndex][indexCounter].value,
5236 CLKGEN0SettingTBL_Video[u8CLKTblIndex][indexCounter].mask);
5237 }
5238 PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]LPLLTblIndex=%u\n", __FUNCTION__, __LINE__, u8CLKTblIndex);
5239
5240 // step2. load CLK GEN2 table
5241 if (u8CLKTblIndex == E_PNL_SUPPORTED_CLK_MAX)
5242 {
5243 printf("[%s,%5d] Unspported LPLL Type, skip LPLL setting\n",__FUNCTION__,__LINE__);
5244 return;
5245 }
5246
5247 for(indexCounter = 0 ; indexCounter<CLK_GEN2_REG_VIDEO_NUM; indexCounter++)
5248 {
5249 if (CLKGEN2SettingTBL_Video[u8CLKTblIndex][indexCounter].address == 0xFF) //delay in micro second
5250 {
5251 MsOS_DelayTaskUs(CLKGEN2SettingTBL_Video[u8CLKTblIndex][indexCounter].value);
5252 continue; // step forward to next register setting.
5253 }
5254
5255 W2BYTEMSK(L_CLKGEN2(CLKGEN2SettingTBL_Video[u8CLKTblIndex][indexCounter].address),
5256 CLKGEN2SettingTBL_Video[u8CLKTblIndex][indexCounter].value,
5257 CLKGEN2SettingTBL_Video[u8CLKTblIndex][indexCounter].mask);
5258 }
5259 PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]LPLLTblIndex=%u\n", __FUNCTION__, __LINE__, u8CLKTblIndex);
5260 }
5261
_MHal_PNL_DumpOSDClkTable(MS_U8 u8CLKTblIndex)5262 static void _MHal_PNL_DumpOSDClkTable(MS_U8 u8CLKTblIndex)
5263 {
5264 // step1. load CLK GEN0 table
5265 if (u8CLKTblIndex == E_PNL_SUPPORTED_CLK_MAX)
5266 {
5267 printf("[%s,%5d] Unspported LPLL Type, skip LPLL setting\n",__FUNCTION__,__LINE__);
5268 return;
5269 }
5270
5271 int indexCounter = 0;
5272
5273 for(indexCounter = 0 ; indexCounter<CLK_GEN0_REG_OSD_NUM; indexCounter++)
5274 {
5275 if (CLKGEN0SettingTBL_OSD[u8CLKTblIndex][indexCounter].address == 0xFF) //delay in micro second
5276 {
5277 MsOS_DelayTaskUs(CLKGEN0SettingTBL_OSD[u8CLKTblIndex][indexCounter].value);
5278 continue; // step forward to next register setting.
5279 }
5280
5281 W2BYTEMSK(L_CLKGEN0(CLKGEN0SettingTBL_OSD[u8CLKTblIndex][indexCounter].address),
5282 CLKGEN0SettingTBL_OSD[u8CLKTblIndex][indexCounter].value,
5283 CLKGEN0SettingTBL_OSD[u8CLKTblIndex][indexCounter].mask);
5284 }
5285 PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]LPLLTblIndex=%u\n", __FUNCTION__, __LINE__, u8CLKTblIndex);
5286
5287 // step2. load CLK GEN2 table
5288 if (u8CLKTblIndex == E_PNL_SUPPORTED_CLK_MAX)
5289 {
5290 printf("[%s,%5d] Unspported LPLL Type, skip LPLL setting\n",__FUNCTION__,__LINE__);
5291 return;
5292 }
5293
5294 for(indexCounter = 0 ; indexCounter<CLK_GEN2_REG_OSD_NUM; indexCounter++)
5295 {
5296 if (CLKGEN2SettingTBL_OSD[u8CLKTblIndex][indexCounter].address == 0xFF) //delay in micro second
5297 {
5298 MsOS_DelayTaskUs(CLKGEN2SettingTBL_OSD[u8CLKTblIndex][indexCounter].value);
5299 continue; // step forward to next register setting.
5300 }
5301
5302 W2BYTEMSK(L_CLKGEN2(CLKGEN2SettingTBL_OSD[u8CLKTblIndex][indexCounter].address),
5303 CLKGEN2SettingTBL_OSD[u8CLKTblIndex][indexCounter].value,
5304 CLKGEN2SettingTBL_OSD[u8CLKTblIndex][indexCounter].mask);
5305 }
5306 PNL_DBG(PNL_DBGLEVEL_INIT, "[%s][%d]LPLLTblIndex=%u\n", __FUNCTION__, __LINE__, u8CLKTblIndex);
5307 }
5308
_MHal_Transfer_PanelType_To_CLKType(PNL_TYPE eLPLL_Type,PNL_MODE eLPLL_Mode)5309 static E_PNL_SUPPORTED_CLK_TYPE _MHal_Transfer_PanelType_To_CLKType(PNL_TYPE eLPLL_Type, PNL_MODE eLPLL_Mode)
5310 {
5311 E_PNL_SUPPORTED_CLK_TYPE eCLKTypeResult = E_PNL_SUPPORTED_CLK_TTL;
5312
5313 switch(eLPLL_Type)
5314 {
5315 case E_PNL_TYPE_TTL:
5316 eCLKTypeResult = E_PNL_SUPPORTED_CLK_TTL;
5317 break;
5318
5319 case E_PNL_TYPE_LVDS:
5320 if(eLPLL_Mode == E_PNL_MODE_SINGLE)
5321 eCLKTypeResult = E_PNL_SUPPORTED_CLK_LVDS_1CH;
5322 else
5323 eCLKTypeResult = E_PNL_SUPPORTED_CLK_LVDS_2CH;
5324 break;
5325
5326 case E_PNL_TYPE_HS_LVDS:
5327 if(eLPLL_Mode == E_PNL_MODE_SINGLE)
5328 eCLKTypeResult = E_PNL_SUPPORTED_CLK_HS_LVDS_1CH;
5329 else
5330 eCLKTypeResult = E_PNL_SUPPORTED_CLK_HS_LVDS_2CH;
5331 break;
5332
5333 case E_PNL_LPLL_VBY1_10BIT_16LANE:
5334 eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_16CH_10BIT;
5335 break;
5336
5337 case E_PNL_LPLL_VBY1_8BIT_16LANE:
5338 eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_16CH_8BIT;
5339 break;
5340
5341 case E_PNL_LPLL_VBY1_10BIT_8LANE:
5342 eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_8CH_10BIT;
5343 break;
5344
5345 case E_PNL_LPLL_VBY1_8BIT_8LANE:
5346 eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_8CH_8BIT;
5347 break;
5348
5349 case E_PNL_LPLL_VBY1_10BIT_4LANE:
5350 eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_4CH_10BIT;
5351 break;
5352
5353 case E_PNL_LPLL_VBY1_8BIT_4LANE:
5354 eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_4CH_8BIT;
5355 break;
5356
5357 case E_PNL_LPLL_VBY1_10BIT_2LANE:
5358 eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_2CH_10BIT;
5359 break;
5360
5361 case E_PNL_LPLL_VBY1_8BIT_2LANE:
5362 eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_2CH_8BIT;
5363 break;
5364
5365 case E_PNL_LPLL_VBY1_10BIT_1LANE:
5366 eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_1CH_10BIT;
5367 break;
5368
5369 case E_PNL_LPLL_VBY1_8BIT_1LANE:
5370 eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_1CH_8BIT;
5371 break;
5372
5373 default:
5374 eCLKTypeResult = E_PNL_SUPPORTED_CLK_TTL;
5375 break;
5376 }
5377 return eCLKTypeResult;
5378 }
5379
_MHal_Transfer_PanelType_To_CLKType_OSD(PNL_TYPE eLPLL_OSD_Type,PNL_TYPE eLPLL_Video_Type,PNL_MODE eLPLL_Mode)5380 static E_PNL_SUPPORTED_CLK_TYPE _MHal_Transfer_PanelType_To_CLKType_OSD(PNL_TYPE eLPLL_OSD_Type,PNL_TYPE eLPLL_Video_Type,PNL_MODE eLPLL_Mode)
5381 {
5382 E_PNL_SUPPORTED_CLK_TYPE eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_8V4O_10BIT;
5383
5384 switch(eLPLL_OSD_Type)
5385 {
5386 case E_PNL_LPLL_VBY1_10BIT_4LANE:
5387 eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_8V4O_10BIT;
5388 break;
5389
5390 case E_PNL_LPLL_VBY1_8BIT_4LANE:
5391 eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_8V4O_8BIT;
5392 break;
5393
5394 case E_PNL_LPLL_VBY1_10BIT_2LANE:
5395 eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_4V2O_10BIT;
5396 break;
5397
5398 case E_PNL_LPLL_VBY1_8BIT_2LANE:
5399 eCLKTypeResult = E_PNL_SUPPORTED_CLK_VBY1_4V2O_8BIT;
5400 break;
5401
5402 default:
5403 eCLKTypeResult = _MHal_Transfer_PanelType_To_CLKType(eLPLL_Video_Type, eLPLL_Mode);
5404 break;
5405 }
5406 return eCLKTypeResult;
5407 }
5408
5409 #define HALFLINE_PIXEL_ALIGN 16
5410
_MHal_PNL_Init_MFT(void * pInstance,PNL_InitData * pstPanelInitData)5411 static void _MHal_PNL_Init_MFT(void *pInstance, PNL_InitData *pstPanelInitData)
5412 {
5413 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
5414 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
5415 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
5416 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
5417
5418 MS_BOOL bMFTenable = TRUE;
5419 MS_U16 u16halfline_pixel = 0; //Half line pixel number of active
5420
5421 if( (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE) || (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE) )
5422 {
5423 if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16MOD_CTRLA & BIT(1))
5424 {
5425 // vby1 16 lane 4 division, open
5426 bMFTenable = TRUE;
5427 }
5428 else
5429 {
5430 // vby1 16 lane 2 division, close
5431 bMFTenable = FALSE;
5432 }
5433 }
5434 else if( (IsVBY1(pstPanelInitData->eLPLL_Type_Ext)) &&
5435 (pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16MOD_CTRLA & BIT(1)) )
5436 {
5437 // vby1 1 lane / 2 lane / 4 lane / 8 lane 2 Divisoin, close
5438 bMFTenable = FALSE;
5439 }
5440 else
5441 {
5442 // case1. single LVDS : 4P->1P, so open
5443 // case2. vby1 1/4/8 division: format be changed, so need to open MFT
5444 // case3. dual LVDS / TCON : 4P->1P, so open
5445 bMFTenable = TRUE;
5446 }
5447
5448 if(bMFTenable)
5449 {
5450 // MFT setting
5451 // MFT reg00[11:0] reg_halfline: Half line pixel number of active(from 0)
5452 // 1/2/4 division: hde/4 - 1
5453 // 8 division: hde/8 -1
5454
5455 ///Maserati is 4P mode and the half line pixel align is 16
5456 if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16Width % HALFLINE_PIXEL_ALIGN)
5457 {
5458 u16halfline_pixel = ((pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16Width + (HALFLINE_PIXEL_ALIGN-1))/HALFLINE_PIXEL_ALIGN * HALFLINE_PIXEL_ALIGN)/4 -1;
5459 }
5460 else
5461 u16halfline_pixel = pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16Width/4 -1;
5462
5463 if( (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)||
5464 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE )||
5465 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE)||
5466 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_8LANE )||
5467 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_4LANE)||
5468 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_4LANE ))
5469 {// 4k2k
5470 W2BYTEMSK(REG_MFT_00_L, u16halfline_pixel, 0x0FFF); // half_line = hde/4-1 = 3840 / 4 - 1 = 959
5471 }
5472 else
5473 {// fullHD
5474 W2BYTEMSK(REG_MFT_00_L, u16halfline_pixel, 0x0FFF); // half_line = hde/16-1 = 1920 / 16 - 1 = 479
5475 }
5476
5477 // MFT reg01[4] reg_1ch_lvds: 1ch lvds mux
5478 if( ((pstPanelInitData->eLPLL_Type == E_PNL_TYPE_LVDS)&&(pstPanelInitData->eLPLL_Mode==E_PNL_MODE_SINGLE)) ||
5479 (pstPanelInitData->eLPLL_Type == E_PNL_TYPE_TTL) ||
5480 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_1LANE) ||
5481 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_1LANE))
5482 {
5483 // single LVDS / TTL / vby1 1lane is one ch, so open
5484 W2BYTEMSK(REG_MFT_01_L, BIT(4), BIT(4));
5485 }
5486 else
5487 {
5488 W2BYTEMSK(REG_MFT_01_L, 0x0000, BIT(4));
5489 }
5490
5491 // MFT reg01[3..0] reg_dout_sel: Data output select
5492 if( (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)||
5493 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE )||
5494 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE)||
5495 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_8LANE )||
5496 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_4LANE)||
5497 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_4LANE ) )
5498 {
5499 // 4p -> 4p, so close
5500 W2BYTEMSK(REG_MFT_01_L, 0x0000, BIT(0));
5501 }
5502 else
5503 {
5504 //case1. 4p->2p, so open
5505 //case2. 4p->1p, so open
5506 W2BYTEMSK(REG_MFT_01_L, BIT(0), BIT(0));
5507 }
5508
5509 // MFT reg03[15..14] reg_mode: mode of pixel sequence, 0:LR2OE, 1:LR2LRGB, 2:OE2LR
5510 // if 4 division, then MFT reg03[15:14]=2'b10, other default=2'b00
5511
5512 // MFT reg03[11] reg_2ch_lvds: 2ch lvds mux
5513 if( (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)||
5514 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE )||
5515 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE)||
5516 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_8LANE )||
5517 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_4LANE)||
5518 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_4LANE ) )
5519 {
5520 // 4p -> 4p, so close
5521 W2BYTEMSK(REG_MFT_03_L, 0x0000, BIT(11));
5522 }
5523 else
5524 {
5525 //case1. 4p->2p, so open
5526 //case2. 4p->1p, so open
5527 if( ((pstPanelInitData->eLPLL_Type == E_PNL_TYPE_LVDS)&&(pstPanelInitData->eLPLL_Mode==E_PNL_MODE_SINGLE)) ||
5528 (pstPanelInitData->eLPLL_Type == E_PNL_TYPE_TTL) ||
5529 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_1LANE) ||
5530 (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_1LANE) )
5531 {
5532 // single LVDS / TTL / vby1 1lane is one ch, so close
5533 W2BYTEMSK(REG_MFT_03_L, 0x00, BIT(11));
5534 }
5535 else
5536 {
5537 W2BYTEMSK(REG_MFT_03_L, BIT(11), BIT(11));
5538 }
5539 }
5540
5541 if( (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE) || (pstPanelInitData->eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE) )
5542 {
5543 // 1 / 2 / 8 division
5544 if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16MOD_CTRLA & BIT(1))
5545 {
5546 // vby1 16 lane 4 division
5547 W2BYTEMSK(REG_MFT_03_L, BIT(15), (BIT(15) | BIT(14)));
5548 }
5549 }
5550 }
5551
5552
5553 // rule: for TCON, if MFT 03[10]=1 , then we have to set MFT 02[11:0]
5554 // BUT script:MFT reg02[11..0] reg_vst_dly: control delay value
5555 if(pstPanelInitData->eLPLL_Type == E_PNL_TYPE_LVDS)
5556 {
5557 W2BYTEMSK(REG_MFT_02_L, 0x000F, 0x0FFF);
5558 }
5559
5560 // MFT reg01[15] reg_mft_lb_en: Enable mft for format translate
5561 if(bMFTenable)
5562 {
5563 W2BYTEMSK(REG_MFT_01_L, BIT(15), BIT(15));
5564 }
5565 else
5566 {
5567 W2BYTEMSK(REG_MFT_01_L, 0x0000, BIT(15));
5568 }
5569
5570 }
5571
_MHal_PNL_Get_LaneNum(void * pInstance)5572 static MS_U8 _MHal_PNL_Get_LaneNum(void *pInstance)
5573 {
5574 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
5575 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
5576 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
5577 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
5578
5579 MS_U8 u8LaneNum = 0;
5580 //check lane num
5581 if((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)
5582 ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE))
5583 {
5584 u8LaneNum = 16;
5585 }
5586 else if((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE)
5587 ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_8LANE))
5588 {
5589 u8LaneNum = 8;
5590 }
5591 else if((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_4LANE)
5592 ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_4LANE))
5593 {
5594 u8LaneNum = 4;
5595 }
5596 else if((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_2LANE)
5597 ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_2LANE))
5598 {
5599 u8LaneNum = 2;
5600 }
5601 else if((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_1LANE)
5602 ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_1LANE))
5603 {
5604 u8LaneNum = 1;
5605 }
5606 else
5607 {
5608 u8LaneNum = 0;
5609 }
5610 return u8LaneNum;
5611 }
5612
5613
_MHal_PNL_Auto_Set_Config(void * pInstance,MS_U16 u16OutputOrder0_3,MS_U16 u16OutputOrder4_7,MS_U16 u16OutputOrder8_11,MS_U16 u16OutputOrder12_15)5614 static void _MHal_PNL_Auto_Set_Config(void *pInstance,
5615 MS_U16 u16OutputOrder0_3,
5616 MS_U16 u16OutputOrder4_7,
5617 MS_U16 u16OutputOrder8_11,
5618 MS_U16 u16OutputOrder12_15)
5619 {
5620 //attention : This function just support vby1 now.
5621 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
5622 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
5623 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
5624 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
5625
5626
5627 MS_U8 u8OutputConfigCount = 0;
5628 MS_U16 u16Config =0;
5629 MS_U8 u8Count = 0;
5630 MS_U8 u8LaneNum = 0;
5631 MS_BOOL bSkip = TRUE;
5632 MS_U16 u16LaneLimit = 0;
5633
5634 //check lane num
5635 u8LaneNum = _MHal_PNL_Get_LaneNum(pInstance);
5636 if(u8LaneNum!=0)
5637 {
5638 bSkip = FALSE;
5639 }
5640 else
5641 {
5642 bSkip = TRUE;
5643
5644 //use default config
5645 MHal_Output_LVDS_Pair_Setting(pInstance,
5646 pPNLResourcePrivate->sthalPNL._u8MOD_LVDS_Pair_Type,
5647 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG0_7,
5648 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG8_15,
5649 pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16OutputCFG16_21);
5650 }
5651
5652 //set Lane Limit in 16 lane case
5653 if((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)
5654 ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE))
5655 {
5656 // 16 lane
5657 u16LaneLimit = PINMAPPING_MAX_LANE + 1;
5658 }
5659 else
5660 {
5661 // 1 / 2 / 4 / 8 lane
5662 u16LaneLimit = PINMAPPING_MAX_LANE;
5663
5664 }
5665
5666 if(!bSkip)
5667 {
5668 //set output config
5669 u16Config = 0;
5670 u8OutputConfigCount = 0;
5671 for( u8Count = 0 ; u8Count < LANE_NUM_EACH_PINMAPPING_GROUP1 ; u8Count++ )
5672 {
5673 if( ( u16OutputOrder0_3 % PINMAPPING_EXP ) < u16LaneLimit)
5674 {
5675 u16Config += CONFIG_FOR_VBY1_DATA<<u8OutputConfigCount;
5676 }
5677 u16OutputOrder0_3 = u16OutputOrder0_3 / PINMAPPING_EXP;
5678 u8OutputConfigCount += CONFIG_FOR_VBY1_DATA_BIT_NUM;
5679 }
5680 for( u8Count = 0 ; u8Count < LANE_NUM_EACH_PINMAPPING_GROUP2 ; u8Count++ )
5681 {
5682 if( (u16OutputOrder4_7 % PINMAPPING_EXP ) < u16LaneLimit)
5683 {
5684 u16Config += CONFIG_FOR_VBY1_DATA<<u8OutputConfigCount;
5685 }
5686 u16OutputOrder4_7 = u16OutputOrder4_7 / PINMAPPING_EXP;
5687 u8OutputConfigCount += CONFIG_FOR_VBY1_DATA_BIT_NUM;
5688 }
5689 MOD_A_W2BYTE(REG_MOD_A_BK00_18_L, u16Config);
5690
5691 u16Config =0;
5692 u8OutputConfigCount = 0;
5693 for( u8Count = 0 ; u8Count < LANE_NUM_EACH_PINMAPPING_GROUP3 ; u8Count++ )
5694 {
5695 if( (u16OutputOrder8_11 % PINMAPPING_EXP ) < u16LaneLimit)
5696 {
5697 u16Config += CONFIG_FOR_VBY1_DATA<<u8OutputConfigCount;
5698 }
5699 u16OutputOrder8_11 = u16OutputOrder8_11 / PINMAPPING_EXP;
5700 u8OutputConfigCount += CONFIG_FOR_VBY1_DATA_BIT_NUM;
5701 }
5702 for( u8Count = 0 ; u8Count < LANE_NUM_EACH_PINMAPPING_GROUP4 ; u8Count++ )
5703 {
5704 if( (u16OutputOrder12_15 % PINMAPPING_EXP ) < u16LaneLimit)
5705 {
5706 u16Config += CONFIG_FOR_VBY1_DATA<<u8OutputConfigCount;
5707 }
5708 u16OutputOrder12_15 = u16OutputOrder12_15 / PINMAPPING_EXP;
5709 u8OutputConfigCount += CONFIG_FOR_VBY1_DATA_BIT_NUM;
5710 }
5711 MOD_A_W2BYTE(REG_MOD_A_BK00_19_L, u16Config);
5712 }
5713 }
5714
_MHal_PNL_Set_Clk(void * pInstance,MS_U8 Type,MS_U16 u16OutputOrder0_3,MS_U16 u16OutputOrder4_7,MS_U16 u16OutputOrder8_11,MS_U16 u16OutputOrder12_15)5715 static void _MHal_PNL_Set_Clk(void *pInstance,
5716 MS_U8 Type,
5717 MS_U16 u16OutputOrder0_3,
5718 MS_U16 u16OutputOrder4_7,
5719 MS_U16 u16OutputOrder8_11,
5720 MS_U16 u16OutputOrder12_15)
5721 {
5722 PNL_INSTANCE_PRIVATE *pPNLInstancePrivate = NULL;
5723 PNL_RESOURCE_PRIVATE* pPNLResourcePrivate = NULL;
5724 UtopiaInstanceGetPrivate(pInstance, (void**)&pPNLInstancePrivate);
5725 UtopiaResourceGetPrivate(g_pPNLResource[PNL_GET_INTERNAL_POOL_ID(pPNLInstancePrivate->u32DeviceID)],(void**)(&pPNLResourcePrivate));
5726
5727 if(Type == APIPNL_OUTPUT_CHANNEL_ORDER_USER )
5728 {
5729 MS_U8 u8Clk = 0;
5730 MS_U8 u8LaneNum = 0;
5731 MS_BOOL bSkip = TRUE;
5732 MS_U8 u8Count = 0;
5733 MS_U8 u8Count1 = 0;
5734 MS_U8 u8StartLane = 0;
5735 MS_U16 u16LaneLimit = 0;
5736
5737 //check lane num
5738 u8LaneNum = _MHal_PNL_Get_LaneNum(pInstance);
5739 if(u8LaneNum!=0)
5740 {
5741 bSkip = FALSE;
5742 }
5743 else
5744 {
5745 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, 0x1F, 0x1F); //open all clk
5746 bSkip = TRUE;
5747 }
5748
5749 //set Lane Limit in 16 lane case
5750 if((pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)
5751 ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE))
5752 {
5753 // 16 lane
5754 u16LaneLimit = PINMAPPING_MAX_LANE + 1;
5755 }
5756 else
5757 {
5758 // 1 / 2 / 4 / 8 lane
5759 u16LaneLimit = PINMAPPING_MAX_LANE;
5760 }
5761
5762 //count clk
5763 if(!bSkip)
5764 {
5765 u8Clk = 0;
5766 u8StartLane = 0;
5767 for( u8Count = u8StartLane ; u8Count < (u8StartLane+LANE_NUM_EACH_PINMAPPING_GROUP1) ; u8Count++ )
5768 {//lane 0 - lane 3
5769 if( ( u16OutputOrder0_3 % PINMAPPING_EXP ) < u16LaneLimit)
5770 {
5771 u8Count1 = 0;
5772 do
5773 {
5774 if(u8Count>=LANE_AND_CLK_TBL[u8Count1][0] && u8Count<=LANE_AND_CLK_TBL[u8Count1][1])
5775 {
5776 u8Clk |= LANE_AND_CLK_TBL[u8Count1][2];
5777 break;
5778 }
5779 u8Count1 ++;
5780 }
5781 while(u8Count1<VBY1_CLK_TBL_ROW);
5782 }
5783 u16OutputOrder0_3 /= PINMAPPING_EXP;
5784 }
5785
5786 u8StartLane = 4;
5787 for( u8Count = u8StartLane ; u8Count < (u8StartLane+LANE_NUM_EACH_PINMAPPING_GROUP2) ; u8Count++ )
5788 {//lane 4 - lane 7
5789 if( ( u16OutputOrder4_7 % PINMAPPING_EXP ) < u16LaneLimit)
5790 {
5791 u8Count1 = 0;
5792 do
5793 {
5794 if(u8Count>=LANE_AND_CLK_TBL[u8Count1][0] && u8Count<=LANE_AND_CLK_TBL[u8Count1][1])
5795 {
5796 u8Clk |= LANE_AND_CLK_TBL[u8Count1][2];
5797 break;
5798 }
5799 u8Count1 ++;
5800 }
5801 while(u8Count1<VBY1_CLK_TBL_ROW);
5802 }
5803 u16OutputOrder4_7 /= PINMAPPING_EXP;
5804 }
5805
5806 u8StartLane = 8;
5807 for( u8Count = u8StartLane ; u8Count < (u8StartLane+LANE_NUM_EACH_PINMAPPING_GROUP3) ; u8Count++ )
5808 {//lane 8 - lane 11
5809 if( ( u16OutputOrder8_11 % PINMAPPING_EXP ) < u16LaneLimit)
5810 {
5811 u8Count1 = 0;
5812 do
5813 {
5814 if(u8Count>=LANE_AND_CLK_TBL[u8Count1][0] && u8Count<=LANE_AND_CLK_TBL[u8Count1][1])
5815 {
5816 u8Clk |= LANE_AND_CLK_TBL[u8Count1][2];
5817 break;
5818 }
5819 u8Count1 ++;
5820 }
5821 while(u8Count1<VBY1_CLK_TBL_ROW);
5822 }
5823 u16OutputOrder8_11 /= PINMAPPING_EXP;
5824
5825 }
5826
5827 u8StartLane = 12;
5828 for( u8Count = u8StartLane ; u8Count < (u8StartLane+LANE_NUM_EACH_PINMAPPING_GROUP4) ; u8Count++ )
5829 {//lane 12 - lane 15
5830 if( ( u16OutputOrder12_15 % PINMAPPING_EXP ) < u16LaneLimit)
5831 {
5832 u8Count1 = 0;
5833 do
5834 {
5835 if(u8Count>=LANE_AND_CLK_TBL[u8Count1][0] && u8Count<=LANE_AND_CLK_TBL[u8Count1][1])
5836 {
5837 u8Clk |= LANE_AND_CLK_TBL[u8Count1][2];
5838 break;
5839 }
5840 u8Count1 ++;
5841 }
5842 while(u8Count1<VBY1_CLK_TBL_ROW);
5843 }
5844 u16OutputOrder12_15 /= PINMAPPING_EXP;
5845 }
5846
5847 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, u8Clk, 0x1F);
5848 }
5849 }
5850 else
5851 {
5852 if( (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_16LANE)
5853 ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_16LANE))
5854 {
5855 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, 0x000F, 0x001F);
5856 }
5857 else if( (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_8LANE)
5858 ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_8LANE))
5859 {
5860 if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.u16MOD_CTRLA & BIT(1))
5861 {
5862 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, 0x0003, 0x001F);
5863 }
5864 else
5865 {
5866 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, 0x0003, 0x001F);
5867 }
5868 }
5869 else if( (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_4LANE)
5870 ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_4LANE))
5871 {
5872 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, 0x0001, 0x001F);
5873 }
5874 else if( (pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_10BIT_2LANE)
5875 ||(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type_Ext == E_PNL_LPLL_VBY1_8BIT_2LANE))
5876 {
5877 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, 0x0001, 0x001F);
5878 }
5879 else if(pPNLResourcePrivate->stdrvPNL._stPnlInitData.eLPLL_Type == E_PNL_TYPE_LVDS)
5880 {//LVDS
5881 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, 0x001F, 0x001F);
5882 }
5883 else
5884 {
5885 MOD_A_W2BYTEMSK(REG_MOD_A_BK00_00_L, 0x001F, 0x001F);
5886 }
5887 }
5888 }
5889 #if defined(PATCH_HW_VTT_LIMITATION)
5890 //There is the hareware bug on Maserati U1 Chip REG_SC_BK10_0D.
5891 //That is replaced by REG_SC_BK68 byMHal_PNL_SetVopVtt function.
MHal_PNL_SetVopVttByBK68(MS_U32 u32DeviceID,MS_U16 u16Vtt)5892 void MHal_PNL_SetVopVttByBK68(MS_U32 u32DeviceID, MS_U16 u16Vtt)
5893 {
5894 MS_U16 u16temp;
5895
5896 u16temp = SC_R2BYTE(u32DeviceID, REG_SC_BK68_31_L);
5897 SC_W2BYTEMSK(u32DeviceID, REG_SC_BK68_31_L, (u16temp & ~BIT(0) & ~BIT(8)) | BIT(1), 0xFFFF);
5898 SC_W2BYTEMSK(u32DeviceID, REG_SC_BK68_32_L, 0xff01 , 0xFFFF);
5899 SC_W2BYTEMSK(u32DeviceID, REG_SC_BK68_38_L, 10, 0xFFFF);
5900 SC_W2BYTEMSK(u32DeviceID, REG_SC_BK68_36_L, u16Vtt , 0xFFFF);
5901 SC_W2BYTEMSK(u32DeviceID, REG_SC_BK68_37_L, u16Vtt , 0xFFFF);
5902 SC_W2BYTEMSK(u32DeviceID, REG_SC_BK0F_55_L, 0x10 , 0xFFFF);
5903 u16temp = SC_R2BYTE(u32DeviceID, REG_SC_BK68_31_L);
5904 SC_W2BYTEMSK(u32DeviceID, REG_SC_BK68_31_L, (u16temp & ~BIT(8))|BIT(0) | BIT(1) , 0xFFFF);
5905 }
5906 #endif
5907
5908 #endif
5909
5910
5911