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