xref: /utopia/UTPA2-700.0.x/modules/ldm/hal/maserati/ldm/halLDM.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
1 ////////////////////////////////////////////////////////////////////////////////
2 //
3 // Copyright (c) 2008-2009 MStar Semiconductor, Inc.
4 // All rights reserved.
5 //
6 // Unless otherwise stipulated in writing, any and all information contained
7 // herein regardless in any format shall remain the sole proprietary of
8 // MStar Semiconductor Inc. and be kept in strict confidence
9 // ("MStar Confidential Information") by the recipient.
10 // Any unauthorized act including without limitation unauthorized disclosure,
11 // copying, use, reproduction, sale, distribution, modification, disassembling,
12 // reverse engineering and compiling of the contents of MStar Confidential
13 // Information is unlawful and strictly prohibited. MStar hereby reserves the
14 // rights to any and all damages, losses, costs and expenses resulting therefrom.
15 //
16 ////////////////////////////////////////////////////////////////////////////////
17 
18 ///////////////////////////////////////////////////////////////////////////////////////////////////
19 ///
20 /// file    halLDM.c
21 /// @brief  local dimming  Driver HAL Interface
22 /// @author MStar Semiconductor Inc.
23 ///////////////////////////////////////////////////////////////////////////////////////////////////
24 
25 
26 //-------------------------------------------------------------------------------------------------
27 //  Include Files
28 //-------------------------------------------------------------------------------------------------
29 
30 #include <string.h>
31 #include "MsCommon.h"
32 #include "MsTypes.h"
33 #include "halLDM.h"
34 #include "regLDM.h"
35 
36 //-------------------------------------------------------------------------------------------------
37 //  Debug Functions
38 //-------------------------------------------------------------------------------------------------
39 #define LD_WriteByte(reg,val) WRITE_BYTE((u32VirtLdBaseAddr + ((reg)<<2)),val)
40 
41 #define LD_Write2Byte(reg,val) WRITE_WORD((u32VirtLdBaseAddr + ((reg)<<2)),val)
42 
43 #define LD_ReadByte(reg)    (READ_BYTE(u32VirtLdBaseAddr + ((reg)<<2)))
44 
45 #define LD_Read2Byte(reg)  (READ_WORD(u32VirtLdBaseAddr + ((reg)<<2)))
46 
47 #define SUBBANK_LD_60HZ  (0x2E) //sub bank 2E for local dimmig 60hz
48 #define SUBBANK_LD_120HZ (0xCE) //sub bank CE for local dimmig 120hz
49 #define SUBBANK_FO_BKC9  (0xC9) //sub bank c9 for data select 60/120hz
50 
51 static MS_U8 u8Subbank = SUBBANK_LD_120HZ;
52 
53 #define HAL_SUBBANKC9   LD_WriteByte(0,SUBBANK_FO_BKC9)
54 #define HAL_SUBBANKLD    LD_WriteByte(0,u8Subbank)
55 #define HAL_SUBBANKOFF  LD_WriteByte(0,0xFF)
56 
57 static MS_U32 u32VirtLdBaseAddr = BASEADDR_RIU + REG_LD_BASE;
58 
59 //------------------------------------------------------------------------------
60 /// Description : Config LDMA MMIO base address
61 /// @param u32PMBankBaseAddr \b IN:base address of MMIO (PM domain)
62 /// @param u32NONPMRegBaseAddr \b IN :base address of MMIO
63 /// @param u8DeviceIndex \b IN: index of HW IP
64 //------------------------------------------------------------------------------
HAL_LDM_MMIOConfig(MS_U32 u32NONPMRegBaseAddr,MS_U8 u8ClkHz)65 void HAL_LDM_MMIOConfig(MS_U32 u32NONPMRegBaseAddr, MS_U8 u8ClkHz)
66 {
67     u32VirtLdBaseAddr = u32NONPMRegBaseAddr + REG_LD_BASE;
68 
69     if(u8ClkHz == 60)
70     {
71         HAL_SUBBANKC9;
72         LD_Write2Byte(REG_FO_DATA_PATH,0x0100);
73         HAL_SUBBANKOFF;
74         u8Subbank = SUBBANK_LD_60HZ;
75     }
76     else if(u8ClkHz == 120)
77     {
78         //LMDA path sel
79         HAL_SUBBANKC9;
80         LD_Write2Byte(REG_FO_DATA_PATH,0x0000);
81         HAL_SUBBANKOFF;
82         u8Subbank = SUBBANK_LD_120HZ;
83     }
84     else //default set 60HZ timming
85     {
86         //LMDA path sel
87         HAL_SUBBANKC9;
88         LD_Write2Byte(REG_FO_DATA_PATH,0x0100);
89         HAL_SUBBANKOFF;
90         u8Subbank = SUBBANK_LD_60HZ;
91     }
92     return;
93 }
94 
HAL_LDM_SetLDFAddr(MS_U8 u8AddIndex,MS_U32 u32LDFAddr_l,MS_U32 u32LDFAddr_r)95 void HAL_LDM_SetLDFAddr(MS_U8 u8AddIndex, MS_U32 u32LDFAddr_l,MS_U32 u32LDFAddr_r)
96 {
97     HAL_SUBBANKLD;
98     switch(u8AddIndex)
99     {
100        case 0:
101             LD_Write2Byte(REG_LDF_BASEADDR0_LOW_L,u32LDFAddr_l&0xFFFF);
102             LD_Write2Byte(REG_LDF_BASEADDR0_HIGH_L,u32LDFAddr_l >> 16);
103             LD_Write2Byte(REG_LDF_BASEADDR0_LOW_R,u32LDFAddr_r&0xFFFF);
104             LD_Write2Byte(REG_LDF_BASEADDR0_HIGH_R,u32LDFAddr_r >> 16);
105             break;
106        case 1:
107             LD_Write2Byte(REG_LDF_BASEADDR1_LOW_L,u32LDFAddr_l&0xFFFF);
108             LD_Write2Byte(REG_LDF_BASEADDR1_HIGH_L,u32LDFAddr_l >> 16);
109             LD_Write2Byte(REG_LDF_BASEADDR1_LOW_R,u32LDFAddr_r&0xFFFF);
110             LD_Write2Byte(REG_LDF_BASEADDR1_HIGH_R,u32LDFAddr_r >> 16);
111             break;
112        default:
113            break;
114     }
115     HAL_SUBBANKOFF;
116     return ;
117 }
118 
HAL_LDM_SetEdge2DAddr(MS_U32 u32Edge2DAddr)119 void HAL_LDM_SetEdge2DAddr(MS_U32 u32Edge2DAddr)
120 {
121     HAL_SUBBANKLD;
122     LD_Write2Byte(REG_EDGE_2D_BASEADDR_LOW,u32Edge2DAddr&0xFFFF);
123     LD_Write2Byte(REG_EDGE_2D_BASEADDR_HIGH,u32Edge2DAddr >> 16);
124     HAL_SUBBANKOFF;
125     return ;
126 }
127 
HAL_LDM_SetLDBAddr(MS_U8 u8AddIndex,MS_U32 u32LDBAddr_l,MS_U32 u32LDBAddr_r)128 void HAL_LDM_SetLDBAddr(MS_U8 u8AddIndex, MS_U32 u32LDBAddr_l,MS_U32 u32LDBAddr_r)
129 {
130     HAL_SUBBANKLD;
131     switch(u8AddIndex)
132     {
133        case 0:
134             LD_Write2Byte(REG_LDB_BASEADDR0_LOW_L,u32LDBAddr_l&0xFFFF);
135             LD_Write2Byte(REG_LDB_BASEADDR0_HIGH_L,u32LDBAddr_l >> 16);
136             LD_Write2Byte(REG_LDB_BASEADDR0_LOW_R,u32LDBAddr_r&0xFFFF);
137             LD_Write2Byte(REG_LDB_BASEADDR0_HIGH_R,u32LDBAddr_r >> 16);
138             break;
139        case 1:
140             LD_Write2Byte(REG_LDB_BASEADDR1_LOW_L,u32LDBAddr_l&0xFFFF);
141             LD_Write2Byte(REG_LDB_BASEADDR1_HIGH_L,u32LDBAddr_l >> 16);
142             LD_Write2Byte(REG_LDB_BASEADDR1_LOW_R,u32LDBAddr_r&0xFFFF);
143             LD_Write2Byte(REG_LDB_BASEADDR1_HIGH_R,u32LDBAddr_r >> 16);
144             break;
145        default:
146            break;
147     }
148     HAL_SUBBANKOFF;
149     return ;
150 }
151 
HAL_LDM_SetMIUPackOffset(MS_U8 u8Channel,MS_U8 u8PackOffset)152 void HAL_LDM_SetMIUPackOffset(MS_U8 u8Channel,MS_U8 u8PackOffset )
153 {
154     if(u8PackOffset > 0x1F) //bit 0 ~bit4
155     {
156         printf("fun:%s @@error:Set MIU PackOffset Outof Range!!!\n",__FUNCTION__);
157         return ;
158     }
159     HAL_SUBBANKLD;
160     switch(u8Channel)
161     {
162        case LDMA0: //DMA0
163             LD_WriteByte(REG_PACK_OFFSET0,u8PackOffset);
164             break;
165        case LDMA1: //DMA1
166             LD_WriteByte(REG_PACK_OFFSET1,u8PackOffset);
167             break;
168        default:
169            break;
170     }
171     HAL_SUBBANKOFF;
172     return ;
173 }
HAL_LDM_SetMIUPackLength(MS_U8 u8Channel,MS_U8 u8PackLength)174 void HAL_LDM_SetMIUPackLength(MS_U8 u8Channel,MS_U8 u8PackLength)
175 {
176     if(u8PackLength > 0x1F) //bit 0 ~bit4
177     {
178         printf("fun:%s @@error:Set MIU PackLength Outof Range!!!\n",__FUNCTION__);
179         return ;
180     }
181 
182     HAL_SUBBANKLD;
183     switch(u8Channel)
184     {
185        case LDMA0: //DMA0
186             LD_WriteByte(REG_PACK_LENGTH0,(LD_Read2Byte(REG_PACK_LENGTH0)&(~0x1F))|u8PackLength);
187             break;
188        case LDMA1: //DMA1
189             LD_WriteByte(REG_PACK_LENGTH1,(LD_Read2Byte(REG_PACK_LENGTH1)&(~0x1F))|u8PackLength);
190             break;
191        default:
192            break;
193     }
194 
195     HAL_SUBBANKOFF;
196     return ;
197 }
HAL_LDM_SetYoffEnd(MS_U8 u8Channel,MS_U8 u8YoffEnd)198 void HAL_LDM_SetYoffEnd(MS_U8 u8Channel,MS_U8 u8YoffEnd)
199 {
200     if(u8YoffEnd > 0x3F) //bit 0~bit5
201     {
202         printf("fun:%s @@error:Set YoffEnd Outof Range!!!\n",__FUNCTION__);
203         return ;
204     }
205     HAL_SUBBANKLD;
206     switch(u8Channel)
207     {
208         case LDMA0: //DMA0
209              LD_WriteByte(REG_DMA_YOFF_END_0,u8YoffEnd);
210              break;
211         case LDMA1: //DMA1
212              LD_WriteByte(REG_DMA_YOFF_END_1,u8YoffEnd);
213              break;
214         default:
215             break;
216     }
217     HAL_SUBBANKOFF;
218     return ;
219 }
HAL_LDM_SetDmaEnable(MS_U8 u8Channel,MS_BOOL Enable)220 void HAL_LDM_SetDmaEnable(MS_U8 u8Channel, MS_BOOL Enable)
221 {
222     HAL_SUBBANKLD;
223     switch(u8Channel)
224     {
225         case LDMA0: //DMA0
226             if(Enable)
227             {
228                 LD_Write2Byte(REG_PACK_LENGTH0,LD_Read2Byte(REG_PACK_LENGTH0)|REG_DMA0_ENABLE_BIT);
229             }
230             else
231             {
232                 LD_Write2Byte(REG_PACK_LENGTH1,LD_Read2Byte(REG_PACK_LENGTH1)&(~REG_DMA1_ENABLE_BIT));
233             }
234             break;
235         case LDMA1: //DMA1
236             if(Enable)
237             {
238                 LD_Write2Byte(REG_PACK_LENGTH1,LD_Read2Byte(REG_PACK_LENGTH1)|REG_DMA0_ENABLE_BIT);
239             }
240             else
241             {
242                 LD_Write2Byte(REG_PACK_LENGTH1,LD_Read2Byte(REG_PACK_LENGTH1)&(~REG_DMA0_ENABLE_BIT));
243             }
244             break;
245         default:
246             break;
247     }
248     HAL_SUBBANKOFF;
249     return ;
250 }
251 
HAL_LDM_SetBlHeightDMA(MS_U8 u8Height)252 void HAL_LDM_SetBlHeightDMA(MS_U8 u8Height)
253 {
254     HAL_SUBBANKLD;
255     LD_Write2Byte(REG_BL_WIDTH_DMA,(LD_Read2Byte(REG_BL_WIDTH_DMA)&(0xC0FF))|(u8Height<<8));
256     HAL_SUBBANKOFF;
257     return ;
258 }
HAL_LDM_SetBlWidthDMA(MS_U8 u8Width)259 void HAL_LDM_SetBlWidthDMA(MS_U8 u8Width)
260 {
261     HAL_SUBBANKLD;
262     LD_Write2Byte(REG_BL_WIDTH_DMA,(LD_Read2Byte(REG_BL_WIDTH_DMA)&(0xFFC0))|u8Width);
263     HAL_SUBBANKOFF;
264     return ;
265 }
266 
HAL_LDM_SetLEDBufBaseOffset(MS_U32 u32DataOffset)267 void HAL_LDM_SetLEDBufBaseOffset(MS_U32 u32DataOffset)
268 {
269     HAL_SUBBANKLD;
270     LD_Write2Byte(REG_BASEADDR_OFFSET,u32DataOffset&0xFFFF);
271     LD_Write2Byte(REG_BASEADDR_OFFSET+1,u32DataOffset >> 16);
272     HAL_SUBBANKOFF;
273     return ;
274 }
275 
276 //step6: enable local dimming
HAL_LDM_Enable(MS_BOOL Enable)277 void HAL_LDM_Enable(MS_BOOL Enable)
278 {
279     HAL_SUBBANKLD;
280     if(Enable)
281     {
282         LD_Write2Byte(REG_LD_ENABLE,0x0001);
283     }
284     else
285     {
286         LD_Write2Byte(REG_LD_ENABLE,0x0000);
287     }
288     HAL_SUBBANKOFF;
289     return ;
290 }
291