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