1 #define ENABLE_DPI1_INTERRUPT 0
2 #define ENABLE_DPI1_REFRESH_RATE_LOG 0
4 #if ENABLE_DPI1_REFRESH_RATE_LOG && !ENABLE_DPI1_INTERRUPT
5 #error "ENABLE_DPI1_REFRESH_RATE_LOG should be also ENABLE_DPI1_INTERRUPT"
8 #if defined(CONFIG_MTK_HDMI_SUPPORT) && !ENABLE_DPI1_INTERRUPT
9 //#error "enable CONFIG_MTK_HDMI_SUPPORT should be also ENABLE_DPI1_INTERRUPT"
12 #include <linux/kernel.h>
13 #include <linux/string.h>
14 #include <linux/hrtimer.h>
16 #include <disp_drv_log.h>
17 #include <linux/wait.h>
18 #include <linux/interrupt.h>
19 #include <linux/sched.h>
20 #include <linux/delay.h>
21 #include "disp_drv_platform.h"
27 #include <mach/mt_clkmgr.h>
30 #if ENABLE_DPI1_INTERRUPT
31 //#include <linux/interrupt.h>
32 //#include <linux/wait.h>
34 #include <mach/irqs.h>
37 static wait_queue_head_t _vsync_wait_queue_dpi
;
38 static bool dpi_vsync
= false;
39 static bool wait_dpi_vsync
= false;
40 static struct hrtimer hrtimer_vsync_dpi
;
41 #include <linux/module.h>
43 #include <mach/sync_write.h>
46 #define OUTREG32(x, y) mt65xx_reg_sync_writel(y, x)
50 #define OUTREGBIT(TYPE,REG,bit,value) \
52 TYPE r = *((TYPE*)&INREG32(®)); \
54 OUTREG32(®, AS_UINT32(&r)); \
59 static PDPI_REGS
const DPI1_REG
= (PDPI_REGS
)(DPI1_BASE
);
60 static PDSI_PHY_REGS
const DSI_PHY_REG_DPI
= (PDSI_PHY_REGS
)(MIPI_CONFIG_BASE
+ 0x800);
61 static UINT32
const PLL_SOURCE
= APMIXEDSYS_BASE
+ 0x44;
62 static BOOL s_isDpiPowerOn
= FALSE
;
63 static DPI_REGS regBackup
;
64 static void (*dpiIntCallback
)(DISP_INTERRUPT_EVENTS
);
66 #define DPI1_REG_OFFSET(r) offsetof(DPI_REGS, r)
67 #define REG_ADDR(base, offset) (((BYTE *)(base)) + (offset))
69 const UINT32 BACKUP_DPI1_REG_OFFSETS
[] =
71 DPI1_REG_OFFSET(INT_ENABLE
),
72 DPI1_REG_OFFSET(SIZE
),
73 DPI1_REG_OFFSET(OUTPUT_SETTING
),
75 DPI1_REG_OFFSET(TGEN_HWIDTH
),
76 DPI1_REG_OFFSET(TGEN_HPORCH
),
78 DPI1_REG_OFFSET(TGEN_VWIDTH_LODD
),
79 DPI1_REG_OFFSET(TGEN_VPORCH_LODD
),
81 DPI1_REG_OFFSET(TGEN_VWIDTH_LEVEN
),
82 DPI1_REG_OFFSET(TGEN_VPORCH_LEVEN
),
83 DPI1_REG_OFFSET(TGEN_VWIDTH_RODD
),
85 DPI1_REG_OFFSET(TGEN_VPORCH_RODD
),
86 DPI1_REG_OFFSET(TGEN_VWIDTH_REVEN
),
88 DPI1_REG_OFFSET(TGEN_VPORCH_REVEN
),
89 DPI1_REG_OFFSET(ESAV_VTIM_LODD
),
90 DPI1_REG_OFFSET(ESAV_VTIM_LEVEN
),
92 DPI1_REG_OFFSET(ESAV_VTIM_RODD
),
93 DPI1_REG_OFFSET(ESAV_VTIM_REVEN
),
96 DPI1_REG_OFFSET(ESAV_FTIM
),
97 DPI1_REG_OFFSET(BG_HCNTL
),
99 DPI1_REG_OFFSET(BG_VCNTL
),
100 DPI1_REG_OFFSET(BG_COLOR
),
101 //DPI1_REG_OFFSET(TGEN_POL),
102 DPI1_REG_OFFSET(EMBSYNC_SETTING
),
104 DPI1_REG_OFFSET(CNTL
),
107 static void _BackupDPIRegisters(void)
109 DPI_REGS
*reg
= ®Backup
;
112 for (i
= 0; i
< ARY_SIZE(BACKUP_DPI1_REG_OFFSETS
); ++ i
)
114 OUTREG32(REG_ADDR(reg
, BACKUP_DPI1_REG_OFFSETS
[i
]),
115 AS_UINT32(REG_ADDR(DPI1_REG
, BACKUP_DPI1_REG_OFFSETS
[i
])));
119 static void _RestoreDPIRegisters(void)
121 DPI_REGS
*reg
= ®Backup
;
124 for (i
= 0; i
< ARY_SIZE(BACKUP_DPI1_REG_OFFSETS
); ++ i
)
126 OUTREG32(REG_ADDR(DPI1_REG
, BACKUP_DPI1_REG_OFFSETS
[i
]),
127 AS_UINT32(REG_ADDR(reg
, BACKUP_DPI1_REG_OFFSETS
[i
])));
131 static void _ResetBackupedDPIRegisterValues(void)
133 DPI_REGS
*regs
= ®Backup
;
134 memset((void*)regs
, 0, sizeof(DPI_REGS
));
136 OUTREG32(®s
->OUTPUT_SETTING
, 0x00000101);
140 #if ENABLE_DPI1_REFRESH_RATE_LOG
141 static void _DPI1_LogRefreshRate(DPI1_REG_INTERRUPT status
)
143 static unsigned long prevUs
= 0xFFFFFFFF;
148 do_gettimeofday(&curr
);
150 if (prevUs
< curr
.tv_usec
)
152 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DPI1", "Receive 1 vsync in %lu us\n",
153 curr
.tv_usec
- prevUs
);
155 prevUs
= curr
.tv_usec
;
159 #define _DPI1_LogRefreshRate(x) do {} while(0)
162 extern void dsi_handle_esd_recovery(void);
164 void DPI1_DisableIrq(void)
166 DPI_REG_INTERRUPT enInt
= DPI1_REG
->INT_ENABLE
;
168 OUTREG32(&DPI1_REG
->INT_ENABLE
, AS_UINT32(&enInt
));
170 void DPI1_EnableIrq(void)
172 DPI_REG_INTERRUPT enInt
= DPI1_REG
->INT_ENABLE
;
174 OUTREG32(&DPI1_REG
->INT_ENABLE
, AS_UINT32(&enInt
));
177 #if ENABLE_DPI1_INTERRUPT
178 static irqreturn_t
_DPI1_InterruptHandler(int irq
, void *dev_id
)
180 static int counter
= 0;
181 DPI_REG_INTERRUPT status
= DPI1_REG
->INT_STATUS
;
182 // if (status.FIFO_EMPTY) ++ counter;
187 dpiIntCallback(DISP_DPI1_VSYNC_INT
);
190 if(-1 != hrtimer_try_to_cancel(&hrtimer_vsync_dpi
)){
192 // hrtimer_try_to_cancel(&hrtimer_vsync_dpi);
193 wake_up_interruptible(&_vsync_wait_queue_dpi
);
198 if (status
.VSYNC
&& counter
) {
199 DISP_LOG_PRINT(ANDROID_LOG_ERROR
, "DPI1", "[Error] DPI FIFO is empty, "
200 "received %d times interrupt !!!\n", counter
);
204 _DPI1_LogRefreshRate(status
);
205 OUTREG32(&DPI1_REG
->INT_STATUS
, 0);
210 #define VSYNC_US_TO_NS(x) (x * 1000)
211 unsigned int vsync_timer_dpi1
= 0;
212 void DPI1_WaitVSYNC(void)
214 wait_dpi_vsync
= true;
215 hrtimer_start(&hrtimer_vsync_dpi
, ktime_set(0, VSYNC_US_TO_NS(vsync_timer_dpi1
)), HRTIMER_MODE_REL
);
216 wait_event_interruptible(_vsync_wait_queue_dpi
, dpi_vsync
);
218 wait_dpi_vsync
= false;
221 void DPI1_PauseVSYNC(bool enable
)
225 enum hrtimer_restart
dpi1_vsync_hrtimer_func(struct hrtimer
*timer
)
231 wake_up_interruptible(&_vsync_wait_queue_dpi
);
232 // printk("hrtimer Vsync, and wake up\n");
234 // ret = hrtimer_forward_now(timer, ktime_set(0, VSYNC_US_TO_NS(vsync_timer_dpi1)));
235 // printk("hrtimer callback\n");
236 return HRTIMER_NORESTART
;
239 void DPI1_InitVSYNC(unsigned int vsync_interval
)
242 vsync_timer_dpi1
= vsync_interval
;
243 ktime
= ktime_set(0, VSYNC_US_TO_NS(vsync_timer_dpi1
));
244 hrtimer_init(&hrtimer_vsync_dpi
, CLOCK_MONOTONIC
, HRTIMER_MODE_REL
);
245 hrtimer_vsync_dpi
.function
= dpi1_vsync_hrtimer_func
;
246 // hrtimer_start(&hrtimer_vsync_dpi, ktime, HRTIMER_MODE_REL);
249 DPI_STATUS
DPI1_Init(BOOL isDpiPoweredOn
)
251 //DPI1_REG_CNTL cntl;
252 //DPI1_REG_EMBSYNC_SETTING embsync;
253 DPI_REG_EN en
= DPI1_REG
->DPI_EN
;
255 if (isDpiPoweredOn
) {
256 _BackupDPIRegisters();
258 _ResetBackupedDPIRegisterValues();
263 en
.EN_TEST_PATERN_CTRL
= 1;
264 OUTREG32(&DPI1_REG
->DPI_EN
, AS_UINT32(&en
));
267 OUTREG32(DPI1_BASE
+ 0x64, 0x400);//
268 OUTREG32(DPI1_BASE
+ 0x6C, 0x400);//
269 OUTREG32(DPI1_BASE
+ 0x74, 0x400);//
270 OUTREG32(DPI1_BASE
+ 0x8C, 0x0FFF0000);//
271 OUTREG32(DPI1_BASE
+ 0x90, 0x0FFF0000);//
272 MASKREG32(DISPSYS_BASE
+ 0x60, 0x1, 0x1); // [1]: DPI0_I2X_EN
273 // 0: DPI0 IO is single edge mode
274 //1: DPI0 IO is dual edge mode
277 MASKREG32(DISPSYS_BASE
+ 0x60, 0xb03, 0xb03);
279 //OUTREG32(DPI1_BASE+ 0x10, 0x000001A0);//DPI_CON
280 //OUTREG32(DPI1_BASE+ 0x14, 0x00000101);//DPI_CLKCON
281 //OUTREG32(DPI1_BASE+ 0x18, 0x02d00500);//DPI_SIZE 720x1280
282 //OUTREG32(DPI1_BASE+ 0x1c, 0x00000028);//DPI_TGEN_HWIDTH 40
283 //OUTREG32(DPI1_BASE+ 0x20, 0x01b800dc);//DPI_TGEN_HPORCH BACK:220 FRONT:440
284 //OUTREG32(DPI1_BASE+ 0x24, 0x00000005);//DPI_TGEN_VWIDTH_LODD 5
285 //OUTREG32(DPI1_BASE+ 0x28, 0x00050014);//DPI_TGEN_VPORCH_LODD BACK:20 FRONT:5
286 //OUTREG32(DPI1_BASE+ 0x44, 0x00001e00);//DPI_ESAV_VTIM_L WIDTH:30 lines
287 //DPI1_ESAVVTimingControlLeft(0, 0x1E, 0, 0);
289 //OUTREG32(DPI1_BASE+ 0x64, 0x1ead1f53);//DPI_MATRIX_COEFF_SET0
290 //OUTREG32(DPI1_BASE+ 0x68, 0x01320200);//DPI_MATRIX_COEFF_SET1
291 //OUTREG32(DPI1_BASE+ 0x6c, 0x00750259);//DPI_MATRIX_COEFF_SET2
292 //OUTREG32(DPI1_BASE+ 0x70, 0x1e530200);//DPI_MATRIX_COEFF_SET3
293 //OUTREG32(DPI1_BASE+ 0x74, 0x00001fa0);//DPI_MATRIX_COEFF_SET4
294 //DPI1_MatrixCoef(0x1F53, 0x1EAD, 0x0200, 0x0132, 0x0259, 0x0075, 0x0200, 0x1E53, 0x1FA0);
296 //OUTREG32(DPI1_BASE+ 0x78, 0x00000000);//DPI_MATRIX_PREADD_SET0
297 //OUTREG32(DPI1_BASE+ 0x7c, 0x00000000);//DPI_MATRIX_PREADD_SET1
298 //DPI1_MatrixPreOffset(0, 0, 0);
300 //OUTREG32(DPI1_BASE+ 0x80, 0x00000800);//DPI_MATRIX_POSTADD_SET0
301 //OUTREG32(DPI1_BASE+ 0x84, 0x00000800);//DPI_MATRIX_POSTADD_SET1
302 //DPI1_MatrixPostOffset(0x0800, 0, 0x0800);
304 //OUTREG32(DPI1_BASE+ 0x88, 0x00000000);//DPI_CLPF_SETTING
305 //DPI1_CLPFSetting(0, FALSE);
307 //OUTREG32(DPI1_BASE+ 0x8c, 0x0f000100);//DPI_Y_LIMIT 256 - 3840
308 //OUTREG32(DPI1_BASE+ 0x90, 0x0f000100);//DPI_C_LIMIT 256 - 3840
309 //DPI1_SetChannelLimit(0x0100, 0x0F00, 0x0100, 0x0F00);
311 //OUTREG32(DPI1_BASE+ 0x9c, 0x00000007);//DPI_EMBSYNC_SETTING
312 //DPI1_EmbeddedSyncSetting(TRUE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE);
314 //OUTREG32(DPI1_BASE+ 0xa8, 0x00000600);//DPI_OUTPUT_SETTING OUT_YC_MAP
315 //DPI1_OutputSetting(DPI_OUTPUT_BIT_NUM_8BITS, FALSE, DPI_OUTPUT_CHANNEL_SWAP_RGB, DPI_OUTPUT_YC_MAP_CY);
317 //OUTREG32(DPI1_BASE+ 0xb4, 0x11223341);//DPI_PATTERN
318 //DPI1_EnableColorBar();
320 //OUTREG32(DPI1_BASE + 0x0, 0x00000001);//
324 cntl
= DPI1_REG
->CNTL
;
326 OUTREG32(&DPI1_REG
->CNTL
, AS_UINT32(&cntl
));
328 embsync
= DPI1_REG
->EMBSYNC_SETTING
;
329 embsync
.ESAV_CODE_MAN
= 0;
330 embsync
.EMBVSYNC_G_Y
= 1;
331 embsync
.EMBVSYNC_R_CR
= 1;
332 embsync
.EMBVSYNC_B_CB
= 1;
333 OUTREG32(&DPI1_REG
->EMBSYNC_SETTING
, AS_UINT32(&embsync
));
336 #if ENABLE_DPI1_INTERRUPT
337 if (request_irq(MT8127_DPI_IRQ_ID
,
338 _DPI1_InterruptHandler
, IRQF_TRIGGER_LOW
, "mtkdpi", NULL
) < 0)
340 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DPI1", "[ERROR] fail to request DPI irq\n");
341 return DPI_STATUS_ERROR
;
345 DPI_REG_INTERRUPT enInt
= DPI1_REG
->INT_ENABLE
;
347 OUTREG32(&DPI1_REG
->INT_ENABLE
, AS_UINT32(&enInt
));
350 LCD_W2M_NeedLimiteSpeed(TRUE
);
351 return DPI_STATUS_OK
;
353 EXPORT_SYMBOL(DPI1_Init
);
355 DPI_STATUS
DPI1_FreeIRQ(void)
357 #if ENABLE_DPI1_INTERRUPT
358 free_irq(MT8127_DPI_IRQ_ID
, NULL
);
360 return DPI_STATUS_OK
;
362 EXPORT_SYMBOL(DPI1_FreeIRQ
);
364 DPI_STATUS
DPI1_Deinit(void)
369 return DPI_STATUS_OK
;
371 EXPORT_SYMBOL(DPI1_Deinit
);
373 void DPI1_mipi_switch(bool on
)
377 // may call enable_mipi(), but do this in DPI1_Init_PLL
382 disable_mipi(MT65XX_MIPI_TX
, "DPI");
388 extern UINT32 FB_Addr
;
391 DPI_STATUS
DPI1_Init_PLL(HDMI_VIDEO_RESOLUTION resolution
)
394 DRV_SetReg32(TVDPLL_PWR_CON0
, (0x1 << 0)); //PLL_PWR_ON
396 DRV_ClrReg32(TVDPLL_PWR_CON0
, (0x1 << 1)); //PLL_ISO_EN
399 case HDMI_VIDEO_720x480p_60Hz
:
400 #ifdef CONFIG_MTK_MT8193_HDMI_SUPPORT
401 case HDMI_VIDEO_720x576p_50Hz
:
404 OUTREG32(TVDPLL_CON1
, 0x80109d89);
405 OUTREG32(TVDPLL_CON0
, 0x80800081);
408 case HDMI_VIDEO_1920x1080p_30Hz
:
409 #ifdef CONFIG_MTK_MT8193_HDMI_SUPPORT
410 case HDMI_VIDEO_1280x720p_50Hz
:
411 case HDMI_VIDEO_1920x1080i_50Hz
:
412 case HDMI_VIDEO_1920x1080p_25Hz
:
413 case HDMI_VIDEO_1920x1080p_24Hz
:
414 case HDMI_VIDEO_1920x1080p_50Hz
:
417 OUTREG32(TVDPLL_CON1
, 0x800b6c4e);
418 OUTREG32(TVDPLL_CON0
, 0x80000081);
422 case HDMI_VIDEO_1280x720p_60Hz
:
423 #ifdef CONFIG_MTK_MT8193_HDMI_SUPPORT
424 case HDMI_VIDEO_1920x1080i_60Hz
:
425 case HDMI_VIDEO_1920x1080p_23Hz
:
426 case HDMI_VIDEO_1920x1080p_29Hz
:
427 case HDMI_VIDEO_1920x1080p_60Hz
:
430 OUTREG32(TVDPLL_CON1
, 0x800b6964);
431 OUTREG32(TVDPLL_CON0
, 0x80000081);
437 printk("[DPI1] not supported format, %s, %d, format = %d\n", __func__
, __LINE__
, resolution
);
444 return DPI_STATUS_OK
;
447 EXPORT_SYMBOL(DPI1_Init_PLL
);
449 DPI_STATUS
DPI1_Set_DrivingCurrent(LCM_PARAMS
*lcm_params
)
451 DISP_LOG_PRINT(ANDROID_LOG_WARN
, "DPI1", "DPI1_Set_DrivingCurrent not implement for 6575");
452 return DPI_STATUS_OK
;
455 DPI_STATUS
DPI1_PowerOn()
459 #ifndef CONFIG_MT6589_FPGA
460 printk("[DPI1] %s,isDpiPowerOn %d\n", __func__
,s_isDpiPowerOn
);
464 ret
+= enable_clock(MT_CG_DISP1_DPI1_DIGITAL_LANE
, "DPI1");
465 ret
+= enable_clock(MT_CG_DISP1_DPI1_ENGINE
, "DPI1");
466 ret
+= enable_clock(MT_CG_DISP1_HDMI_PIXEL_CLOCK
, "DPI1");
467 ret
+= enable_clock(MT_CG_DISP1_HDMI_PLL_CLOCK
, "DPI1");
468 ret
+= enable_clock(MT_CG_DISP1_HDMI_AUDIO_CLOCK
, "DPI1");
469 ret
+= enable_clock(MT_CG_DISP1_HDMI_SPDIF_CLOCK
, "DPI1");
474 DISP_LOG_PRINT(ANDROID_LOG_ERROR
, "DPI", "power manager API return FALSE\n");
477 _RestoreDPIRegisters();
478 s_isDpiPowerOn
= TRUE
;
481 return DPI_STATUS_OK
;
484 DPI_STATUS
DPI1_PowerOff()
487 #ifndef CONFIG_MT6589_FPGA
488 printk("[DPI1] %s,isDpiPowerOn %d\n", __func__
,s_isDpiPowerOn
);
492 _BackupDPIRegisters();
494 ret
+= disable_clock(MT_CG_DISP1_DPI1_DIGITAL_LANE
, "DPI1");
495 ret
+= disable_clock(MT_CG_DISP1_DPI1_ENGINE
, "DPI1");
496 ret
+= disable_clock(MT_CG_DISP1_HDMI_PIXEL_CLOCK
, "DPI1");
497 ret
+= disable_clock(MT_CG_DISP1_HDMI_PLL_CLOCK
, "DPI1");
498 ret
+= disable_clock(MT_CG_DISP1_HDMI_AUDIO_CLOCK
, "DPI1");
499 ret
+= disable_clock(MT_CG_DISP1_HDMI_SPDIF_CLOCK
, "DPI1");
504 DISP_LOG_PRINT(ANDROID_LOG_ERROR
, "DPI", "power manager API return FALSE\n");
507 s_isDpiPowerOn
= FALSE
;
510 return DPI_STATUS_OK
;
513 EXPORT_SYMBOL(DPI1_PowerOn
);
515 EXPORT_SYMBOL(DPI1_PowerOff
);
517 DPI_STATUS
DPI1_EnableClk()
519 DPI_REG_EN en
= DPI1_REG
->DPI_EN
;
521 OUTREG32(&DPI1_REG
->DPI_EN
, AS_UINT32(&en
));
523 //#ifndef BUILD_UBOOT
525 OUTREG32(DISP_MUTEX_BASE
+ 0x24, 0);
526 while((INREG32(DISP_MUTEX_BASE
+ 0x24)&0x02)!=0){} // polling until mutex lock complete
528 return DPI_STATUS_OK
;
530 EXPORT_SYMBOL(DPI1_EnableClk
);
532 DPI_STATUS
DPI1_DisableClk()
534 DPI_REG_EN en
= DPI1_REG
->DPI_EN
;
536 OUTREG32(&DPI1_REG
->DPI_EN
, AS_UINT32(&en
));
538 return DPI_STATUS_OK
;
540 EXPORT_SYMBOL(DPI1_DisableClk
);
542 DPI_STATUS
DPI1_EnableSeqOutput(BOOL enable
)
544 return DPI_STATUS_OK
;
546 EXPORT_SYMBOL(DPI1_EnableSeqOutput
);
548 DPI_STATUS
DPI1_SetRGBOrder(DPI_RGB_ORDER input
, DPI_RGB_ORDER output
)
550 return DPI_STATUS_OK
;
552 EXPORT_SYMBOL(DPI1_SetRGBOrder
);
554 DPI_STATUS
DPI1_ConfigPixelClk(DPI_POLARITY polarity
, UINT32 divisor
, UINT32 duty
)
556 DPI_REG_OUTPUT_SETTING ctrl
= DPI1_REG
->OUTPUT_SETTING
;
557 DPI_REG_CLKCNTL clkctrl
= DPI1_REG
->DPI_CLKCON
;
559 ASSERT(divisor >= 2);
560 ASSERT(duty > 0 && duty < divisor);
562 ctrl.POLARITY = (DPI_POLARITY_FALLING == polarity) ? 1 : 0;
563 ctrl.DIVISOR = divisor - 1;
567 ctrl
.CLK_POL
= (DPI_POLARITY_FALLING
== polarity
) ? 1 : 0;
568 clkctrl
.DPI_CKOUT_DIV
= 1;
569 clkctrl
.EDGE_SEL_EN
= 0;
570 OUTREG32(&DPI1_REG
->OUTPUT_SETTING
, AS_UINT32(&ctrl
));
571 OUTREG32(&DPI1_REG
->DPI_CLKCON
, AS_UINT32(&clkctrl
));
573 return DPI_STATUS_OK
;
575 EXPORT_SYMBOL(DPI1_ConfigPixelClk
);
577 DPI_STATUS
DPI1_ConfigHDMI()
579 DPI_REG_CNTL ctrl
= DPI1_REG
->CNTL
;
583 OUTREG32(&DPI1_REG
->CNTL
, AS_UINT32(&ctrl
));
585 return DPI_STATUS_OK
;
587 EXPORT_SYMBOL(DPI1_ConfigHDMI
);
588 DPI_STATUS
DPI1_ColorSpace_Enable(UINT8 ColorSpace
)
590 DPI_REG_CNTL ctrl
= DPI1_REG
->CNTL
;
591 DPI_REG_OUTPUT_SETTING output
= DPI1_REG
->OUTPUT_SETTING
;
593 if((YCBCR_444
== ColorSpace
) || (YCBCR_444_FULL
== ColorSpace
)) //YUV444
600 else if((YCBCR_422
== ColorSpace
) || (YCBCR_422_FULL
== ColorSpace
)) //YUV422
614 OUTREG32(&DPI1_REG
->OUTPUT_SETTING
, AS_UINT32(&output
));
615 OUTREG32(&DPI1_REG
->CNTL
, AS_UINT32(&ctrl
));
617 return DPI_STATUS_OK
;
619 EXPORT_SYMBOL(DPI1_ColorSpace_Enable
);
621 DPI_STATUS
DPI1_Config_Ctrl(BOOL fg3DFrame
, BOOL fgInterlace
)
623 DPI_REG_CNTL ctrl
= DPI1_REG
->CNTL
;
624 ctrl
.TDFP_EN
= fg3DFrame
;
625 ctrl
.INTL_EN
= fgInterlace
;
627 OUTREG32(&DPI1_REG
->CNTL
, AS_UINT32(&ctrl
));
629 return DPI_STATUS_OK
;
631 EXPORT_SYMBOL(DPI1_Config_Ctrl
);
633 DPI_STATUS
DPI1_ConfigDataEnable(DPI_POLARITY polarity
)
636 DPI_REG_OUTPUT_SETTING pol
= DPI1_REG
->OUTPUT_SETTING
;
637 pol
.DE_POL
= (DPI_POLARITY_FALLING
== polarity
) ? 1 : 0;
638 OUTREG32(&DPI1_REG
->OUTPUT_SETTING
, AS_UINT32(&pol
));
640 return DPI_STATUS_OK
;
642 EXPORT_SYMBOL(DPI1_ConfigDataEnable
);
644 DPI_STATUS
DPI1_ConfigVsync(DPI_POLARITY polarity
, UINT32 pulseWidth
, UINT32 backPorch
,
647 DPI_REG_TGEN_VWIDTH_LODD vwidth_lodd
= DPI1_REG
->TGEN_VWIDTH_LODD
;
648 DPI_REG_TGEN_VPORCH_LODD vporch_lodd
= DPI1_REG
->TGEN_VPORCH_LODD
;
649 DPI_REG_OUTPUT_SETTING pol
= DPI1_REG
->OUTPUT_SETTING
;
651 pol
.VSYNC_POL
= (DPI_POLARITY_FALLING
== polarity
) ? 1 : 0;
652 vwidth_lodd
.VPW_LODD
= pulseWidth
;
653 vporch_lodd
.VBP_LODD
= backPorch
;
654 vporch_lodd
.VFP_LODD
= frontPorch
;
656 OUTREG32(&DPI1_REG
->OUTPUT_SETTING
, AS_UINT32(&pol
));
657 OUTREG32(&DPI1_REG
->TGEN_VWIDTH_LODD
, AS_UINT32(&vwidth_lodd
));
658 OUTREG32(&DPI1_REG
->TGEN_VPORCH_LODD
, AS_UINT32(&vporch_lodd
));
660 return DPI_STATUS_OK
;
662 EXPORT_SYMBOL(DPI1_ConfigVsync
);
664 DPI_STATUS
DPI1_ConfigVsync_LEVEN(UINT32 pulseWidth
, UINT32 backPorch
, UINT32 frontPorch
, BOOL fgInterlace
)
666 DPI_REG_TGEN_VWIDTH_LEVEN vwidth_leven
= DPI1_REG
->TGEN_VWIDTH_LEVEN
;
667 DPI_REG_TGEN_VPORCH_LEVEN vporch_leven
= DPI1_REG
->TGEN_VPORCH_LEVEN
;
669 vwidth_leven
.VPW_LEVEN
= pulseWidth
;
670 vwidth_leven
.VPW_HALF_LEVEN
= fgInterlace
;
671 vporch_leven
.VBP_LEVEN
= backPorch
;
672 //vporch_leven.VFP_HALF_LEVEN = fgInterlace;
673 vporch_leven
.VFP_LEVEN
= frontPorch
;
675 OUTREG32(&DPI1_REG
->TGEN_VWIDTH_LEVEN
, AS_UINT32(&vwidth_leven
));
676 OUTREG32(&DPI1_REG
->TGEN_VPORCH_LEVEN
, AS_UINT32(&vporch_leven
));
678 return DPI_STATUS_OK
;
681 EXPORT_SYMBOL(DPI1_ConfigVsync_LEVEN
);
683 DPI_STATUS
DPI1_ConfigVsync_RODD(UINT32 pulseWidth
, UINT32 backPorch
, UINT32 frontPorch
)
685 DPI_REG_TGEN_VWIDTH_RODD vwidth_rodd
= DPI1_REG
->TGEN_VWIDTH_RODD
;
686 DPI_REG_TGEN_VPORCH_RODD vporch_rodd
= DPI1_REG
->TGEN_VPORCH_RODD
;
688 vwidth_rodd
.VPW_RODD
= pulseWidth
;
689 vporch_rodd
.VBP_RODD
= backPorch
;
690 vporch_rodd
.VFP_RODD
= frontPorch
;
692 OUTREG32(&DPI1_REG
->TGEN_VWIDTH_RODD
, AS_UINT32(&vwidth_rodd
));
693 OUTREG32(&DPI1_REG
->TGEN_VPORCH_RODD
, AS_UINT32(&vporch_rodd
));
695 return DPI_STATUS_OK
;
698 EXPORT_SYMBOL(DPI1_ConfigVsync_RODD
);
700 DPI_STATUS
DPI1_ConfigVsync_REVEN(UINT32 pulseWidth
, UINT32 backPorch
, UINT32 frontPorch
, BOOL fgInterlace
)
702 DPI_REG_TGEN_VWIDTH_REVEN vwidth_reven
= DPI1_REG
->TGEN_VWIDTH_REVEN
;
703 DPI_REG_TGEN_VPORCH_REVEN vporch_reven
= DPI1_REG
->TGEN_VPORCH_REVEN
;
705 vwidth_reven
.VPW_REVEN
= pulseWidth
;
706 vwidth_reven
.VPW_HALF_REVEN
= fgInterlace
;
707 vporch_reven
.VBP_REVEN
= backPorch
;
708 //vporch_reven.VFP_HALF_REVEN = fgInterlace;
709 vporch_reven
.VFP_REVEN
= frontPorch
;
711 OUTREG32(&DPI1_REG
->TGEN_VWIDTH_REVEN
, AS_UINT32(&vwidth_reven
));
712 OUTREG32(&DPI1_REG
->TGEN_VPORCH_REVEN
, AS_UINT32(&vporch_reven
));
714 return DPI_STATUS_OK
;
716 EXPORT_SYMBOL(DPI1_ConfigVsync_REVEN
);
718 DPI_STATUS
DPI1_SW_Reset(UINT32 Reset
)
720 OUTREG32(&DPI1_REG
->DPI_RST
, Reset
);
722 return DPI_STATUS_OK
;
724 EXPORT_SYMBOL(DPI1_SW_Reset
);
726 DPI_STATUS
DPI1_ConfigHsync(DPI_POLARITY polarity
, UINT32 pulseWidth
, UINT32 backPorch
,
729 DPI_REG_TGEN_HPORCH hporch
= DPI1_REG
->TGEN_HPORCH
;
730 DPI_REG_OUTPUT_SETTING pol
= DPI1_REG
->OUTPUT_SETTING
;
732 pol
.HSYNC_POL
= (DPI_POLARITY_FALLING
== polarity
) ? 1 : 0;
733 //DPI1_REG->TGEN_HWIDTH = pulseWidth;
734 OUTREG32(&DPI1_REG
->TGEN_HWIDTH
,pulseWidth
);
735 hporch
.HBP
= backPorch
;
736 hporch
.HFP
= frontPorch
;
738 OUTREG32(&DPI1_REG
->OUTPUT_SETTING
, AS_UINT32(&pol
));
739 OUTREG32(&DPI1_REG
->TGEN_HPORCH
, AS_UINT32(&hporch
));
741 return DPI_STATUS_OK
;
743 EXPORT_SYMBOL(DPI1_ConfigHsync
);
745 DPI_STATUS
DPI1_FBEnable(DPI_FB_ID id
, BOOL enable
)
747 return DPI_STATUS_OK
;
749 EXPORT_SYMBOL(DPI1_FBEnable
);
751 DPI_STATUS
DPI1_FBSyncFlipWithLCD(BOOL enable
)
753 return DPI_STATUS_OK
;
755 EXPORT_SYMBOL(DPI1_FBSyncFlipWithLCD
);
757 DPI_STATUS
DPI1_SetDSIMode(BOOL enable
)
759 return DPI_STATUS_OK
;
763 BOOL
DPI1_IsDSIMode(void)
765 // return DPI1_REG->CNTL.DSI_MODE ? TRUE : FALSE;
770 DPI_STATUS
DPI1_FBSetFormat(DPI_FB_FORMAT format
)
772 return DPI_STATUS_OK
;
774 EXPORT_SYMBOL(DPI1_FBSetFormat
);
776 DPI_FB_FORMAT
DPI1_FBGetFormat(void)
780 EXPORT_SYMBOL(DPI1_FBGetFormat
);
783 DPI_STATUS
DPI1_FBSetSize(UINT32 width
, UINT32 height
)
787 size
.HEIGHT
= height
;
789 OUTREG32(&DPI1_REG
->SIZE
, AS_UINT32(&size
));
791 return DPI_STATUS_OK
;
793 EXPORT_SYMBOL(DPI1_FBSetSize
);
795 DPI_STATUS
DPI1_FBSetAddress(DPI_FB_ID id
, UINT32 address
)
797 return DPI_STATUS_OK
;
799 EXPORT_SYMBOL(DPI1_FBSetAddress
);
801 DPI_STATUS
DPI1_FBSetPitch(DPI_FB_ID id
, UINT32 pitchInByte
)
803 return DPI_STATUS_OK
;
805 EXPORT_SYMBOL(DPI1_FBSetPitch
);
807 DPI_STATUS
DPI1_SetFifoThreshold(UINT32 low
, UINT32 high
)
809 return DPI_STATUS_OK
;
811 EXPORT_SYMBOL(DPI1_SetFifoThreshold
);
814 DPI_STATUS
DPI1_DumpRegisters(void)
818 DISP_LOG_PRINT(ANDROID_LOG_WARN
, "DPI1", "---------- Start dump DPI1 registers ----------\n");
820 for (i
= 0; i
< sizeof(DPI_REGS
); i
+= 4)
822 DISP_LOG_PRINT(ANDROID_LOG_WARN
, "DPI1", "DPI1+%04x : 0x%08x\n", i
, INREG32(DPI1_BASE
+ i
));
825 return DPI_STATUS_OK
;
828 EXPORT_SYMBOL(DPI1_DumpRegisters
);
830 UINT32
DPI1_GetCurrentFB(void)
834 EXPORT_SYMBOL(DPI1_GetCurrentFB
);
836 DPI_STATUS
DPI1_Capture_Framebuffer(unsigned int pvbuf
, unsigned int bpp
)
841 unsigned int fbsize
= 0;
842 unsigned int dpi_fb_bpp
= 0;
844 BOOL dpi_needPowerOff
= FALSE
;
847 dpi_needPowerOff
= TRUE
;
848 LCD_WaitForNotBusy();
849 LCD_WaitDPIIndication(FALSE
);
851 LCD_StartTransfer(TRUE
);
852 LCD_WaitDPIIndication(TRUE
);
855 if(pvbuf
== 0 || bpp
== 0)
857 DISP_LOG_PRINT(ANDROID_LOG_ERROR
, "DPI", "DPI1_Capture_Framebuffer, ERROR, parameters wrong: pvbuf=0x%08x, bpp=%d\n", pvbuf
, bpp
);
858 return DPI_STATUS_OK
;
861 if(DPI1_FBGetFormat() == DPI_FB_FORMAT_RGB565
)
865 else if(DPI1_FBGetFormat() == DPI_FB_FORMAT_RGB888
)
871 DISP_LOG_PRINT(ANDROID_LOG_ERROR
, "DPI", "DPI1_Capture_Framebuffer, ERROR, dpi_fb_bpp is wrong: %d\n", dpi_fb_bpp
);
872 return DPI_STATUS_OK
;
875 w
= DISP_GetScreenWidth();
876 h
= DISP_GetScreenHeight();
877 fbsize
= w
*h
*dpi_fb_bpp
/8;
879 fbv
= (unsigned char*)ioremap_cached((unsigned int)DPI1_REG
->FB
[0].ADDR
, fbsize
);
881 fbv
= (unsigned char*)ioremap_cached((unsigned int)DPI1_REG
->FB
[DPI1_GetCurrentFB()].ADDR
, fbsize
);
883 DISP_LOG_PRINT(ANDROID_LOG_INFO
, "DPI", "current fb count is %d\n", DPI1_GetCurrentFB());
885 if(bpp
== 32 && dpi_fb_bpp
== 24)
887 if(0 == strncmp(CONFIG_MTK_LCM_PHYSICAL_ROTATION
, "180", 3)){
888 unsigned int pix_count
= w
* h
- 1;
889 for(i
= 0;i
< w
*h
; i
++)
891 *(unsigned int*)(pvbuf
+ (pix_count
- i
) * 4) = 0xff000000|fbv
[i
*3]|(fbv
[i
*3+1]<<8)|(fbv
[i
*3+2]<<16);
895 for(i
= 0;i
< w
*h
; i
++)
897 *(unsigned int*)(pvbuf
+i
*4) = 0xff000000|fbv
[i
*3]|(fbv
[i
*3+1]<<8)|(fbv
[i
*3+2]<<16);
901 else if(bpp
== 32 && dpi_fb_bpp
== 16)
904 unsigned short* fbvt
= (unsigned short*)fbv
;
906 if(0 == strncmp(CONFIG_MTK_LCM_PHYSICAL_ROTATION
, "180", 3)){
907 unsigned int pix_count
= w
* h
- 1;
909 for(i
= 0;i
< w
*h
; i
++)
912 *(unsigned int*)(pvbuf
+ (pix_count
- i
) * 4) = 0xff000000|((t
&0x001F)<<3)|((t
&0x07E0)<<5)|((t
&0xF800)<<8);
916 for(i
= 0;i
< w
*h
; i
++)
919 *(unsigned int*)(pvbuf
+i
*4) = 0xff000000|((t
&0x001F)<<3)|((t
&0x07E0)<<5)|((t
&0xF800)<<8);
923 else if(bpp
== 16 && dpi_fb_bpp
== 16)
925 if(0 == strncmp(CONFIG_MTK_LCM_PHYSICAL_ROTATION
, "180", 3)){
926 unsigned int pix_count
= w
* h
- 1;
927 unsigned short* fbvt
= (unsigned short*)fbv
;
928 for(i
= 0;i
< w
*h
; i
++)
930 *(unsigned short*)(pvbuf
+ (pix_count
- i
) * 2) = fbvt
[i
];
934 memcpy((void*)pvbuf
, (void*)fbv
, fbsize
);
936 else if(bpp
== 16 && dpi_fb_bpp
== 24)
938 if(0 == strncmp(CONFIG_MTK_LCM_PHYSICAL_ROTATION
, "180", 3)){
939 unsigned int pix_count
= w
* h
- 1;
940 for(i
= 0;i
< w
*h
; i
++)
942 *(unsigned short*)(pvbuf
+ (pix_count
- i
) * 2) = ((fbv
[i
*3+0]&0xF8)>>3)|
943 ((fbv
[i
*3+1]&0xFC)<<3)|
944 ((fbv
[i
*3+2]&0xF8)<<8);
948 for(i
= 0;i
< w
*h
; i
++)
950 *(unsigned short*)(pvbuf
+i
*2) = ((fbv
[i
*3+0]&0xF8)>>3)|
951 ((fbv
[i
*3+1]&0xFC)<<3)|
952 ((fbv
[i
*3+2]&0xF8)<<8);
958 DISP_LOG_PRINT(ANDROID_LOG_ERROR
, "DPI", "DPI1_Capture_Framebuffer, bpp:%d & dpi_fb_bpp:%d is not supported now\n", bpp
, dpi_fb_bpp
);
963 if(dpi_needPowerOff
){
968 return DPI_STATUS_OK
;
971 DPI_STATUS
DPI1_EnableInterrupt(DISP_INTERRUPT_EVENTS eventID
)
973 #if ENABLE_DPI1_INTERRUPT
976 case DISP_DPI_VSYNC_INT
:
977 //DPI1_REG->INT_ENABLE.VSYNC = 1;
978 OUTREGBIT(DPI_REG_INTERRUPT
,DPI1_REG
->INT_ENABLE
,VSYNC
,1);
981 return DPI_STATUS_ERROR
;
984 return DPI_STATUS_OK
;
986 ///TODO: warning log here
987 return DPI_STATUS_ERROR
;
992 DPI_STATUS
DPI1_SetInterruptCallback(void (*pCB
)(DISP_INTERRUPT_EVENTS
))
994 dpiIntCallback
= pCB
;
996 return DPI_STATUS_OK
;
1000 DPI_STATUS
DPI1_FMDesense_Query(void)
1002 return DPI_STATUS_ERROR
;
1005 DPI_STATUS
DPI1_FM_Desense(unsigned long freq
)
1007 return DPI_STATUS_OK
;
1010 DPI_STATUS
DPI1_Reset_CLK(void)
1012 return DPI_STATUS_OK
;
1015 DPI_STATUS
DPI1_Get_Default_CLK(unsigned int *clk
)
1017 return DPI_STATUS_OK
;
1020 DPI_STATUS
DPI1_Get_Current_CLK(unsigned int *clk
)
1022 return DPI_STATUS_OK
;
1025 DPI_STATUS
DPI1_Change_CLK(unsigned int clk
)
1027 return DPI_STATUS_OK
;
1030 DPI_STATUS
DPI1_EnableColorBar(void)
1033 DPI_REG_PATTERN pattern = DPI1_REG->PATTERN;
1036 pattern.PAT_SEL = 4; // Color Bar
1038 OUTREG32(&DPI1_REG->PATTERN, AS_UINT32(&pattern));
1040 OUTREG32(DPI1_BASE
+0xf00, 0x41);
1043 return DPI_STATUS_OK
;
1045 EXPORT_SYMBOL(DPI1_EnableColorBar
);
1047 DPI_STATUS
DPI1_EnableBlackScreen(void)
1051 DPI_REG_PATTERN pattern = DPI1_REG->PATTERN;
1054 pattern.PAT_SEL = 5; // User defined color
1055 pattern.PAT_R_MAN = 0;
1056 pattern.PAT_G_MAN = 0;
1057 pattern.PAT_B_MAN = 0;
1059 OUTREG32(&DPI1_REG->PATTERN, AS_UINT32(&pattern));
1061 return DPI_STATUS_OK
;
1063 EXPORT_SYMBOL(DPI1_EnableBlackScreen
);
1065 DPI_STATUS
DPI1_DisableInternalPattern(void)
1068 DPI_REG_PATTERN pattern = DPI1_REG->PATTERN;
1072 OUTREG32(&DPI1_REG->PATTERN, AS_UINT32(&pattern));
1074 return DPI_STATUS_OK
;
1076 EXPORT_SYMBOL(DPI1_DisableInternalPattern
);
1078 DPI_STATUS
DPI1_MatrixCoef(UINT16 c00
, UINT16 c01
, UINT16 c02
,
1079 UINT16 c10
, UINT16 c11
, UINT16 c12
,
1080 UINT16 c20
, UINT16 c21
, UINT16 c22
)
1084 DPI_REG_MATRIX_COEFF_SET0 set0 = DPI1_REG->MATRIX_COEFF_SET0;
1085 DPI_REG_MATRIX_COEFF_SET1 set1 = DPI1_REG->MATRIX_COEFF_SET1;
1086 DPI_REG_MATRIX_COEFF_SET2 set2 = DPI1_REG->MATRIX_COEFF_SET2;
1087 DPI_REG_MATRIX_COEFF_SET3 set3 = DPI1_REG->MATRIX_COEFF_SET3;
1088 DPI_REG_MATRIX_COEFF_SET4 set4 = DPI1_REG->MATRIX_COEFF_SET4;
1090 set0.MATRIX_C00 = c00; set0.MATRIX_C01 = c01;
1091 set1.MATRIX_C02 = c02; set1.MATRIX_C10 = c10;
1092 set2.MATRIX_C11 = c11; set2.MATRIX_C12 = c12;
1093 set3.MATRIX_C20 = c20; set3.MATRIX_C21 = c21;
1094 set4.MATRIX_C22 = c22;
1096 OUTREG32(&DPI1_REG->MATRIX_COEFF_SET0, AS_UINT32(&set0));
1097 OUTREG32(&DPI1_REG->MATRIX_COEFF_SET1, AS_UINT32(&set1));
1098 OUTREG32(&DPI1_REG->MATRIX_COEFF_SET2, AS_UINT32(&set2));
1099 OUTREG32(&DPI1_REG->MATRIX_COEFF_SET3, AS_UINT32(&set3));
1100 OUTREG32(&DPI1_REG->MATRIX_COEFF_SET4, AS_UINT32(&set4));
1102 return DPI_STATUS_OK
;
1104 EXPORT_SYMBOL(DPI1_MatrixCoef
);
1106 DPI_STATUS
DPI1_MatrixPreOffset(UINT16 preAdd0
, UINT16 preAdd1
, UINT16 preAdd2
)
1109 DPI_REG_MATRIX_PREADD_SET0 set0 = DPI1_REG->MATRIX_PREADD_SET0;
1110 DPI_REG_MATRIX_PREADD_SET1 set1 = DPI1_REG->MATRIX_PREADD_SET1;
1112 set0.MATRIX_PRE_ADD_0 = preAdd0; set0.MATRIX_PRE_ADD_1 = preAdd1;
1113 set1.MATRIX_PRE_ADD_2 = preAdd2;
1115 OUTREG32(&DPI1_REG->MATRIX_PREADD_SET0, AS_UINT32(&set0));
1116 OUTREG32(&DPI1_REG->MATRIX_PREADD_SET1, AS_UINT32(&set1));
1118 return DPI_STATUS_OK
;
1120 EXPORT_SYMBOL(DPI1_MatrixPreOffset
);
1122 DPI_STATUS
DPI1_MatrixPostOffset(UINT16 postAdd0
, UINT16 postAdd1
, UINT16 postAdd2
)
1125 DPI_REG_MATRIX_POSTADD_SET0 set0 = DPI1_REG->MATRIX_POSTADD_SET0;
1126 DPI_REG_MATRIX_POSTADD_SET1 set1 = DPI1_REG->MATRIX_POSTADD_SET1;
1128 set0.MATRIX_POST_ADD_0 = postAdd0; set0.MATRIX_POST_ADD_1 = postAdd1;
1129 set1.MATRIX_POST_ADD_2 = postAdd2;
1131 OUTREG32(&DPI1_REG->MATRIX_POSTADD_SET0, AS_UINT32(&set0));
1132 OUTREG32(&DPI1_REG->MATRIX_POSTADD_SET1, AS_UINT32(&set1));
1134 return DPI_STATUS_OK
;
1136 EXPORT_SYMBOL(DPI1_MatrixPostOffset
);
1138 DPI_STATUS
DPI1_SetChannelLimit(UINT16 yBottom
, UINT16 yTop
, UINT16 cBottom
, UINT16 cTop
)
1140 DPI_REG_Y_LIMIT y
= DPI1_REG
->Y_LIMIT
;
1141 DPI_REG_C_LIMIT c
= DPI1_REG
->C_LIMIT
;
1143 y
.Y_LIMIT_BOT
= yBottom
;
1144 y
.Y_LIMIT_TOP
= yTop
;
1145 c
.C_LIMIT_BOT
= cBottom
;
1146 c
.C_LIMIT_TOP
= cTop
;
1148 OUTREG32(&DPI1_REG
->Y_LIMIT
, AS_UINT32(&y
));
1149 OUTREG32(&DPI1_REG
->C_LIMIT
, AS_UINT32(&c
));
1151 return DPI_STATUS_OK
;
1153 EXPORT_SYMBOL(DPI1_SetChannelLimit
);
1155 DPI_STATUS
DPI1_CLPFSetting(UINT8 clpfType
, BOOL roundingEnable
)
1157 DPI_REG_CLPF_SETTING setting
= DPI1_REG
->CLPF_SETTING
;
1159 setting
.CLPF_TYPE
= clpfType
;
1160 setting
.ROUND_EN
= roundingEnable
? 1 : 0;
1162 OUTREG32(&DPI1_REG
->CLPF_SETTING
, AS_UINT32(&setting
));
1164 return DPI_STATUS_OK
;
1166 EXPORT_SYMBOL(DPI1_CLPFSetting
);
1168 DPI_STATUS
DPI1_EmbeddedSyncSetting(BOOL embSync_R_Cr
, BOOL embSync_G_Y
, BOOL embSync_B_Cb
,
1169 BOOL esavFInv
, BOOL esavVInv
, BOOL esavHInv
,
1172 DPI_REG_EMBSYNC_SETTING setting
= DPI1_REG
->EMBSYNC_SETTING
;
1174 setting
.EMBVSYNC_R_CR
= embSync_R_Cr
? 1 : 0;
1175 setting
.EMBVSYNC_G_Y
= embSync_G_Y
? 1 : 0;
1176 setting
.EMBVSYNC_B_CB
= embSync_B_Cb
? 1 : 0;
1177 setting
.ESAV_F_INV
= esavFInv
? 1 : 0;
1178 setting
.ESAV_V_INV
= esavVInv
? 1 : 0;
1179 setting
.ESAV_H_INV
= esavHInv
? 1 : 0;
1180 setting
.ESAV_CODE_MAN
= esavCodeMan
? 1 : 0;
1182 OUTREG32(&DPI1_REG
->EMBSYNC_SETTING
, AS_UINT32(&setting
));
1184 return DPI_STATUS_OK
;
1186 EXPORT_SYMBOL(DPI1_EmbeddedSyncSetting
);
1188 DPI_STATUS
DPI1_OutputSetting(DPI_OUTPUT_BIT_NUM outBitNum
, BOOL outBitSwap
, DPI_OUTPUT_CHANNEL_SWAP outChSwap
, DPI_OUTPUT_YC_MAP outYCMap
)
1190 DPI_REG_OUTPUT_SETTING setting
= DPI1_REG
->OUTPUT_SETTING
;
1192 setting
.OUT_BIT
= outBitNum
;
1193 setting
.BIT_SWAP
= outBitSwap
? 1 : 0;
1194 setting
.CH_SWAP
= outChSwap
;
1195 setting
.YC_MAP
= outYCMap
;
1197 OUTREG32(&DPI1_REG
->OUTPUT_SETTING
, AS_UINT32(&setting
));
1199 return DPI_STATUS_OK
;
1201 EXPORT_SYMBOL(DPI1_OutputSetting
);
1203 DPI_STATUS
DPI1_ESAVVTimingControlLeft(UINT16 offsetOdd
, UINT16 widthOdd
, UINT16 offsetEven
, UINT16 widthEven
)
1205 DPI_REG_ESAV_VTIM_LODD setting1
= DPI1_REG
->ESAV_VTIM_LODD
;
1206 DPI_REG_ESAV_VTIM_LEVEN setting2
= DPI1_REG
->ESAV_VTIM_LEVEN
;
1208 setting1
.ESAV_VOFST_LODD
= offsetOdd
;
1209 setting1
.ESAV_VWID_LODD
= widthOdd
;
1210 setting2
.ESAV_VOFST_LEVEN
= offsetEven
;
1211 setting2
.ESAV_VWID_LEVEN
= widthEven
;
1214 OUTREG32(&DPI1_REG
->ESAV_VTIM_LODD
, AS_UINT32(&setting1
));
1215 OUTREG32(&DPI1_REG
->ESAV_VTIM_LEVEN
, AS_UINT32(&setting2
));
1216 return DPI_STATUS_OK
;
1218 EXPORT_SYMBOL(DPI1_ESAVVTimingControlLeft
);
1220 DPI_STATUS
DPI1_ESAVVTimingControlRight(UINT16 offsetOdd
, UINT16 widthOdd
, UINT16 offsetEven
, UINT16 widthEven
)
1222 DPI_REG_ESAV_VTIM_RODD setting1
= DPI1_REG
->ESAV_VTIM_RODD
;
1223 DPI_REG_ESAV_VTIM_REVEN setting2
= DPI1_REG
->ESAV_VTIM_REVEN
;
1225 setting1
.ESAV_VOFST_RODD
= offsetOdd
;
1226 setting1
.ESAV_VWID_RODD
= widthOdd
;
1227 setting2
.ESAV_VOFST_REVEN
= offsetEven
;
1228 setting2
.ESAV_VWID_REVEN
= widthEven
;
1230 OUTREG32(&DPI1_REG
->ESAV_VTIM_RODD
, AS_UINT32(&setting1
));
1231 OUTREG32(&DPI1_REG
->ESAV_VTIM_REVEN
, AS_UINT32(&setting2
));
1233 return DPI_STATUS_OK
;
1235 EXPORT_SYMBOL(DPI1_ESAVVTimingControlRight
);
1238 DPI_STATUS
DPI1_Config_ColorSpace(UINT8 ColorSpace
, UINT8 HDMI_Res
)
1241 DPI_REG_CNTL ctrl
= DPI1_REG
->CNTL
;
1243 printk("[DPI1] DPI1_Config_ColorSpace: ColorSpace[%d] / HDMI Resolution[%d] \n", ColorSpace
, HDMI_Res
);
1245 if((HDMI_Res
== 0) || (HDMI_Res
== 1)) //SD
1254 //DPI1_MatrixCoef(dpi1_coef[i][0][0], dpi1_coef[i][0][1], dpi1_coef[i][0][2],
1255 // dpi1_coef[i][1][0], dpi1_coef[i][1][1], dpi1_coef[i][1][2],
1256 // dpi1_coef[i][2][0], dpi1_coef[i][2][1], dpi1_coef[i][2][2]);
1257 //DPI1_MatrixPreOffset(dpi1_coef[i][3][0], dpi1_coef[i][3][1], dpi1_coef[i][3][2]);
1258 //DPI1_MatrixPostOffset(dpi1_coef[i][4][1], dpi1_coef[i][4][0], dpi1_coef[i][4][2]);
1261 if((YCBCR_444
== ColorSpace
) || (YCBCR_444_FULL
== ColorSpace
)) //YUV444
1266 else if((YCBCR_422
== ColorSpace
) || (YCBCR_422_FULL
== ColorSpace
)) //YUV422
1277 OUTREG32(&DPI1_REG
->CNTL
, AS_UINT32(&ctrl
));
1279 //DPI1_ColorSpace_Enable(ColorSpace);
1281 return DPI_STATUS_OK
;
1284 EXPORT_SYMBOL(DPI1_Config_ColorSpace
);
1286 BOOL
DPI1_IS_TOP_FIELD(void)
1288 if(DPI1_REG
->STATUS
.FIELD
== 0)
1294 EXPORT_SYMBOL(DPI1_IS_TOP_FIELD
);