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 ////////////////////////////////////////////////////////////////////////////////
79 //
80 // Copyright (c) 2011-2013 MStar Semiconductor, Inc.
81 // All rights reserved.
82 //
83 // Unless otherwise stipulated in writing, any and all information contained
84 // herein regardless in any format shall remain the sole proprietary of
85 // MStar Semiconductor Inc. and be kept in strict confidence
86 // ("MStar Confidential Information") by the recipient.
87 // Any unauthorized act including without limitation unauthorized disclosure,
88 // copying, use, reproduction, sale, distribution, modification, disassembling,
89 // reverse engineering and compiling of the contents of MStar Confidential
90 // Information is unlawful and strictly prohibited. MStar hereby reserves the
91 // rights to any and all damages, losses, costs and expenses resulting therefrom.
92 //
93 ////////////////////////////////////////////////////////////////////////////////
94
95 ////////////////////////////////////////////////////////////////////////////////////////////////////
96 // file halTSO.c
97 // @brief TS I/O HAL
98 // @author MStar Semiconductor,Inc.
99 ////////////////////////////////////////////////////////////////////////////////////////////////////
100 #include "halTSO.h"
101 #include "halCHIP.h"
102
103 //--------------------------------------------------------------------------------------------------
104 // Driver Compiler Option
105 //--------------------------------------------------------------------------------------------------
106 #define TSP_HAL_REG_SAFE_MODE 1UL // Register protection access between 1 task and 1+ ISR
107
108 //-------------------------------------------------------------------------------------------------
109 // Local Structures
110 //-------------------------------------------------------------------------------------------------
111 typedef struct _HalTSO_OutPad
112 {
113 MS_U16 u16OutPad[TSO_ENGINE_NUM];
114 MS_U16 u16TSCfgOld[TSO_ENGINE_NUM];
115 MS_U16 u16TSOutModeOld[TSO_ENGINE_NUM];
116 } HalTSO_OutPad;
117
118 //--------------------------------------------------------------------------------------------------
119 // TSP Hardware Abstraction Layer
120 //--------------------------------------------------------------------------------------------------
121 static REG_Ctrl_TSO* _TSOCtrl = NULL;
122 static REG_Ctrl_TSO1* _TSOCtrl1 = NULL;
123
124
125 static MS_VIRT _virtTSORegBase = 0;
126 static MS_PHY _phyTSOFiMiuOffset[TSO_FILE_IF_NUM] = {[0 ... (TSO_FILE_IF_NUM-1)] = 0UL};
127 static MS_PHY _phyTSOVQiMiuOffset = 0U;
128
129 static HalTSO_OutPad _stOutPadCtrl;
130
131 #ifdef MSOS_TYPE_LINUX_KERNEL
132 static MS_U16 _u16TSORegArray[2][128];
133 #endif
134
135
136 //[NOTE] Jerry
137 // Some register has write order, for example, writing PCR_L will disable PCR counter
138 // writing PCR_M trigger nothing, writing PCR_H will enable PCR counter
139 #define _HAL_REG32_W(reg, value) do { (reg)->L = ((value) & 0x0000FFFFUL); \
140 (reg)->H = ((value) >> 16UL); } while(0)
141
142 #define _HAL_REG16_W(reg, value) (reg)->data = (value);
143
144 #define TSO0_REG(addr) (*((volatile MS_U16*)(_virtTSORegBase + REG_CTRL_BASE_TSO + ((addr)<<2UL))))
145 #define TSO1_REG(addr) (*((volatile MS_U16*)(_virtTSORegBase + REG_CTRL_BASE_TSO1 + ((addr)<<2UL))))
146
147 //--------------------------------------------------------------------------------------------------
148 // Macro of bit operations
149 //--------------------------------------------------------------------------------------------------
150 #define HAS_FLAG(flag, bit) ((flag) & (bit))
151 #define SET_FLAG(flag, bit) ((flag)|= (bit))
152 #define RESET_FLAG(flag, bit) ((flag)&= (~(bit)))
153 #define SET_FLAG1(flag, bit) ((flag)| (bit))
154 #define RESET_FLAG1(flag, bit) ((flag)& (~(bit)))
155
156 #define TSO_CLKGEN0_REG(addr) (*((volatile MS_U16*)(_virtTSORegBase + 0x1600UL + ((addr)<<2UL))))
157 #define REG_CLKGEN0_TSO_IN 0x27UL
158 #define REG_CLKGEN0_TSO_TRACE_MASK 0x000FUL
159 #define REG_CLKGEN0_TSO_TRACE_DISABLE 0x0001UL
160 #define REG_CLKGEN0_TSO_TRACE_INVERT 0x0002UL
161 #define REG_CLKGEN0_TSO_TRACE_216M 0x0000UL
162 #define REG_CLKGEN0_TSO_IN_MASK 0x1F00UL
163 #define REG_CLKGEN0_TSO_IN_SHIFT 8UL
164 #define REG_CLKGEN0_TSO_IN_DISABLE 0x0100UL
165 #define REG_CLKGEN0_TSO_IN_INVERT 0x0200UL
166 // bit[12:8] -> 0: disable clock
167 // 1: invert clock
168 // bit [4:2] -> 000: Sel TS0 Clk
169 // 001: Sel TS1 Clk
170 // 010: Sel TS2 Clk
171 // 011: Sel TS3 Clk
172 // 100: Sel TS4 Clk
173 // 101: Sel TS5 Clk
174 // 110: Sel Dmd Clk
175 #define REG_CLKGEN0_TSO_OUT_PHASE 0x7CUL
176 #define REG_CLKGEN0_TSO_OUT_DIVNUM_MASK 0x001FUL
177 #define REG_CLKGEN0_TSO_OUT_PH_TUN_NUM_MASK 0x1F00UL
178 #define REG_CLKGEN0_TSO_OUT_PH_TUN_NUM_SHIFT 8UL
179
180 #define REG_CLKGEN0_TSO_OUT_CLK 0x7DUL
181 #define REG_CLKGEN0_TSO_OUT_DIV_SEL_MASK 0x0001UL
182 // bit[0] -> 0: CLK_DMPLLDIV2
183 // 1: CLK_DMPLLDIV3
184 #define REG_CLKGEN0_TSO_OUT_INV 0x0002UL
185 #define REG_CLKGEN0_TSO_OUT_PHASE_TUN_ENABLE 0x0004UL
186 #define REG_CLKGEN1_TSO_OUT_PRE_CLK_MASK 0x0070UL
187 #define REG_CLKGEN1_TSO_OUT_PRE_CLK_SHIFT 4UL
188 // bit[6:4] -> 000:CLK_TS0_IN
189 // 001:CLK_TS1_IN
190 // 010:CLK_TS2_IN
191 // 011:CLK_TS3_IN
192 // 100:CLK_TS4_IN
193 // 101:CLK_TS5_IN
194 #define REG_CLKGEN0_TSO_OUT_CLK_MASK 0x1F00UL
195 #define REG_CLKGEN0_TSO_OUT_CLK_DISABLE 0x0100UL
196 #define REG_CLKGEN0_TSO_OUT_CLK_INVERT 0x0200UL
197 // bit[12:8] -> 0: disable clock
198 // 1: invert clock
199 // bit [4:2] -> 000: TSO_OUT_DIV2 (clock/2N+1)
200 // 001: 62MHz
201 // 010: 54MHz
202 // 011: clk_p_tso_out (live in)
203 // 100: clk_p_tso_out_div8 (live in)
204 // 101: 27MHz
205 // 111: clk_demod_ts_p
206 #define REG_CLKGEN0_RESERVED0 0x7EUL
207 #define REG_CLKGEN0_RES0_CLKTSO_TOPAD_INV 0x8000UL
208 #define TSO_CLKGEN2_REG(addr) (*((volatile MS_U16*)(_virtTSORegBase + 0x1400UL + ((addr)<<2UL))))
209 #define REG_CLKGEN2_TSO1_IN 0x10UL
210 #define REG_CLKGEN2_TSO1_IN_MASK 0x001FUL
211 #define REG_CLKGEN2_TSO1_IN_SHIFT 0UL
212 #define REG_CLKGEN2_TSO1_IN_DISABLE 0x0001UL
213 #define REG_CLKGEN2_TSO1_IN_INVERT 0x0002UL
214 // bit[4:0] -> 0: disable clock
215 // 1: invert clock
216 // bit [4:2] -> 000: Sel TS0 Clk
217 // 001: Sel TS1 Clk
218 // 010: Sel TS2 Clk
219 // 011: Sel TS3 Clk
220 // 100: Sel TS4 Clk
221 // 101: Sel TS5 Clk
222 // 111: Sel Dmd Clk
223 #define REG_CLKGEN2_TSO2_IN_MASK 0x1F00UL
224 #define REG_CLKGEN2_TSO2_IN_SHIFT 8UL
225 #define REG_CLKGEN2_TSO2_IN_DISABLE 0x0001UL
226 #define REG_CLKGEN2_TSO2_IN_INVERT 0x0002UL
227 // bit[12:8] -> 0: disable clock
228 // 1: invert clock
229 // bit [12:10] -> 000: Sel TS0 Clk
230 // 001: Sel TS1 Clk
231 // 010: Sel TS2 Clk
232 // 011: Sel TS3 Clk
233 // 100: Sel TS4 Clk
234 // 101: Sel TS5 Clk
235 // 111: Sel Dmd Clk
236 #define TSP_TOP_REG(addr) (*((volatile MS_U16*)(_virtTSORegBase + 0x3c00UL + ((addr)<<2UL))))
237 #define REG_TOP_TSO_MUX 0x10UL
238 #define REG_TOP_TSO_EVDMODE_MASK 0x0600UL
239 #define REG_TOP_TS3_OUT_MODE_TSO 0x0400UL
240 #define REG_TOP_TSO_MUX_MASK 0x7000UL
241 #define REG_TOP_TSO_MUX_SHIFT 12UL
242 // bit[14:12] -> 000: PAD_TS0
243 // 001: PAD_TS1
244 // 010: PAD_TS2
245 // 011: PAD_TS3
246 // 100: PAD_TS4
247 // 101: PAD_TS5
248 // 111: DEMOD
249 #define REG_TOP_TSO1_MUX 0x14UL
250 #define REG_TOP_TSO1_MUX_MASK 0x0007UL
251 #define REG_TOP_TSO1_MUX_SHIFT 0UL
252 // bit[2:0] -> 000: PAD_TS0
253 // 001: PAD_TS1
254 // 010: PAD_TS2
255 // 011: PAD_TS3
256 // 100: PAD_TS4
257 // 101: PAD_TS5
258 // 111: DEMOD
259 #define REG_TOP_TSO2_MUX_MASK 0x0070UL
260 #define REG_TOP_TSO2_MUX_SHIFT 4UL
261 // bit[6:4] -> 000: PAD_TS0
262 // 001: PAD_TS1
263 // 010: PAD_TS2
264 // 011: PAD_TS3
265 // 100: PAD_TS4
266 // 101: PAD_TS5
267 // 111: DEMOD
268 #define REG_TOP_TS4TS5_CFG 0x40UL
269 #define REG_TOP_TS_OUT_MODE_MASK 0x0070UL
270 #define REG_TOP_TS1_OUT_MODE_TSO 0x0030UL
271 #define REG_TOP_TS1_OUT_MODE_Ser2Par 0x0040UL
272 #define REG_TOP_TS1_OUT_MODE_Ser2Par1 0x0050UL
273 #define REG_TOP_TS4_CFG_MASK 0x0C00UL
274 #define REG_TOP_TS4_CFG_SHIFT 10UL
275 #define REG_TOP_TS4_CFG_SERIAL_IN 0x0400UL
276 #define REG_TOP_TS4_CFG_PARALLEL_IN 0x0800UL
277 #define REG_TOP_TS5_CFG_MASK 0x3000UL
278 #define REG_TOP_TS5_CFG_SHIFT 12UL
279 #define REG_TOP_TS5_CFG_SERIAL_IN 0x1000UL
280
281 #define REG_TOP_TS_CONFIG 0x57UL
282 #define REG_TOP_TS0_CONFIG_MASK 0x0700UL
283 #define REG_TOP_TS0_CONFIG_PARALLEL_IN 0x0100UL
284 #define REG_TOP_TS0_CONFIG_SERIAL_IN 0x0200UL
285 #define REG_TOP_TS0_CONFIG_MSPI_MODE 0x0300UL
286 #define REG_TOP_TS0_CONFIG_3WIRE_MODE 0x0400UL
287 #define REG_TOP_TS1_CONFIG_MASK 0x3800UL
288 #define REG_TOP_TS1_CONFIG_PARALLEL_IN 0x0800UL
289 #define REG_TOP_TS1_CONFIG_PARALLEL_OUT 0x1000UL //out from demod
290 #define REG_TOP_TS1_CONFIG_SERIAL_IN 0x1800UL
291 #define REG_TOP_TS1_CONFIG_3WIRE_MODE 0x2000UL
292 #define REG_TOP_TS1_CONFIG_MSPI_MODE 0x2800UL
293 #define REG_TOP_TS2_CONFIG_MASK 0xC000UL
294 #define REG_TOP_TS2_CONFIG_PARALLEL_IN 0x8000UL
295 #define REG_TOP_TS2_CONFIG_SERIAL_IN 0x4000UL
296
297 #define REG_TOP_TS3_CONFIG 0x67UL
298 #define REG_TOP_TS3_CONFIG_MASK 0xF000UL
299 #define REG_TOP_TS3_CONFIG_SERIAL_IN 0x1000UL
300 #define REG_TOP_TS3_CONFIG_PARALLEL_IN 0x2000UL
301 #define REG_TOP_TS3_CONFIG_MSPI 0x3000UL
302 #define REG_TOP_TS3_CONFIG_PAROUT_DMD 0x5000UL
303 #define REG_TOP_TS3_CONFIG_PAROUT_Ser2Par 0x7000UL
304 #define REG_TOP_TS3_CONFIG_PAROUT_Ser2Par1 0x8000UL
305
306 #define TSP_TSP5_REG(addr) (*((volatile MS_U16*)(_virtTSORegBase + 0xc7600 + ((addr)<<2))))
307 #define REG_TSP5_TSOIN_MUX 0x13UL
308 #define REG_TSP5_TSOIN_MUX_MASK 0x000FUL
309 #define REG_TSP5_TSOIN0_MUX_SHIFT 0UL
310 #define REG_TSP5_TSOIN1_MUX_SHIFT 4UL
311 #define REG_TSP5_TSOIN2_MUX_SHIFT 8UL
312 #define REG_TSP5_TSOOUT_MUX 0x15UL
313 #define REG_TSP5_TSOOUT_MUX_MASK 0x000FUL
314 #define REG_TSP5_TSOOUT_MUX_TSO 0x0000UL
315 #define REG_TSP5_TSOOUT_MUX_S2P0 0x0001UL
316
317 #define TSP_TS_SAMPLE_REG(addr) (*((volatile MS_U16*)(_virtTSORegBase + 0x21600 + ((addr)<<2))))
318 #define REG_TSO_OUT_CLK_SEL 0x30UL
319 #define REG_TSO_OUT_CLK_SEL_MASK 1UL
320 #define REG_TSO_OUT_TSO 0x0000UL
321 #define REG_TSO_OUT_S2P 0x0001UL
322
323 //--------------------------------------------------------------------------------------------------
324 // Implementation
325 //--------------------------------------------------------------------------------------------------
_HAL_REG32_R(REG32 * reg)326 static MS_U32 _HAL_REG32_R(REG32 *reg)
327 {
328 MS_U32 value = 0UL;
329 value = (reg)->H << 16UL;
330 value |= (reg)->L;
331 return value;
332 }
333
_HAL_REG16_R(REG16 * reg)334 static MS_U16 _HAL_REG16_R(REG16 *reg)
335 {
336 MS_U16 value = 0;
337 value = (reg)->data;
338 return value;
339 }
340
_HAL_TSO_MIU_OFFSET(MS_PHY Phyaddr)341 static MS_PHY _HAL_TSO_MIU_OFFSET(MS_PHY Phyaddr)
342 {
343 #ifdef HAL_MIU2_BASE
344 if(Phyaddr >= (MS_PHY)HAL_MIU2_BASE)
345 return ((MS_PHY)HAL_MIU2_BASE & 0xFFFFFFFFUL);
346 else
347 #endif //HAL_MIU2_BASE
348 #ifdef HAL_MIU1_BASE
349 if(Phyaddr >= (MS_PHY)HAL_MIU1_BASE)
350 return ((MS_PHY)HAL_MIU1_BASE & 0xFFFFFFFFUL);
351 else
352 #endif //HAL_MIU1_BASE
353 return ((MS_PHY)HAL_MIU0_BASE & 0xFFFFFFFFUL);
354 }
355
HAL_TSO_SetBank(MS_VIRT virtBankAddr)356 void HAL_TSO_SetBank(MS_VIRT virtBankAddr)
357 {
358 _virtTSORegBase = virtBankAddr;
359 _TSOCtrl = (REG_Ctrl_TSO*)(_virtTSORegBase+ REG_CTRL_BASE_TSO);
360 _TSOCtrl1 = (REG_Ctrl_TSO1*)(_virtTSORegBase+ REG_CTRL_BASE_TSO1);
361 }
362
HAL_TSO_REG32_IndR(REG32 * reg)363 static MS_U32 HAL_TSO_REG32_IndR(REG32 *reg)
364 {
365 MS_U32 u32tmp;
366 MS_VIRT virtReg = (MS_VIRT)reg;
367
368 u32tmp = ((MS_U32)virtReg)>> 1UL;
369
370 _HAL_REG32_W(&(_TSOCtrl->TSO_INDR_ADDR), u32tmp); // set address
371 _HAL_REG16_W(&(_TSOCtrl->TSO_INDR_CTRL) , SET_FLAG1(_HAL_REG16_R(&(_TSOCtrl->TSO_INDR_CTRL)), TSO_INDIR_R_ENABLE)); // set command
372
373 u32tmp = ((MS_U32)_HAL_REG16_R(&(_TSOCtrl->TSO_INDR_RDATA))) & 0xFFFFUL; // get read value
374
375 return u32tmp;
376 }
377
HAL_TSO_REG32_IndW(REG32 * reg,MS_U32 value)378 static void HAL_TSO_REG32_IndW(REG32 *reg, MS_U32 value)
379 {
380 MS_VIRT virtReg = (MS_VIRT)reg;
381 MS_U32 u32tmp = 0;
382
383 u32tmp = ((MS_U32)virtReg)>> 1;
384
385 _HAL_REG32_W(&(_TSOCtrl->TSO_INDR_ADDR), u32tmp); // set address
386 _HAL_REG32_W(&(_TSOCtrl->TSO_INDR_WDATA), value); // set write value
387 _HAL_REG16_W(&(_TSOCtrl->TSO_INDR_CTRL) , SET_FLAG1(_HAL_REG16_R(&(_TSOCtrl->TSO_INDR_CTRL)), TSO_INDIR_W_ENABLE)); // set command
388 }
389
390 //
391 // General API
392 //
HAL_TSO_Init(void)393 void HAL_TSO_Init(void)
394 {
395 MS_U8 u8ii = 0;
396
397 //select MIU0, and 128bit MIU bus
398 #if 0
399 TSO_MIUDIG0_REG(REG_MIUDIG_MIU_SEL1) &= ~REG_MIUDIG_MIU_SEL1_TSO_SEL_MASK; //select miu0
400 TSO_MIUDIG1_REG(REG_MIUDIG_MIU_SEL1) &= ~REG_MIUDIG_MIU_SEL1_TSO_SEL_MASK; //select miu0
401 TSP_TOP_REG(REG_TOP_MIU_GP1_i64) =
402 (TSP_TOP_REG(REG_TOP_MIU_GP1_i64) & ~REG_TOP_MIU_GP1_i64_TSO_MASK) | REG_TOP_MIU_GP1_i64_TSO_128BIT_CLIENT;
403 #endif
404
405 for(u8ii = 0; u8ii < (MS_U8)TSO_ENGINE_NUM; u8ii++)
406 {
407 _stOutPadCtrl.u16OutPad[u8ii] = 0;
408 _stOutPadCtrl.u16TSCfgOld[u8ii] = 0;
409 _stOutPadCtrl.u16TSOutModeOld[u8ii] = 0;
410 }
411
412 //reset
413 _HAL_REG16_W(&(_TSOCtrl->SW_RSTZ1), TSO_SW_RSTZ1_ALL);
414 _HAL_REG16_W(&(_TSOCtrl->SW_RSTZ), TSO_SW_RSTZ_ALL);
415 _HAL_REG16_W(&(_TSOCtrl->SW_RSTZ1), 0);
416 _HAL_REG16_W(&(_TSOCtrl->SW_RSTZ), TSO_SW_RSTZ_DISABLE);
417
418 //default local stream id
419 _HAL_REG16_W(&(_TSOCtrl1->TSO_PRE_HEADER1_CFG0), 0x47);
420 _HAL_REG16_W(&(_TSOCtrl1->TSO_PRE_HEADER5_CFG0), 0x47);
421 _HAL_REG16_W(&(_TSOCtrl1->TSO_PRE_HEADER6_CFG0), 0x47);
422
423 _HAL_REG16_W(&(_TSOCtrl1->TSO_SVQ_RX_CFG), (_HAL_REG16_R(&(_TSOCtrl1->TSO_SVQ_RX_CFG)) & ~TSO_SVQ_RX_CFG_MODE_MASK) | TSO_SVQ_RX_CFG_MODE_CIPL);
424
425 // Set SVQ FIFO timeout value
426 _HAL_REG16_W(&(_TSOCtrl1->TSO_SVQ1_TX_CFG), (_HAL_REG16_R(&(_TSOCtrl1->TSO_SVQ1_TX_CFG)) & ~TSO_SVQ_TX_CFG_FORCE_FIRE_CNT_MASK) | (0x0C << TSO_SVQ_TX_CFG_FORCE_FIRE_CNT_SHIFT));
427 _HAL_REG16_W(&(_TSOCtrl1->TSO_SVQ5_TX_CFG), (_HAL_REG16_R(&(_TSOCtrl1->TSO_SVQ5_TX_CFG)) & ~TSO_SVQ_TX_CFG_FORCE_FIRE_CNT_MASK) | (0x0C << TSO_SVQ_TX_CFG_FORCE_FIRE_CNT_SHIFT));
428 _HAL_REG16_W(&(_TSOCtrl1->TSO_SVQ6_TX_CFG), (_HAL_REG16_R(&(_TSOCtrl1->TSO_SVQ6_TX_CFG)) & ~TSO_SVQ_TX_CFG_FORCE_FIRE_CNT_MASK) | (0x0C << TSO_SVQ_TX_CFG_FORCE_FIRE_CNT_SHIFT));
429
430 }
431
HAL_TSO_Reset_All(MS_U8 u8Eng)432 void HAL_TSO_Reset_All(MS_U8 u8Eng)
433 {
434 _HAL_REG16_W(&(_TSOCtrl->SW_RSTZ1), TSO_SW_RSTZ1_ALL);
435 _HAL_REG16_W(&(_TSOCtrl->SW_RSTZ), TSO_SW_RSTZ_ALL);
436
437 _HAL_REG16_W(&(_TSOCtrl->SW_RSTZ1), 0);
438 _HAL_REG16_W(&(_TSOCtrl->SW_RSTZ), TSO_SW_RSTZ_DISABLE);
439 }
440
HAL_TSO_Reset(MS_U8 u8Eng)441 void HAL_TSO_Reset(MS_U8 u8Eng)
442 {
443 _HAL_REG16_W(&(_TSOCtrl->SW_RSTZ), _HAL_REG16_R(&(_TSOCtrl->SW_RSTZ)) & ~TSO_SW_RSTZ_DISABLE);
444 _HAL_REG16_W(&(_TSOCtrl->SW_RSTZ), _HAL_REG16_R(&(_TSOCtrl->SW_RSTZ)) | TSO_SW_RSTZ_DISABLE);
445 }
446
HAL_TSO_Reset_SubItem(MS_U8 u8Eng,MS_U16 u16RstItem)447 void HAL_TSO_Reset_SubItem(MS_U8 u8Eng, MS_U16 u16RstItem)
448 {
449 _HAL_REG16_W(&(_TSOCtrl->SW_RSTZ), (_HAL_REG16_R(&(_TSOCtrl->SW_RSTZ)) | u16RstItem));
450 _HAL_REG16_W(&(_TSOCtrl->SW_RSTZ), (_HAL_REG16_R(&(_TSOCtrl->SW_RSTZ)) & ~u16RstItem));
451 }
452
HAL_TSO_HWInt_Enable(MS_U8 u8Eng,MS_BOOL bEnable,MS_U16 u16init)453 void HAL_TSO_HWInt_Enable(MS_U8 u8Eng, MS_BOOL bEnable, MS_U16 u16init)
454 {
455 MS_U16 u16data = _HAL_REG16_R(&(_TSOCtrl->TSO_Interrupt));
456
457 if(bEnable)
458 {
459 _HAL_REG16_W(&(_TSOCtrl->TSO_Interrupt), (u16data | u16init));
460 }
461 else
462 {
463 _HAL_REG16_W(&(_TSOCtrl->TSO_Interrupt), (u16data & ~u16init));
464 }
465 }
466
HAL_TSO_HWInt_Clear(MS_U8 u8Eng,MS_U16 u16Int)467 void HAL_TSO_HWInt_Clear(MS_U8 u8Eng, MS_U16 u16Int)
468 {
469 _HAL_REG16_W(&(_TSOCtrl->TSO_Interrupt), (_HAL_REG16_R(&(_TSOCtrl->TSO_Interrupt)) & ~u16Int));
470 }
471
HAL_TSO_HWInt_Status(MS_U8 u8Eng)472 MS_U16 HAL_TSO_HWInt_Status(MS_U8 u8Eng)
473 {
474 return (_HAL_REG16_R(&(_TSOCtrl->TSO_Interrupt)) & TSO_INT_STATUS_MASK);
475 }
476
HAL_TSO_PowerCtrl(MS_BOOL bOn)477 void HAL_TSO_PowerCtrl(MS_BOOL bOn)
478 {
479 if (bOn)
480 {
481 TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_IN) &= ~REG_CLKGEN0_TSO_TRACE_MASK;
482 TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_OUT_CLK) &= ~REG_CLKGEN0_TSO_OUT_CLK_MASK;
483 TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_IN) &= ~REG_CLKGEN0_TSO_IN_MASK;
484 TSO_CLKGEN2_REG(REG_CLKGEN2_TSO1_IN) &= ~REG_CLKGEN2_TSO1_IN_MASK;
485 TSO_CLKGEN2_REG(REG_CLKGEN2_TSO1_IN) &= ~REG_CLKGEN2_TSO2_IN_MASK;
486 }
487 else
488 {
489 TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_OUT_CLK) |= REG_CLKGEN0_TSO_OUT_CLK_DISABLE;
490 TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_IN) |= REG_CLKGEN0_TSO_TRACE_DISABLE;
491 TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_IN) |= REG_CLKGEN0_TSO_IN_DISABLE;
492 TSO_CLKGEN2_REG(REG_CLKGEN2_TSO1_IN) |= REG_CLKGEN2_TSO1_IN_DISABLE;
493 TSO_CLKGEN2_REG(REG_CLKGEN2_TSO1_IN) |= REG_CLKGEN2_TSO2_IN_DISABLE;
494 }
495 }
496
HAL_TSO_Recover_TSOutMode(MS_U8 u8Eng)497 void HAL_TSO_Recover_TSOutMode(MS_U8 u8Eng)
498 {
499 switch(_stOutPadCtrl.u16OutPad[u8Eng])
500 {
501 case HAL_TSOOUT_MUX_TS1:
502 TSP_TOP_REG(REG_TOP_TS_CONFIG) = (TSP_TOP_REG(REG_TOP_TS_CONFIG) & ~REG_TOP_TS1_CONFIG_MASK) | _stOutPadCtrl.u16TSCfgOld[u8Eng];
503 TSP_TOP_REG(REG_TOP_TS4TS5_CFG) = (TSP_TOP_REG(REG_TOP_TS4TS5_CFG) & ~REG_TOP_TS_OUT_MODE_MASK) | _stOutPadCtrl.u16TSOutModeOld[u8Eng];
504 break;
505 case HAL_TSOOUT_MUX_TS3:
506 TSP_TOP_REG(REG_TOP_TS3_CONFIG) = TSP_TOP_REG(REG_TOP_TS3_CONFIG) & ~REG_TOP_TS3_CONFIG_MASK;
507 TSP_TOP_REG(REG_TOP_TSO_MUX) = (TSP_TOP_REG(REG_TOP_TSO_MUX) & ~REG_TOP_TSO_EVDMODE_MASK) | REG_TOP_TS3_OUT_MODE_TSO;
508 break;
509 default:
510 return;
511 }
512 }
513
HAL_TSO_OutPad(MS_U8 u8Eng,MS_U16 * pu16OutPad,MS_BOOL bSet)514 MS_BOOL HAL_TSO_OutPad(MS_U8 u8Eng, MS_U16* pu16OutPad, MS_BOOL bSet)
515 {
516 if(bSet)
517 {
518 switch(*pu16OutPad)
519 {
520 case HAL_TSOOUT_MUX_TS1:
521 _stOutPadCtrl.u16OutPad[u8Eng] = *pu16OutPad;
522 _stOutPadCtrl.u16TSCfgOld[u8Eng] = TSP_TOP_REG(REG_TOP_TS_CONFIG) & REG_TOP_TS1_CONFIG_MASK;
523 _stOutPadCtrl.u16TSOutModeOld[u8Eng] = TSP_TOP_REG(REG_TOP_TS4TS5_CFG) & REG_TOP_TS_OUT_MODE_MASK;
524 TSP_TOP_REG(REG_TOP_TS_CONFIG) = TSP_TOP_REG(REG_TOP_TS_CONFIG) & ~REG_TOP_TS1_CONFIG_MASK;
525 TSP_TOP_REG(REG_TOP_TS4TS5_CFG) = (TSP_TOP_REG(REG_TOP_TS4TS5_CFG) & ~REG_TOP_TS_OUT_MODE_MASK) | REG_TOP_TS1_OUT_MODE_TSO;
526 return TRUE;
527 case HAL_TSOOUT_MUX_TS3:
528 _stOutPadCtrl.u16OutPad[u8Eng] = *pu16OutPad;
529 _stOutPadCtrl.u16TSCfgOld[u8Eng] = TSP_TOP_REG(REG_TOP_TS3_CONFIG) & REG_TOP_TS3_CONFIG_MASK;
530 _stOutPadCtrl.u16TSOutModeOld[u8Eng] = TSP_TOP_REG(REG_TOP_TSO_MUX) & REG_TOP_TSO_EVDMODE_MASK;
531 TSP_TOP_REG(REG_TOP_TS3_CONFIG) = TSP_TOP_REG(REG_TOP_TS3_CONFIG) & ~REG_TOP_TS3_CONFIG_MASK;
532 TSP_TOP_REG(REG_TOP_TSO_MUX) = (TSP_TOP_REG(REG_TOP_TSO_MUX) & ~REG_TOP_TSO_EVDMODE_MASK) | REG_TOP_TS3_OUT_MODE_TSO;
533 return TRUE;
534 default:
535 return FALSE;
536 }
537 }
538 else
539 {
540 if((TSP_TOP_REG(REG_TOP_TS4TS5_CFG) & REG_TOP_TS_OUT_MODE_MASK) == REG_TOP_TS1_OUT_MODE_TSO)
541 {
542 if((TSP_TOP_REG(REG_TOP_TS_CONFIG) & REG_TOP_TS1_CONFIG_MASK) == 0)
543 {
544 *pu16OutPad = HAL_TSOOUT_MUX_TS1;
545 return TRUE;
546 }
547 }
548 else if((TSP_TOP_REG(REG_TOP_TSO_MUX) & REG_TOP_TSO_EVDMODE_MASK) == REG_TOP_TS3_OUT_MODE_TSO)
549 {
550 if((TSP_TOP_REG(REG_TOP_TS3_CONFIG) & REG_TOP_TS3_CONFIG_MASK) == 0)
551 {
552 *pu16OutPad = HAL_TSOOUT_MUX_TS3;
553 return TRUE;
554 }
555 }
556
557 return FALSE;
558 }
559 }
560
HAL_TSO_SelPad(MS_U8 u8Eng,MS_U8 u8TsIf,MS_U16 u16InPadSel,MS_BOOL bParallel)561 MS_BOOL HAL_TSO_SelPad(MS_U8 u8Eng, MS_U8 u8TsIf, MS_U16 u16InPadSel, MS_BOOL bParallel)
562 {
563 MS_U16 u16Reg, u16RegMask, u16RegShift;
564 MS_U16 u16data = 0;
565
566 // Set pad mux
567 switch(u8TsIf)
568 {
569 case HAL_TSO_TSIF_LIVE1:
570 u16RegShift = REG_TSP5_TSOIN0_MUX_SHIFT;
571 break;
572 case HAL_TSO_TSIF_LIVE2:
573 u16RegShift = REG_TSP5_TSOIN1_MUX_SHIFT;
574 break;
575 case HAL_TSO_TSIF_LIVE3:
576 u16RegShift = REG_TSP5_TSOIN2_MUX_SHIFT;
577 break;
578 default:
579 return FALSE;
580 }
581
582 //set pad configure
583 switch(u16InPadSel)
584 {
585 case HAL_TSOIN_MUX_TS0:
586 u16Reg = REG_TOP_TS_CONFIG;
587 u16RegMask = REG_TOP_TS0_CONFIG_MASK;
588 if(bParallel)
589 {
590 u16data = REG_TOP_TS0_CONFIG_PARALLEL_IN;
591 }
592 else
593 {
594 u16data = REG_TOP_TS0_CONFIG_SERIAL_IN;
595 }
596 break;
597 case HAL_TSOIN_MUX_TS1:
598 u16Reg = REG_TOP_TS_CONFIG;
599 u16RegMask = REG_TOP_TS1_CONFIG_MASK;
600 if(bParallel)
601 {
602 u16data = REG_TOP_TS1_CONFIG_PARALLEL_IN;
603 }
604 else
605 {
606 u16data = REG_TOP_TS1_CONFIG_SERIAL_IN;
607 }
608 break;
609 case HAL_TSOIN_MUX_TS2:
610 u16Reg = REG_TOP_TS_CONFIG;
611 u16RegMask = REG_TOP_TS2_CONFIG_MASK;
612 if(bParallel)
613 {
614 u16data = REG_TOP_TS2_CONFIG_PARALLEL_IN;
615 }
616 else
617 {
618 u16data = REG_TOP_TS2_CONFIG_SERIAL_IN;
619 }
620 break;
621 case HAL_TSOIN_MUX_TS3:
622 u16Reg = REG_TOP_TS3_CONFIG;
623 u16RegMask = REG_TOP_TS3_CONFIG_MASK;
624 if(bParallel)
625 {
626 u16data = REG_TOP_TS3_CONFIG_PARALLEL_IN;
627 }
628 else
629 {
630 u16data = REG_TOP_TS3_CONFIG_SERIAL_IN;
631 }
632 break;
633 case HAL_TSOIN_MUX_TS4:
634 u16Reg = REG_TOP_TS4TS5_CFG;
635 u16RegMask = REG_TOP_TS4_CFG_MASK;
636 if(bParallel)
637 {
638 u16data = REG_TOP_TS4_CFG_PARALLEL_IN;
639 }
640 else
641 {
642 u16data = REG_TOP_TS4_CFG_SERIAL_IN;
643 }
644 break;
645 case HAL_TSOIN_MUX_TS5:
646 u16Reg = REG_TOP_TS4TS5_CFG;
647 u16RegMask = REG_TOP_TS5_CFG_MASK;
648 if(bParallel)
649 {
650 return FALSE;
651 }
652 else
653 {
654 u16data = REG_TOP_TS5_CFG_SERIAL_IN;
655 }
656 break;
657 case HAL_TSOIN_MUX_TSDEMOD0:
658 TSP_TSP5_REG(REG_TSP5_TSOIN_MUX) = (TSP_TSP5_REG(REG_TSP5_TSOIN_MUX) & ~(REG_TSP5_TSOIN_MUX_MASK << u16RegShift)) | (u16InPadSel << u16RegShift);
659 return TRUE;
660
661 default:
662 return FALSE;
663 }
664
665 TSP_TOP_REG(u16Reg) = (TSP_TOP_REG(u16Reg) & ~u16RegMask) | u16data;
666
667 TSP_TSP5_REG(REG_TSP5_TSOIN_MUX) = (TSP_TSP5_REG(REG_TSP5_TSOIN_MUX) & ~(REG_TSP5_TSOIN_MUX_MASK)) | (u16InPadSel << u16RegShift);
668
669 return TRUE;
670 }
671
HAL_TSO_Set_InClk(MS_U8 u8Eng,MS_U8 u8TsIf,MS_U16 u16ClkSel,MS_BOOL bClkInvert,MS_BOOL bEnable)672 MS_BOOL HAL_TSO_Set_InClk(MS_U8 u8Eng, MS_U8 u8TsIf, MS_U16 u16ClkSel, MS_BOOL bClkInvert, MS_BOOL bEnable)
673 {
674 MS_U16 u16Reg, u16RegMask, u16RegShift;
675 MS_U16 u16value = 0;
676
677 //printf("[%s] u8TsIf %x, u16ClkSel %d\n", __FUNCTION__, (int)u8TsIf, u16ClkSel);
678
679 //set clock
680 switch(u8TsIf)
681 {
682 case HAL_TSO_TSIF_LIVE1:
683 u16Reg = REG_CLKGEN0_TSO_IN;
684 u16RegMask = REG_CLKGEN0_TSO_IN_MASK;
685 u16RegShift = REG_CLKGEN0_TSO_IN_SHIFT;
686 u16value = TSO_CLKGEN0_REG(u16Reg) & ~u16RegMask;
687 break;
688 case HAL_TSO_TSIF_LIVE2:
689 u16Reg = REG_CLKGEN2_TSO1_IN;
690 u16RegMask = REG_CLKGEN2_TSO1_IN_MASK;
691 u16RegShift = REG_CLKGEN2_TSO1_IN_SHIFT;
692 u16value = TSO_CLKGEN2_REG(u16Reg) & ~u16RegMask;
693 break;
694 case HAL_TSO_TSIF_LIVE3:
695 u16Reg = REG_CLKGEN2_TSO1_IN;
696 u16RegMask = REG_CLKGEN2_TSO2_IN_MASK;
697 u16RegShift = REG_CLKGEN2_TSO2_IN_SHIFT;
698 u16value = TSO_CLKGEN2_REG(u16Reg) & ~u16RegMask;
699 break;
700 default:
701 return FALSE;
702 }
703
704 //printf("[%s] u16RegMask %x, u16RegShift %d\n", __FUNCTION__, u16RegMask, u16RegShift);
705
706 if(!bEnable)
707 {
708 u16value |= ((REG_CLKGEN2_TSO1_IN_DISABLE << u16RegShift) & 0xFFFFUL);
709 }
710 else
711 {
712 if(u16ClkSel > TSO_CLKIN_TS5)
713 {
714 return FALSE;
715 }
716
717 u16value |= (u16ClkSel << u16RegShift);
718 if(bClkInvert)
719 {
720 u16value |= ((REG_CLKGEN2_TSO1_IN_INVERT << u16RegShift) & 0xFFFFUL);
721 }
722 }
723
724 switch(u8TsIf)
725 {
726 case HAL_TSO_TSIF_LIVE1:
727 TSO_CLKGEN0_REG(u16Reg) = u16value;
728 break;
729 case HAL_TSO_TSIF_LIVE2:
730 case HAL_TSO_TSIF_LIVE3:
731 TSO_CLKGEN2_REG(u16Reg) = u16value;
732 break;
733 default:
734 return FALSE;
735 }
736
737 return TRUE;
738 }
739
HAL_TSO_GetInputTSIF_Status(MS_U8 u8Eng,MS_U8 u8TsIf,MS_U16 * pu16Pad,MS_BOOL * pbClkInvert,MS_BOOL * pbExtSync,MS_BOOL * pbParl)740 MS_BOOL HAL_TSO_GetInputTSIF_Status(MS_U8 u8Eng, MS_U8 u8TsIf, MS_U16* pu16Pad, MS_BOOL* pbClkInvert, MS_BOOL* pbExtSync, MS_BOOL* pbParl)
741 {
742 MS_U16 u16Reg, u16RegMask, u16RegShift;
743 MS_U16 u16data = 0;
744 REG16* reg16 = 0;
745
746 // Set pad mux
747 switch(u8TsIf)
748 {
749 case HAL_TSO_TSIF_LIVE1:
750 u16Reg = REG_TOP_TSO_MUX;
751 u16RegMask = REG_TOP_TSO_MUX_MASK;
752 u16RegShift = REG_TOP_TSO_MUX_SHIFT;
753 break;
754 case HAL_TSO_TSIF_LIVE2:
755 u16Reg = REG_TOP_TSO1_MUX;
756 u16RegMask = REG_TOP_TSO1_MUX_MASK;
757 u16RegShift = REG_TOP_TSO1_MUX_SHIFT;
758 break;
759 case HAL_TSO_TSIF_LIVE3:
760 u16Reg = REG_TOP_TSO1_MUX;
761 u16RegMask = REG_TOP_TSO2_MUX_MASK;
762 u16RegShift = REG_TOP_TSO2_MUX_SHIFT;
763 break;
764 default:
765 return FALSE;
766 }
767
768 *pu16Pad = (TSP_TOP_REG(u16Reg) & u16RegMask) >> u16RegShift;
769
770 switch(u8TsIf)
771 {
772 case HAL_TSO_TSIF_LIVE1:
773 u16data = (TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_IN) & REG_CLKGEN0_TSO_IN_MASK) >> REG_CLKGEN0_TSO_IN_SHIFT;
774 reg16 = &(_TSOCtrl->TSO_CH0_IF1_CFG2);
775 break;
776 case HAL_TSO_TSIF_LIVE2:
777 u16data = (TSO_CLKGEN0_REG(REG_CLKGEN2_TSO1_IN) & REG_CLKGEN2_TSO1_IN_MASK) >> REG_CLKGEN2_TSO1_IN_SHIFT;
778 reg16 = &(_TSOCtrl->TSO_CH0_IF5_CFG2);
779 break;
780 case HAL_TSO_TSIF_LIVE3:
781 u16data = (TSO_CLKGEN0_REG(REG_CLKGEN2_TSO1_IN) & REG_CLKGEN2_TSO2_IN_MASK) >> REG_CLKGEN2_TSO2_IN_SHIFT;
782 reg16 = &(_TSOCtrl->TSO_CH0_IF6_CFG2);
783 break;
784 default:
785 return FALSE;
786 }
787
788 *pbExtSync = ((_HAL_REG16_R(reg16) & TSO_CHCFG_EXT_SYNC_SEL) == TSO_CHCFG_EXT_SYNC_SEL);
789 *pbParl = ((_HAL_REG16_R(reg16) & TSO_CHCFG_P_SEL) == TSO_CHCFG_P_SEL);
790 *pbClkInvert = ((u16data & REG_CLKGEN2_TSO1_IN_INVERT) == REG_CLKGEN2_TSO1_IN_INVERT);
791
792 return TRUE;
793
794 }
795
HAL_TSO_OutClk_DefSelect(MS_U8 u8Eng,MS_U16 u16PadSel,MS_BOOL bSet,HalTSOOutClk * pstOutClkSet)796 MS_BOOL HAL_TSO_OutClk_DefSelect(MS_U8 u8Eng, MS_U16 u16PadSel, MS_BOOL bSet, HalTSOOutClk* pstOutClkSet)
797 {
798 if((u16PadSel == 0xFFFF) || (bSet == TRUE))
799 {
800 return FALSE; //not support yet
801 }
802
803 switch(u16PadSel)
804 {
805 case HAL_TSOIN_MUX_TS0:
806 pstOutClkSet->u16OutClk = HAL_TSO_OUT_SEL_TSO_OUT_PTSOOUT;
807 pstOutClkSet->u16PreTsoOutClk = HAL_PRE_TSO_OUT_SEL_TS0IN;
808 break;
809 case HAL_TSOIN_MUX_TS1:
810 pstOutClkSet->u16OutClk = HAL_TSO_OUT_SEL_TSO_OUT_PTSOOUT;
811 pstOutClkSet->u16PreTsoOutClk = HAL_PRE_TSO_OUT_SEL_TS1IN;
812 break;
813 case HAL_TSOIN_MUX_TS2:
814 pstOutClkSet->u16OutClk = HAL_TSO_OUT_SEL_TSO_OUT_PTSOOUT;
815 pstOutClkSet->u16PreTsoOutClk = HAL_PRE_TSO_OUT_SEL_TS2IN;
816 break;
817 case HAL_TSOIN_MUX_TS3:
818 pstOutClkSet->u16OutClk = HAL_TSO_OUT_SEL_TSO_OUT_PTSOOUT;
819 pstOutClkSet->u16PreTsoOutClk = HAL_PRE_TSO_OUT_SEL_TS3IN;
820 break;
821 case HAL_TSOIN_MUX_TS4:
822 pstOutClkSet->u16OutClk = HAL_TSO_OUT_SEL_TSO_OUT_PTSOOUT;
823 pstOutClkSet->u16PreTsoOutClk = HAL_PRE_TSO_OUT_SEL_TS4IN;
824 break;
825 case HAL_TSOIN_MUX_TS5:
826 pstOutClkSet->u16OutClk = HAL_TSO_OUT_SEL_TSO_OUT_PTSOOUT;
827 pstOutClkSet->u16PreTsoOutClk = HAL_PRE_TSO_OUT_SEL_TS5IN;
828 break;
829 case HAL_TSOIN_MUX_TSDEMOD0:
830 pstOutClkSet->u16OutClk = HAL_TSO_OUT_SEL_TSO_OUT_FROM_DEMOD;
831 break;
832 case HAL_TSOIN_MUX_MEM:
833 case HAL_TSOIN_MUX_MEM1:
834 pstOutClkSet->u16OutClk = HAL_TSO_OUT_SEL_TSO_OUT_DIV2N;
835 pstOutClkSet->u16OutDivSrc = HAL_TSO_OUT_DIV_SEL_172M_2N;
836 pstOutClkSet->u16OutDivNum = 0x0F; //default: 172.8/2(15+1) = 5.4M
837 break;
838 default:
839 return FALSE;
840 }
841
842 return TRUE;
843 }
844
845 // default: dmplldiv5 / 2 (11+1) = 7.2 MHz
846 // default: dmplldiv_3 / 2 (17+1) = 8 MHz
HAL_TSO_OutputClk(MS_U8 u8Eng,HalTSOOutClk * pstOutClkSet,MS_BOOL bSet)847 void HAL_TSO_OutputClk(MS_U8 u8Eng, HalTSOOutClk* pstOutClkSet, MS_BOOL bSet)
848 {
849 if(bSet == TRUE)
850 {
851 if(pstOutClkSet->bEnable == FALSE)
852 {
853 HAL_TSO_OutClk(u8Eng, &(pstOutClkSet->u16OutClk), &(pstOutClkSet->bClkInvert), &(pstOutClkSet->bEnable), TRUE);
854 return;
855 }
856
857 switch(pstOutClkSet->u16OutClk)
858 {
859 case HAL_TSO_OUT_SEL_TSO_OUT_DIV2N:
860 HAL_TSO_TSOOutDiv(u8Eng, &(pstOutClkSet->u16OutDivSrc), &(pstOutClkSet->u16OutDivNum), TRUE);
861 break;
862 case HAL_TSO_OUT_SEL_TSO_OUT_62MHz:
863 case HAL_TSO_OUT_SEL_TSO_OUT_54MHz:
864 case HAL_TSO_OUT_SEL_TSO_OUT_27MHz:
865 case HAL_TSO_OUT_SEL_TSO_OUT_FROM_DEMOD:
866 break;
867 case HAL_TSO_OUT_SEL_TSO_OUT_PTSOOUT:
868 case HAL_TSO_OUT_SEL_TSO_OUT_PTSOOUT_DIV8:
869 HAL_TSO_PreTsoOutClk(u8Eng, &(pstOutClkSet->u16PreTsoOutClk), TRUE);
870 break;
871 default:
872 return;
873 }
874
875 HAL_TSO_Set_TSOOut_Phase_Tune(u8Eng, 0, FALSE); //default -> no phase tuning
876 HAL_TSO_OutClk(u8Eng, &(pstOutClkSet->u16OutClk), &(pstOutClkSet->bClkInvert), &(pstOutClkSet->bEnable), TRUE); //alyays need TSO out clock
877 }
878 else
879 {
880 HAL_TSO_OutClk(u8Eng, &(pstOutClkSet->u16OutClk), &(pstOutClkSet->bClkInvert), &(pstOutClkSet->bEnable), FALSE);
881 if(pstOutClkSet->u16OutClk == HAL_TSO_OUT_SEL_TSO_OUT_DIV2N)
882 {
883 HAL_TSO_TSOOutDiv(u8Eng, &(pstOutClkSet->u16OutDivSrc), &(pstOutClkSet->u16OutDivNum), FALSE);
884 }
885 else if((pstOutClkSet->u16OutClk == HAL_TSO_OUT_SEL_TSO_OUT_PTSOOUT) || (pstOutClkSet->u16OutClk == HAL_TSO_OUT_SEL_TSO_OUT_PTSOOUT_DIV8))
886 {
887 HAL_TSO_PreTsoOutClk(u8Eng, &(pstOutClkSet->u16PreTsoOutClk), FALSE);
888 }
889 }
890 }
891
HAL_TSO_Set_TSOOut_Phase_Tune(MS_U8 u8Eng,MS_U16 u16ClkOutPhase,MS_BOOL bPhaseEnable)892 MS_BOOL HAL_TSO_Set_TSOOut_Phase_Tune(MS_U8 u8Eng, MS_U16 u16ClkOutPhase, MS_BOOL bPhaseEnable)
893 {
894 MS_U16 u16value = 0;
895
896 if(!bPhaseEnable)
897 {
898 TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_OUT_CLK) &= ~REG_CLKGEN0_TSO_OUT_PHASE_TUN_ENABLE;
899 }
900 else
901 {
902 u16value = (TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_OUT_PHASE) & ~REG_CLKGEN0_TSO_OUT_PH_TUN_NUM_MASK)
903 | (u16ClkOutPhase << REG_CLKGEN0_TSO_OUT_PH_TUN_NUM_SHIFT);
904
905 TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_OUT_PHASE) = u16value;
906 TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_OUT_CLK) |= REG_CLKGEN0_TSO_OUT_PHASE_TUN_ENABLE;
907 }
908
909 return TRUE;
910 }
911
HAL_TSO_PreTsoOutClk(MS_U8 u8Eng,MS_U16 * pu16PreTsoOutSel,MS_BOOL bSet)912 MS_BOOL HAL_TSO_PreTsoOutClk(MS_U8 u8Eng, MS_U16* pu16PreTsoOutSel, MS_BOOL bSet)
913 {
914 if(bSet == TRUE)
915 {
916 if(*pu16PreTsoOutSel > HAL_PRE_TSO_OUT_SEL_TS5IN)
917 {
918 return FALSE;
919 }
920
921 TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_OUT_CLK) =
922 (TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_OUT_CLK) & ~REG_CLKGEN1_TSO_OUT_PRE_CLK_MASK) | (*pu16PreTsoOutSel << REG_CLKGEN1_TSO_OUT_PRE_CLK_SHIFT);
923 }
924 else
925 {
926 *pu16PreTsoOutSel = (TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_OUT_CLK) & REG_CLKGEN1_TSO_OUT_PRE_CLK_MASK) >> REG_CLKGEN1_TSO_OUT_PRE_CLK_SHIFT;
927 }
928
929 return TRUE;
930 }
931
HAL_TSO_TSOOutDiv(MS_U8 u8Eng,MS_U16 * pu16ClkOutDivSrcSel,MS_U16 * pu16ClkOutDivNum,MS_BOOL bSet)932 MS_BOOL HAL_TSO_TSOOutDiv(MS_U8 u8Eng, MS_U16* pu16ClkOutDivSrcSel, MS_U16 *pu16ClkOutDivNum, MS_BOOL bSet)
933 {
934 //clock source for clock divide
935 if(bSet == TRUE)
936 {
937 TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_IN) =
938 (TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_IN) & ~REG_CLKGEN0_TSO_TRACE_MASK) | REG_CLKGEN0_TSO_TRACE_216M;
939
940 TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_OUT_CLK) =
941 (TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_OUT_CLK) & ~REG_CLKGEN0_TSO_OUT_DIV_SEL_MASK) | (*pu16ClkOutDivSrcSel);
942
943 TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_OUT_PHASE) =
944 (TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_OUT_PHASE) & ~REG_CLKGEN0_TSO_OUT_DIVNUM_MASK) | (*pu16ClkOutDivNum);
945 }
946 else
947 {
948 *pu16ClkOutDivSrcSel = TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_OUT_CLK) & REG_CLKGEN0_TSO_OUT_DIV_SEL_MASK;
949 *pu16ClkOutDivNum = TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_OUT_PHASE) & REG_CLKGEN0_TSO_OUT_DIVNUM_MASK;
950 }
951
952 return TRUE;
953 }
954
HAL_TSO_OutClk(MS_U8 u8Eng,MS_U16 * pu16ClkOutSel,MS_BOOL * pbClkInvert,MS_BOOL * pbEnable,MS_BOOL bSet)955 MS_BOOL HAL_TSO_OutClk(MS_U8 u8Eng, MS_U16* pu16ClkOutSel, MS_BOOL* pbClkInvert, MS_BOOL* pbEnable, MS_BOOL bSet)
956 {
957 MS_U16 u16Clk = TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_OUT_CLK) & ~REG_CLKGEN0_TSO_OUT_CLK_MASK;
958
959 if(bSet == TRUE)
960 {
961 if(*pbEnable == FALSE)
962 {
963 u16Clk |= REG_CLKGEN0_TSO_OUT_CLK_DISABLE;
964 }
965 else
966 {
967 TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_IN) =
968 (TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_IN) & ~REG_CLKGEN0_TSO_TRACE_MASK) | REG_CLKGEN0_TSO_TRACE_216M;
969
970 u16Clk |= (*pu16ClkOutSel);
971
972 if(*pbClkInvert)
973 u16Clk |= REG_CLKGEN0_TSO_OUT_CLK_INVERT;
974
975 TSO_CLKGEN0_REG(REG_CLKGEN0_RESERVED0) |= REG_CLKGEN0_RES0_CLKTSO_TOPAD_INV;
976 }
977 TSO_CLKGEN0_REG(REG_CLKGEN0_TSO_OUT_CLK) = u16Clk;
978 }
979 else
980 {
981 *pbEnable = ((u16Clk & REG_CLKGEN0_TSO_OUT_CLK_DISABLE) == 0);
982 *pbClkInvert = ((u16Clk & REG_CLKGEN0_TSO_OUT_CLK_INVERT) == REG_CLKGEN0_TSO_OUT_CLK_INVERT);
983 *pu16ClkOutSel = u16Clk;
984 }
985
986 return TRUE;
987 }
988
989 // ------------------------------------------------------
990 // APIS
991 //-------------------------------------------------------
HAL_TSO_Flt_SetPid(MS_U8 u8Eng,MS_U16 u16FltId,MS_U16 u16PID)992 void HAL_TSO_Flt_SetPid(MS_U8 u8Eng, MS_U16 u16FltId, MS_U16 u16PID)
993 {
994 MS_U32 u32value;
995 REG_PidFlt* pidReg = &(_TsoPid[u8Eng].Flt[u16FltId]);
996
997 u32value = (HAL_TSO_REG32_IndR((REG32 *)pidReg) & ~TSO_PIDFLT_PID_MASK) | (((MS_U32)u16PID << TSO_PIDFLT_PID_SHFT) & TSO_PIDFLT_PID_MASK);
998 HAL_TSO_REG32_IndW((REG32 *)pidReg, u32value);
999 }
1000
HAL_TSO_Flt_SetInputSrc(MS_U8 u8Eng,MS_U16 u16FltId,MS_U16 u16InputSrc)1001 void HAL_TSO_Flt_SetInputSrc(MS_U8 u8Eng, MS_U16 u16FltId, MS_U16 u16InputSrc)
1002 {
1003 MS_U32 u32value;
1004 REG_PidFlt* pidReg = &(_TsoPid[u8Eng].Flt[u16FltId]);
1005
1006 u32value = (HAL_TSO_REG32_IndR((REG32 *)pidReg) & ~TSO_PIDFLT_IN_MASK) | (u16InputSrc << TSO_PIDFLT_IN_SHIFT);
1007 HAL_TSO_REG32_IndW((REG32 *)pidReg, u32value);
1008 }
1009
HAL_TSO_ReplaceFlt_SetPktPid(MS_U8 u8Eng,MS_U16 u16FltId,MS_U8 u8TsIf,MS_U16 u16OldPid,MS_U16 u16NewPid)1010 MS_BOOL HAL_TSO_ReplaceFlt_SetPktPid(MS_U8 u8Eng, MS_U16 u16FltId, MS_U8 u8TsIf, MS_U16 u16OldPid, MS_U16 u16NewPid)
1011 {
1012 REG32 *pReg = 0;
1013 MS_U32 u32data = (((MS_U32)u16OldPid) & REP_PIDFLT_ORG_PID_MASK) | (((MS_U32)u8TsIf) << REP_PIDFLT_SRC_SHIFT) |
1014 ((((MS_U32)u16NewPid) << REP_PIDFLT_NEW_PID_SHIFT) & REP_PIDFLT_NEW_PID_MASK);
1015 pReg = &(_TSOCtrl->REP_PidFlt[u16FltId]);
1016 _HAL_REG32_W(pReg , u32data);
1017
1018 return TRUE;
1019 }
1020
HAL_TSO_ReplaceFlt_Enable(MS_U8 u8Eng,MS_U16 u16FltId,MS_BOOL bEnable)1021 MS_BOOL HAL_TSO_ReplaceFlt_Enable(MS_U8 u8Eng, MS_U16 u16FltId, MS_BOOL bEnable)
1022 {
1023 if(bEnable)
1024 {
1025 _HAL_REG32_W(&(_TSOCtrl->REP_PidFlt[u16FltId]), SET_FLAG1(_HAL_REG32_R(&(_TSOCtrl->REP_PidFlt[u16FltId])), REP_PIDFLT_REPLACE_EN));
1026 }
1027 else
1028 {
1029 _HAL_REG32_W(&(_TSOCtrl->REP_PidFlt[u16FltId]), RESET_FLAG1(_HAL_REG32_R(&(_TSOCtrl->REP_PidFlt[u16FltId])), REP_PIDFLT_REPLACE_EN));
1030 }
1031
1032 return TRUE;
1033 }
1034
HAL_TSO_Set_Filein_ReadAddr(MS_U8 u8Eng,MS_U8 u8FileEng,MS_PHY phyAddr)1035 void HAL_TSO_Set_Filein_ReadAddr(MS_U8 u8Eng, MS_U8 u8FileEng, MS_PHY phyAddr)
1036 {
1037 _phyTSOFiMiuOffset[u8FileEng] = _HAL_TSO_MIU_OFFSET(phyAddr);
1038
1039 if(u8FileEng == 0)
1040 {
1041 _HAL_REG32_W(&(_TSOCtrl->TSO_Filein_raddr), (MS_U32)(phyAddr-_phyTSOFiMiuOffset[u8FileEng]));
1042 }
1043 else if(u8FileEng == 1)
1044 {
1045 _HAL_REG32_W(&(_TSOCtrl->TSO_Filein_raddr1), (MS_U32)(phyAddr-_phyTSOFiMiuOffset[u8FileEng]));
1046 }
1047 }
1048
HAL_TSO_Set_Filein_ReadLen(MS_U8 u8Eng,MS_U8 u8FileEng,MS_U32 u32len)1049 void HAL_TSO_Set_Filein_ReadLen(MS_U8 u8Eng, MS_U8 u8FileEng, MS_U32 u32len)
1050 {
1051 if(u8FileEng == 0)
1052 {
1053 _HAL_REG32_W(&(_TSOCtrl->TSO_Filein_rNum), u32len);
1054 }
1055 else if(u8FileEng == 1)
1056 {
1057 _HAL_REG32_W(&(_TSOCtrl->TSO_Filein_rNum1), u32len);
1058 }
1059 }
1060
HAL_TSO_Get_Filein_ReadAddr(MS_U8 u8Eng,MS_U8 u8FileEng)1061 MS_PHY HAL_TSO_Get_Filein_ReadAddr(MS_U8 u8Eng, MS_U8 u8FileEng)
1062 {
1063 MS_PHY phyvalue = 0;
1064
1065 _HAL_REG16_W(&(_TSOCtrl->TSO_FILE_CFG[u8FileEng]), _HAL_REG16_R(&(_TSOCtrl->TSO_FILE_CFG[u8FileEng])) | TSO_FICFG_RADDR_READ);
1066 phyvalue = ((MS_PHY)_HAL_REG32_R(&(_TSOCtrl->TSO_TSO2MI_RADDR[u8FileEng])) & 0xFFFFFFFFUL) << TSO_MIU_BUS;
1067 phyvalue += _phyTSOFiMiuOffset[u8FileEng];
1068 _HAL_REG16_W(&(_TSOCtrl->TSO_FILE_CFG[u8FileEng]), _HAL_REG16_R(&(_TSOCtrl->TSO_FILE_CFG[u8FileEng])) & ~TSO_FICFG_RADDR_READ);
1069 return phyvalue;
1070 }
1071
HAL_TSO_Set_Filein_Ctrl(MS_U8 u8Eng,MS_U8 u8FileEng,MS_U16 u16ctrl)1072 void HAL_TSO_Set_Filein_Ctrl(MS_U8 u8Eng, MS_U8 u8FileEng, MS_U16 u16ctrl)
1073 {
1074 if(u8FileEng == 0)
1075 {
1076 _HAL_REG16_W(&(_TSOCtrl->TSO_Filein_Ctrl), (_HAL_REG16_R(&(_TSOCtrl->TSO_Filein_Ctrl)) & ~TSO_FILEIN_CTRL_MASK) | u16ctrl);
1077 }
1078 else if(u8FileEng == 1)
1079 {
1080 _HAL_REG16_W(&(_TSOCtrl->TSO_Filein_Ctrl1), (_HAL_REG16_R(&(_TSOCtrl->TSO_Filein_Ctrl1)) & ~TSO_FILEIN_CTRL_MASK) | u16ctrl);
1081 }
1082 }
1083
HAL_TSO_Get_Filein_Ctrl(MS_U8 u8Eng,MS_U8 u8FileEng)1084 MS_U16 HAL_TSO_Get_Filein_Ctrl(MS_U8 u8Eng, MS_U8 u8FileEng)
1085 {
1086 if(u8FileEng == 0)
1087 {
1088 return (_HAL_REG16_R(&(_TSOCtrl->TSO_Filein_Ctrl)) & TSO_FILEIN_CTRL_MASK);
1089 }
1090 else if(u8FileEng == 1)
1091 {
1092 return (_HAL_REG16_R(&(_TSOCtrl->TSO_Filein_Ctrl1)) & TSO_FILEIN_CTRL_MASK);
1093 }
1094
1095 return 0;
1096 }
1097
HAL_TSO_Set_Filein_MOBFKey(MS_U8 u8FileEng,MS_U32 u32Key,MS_BOOL bSecured)1098 MS_BOOL HAL_TSO_Set_Filein_MOBFKey(MS_U8 u8FileEng, MS_U32 u32Key, MS_BOOL bSecured)
1099 {
1100 MS_U16 u16data = (bSecured ? TSO_FILEIN_RIU_TSO_NS : 0);
1101 REG16* pReg = ((u8FileEng == 0)? (&(_TSOCtrl->TSO_Filein_Ctrl)) : (&(_TSOCtrl->TSO_Filein_Ctrl1)));
1102
1103 if((_HAL_REG16_R(pReg) & (TSO_FILEIN_RSTART|TSO_FILEIN_ABORT)) != 0)
1104 {
1105 return FALSE;
1106 }
1107
1108 u16data |= ((MS_U16)(u32Key << TSO_FILEIN_MOBF_IDX_SHIFT) & TSO_FILEIN_MOBF_IDX_MASK);
1109 _HAL_REG16_W(pReg, u16data)
1110
1111 return TRUE;
1112 }
1113
HAL_TSO_Filein_Enable(MS_U8 u8Eng,MS_U8 u8FileEng,MS_BOOL bEnable)1114 MS_BOOL HAL_TSO_Filein_Enable(MS_U8 u8Eng, MS_U8 u8FileEng, MS_BOOL bEnable)
1115 {
1116 MS_U16 u16ChIf = ((u8Eng == 0)? TSO_CFG1_TSO_TSIF5_EN: TSO_CFG1_TSO_TSIF6_EN);
1117
1118 if(bEnable)
1119 {
1120 _HAL_REG16_W(&(_TSOCtrl->TSO_CFG1), SET_FLAG1(_HAL_REG16_R(&(_TSOCtrl->TSO_CFG1)), u16ChIf));
1121 _HAL_REG16_W(&(_TSOCtrl->TSO_FILE_CFG[u8FileEng]),
1122 SET_FLAG1(_HAL_REG16_R(&_TSOCtrl->TSO_FILE_CFG[u8FileEng]), TSO_FICFG_TSO_FILEIN|TSO_FICFG_FILE_SEGMENT|TSO_FICFG_TS_DATAPORT_SEL));
1123 }
1124 else
1125 {
1126 _HAL_REG16_W(&(_TSOCtrl->TSO_CFG1), RESET_FLAG1(_HAL_REG16_R(&(_TSOCtrl->TSO_CFG1)), u16ChIf));
1127 _HAL_REG16_W(&(_TSOCtrl->TSO_FILE_CFG[u8FileEng]),
1128 RESET_FLAG1(_HAL_REG16_R(&_TSOCtrl->TSO_FILE_CFG[u8FileEng]), TSO_FICFG_TSO_FILEIN|TSO_FICFG_FILE_SEGMENT|TSO_FICFG_TS_DATAPORT_SEL));
1129 }
1130
1131 return TRUE;
1132 }
1133
HAL_TSO_FileinTimer_Enable(MS_U8 u8Eng,MS_U8 u8FileEng,MS_BOOL bEnable)1134 void HAL_TSO_FileinTimer_Enable(MS_U8 u8Eng, MS_U8 u8FileEng, MS_BOOL bEnable)
1135 {
1136 if(bEnable)
1137 {
1138 _HAL_REG16_W(&(_TSOCtrl->TSO_FILE_CFG[u8FileEng]), _HAL_REG16_R(&(_TSOCtrl->TSO_FILE_CFG[u8FileEng])) | TSO_FICFG_TIMER_ENABLE);
1139 }
1140 else
1141 {
1142 _HAL_REG16_W(&(_TSOCtrl->TSO_FILE_CFG[u8FileEng]), _HAL_REG16_R(&(_TSOCtrl->TSO_FILE_CFG[u8FileEng])) & ~TSO_FICFG_TIMER_ENABLE);
1143 }
1144 }
1145
HAL_TSO_Filein_Rate(MS_U8 u8Eng,MS_U8 u8FileEng,MS_U16 u16timer)1146 void HAL_TSO_Filein_Rate(MS_U8 u8Eng, MS_U8 u8FileEng, MS_U16 u16timer)
1147 {
1148 _HAL_REG16_W(&(_TSOCtrl->TSO_FI_TIMER[u8FileEng]), u16timer);
1149 }
1150
HAL_TSO_Filein_192Mode_Enable(MS_U8 u8Eng,MS_U8 u8FileEng,MS_BOOL bEnable)1151 void HAL_TSO_Filein_192Mode_Enable(MS_U8 u8Eng, MS_U8 u8FileEng, MS_BOOL bEnable)
1152 {
1153 if(bEnable)
1154 {
1155 _HAL_REG16_W(&(_TSOCtrl->TSO_FILE_CFG[u8FileEng]), SET_FLAG1(_HAL_REG16_R(&_TSOCtrl->TSO_FILE_CFG[u8FileEng]), TSO_FICFG_PKT192_ENABLE));
1156 }
1157 else
1158 {
1159 _HAL_REG16_W(&(_TSOCtrl->TSO_FILE_CFG[u8FileEng]),
1160 RESET_FLAG1(_HAL_REG16_R(&_TSOCtrl->TSO_FILE_CFG[u8FileEng]), TSO_FICFG_PKT192_ENABLE));
1161 }
1162 }
1163
HAL_TSO_Filein_192BlockMode_Enable(MS_U8 u8Eng,MS_U8 u8FileEng,MS_BOOL bEnable)1164 void HAL_TSO_Filein_192BlockMode_Enable(MS_U8 u8Eng, MS_U8 u8FileEng, MS_BOOL bEnable)
1165 {
1166 if(bEnable)
1167 {
1168 _HAL_REG16_W(&(_TSOCtrl->TSO_FILE_CFG[u8FileEng]),
1169 RESET_FLAG1(_HAL_REG16_R(&_TSOCtrl->TSO_FILE_CFG[u8FileEng]), TSO_FICFG_PKT192_BLK_DISABLE));
1170 }
1171 else
1172 {
1173 _HAL_REG16_W(&(_TSOCtrl->TSO_FILE_CFG[u8FileEng]),
1174 SET_FLAG1(_HAL_REG16_R(&_TSOCtrl->TSO_FILE_CFG[u8FileEng]), TSO_FICFG_PKT192_BLK_DISABLE));
1175 }
1176 }
1177
HAL_TSO_CmdQ_FIFO_Get_WRCnt(MS_U8 u8Eng,MS_U8 u8FileEng)1178 MS_U16 HAL_TSO_CmdQ_FIFO_Get_WRCnt(MS_U8 u8Eng, MS_U8 u8FileEng)
1179 {
1180 MS_U16 u16Shift = ((u8FileEng == 0) ? 0: 8);
1181
1182 return ((_HAL_REG16_R(&(_TSOCtrl->TSO_CMDQ_STATUS)) >> u16Shift) & TSO_CMDQ_STS_WCNT_MASK);
1183 }
1184
HAL_TSO_CmdQ_FIFO_IsFull(MS_U8 u8Eng,MS_U8 u8FileEng)1185 MS_BOOL HAL_TSO_CmdQ_FIFO_IsFull(MS_U8 u8Eng, MS_U8 u8FileEng)
1186 {
1187 MS_U16 u16Shift = ((u8FileEng == 0) ? 0: 8);
1188
1189 return (MS_BOOL)((_HAL_REG16_R(&(_TSOCtrl->TSO_CMDQ_STATUS)) >> u16Shift) & TSO_CMDQ_STS_FIFO_FULL);
1190 }
1191
HAL_TSO_CmdQ_FIFO_IsEmpty(MS_U8 u8Eng,MS_U8 u8FileEng)1192 MS_BOOL HAL_TSO_CmdQ_FIFO_IsEmpty(MS_U8 u8Eng, MS_U8 u8FileEng)
1193 {
1194 MS_U16 u16Shift = ((u8FileEng == 0) ? 0: 8);
1195
1196 return (MS_BOOL)((_HAL_REG16_R(&(_TSOCtrl->TSO_CMDQ_STATUS)) >> u16Shift) & TSO_CMDQ_STS_FIFO_EMPTY);
1197 }
1198
HAL_TSO_CmdQ_FIFO_Get_WRLevel(MS_U8 u8Eng,MS_U8 u8FileEng)1199 MS_U8 HAL_TSO_CmdQ_FIFO_Get_WRLevel(MS_U8 u8Eng, MS_U8 u8FileEng)
1200 {
1201 MS_U16 u16Shift = ((u8FileEng == 0) ? 0: 8);
1202
1203 return (MS_U8)((_HAL_REG16_R(&(_TSOCtrl[u8Eng].TSO_CMDQ_STATUS)) >> u16Shift) & TSO_CMDQ_STS_WLEVEL_MASK);
1204 }
1205
HAL_TSO_CmdQ_Reset(MS_U8 u8Eng,MS_U8 u8FileEng)1206 MS_BOOL HAL_TSO_CmdQ_Reset(MS_U8 u8Eng, MS_U8 u8FileEng)
1207 {
1208 MS_U16 u16data = ((u8FileEng == 0)? TSO_SW_RSTZ_CMDQ : TSO_SW_RSTZ_CMDQ1);
1209
1210 _HAL_REG16_W(&(_TSOCtrl->SW_RSTZ), SET_FLAG1(_HAL_REG16_R(&(_TSOCtrl->SW_RSTZ)), u16data));
1211 _HAL_REG16_W(&(_TSOCtrl->SW_RSTZ), RESET_FLAG1(_HAL_REG16_R(&(_TSOCtrl->SW_RSTZ)), u16data));
1212 return TRUE;
1213 }
1214
HAL_TSO_RW_ValidBlock_Count(MS_U8 u8Eng,MS_BOOL bWrite,MS_U16 * pu16ValidBlockCnt)1215 void HAL_TSO_RW_ValidBlock_Count(MS_U8 u8Eng, MS_BOOL bWrite, MS_U16 *pu16ValidBlockCnt)
1216 {
1217 MS_U16 u16data = _HAL_REG16_R(&(_TSOCtrl->TSO_CFG2));
1218
1219 if(bWrite)
1220 {
1221 u16data &= ~TSO_CFG2_VALID_BYTECNT_MASK;
1222 u16data |= (*pu16ValidBlockCnt << TSO_CFG2_VALID_BYTECNT_SHIFT);
1223 _HAL_REG16_W(&(_TSOCtrl->TSO_CFG2), u16data);
1224
1225 _HAL_REG16_W(&(_TSOCtrl->TSO_CFG1), SET_FLAG1(_HAL_REG16_R(&_TSOCtrl->TSO_CFG1), TSO_CFG1_PKT_PARAM_LD));
1226 _HAL_REG16_W(&(_TSOCtrl->TSO_CFG1), RESET_FLAG1(_HAL_REG16_R(&_TSOCtrl->TSO_CFG1), TSO_CFG1_PKT_PARAM_LD));
1227 }
1228 else
1229 {
1230 *pu16ValidBlockCnt = (u16data & TSO_CFG2_VALID_BYTECNT_MASK) >> TSO_CFG2_VALID_BYTECNT_SHIFT;
1231 }
1232 }
1233
HAL_TSO_RW_InvalidBlock_Count(MS_U8 u8Eng,MS_BOOL bWrite,MS_U16 * pu16InvalidBlockCnt)1234 void HAL_TSO_RW_InvalidBlock_Count(MS_U8 u8Eng, MS_BOOL bWrite, MS_U16 *pu16InvalidBlockCnt)
1235 {
1236 MS_U16 u16data = _HAL_REG16_R(&(_TSOCtrl->TSO_CFG2));
1237
1238 if(bWrite)
1239 {
1240 u16data &= ~TSO_CFG2_INVALID_BYTECNT_MASK;
1241 u16data |= (*pu16InvalidBlockCnt << TSO_CFG2_INVALID_BYTECNT_SHIFT);
1242 _HAL_REG16_W(&(_TSOCtrl->TSO_CFG2), u16data);
1243
1244 _HAL_REG16_W(&(_TSOCtrl->TSO_CFG1), SET_FLAG1(_HAL_REG16_R(&_TSOCtrl->TSO_CFG1), TSO_CFG1_PKT_PARAM_LD));
1245 _HAL_REG16_W(&(_TSOCtrl->TSO_CFG1), RESET_FLAG1(_HAL_REG16_R(&_TSOCtrl->TSO_CFG1), TSO_CFG1_PKT_PARAM_LD));
1246 }
1247 else
1248 {
1249 *pu16InvalidBlockCnt = u16data & TSO_CFG2_INVALID_BYTECNT_MASK;
1250 }
1251 }
1252
HAL_TSO_RW_OutputPktSize(MS_U8 u8Eng,MS_BOOL bWrite,MS_U16 * pu16PktSize)1253 void HAL_TSO_RW_OutputPktSize(MS_U8 u8Eng, MS_BOOL bWrite, MS_U16 *pu16PktSize)
1254 {
1255 if(bWrite)
1256 {
1257 _HAL_REG16_W(&(_TSOCtrl->TSO_CFG3), *pu16PktSize);
1258 }
1259 else
1260 {
1261 *pu16PktSize = _HAL_REG16_R(&(_TSOCtrl->TSO_CFG3));
1262 }
1263
1264 _HAL_REG16_W(&(_TSOCtrl->TSO_CFG1), SET_FLAG1(_HAL_REG16_R(&_TSOCtrl->TSO_CFG1), TSO_CFG1_PKT_PARAM_LD));
1265 _HAL_REG16_W(&(_TSOCtrl->TSO_CFG1), RESET_FLAG1(_HAL_REG16_R(&_TSOCtrl->TSO_CFG1), TSO_CFG1_PKT_PARAM_LD));
1266 }
1267
HAL_TSO_LPcr2_Set(MS_U8 u8Eng,MS_U8 u8FileEng,MS_U32 u32lpcr2)1268 void HAL_TSO_LPcr2_Set(MS_U8 u8Eng, MS_U8 u8FileEng, MS_U32 u32lpcr2)
1269 {
1270 MS_U16 u16temp = _HAL_REG16_R(&(_TSOCtrl->TSO_FILE_CFG[u8FileEng]));
1271
1272 _HAL_REG16_W(&(_TSOCtrl->TSO_FILE_CFG[u8FileEng]), u16temp | TSO_FICFG_LPCR2_WLD);
1273 _HAL_REG32_W(&(_TSOCtrl->TSO_LPCR2[u8FileEng]), u32lpcr2);
1274 _HAL_REG16_W(&(_TSOCtrl->TSO_FILE_CFG[u8FileEng]), u16temp);
1275 }
1276
HAL_TSO_LPcr2_Get(MS_U8 u8Eng,MS_U8 u8FileEng)1277 MS_U32 HAL_TSO_LPcr2_Get(MS_U8 u8Eng, MS_U8 u8FileEng)
1278 {
1279 MS_U32 u32temp = 0;
1280 MS_U16 u16temp = _HAL_REG16_R(&(_TSOCtrl->TSO_FILE_CFG[u8FileEng]));
1281
1282 _HAL_REG16_W(&(_TSOCtrl->TSO_FILE_CFG[u8FileEng]), ((u16temp & ~TSO_FICFG_LPCR2_WLD)|TSO_FICFG_LPCR2_LD));
1283 u32temp = _HAL_REG32_R(&_TSOCtrl->TSO_LPCR2[u8FileEng]);
1284 _HAL_REG16_W(&(_TSOCtrl->TSO_FILE_CFG[u8FileEng]), u16temp);
1285
1286 return u32temp;
1287 }
1288
HAL_TSO_TimeStamp_Get(MS_U8 u8Eng,MS_U8 u8FileEng)1289 MS_U32 HAL_TSO_TimeStamp_Get(MS_U8 u8Eng, MS_U8 u8FileEng)
1290 {
1291 return _HAL_REG32_R(&(_TSOCtrl->TSO_TIMESTAMP[u8FileEng]));
1292 }
1293
HAL_TSO_PktChkSize_Set(MS_U8 u8Eng,MS_U8 u8If,MS_U8 u8size)1294 MS_BOOL HAL_TSO_PktChkSize_Set(MS_U8 u8Eng, MS_U8 u8If, MS_U8 u8size)
1295 {
1296 MS_U16 u16data = 0;
1297
1298 if(u8If == HAL_TSO_TSIF_LIVE1)
1299 {
1300 u16data = _HAL_REG16_R(&(_TSOCtrl->TSO_CH0_IF1_CFG0)) & ~TSO_PKT_SIZE_CHK_LIVE_MASK;
1301 _HAL_REG16_W(&(_TSOCtrl->TSO_CH0_IF1_CFG0), u16data | (MS_U16)u8size);
1302 }
1303 else if((u8If == HAL_TSO_TSIF_LIVE2) || (u8If == HAL_TSO_TSIF_FILE1))
1304 {
1305 u16data = _HAL_REG16_R(&(_TSOCtrl->TSO_CH0_IF5_CFG0)) & ~TSO_PKT_SIZE_CHK_LIVE_MASK;
1306 _HAL_REG16_W(&(_TSOCtrl->TSO_CH0_IF5_CFG0), u16data | (MS_U16)u8size);
1307 }
1308 else if((u8If == HAL_TSO_TSIF_LIVE3) || (u8If == HAL_TSO_TSIF_FILE2))
1309 {
1310 u16data = _HAL_REG16_R(&(_TSOCtrl->TSO_CH0_IF6_CFG0)) & ~TSO_PKT_SIZE_CHK_LIVE_MASK;
1311 _HAL_REG16_W(&(_TSOCtrl->TSO_CH0_IF6_CFG0), u16data | (MS_U16)u8size);
1312 }
1313 else
1314 {
1315 return FALSE;
1316 }
1317
1318 return TRUE;
1319 }
1320
HAL_TSO_Filein_PktChkSize_Set(MS_U8 u8Eng,MS_U8 u8FileEng,MS_U8 u8size)1321 void HAL_TSO_Filein_PktChkSize_Set(MS_U8 u8Eng, MS_U8 u8FileEng, MS_U8 u8size)
1322 {
1323 MS_U16 u16temp = 0, u16shift = ((u8FileEng == 0) ? 0: 8);
1324
1325 u16temp = _HAL_REG16_R(&(_TSOCtrl->TSO_PKT_CHKSIZE_FI)) & ~(TSO_PKT_CHKSIZE_FI_MASK << u16shift);
1326 u16temp |= (((MS_U16)(u8size & 0xFF)) << u16shift);
1327
1328 _HAL_REG16_W(&(_TSOCtrl->TSO_PKT_CHKSIZE_FI), u16temp);
1329 }
1330
HAL_TSO_Cfg1_Enable(MS_U8 u8Eng,MS_U16 u16CfgItem,MS_BOOL bEnable)1331 void HAL_TSO_Cfg1_Enable(MS_U8 u8Eng, MS_U16 u16CfgItem, MS_BOOL bEnable)
1332 {
1333 MS_U16 u16data = _HAL_REG16_R(&(_TSOCtrl->TSO_CFG1));
1334
1335 if(bEnable)
1336 {
1337 u16data |= u16CfgItem;
1338 }
1339 else
1340 {
1341 u16data &= ~u16CfgItem;
1342 }
1343
1344 _HAL_REG16_W(&(_TSOCtrl->TSO_CFG1), u16data);
1345 }
1346
HAL_TSO_Cfg4_Enable(MS_U8 u8Eng,MS_U16 u16CfgItem,MS_BOOL bEnable)1347 void HAL_TSO_Cfg4_Enable(MS_U8 u8Eng, MS_U16 u16CfgItem, MS_BOOL bEnable)
1348 {
1349 MS_U16 u16data = _HAL_REG16_R(&(_TSOCtrl->TSO_CFG4));
1350
1351 if(bEnable)
1352 {
1353 u16data |= u16CfgItem;
1354 }
1355 else
1356 {
1357 u16data &= ~u16CfgItem;
1358 }
1359
1360 _HAL_REG16_W(&(_TSOCtrl->TSO_CFG4), u16data);
1361 }
1362
HAL_TSO_ChIf_Enable(MS_U8 u8Eng,MS_U8 u8ChIf,MS_BOOL bEnable)1363 MS_BOOL HAL_TSO_ChIf_Enable(MS_U8 u8Eng, MS_U8 u8ChIf, MS_BOOL bEnable)
1364 {
1365 MS_U16 u16data = 0;
1366
1367 if(u8Eng > 0)
1368 {
1369 return FALSE;
1370 }
1371
1372 switch(u8ChIf)
1373 {
1374 case HAL_TSO_TSIF_LIVE1:
1375 u16data = TSO_CFG1_TSO_TSIF1_EN;
1376 break;
1377 case HAL_TSO_TSIF_LIVE2:
1378 u16data = TSO_CFG1_TSO_TSIF5_EN;
1379 break;
1380 case HAL_TSO_TSIF_LIVE3:
1381 u16data = TSO_CFG1_TSO_TSIF6_EN;
1382 break;
1383 default:
1384 return FALSE;
1385 }
1386
1387 if(bEnable)
1388 {
1389 _HAL_REG16_W(&(_TSOCtrl->TSO_CFG1), SET_FLAG1(_HAL_REG16_R(&(_TSOCtrl->TSO_CFG1)), u16data));
1390 }
1391 else
1392 {
1393 _HAL_REG16_W(&(_TSOCtrl->TSO_CFG1), RESET_FLAG1(_HAL_REG16_R(&(_TSOCtrl->TSO_CFG1)), u16data));
1394 }
1395
1396 return FALSE;
1397
1398 }
1399
HAL_TSO_ChIf_Cfg(MS_U8 u8Eng,MS_U8 u8ChIf,MS_U16 u16Cfg,MS_BOOL bEnable)1400 MS_BOOL HAL_TSO_ChIf_Cfg(MS_U8 u8Eng, MS_U8 u8ChIf, MS_U16 u16Cfg, MS_BOOL bEnable)
1401 {
1402 REG16* pReg = NULL;
1403
1404 if(u8Eng > 0)
1405 {
1406 return FALSE;
1407 }
1408
1409 switch(u8ChIf)
1410 {
1411 case HAL_TSO_TSIF_LIVE1:
1412 pReg = &(_TSOCtrl->TSO_CH0_IF1_CFG2);
1413 break;
1414 case HAL_TSO_TSIF_LIVE2:
1415 pReg = &(_TSOCtrl->TSO_CH0_IF5_CFG2);
1416 break;
1417 case HAL_TSO_TSIF_LIVE3:
1418 pReg = &(_TSOCtrl->TSO_CH0_IF6_CFG2);
1419 break;
1420 default:
1421 return FALSE;
1422 }
1423
1424 if(bEnable)
1425 {
1426 _HAL_REG16_W(pReg, SET_FLAG1(_HAL_REG16_R(pReg), u16Cfg));
1427 }
1428 else
1429 {
1430 _HAL_REG16_W(pReg, RESET_FLAG1(_HAL_REG16_R(pReg), u16Cfg));
1431 }
1432
1433 return TRUE;
1434 }
1435
HAL_TSO_Get_ChIf_Cfg(MS_U8 u8Eng,MS_U8 u8ChIf,MS_U16 * pu16Cfg,MS_BOOL * pbEnable)1436 MS_BOOL HAL_TSO_Get_ChIf_Cfg(MS_U8 u8Eng, MS_U8 u8ChIf, MS_U16* pu16Cfg, MS_BOOL *pbEnable)
1437 {
1438 REG16* pReg = NULL;
1439 MS_U16 u16data = 0;
1440
1441 *pu16Cfg = 0;
1442 *pbEnable = FALSE;
1443
1444 if(u8Eng > 0)
1445 {
1446 return FALSE;
1447 }
1448
1449 switch(u8ChIf)
1450 {
1451 case HAL_TSO_TSIF_LIVE1:
1452 pReg = &(_TSOCtrl->TSO_CH0_IF1_CFG2);
1453 break;
1454 case HAL_TSO_TSIF_LIVE2:
1455 pReg = &(_TSOCtrl->TSO_CH0_IF5_CFG2);
1456 break;
1457 case HAL_TSO_TSIF_LIVE3:
1458 pReg = &(_TSOCtrl->TSO_CH0_IF6_CFG2);
1459 break;
1460 default:
1461 return FALSE;
1462 }
1463
1464 *pu16Cfg = _HAL_REG16_R(pReg);
1465
1466 switch(u8ChIf)
1467 {
1468 case HAL_TSO_TSIF_LIVE1:
1469 u16data = TSO_CFG1_TSO_TSIF1_EN;
1470 break;
1471 case HAL_TSO_TSIF_LIVE2:
1472 u16data = TSO_CFG1_TSO_TSIF5_EN;
1473 break;
1474 case HAL_TSO_TSIF_LIVE3:
1475 u16data = TSO_CFG1_TSO_TSIF6_EN;
1476 break;
1477 default:
1478 return FALSE;
1479 }
1480
1481 *pbEnable = ((_HAL_REG16_R(&(_TSOCtrl->TSO_CFG1)) & u16data) == u16data);
1482
1483 return TRUE;
1484
1485 }
1486
1487
HAL_TSO_SVQBuf_Set(MS_U8 u8Eng,MS_U8 u8ChIf,MS_PHY phyBufAddr,MS_U32 u32BufSize)1488 MS_BOOL HAL_TSO_SVQBuf_Set(MS_U8 u8Eng, MS_U8 u8ChIf, MS_PHY phyBufAddr, MS_U32 u32BufSize)
1489 {
1490 REG32* p32Reg = NULL;
1491 REG16* p16Reg = NULL;
1492 REG16* p16RegCfg = NULL;
1493 MS_U32 u32addr = 0;
1494
1495 _phyTSOVQiMiuOffset = _HAL_TSO_MIU_OFFSET(phyBufAddr);
1496 u32addr = (MS_U32)(phyBufAddr - _phyTSOVQiMiuOffset);
1497
1498 if(u8Eng > 0)
1499 {
1500 return FALSE;
1501 }
1502
1503 switch(u8ChIf)
1504 {
1505 case HAL_TSO_TSIF_LIVE1:
1506 p32Reg = &(_TSOCtrl1->TSO_SVQ1_BASE);
1507 p16Reg = &(_TSOCtrl1->TSO_SVQ1_SIZE);
1508 p16RegCfg = &(_TSOCtrl1->TSO_SVQ1_TX_CFG);
1509 break;
1510 case HAL_TSO_TSIF_LIVE2:
1511 p32Reg = &(_TSOCtrl1->TSO_SVQ5_BASE);
1512 p16Reg = &(_TSOCtrl1->TSO_SVQ5_SIZE);
1513 p16RegCfg = &(_TSOCtrl1->TSO_SVQ5_TX_CFG);
1514 break;
1515 case HAL_TSO_TSIF_LIVE3:
1516 p32Reg = &(_TSOCtrl1->TSO_SVQ6_BASE);
1517 p16Reg = &(_TSOCtrl1->TSO_SVQ6_SIZE);
1518 p16RegCfg = &(_TSOCtrl1->TSO_SVQ6_TX_CFG);
1519 break;
1520 default:
1521 return FALSE;
1522 }
1523
1524 _HAL_REG32_W(p32Reg, u32addr >> TSO_MIU_BUS);
1525 _HAL_REG16_W(p16Reg , u32BufSize/TSO_SVQ_UNIT_SIZE);
1526
1527 // Reset SVQ
1528 _HAL_REG16_W(p16RegCfg , SET_FLAG1(_HAL_REG16_R(p16RegCfg), TSO_SVQ_TX_CFG_TX_RESET));
1529 _HAL_REG16_W(p16RegCfg , RESET_FLAG1(_HAL_REG16_R(p16RegCfg), TSO_SVQ_TX_CFG_TX_RESET));
1530
1531 _HAL_REG16_W(p16RegCfg, SET_FLAG1(_HAL_REG16_R(p16RegCfg), TSO_SVQ_TX_CFG_SVQ_EN));
1532
1533 return TRUE;
1534 }
1535
HAL_TSO_ChIf_ClrByteCnt(MS_U8 u8Eng,MS_U8 u8ChIf)1536 MS_BOOL HAL_TSO_ChIf_ClrByteCnt(MS_U8 u8Eng, MS_U8 u8ChIf)
1537 {
1538 MS_U16 u16data = 0;
1539
1540 switch(u8ChIf)
1541 {
1542 case HAL_TSO_TSIF_LIVE1:
1543 u16data = TSO_CLR_BYTE_CNT_1;
1544 break;
1545 case HAL_TSO_TSIF_LIVE2:
1546 u16data = TSO_CLR_BYTE_CNT_5;
1547 break;
1548 case HAL_TSO_TSIF_LIVE3:
1549 u16data = TSO_CLR_BYTE_CNT_6;
1550 break;
1551 default:
1552 return FALSE;
1553 }
1554
1555
1556 _HAL_REG16_W(&(_TSOCtrl->TSO_CLR_BYTE_CNT), SET_FLAG1(_HAL_REG16_R(&(_TSOCtrl->TSO_CLR_BYTE_CNT)), u16data));
1557 _HAL_REG16_W(&(_TSOCtrl->TSO_CLR_BYTE_CNT), RESET_FLAG1(_HAL_REG16_R(&(_TSOCtrl->TSO_CLR_BYTE_CNT)), u16data));
1558
1559 return TRUE;
1560 }
1561
HAL_TSO_LocalStreamID(MS_U8 u8Eng,MS_U8 u8ChIf,MS_U8 * pu8StrID,MS_BOOL beSet)1562 MS_BOOL HAL_TSO_LocalStreamID(MS_U8 u8Eng, MS_U8 u8ChIf, MS_U8* pu8StrID, MS_BOOL beSet)
1563 {
1564 REG16* p16Reg = NULL;
1565
1566 if(beSet == FALSE)
1567 {
1568 *pu8StrID = 0xFF;
1569 }
1570
1571 if(u8Eng > 0)
1572 {
1573 return FALSE;
1574 }
1575
1576 switch(u8ChIf)
1577 {
1578 case HAL_TSO_TSIF_LIVE1:
1579 p16Reg = &(_TSOCtrl1->TSO_PRE_HEADER1_CFG0);
1580 break;
1581 case HAL_TSO_TSIF_LIVE2:
1582 p16Reg = &(_TSOCtrl1->TSO_PRE_HEADER5_CFG0);
1583 break;
1584 case HAL_TSO_TSIF_LIVE3:
1585 p16Reg = &(_TSOCtrl1->TSO_PRE_HEADER6_CFG0);
1586 break;
1587 default:
1588 return FALSE;
1589 }
1590
1591 if(beSet == TRUE)
1592 {
1593 _HAL_REG16_W(p16Reg , (MS_U16)(*pu8StrID) & 0xFF);
1594 }
1595 else
1596 {
1597 *pu8StrID = (MS_U8)(_HAL_REG16_R(p16Reg) & 0xFF);
1598 }
1599
1600 return TRUE;
1601
1602 }
1603
HAL_TSO_SVQ_TX_Reset(MS_U8 u8Eng,MS_U8 u8ChIf)1604 MS_BOOL HAL_TSO_SVQ_TX_Reset(MS_U8 u8Eng, MS_U8 u8ChIf)
1605 {
1606 REG16* p16Reg = NULL;
1607
1608 if(u8Eng > 0)
1609 {
1610 return FALSE;
1611 }
1612
1613 switch(u8ChIf)
1614 {
1615 case HAL_TSO_TSIF_LIVE1:
1616 p16Reg = &(_TSOCtrl1->TSO_SVQ1_TX_CFG);
1617 break;
1618 case HAL_TSO_TSIF_LIVE2:
1619 p16Reg = &(_TSOCtrl1->TSO_SVQ5_TX_CFG);
1620 break;
1621 case HAL_TSO_TSIF_LIVE3:
1622 p16Reg = &(_TSOCtrl1->TSO_SVQ6_TX_CFG);
1623 break;
1624 default:
1625 return FALSE;
1626 }
1627
1628 _HAL_REG16_W(p16Reg , SET_FLAG1(_HAL_REG16_R(p16Reg), TSO_SVQ_TX_CFG_TX_RESET));
1629 _HAL_REG16_W(p16Reg , RESET_FLAG1(_HAL_REG16_R(p16Reg), TSO_SVQ_TX_CFG_TX_RESET));
1630
1631 return TRUE;
1632
1633 }
1634
HAL_TSO_Set_SVQRX_MOBFKey(MS_U8 u8Eng,MS_U32 u32Key,MS_BOOL bSecured)1635 MS_BOOL HAL_TSO_Set_SVQRX_MOBFKey(MS_U8 u8Eng, MS_U32 u32Key, MS_BOOL bSecured)
1636 {
1637 MS_U16 u16data = _HAL_REG16_R(&(_TSOCtrl1->TSO_SVQ_RX_CFG)) & ~TSO_SVQ_RX_CFG_SVQ_MOBF_IDX_MASK;
1638
1639 u16data |= ((MS_U16)(u32Key << TSO_SVQ_RX_CFG_SVQ_MOBF_IDX_SHIFT) & TSO_SVQ_RX_CFG_SVQ_MOBF_IDX_MASK);
1640
1641 if(bSecured)
1642 {
1643 u16data |= TSO_SVQ_RX_CFG_SVQ_MIU_NS;
1644 }
1645 else
1646 {
1647 u16data &= ~TSO_SVQ_RX_CFG_SVQ_MIU_NS;
1648 }
1649
1650 _HAL_REG16_W(&(_TSOCtrl1->TSO_SVQ_RX_CFG), u16data);
1651
1652 return TRUE;
1653 }
1654
HAL_TSO_Set_SVQRX_PktMode(MS_U8 u8Eng,MS_U16 u16mode)1655 MS_BOOL HAL_TSO_Set_SVQRX_PktMode(MS_U8 u8Eng, MS_U16 u16mode)
1656 {
1657 _HAL_REG16_W(&(_TSOCtrl1->TSO_SVQ_RX_CFG), (_HAL_REG16_R(&(_TSOCtrl1->TSO_SVQ_RX_CFG)) & ~TSO_SVQ_RX_CFG_MODE_MASK) | u16mode);
1658
1659 return TRUE;
1660 }
1661
HAL_TSO_Set_SVQRX_ArbitorMode(MS_U8 u8Eng,MS_U16 u16mode,MS_U16 * pu16SvqRxPri)1662 MS_BOOL HAL_TSO_Set_SVQRX_ArbitorMode(MS_U8 u8Eng, MS_U16 u16mode, MS_U16 *pu16SvqRxPri)
1663 {
1664 MS_U8 u8ii = 0, u8jj = 0;
1665 MS_U16 u16shift = 0;
1666
1667 _HAL_REG16_W(&(_TSOCtrl1->TSO_SVQ_RX_CFG), (_HAL_REG16_R(&(_TSOCtrl1->TSO_SVQ_RX_CFG)) & ~TSO_SVQ_RX_CFG_ARBMODE_MASK) | u16mode);
1668
1669 if(u16mode != TSO_SVQ_RX_CFG_ARBMODE_FIXPRI)
1670 {
1671 return TRUE;
1672 }
1673
1674 for(u8ii = 0; u8ii < TSO_SVQ_RX_NUM; u8ii++)
1675 {
1676 u8jj = u8ii >> 1;
1677 u16shift = ((u8ii % 2) ? TSO_SVQ_RX_PRI_SHIFT: 0);
1678
1679 _HAL_REG16_W(&(_TSOCtrl1->TSO_SVQ_RX_PRI[u8jj]),
1680 (_HAL_REG16_R(&(_TSOCtrl1->TSO_SVQ_RX_PRI[u8jj])) & ~(TSO_SVQ_RX_PRI_MASK << u16shift)) | (pu16SvqRxPri[u8ii] << u16shift));
1681 }
1682
1683 return TRUE;
1684 }
1685
HAL_TSO_Set_SVQ_LocalSysTimestamp(MS_U8 u8Eng,MS_U32 u32systime)1686 MS_BOOL HAL_TSO_Set_SVQ_LocalSysTimestamp(MS_U8 u8Eng, MS_U32 u32systime)
1687 {
1688 _HAL_REG16_W(&(_TSOCtrl->TSO_CFG4) , RESET_FLAG1(_HAL_REG16_R(&(_TSOCtrl->TSO_CFG4)), TSO_CFG4_SET_SYS_TIMESTAMP));
1689 _HAL_REG32_W(&(_TSOCtrl->TSO_SYSTIMESTAMP), u32systime);
1690 _HAL_REG16_W(&(_TSOCtrl->TSO_CFG4) , SET_FLAG1(_HAL_REG16_R(&(_TSOCtrl->TSO_CFG4)), TSO_CFG4_SET_SYS_TIMESTAMP));
1691
1692 return FALSE;
1693 }
1694
HAL_TSO_Get_SVQ_Status(MS_U8 u8Eng,MS_U8 u8ChIf,MS_U16 * pu16Status)1695 MS_BOOL HAL_TSO_Get_SVQ_Status(MS_U8 u8Eng, MS_U8 u8ChIf, MS_U16* pu16Status)
1696 {
1697 MS_U32 u32data = 0;
1698 MS_U32 u32Shift = 0;
1699
1700 *pu16Status = 0;
1701
1702 if(u8Eng > 0)
1703 {
1704 return FALSE;
1705 }
1706
1707 u32data = _HAL_REG32_R(&(_TSOCtrl1->TSO_SVQ_STATUS));
1708
1709 switch(u8ChIf)
1710 {
1711 case HAL_TSO_TSIF_LIVE1:
1712 u32Shift = 0;
1713 break;
1714 case HAL_TSO_TSIF_LIVE2:
1715 u32Shift = 16;
1716 break;
1717 case HAL_TSO_TSIF_LIVE3:
1718 u32Shift = 20;
1719 break;
1720 default:
1721 return FALSE;
1722 }
1723
1724 *pu16Status = ((MS_U16)(u32data >> u32Shift) & TSO_SVQ_STS_MASK);
1725
1726 return TRUE;
1727
1728 }
1729
HAL_TSO_GetDelayTime_PreHd2Output(MS_U8 u8Eng,MS_U8 u8ChIf,MS_U32 * pu32time)1730 MS_BOOL HAL_TSO_GetDelayTime_PreHd2Output(MS_U8 u8Eng, MS_U8 u8ChIf, MS_U32 *pu32time)
1731 {
1732 *pu32time = 0;
1733
1734 if(u8Eng > 0)
1735 {
1736 return FALSE;
1737 }
1738
1739 _HAL_REG16_W(&(_TSOCtrl1->TSO_DELTA_CFG) , SET_FLAG1(_HAL_REG16_R(&(_TSOCtrl1->TSO_DELTA_CFG)), TSO_DELTA_CFG_DELTA_CLR));
1740 _HAL_REG16_W(&(_TSOCtrl1->TSO_DELTA_CFG) , RESET_FLAG1(_HAL_REG16_R(&(_TSOCtrl1->TSO_DELTA_CFG)), TSO_DELTA_CFG_DELTA_CLR));
1741
1742 _HAL_REG16_W(&(_TSOCtrl1->TSO_DELTA_CFG) ,
1743 (_HAL_REG16_R(&(_TSOCtrl1->TSO_DELTA_CFG)) & ~TSO_DELTA_CFG_SEL_CH_MASK) | u8ChIf);
1744
1745 *pu32time = _HAL_REG32_R(&(_TSOCtrl1->TSO_DELTA));
1746
1747 return TRUE;
1748 }
1749
HAL_TSO_Get_MaxDelta_ChId(MS_U8 u8Eng,MS_U8 * pu8ChIf)1750 MS_BOOL HAL_TSO_Get_MaxDelta_ChId(MS_U8 u8Eng, MS_U8 *pu8ChIf)
1751 {
1752 *pu8ChIf = 0xFF;
1753
1754 *pu8ChIf = (MS_U8)((_HAL_REG16_R(&(_TSOCtrl1->TSO_DELTA_CFG)) & TSO_DELTA_CFG_MAX_ID_MASK) >> TSO_DELTA_CFG_MAX_ID_SHIFT);
1755
1756 return TRUE;
1757 }
1758
HAL_TSO_Sel_LocalSysStampClkBase(MS_U8 u8Eng,MS_U16 u16ClkBase)1759 MS_BOOL HAL_TSO_Sel_LocalSysStampClkBase(MS_U8 u8Eng, MS_U16 u16ClkBase)
1760 {
1761 if(u16ClkBase == HAL_TSO_TIMESTAMP_27M)
1762 {
1763 _HAL_REG16_W(&(_TSOCtrl->TSO_CFG4) , SET_FLAG1(_HAL_REG16_R(&(_TSOCtrl->TSO_CFG4)), TSO_CFG4_SET_TIMESTAMP_27M));
1764 }
1765 else
1766 {
1767 _HAL_REG16_W(&(_TSOCtrl->TSO_CFG4) , RESET_FLAG1(_HAL_REG16_R(&(_TSOCtrl->TSO_CFG4)), TSO_CFG4_SET_TIMESTAMP_BASE_MASK));
1768 }
1769
1770 return TRUE;
1771 }
1772
1773 #ifdef MSOS_TYPE_LINUX_KERNEL
1774
HAL_TSO_SaveRegs(void)1775 MS_BOOL HAL_TSO_SaveRegs(void)
1776 {
1777 MS_U32 u32ii = 0;
1778
1779 _u16TSORegArray[0][0x04] = TSO0_REG(0x04);
1780 _u16TSORegArray[0][0x05] = TSO0_REG(0x05);
1781 _u16TSORegArray[0][0x06] = TSO0_REG(0x06);
1782
1783 _u16TSORegArray[0][0x14] = TSO0_REG(0x14);
1784 _u16TSORegArray[0][0x15] = TSO0_REG(0x15);
1785 _u16TSORegArray[0][0x16] = TSO0_REG(0x16);
1786
1787 _u16TSORegArray[0][0x18] = TSO0_REG(0x18);
1788 _u16TSORegArray[0][0x19] = TSO0_REG(0x19);
1789 _u16TSORegArray[0][0x1a] = TSO0_REG(0x1a);
1790
1791 for(u32ii = 0x1c; u32ii <= 0x44; u32ii++)
1792 {
1793 _u16TSORegArray[0][u32ii] = TSO0_REG(u32ii);
1794 }
1795
1796 _u16TSORegArray[0][0x4c] = TSO0_REG(0x4c);
1797 _u16TSORegArray[0][0x4d] = TSO0_REG(0x4d);
1798
1799 for(u32ii = 0x60; u32ii <= 0x6f; u32ii++)
1800 {
1801 _u16TSORegArray[0][u32ii] = TSO0_REG(u32ii);
1802 }
1803
1804 _u16TSORegArray[0][0x79] = TSO0_REG(0x79);
1805 _u16TSORegArray[0][0x7a] = TSO0_REG(0x7a);
1806 _u16TSORegArray[0][0x7b] = TSO0_REG(0x7b);
1807 _u16TSORegArray[0][0x7c] = TSO0_REG(0x7c);
1808
1809 //TSO1
1810 _u16TSORegArray[1][0x00] = TSO1_REG(0x00);
1811 _u16TSORegArray[1][0x10] = TSO1_REG(0x10);
1812 _u16TSORegArray[1][0x14] = TSO1_REG(0x14);
1813
1814 for(u32ii = 0x18; u32ii <= 0x1b; u32ii++)
1815 {
1816 _u16TSORegArray[1][u32ii] = TSO1_REG(u32ii);
1817 }
1818
1819 for(u32ii = 0x28; u32ii <= 0x33; u32ii++)
1820 {
1821 _u16TSORegArray[1][u32ii] = TSO1_REG(u32ii);
1822 }
1823
1824 return TRUE;
1825 }
1826
HAL_TSO_RestoreRegs(void)1827 MS_BOOL HAL_TSO_RestoreRegs(void)
1828 {
1829 MS_U32 u32ii = 0, u32jj, u32temp = 0;
1830
1831 TSO0_REG(0x04) = _u16TSORegArray[0][0x04];
1832 TSO0_REG(0x05) = _u16TSORegArray[0][0x05];
1833 TSO0_REG(0x06) = _u16TSORegArray[0][0x06];
1834
1835 for(u32ii = 0; u32ii < TSO_FILE_IF_NUM; u32ii++)
1836 {
1837 TSO0_REG(u32temp+0x14) = _u16TSORegArray[0][u32temp+0x14];
1838 TSO0_REG(u32temp+0x15) = _u16TSORegArray[0][u32temp+0x15];
1839 TSO0_REG(u32temp+0x16) = _u16TSORegArray[0][u32temp+0x16];
1840 u32temp += 4;
1841 }
1842
1843 for(u32ii = 0x1c; u32ii <= 0x3f; u32ii++)
1844 {
1845 TSO0_REG(u32ii) = _u16TSORegArray[0][u32ii];
1846 }
1847
1848 TSO0_REG(0x43) = _u16TSORegArray[0][0x43] & ~0x0004;
1849 TSO0_REG(0x44) = _u16TSORegArray[0][0x44];
1850
1851 for(u32ii = 0; u32ii < TSO_FILE_IF_NUM; u32ii++)
1852 {
1853 TSO0_REG(u32ii+0x4c) = _u16TSORegArray[0][u32ii+0x4c];
1854 }
1855
1856 u32temp = 0;
1857 for(u32ii = 0; u32ii < TSO_FILE_IF_NUM; u32ii++)
1858 {
1859 TSO0_REG(u32temp+0x60) = _u16TSORegArray[0][u32temp+0x60];
1860 TSO0_REG(u32temp+0x61) = _u16TSORegArray[0][u32temp+0x61];
1861 TSO0_REG(u32temp+0x62) = _u16TSORegArray[0][u32temp+0x62];
1862 TSO0_REG(u32temp+0x63) = _u16TSORegArray[0][u32temp+0x63];
1863 u32temp += 5;
1864 }
1865
1866 TSO0_REG(0x6a) = _u16TSORegArray[0][0x6a];
1867 TSO0_REG(0x6b) = _u16TSORegArray[0][0x6b];
1868
1869 for(u32ii = 0; u32ii < TSO_FILE_IF_NUM; u32ii++)
1870 {
1871 TSO0_REG(u32ii+0x79) = _u16TSORegArray[0][u32ii+0x79];
1872 }
1873 TSO0_REG(0x7b) = _u16TSORegArray[0][0x7b];
1874 TSO0_REG(0x7c) = _u16TSORegArray[0][0x7c];
1875
1876 //TSO1
1877 TSO1_REG(0x00) = _u16TSORegArray[1][0x00];
1878
1879 for(u32ii = 0; u32ii < TSO_FILE_IF_NUM; u32ii++)
1880 {
1881 TSO1_REG(u32temp+0x10) = _u16TSORegArray[1][u32temp+0x10];
1882 u32temp += 4;
1883 }
1884
1885 TSO1_REG(0x18) = _u16TSORegArray[1][0x18];
1886 TSO1_REG(0x19) = _u16TSORegArray[1][0x19];
1887 TSO1_REG(0x1a) = _u16TSORegArray[1][0x1a];
1888 TSO1_REG(0x1b) = _u16TSORegArray[1][0x1b] & ~TSO_SVQ_TX_CFG_SVQ_EN; //disable SVQ fisr
1889
1890 u32temp =0;
1891 for(u32ii = 0; u32ii < TSO_FILE_IF_NUM; u32ii++)
1892 {
1893 TSO1_REG(u32temp+0x28) = _u16TSORegArray[1][u32temp+0x28];
1894 TSO1_REG(u32temp+0x29) = _u16TSORegArray[1][u32temp+0x29];
1895 TSO1_REG(u32temp+0x2a) = _u16TSORegArray[1][u32temp+0x2a];
1896 TSO1_REG(u32temp+0x2b) = _u16TSORegArray[1][u32temp+0x2b] & ~TSO_SVQ_TX_CFG_SVQ_EN; //disable SVQ first
1897 u32temp += 4;
1898 }
1899 for(u32ii = 0x30; u32ii <= 0x33; u32ii++)
1900 {
1901 TSO1_REG(u32ii) = _u16TSORegArray[1][u32ii];
1902 }
1903
1904 //enable SVQ
1905 if(_u16TSORegArray[1][0x1b] & TSO_SVQ_TX_CFG_SVQ_EN)
1906 {
1907 TSO1_REG(0x1b) |= TSO_SVQ_TX_CFG_TX_RESET;
1908 TSO1_REG(0x1b) &= ~TSO_SVQ_TX_CFG_TX_RESET;
1909 TSO1_REG(0x2b) |= TSO_SVQ_TX_CFG_TX_RESET;
1910 TSO1_REG(0x2b) &= ~TSO_SVQ_TX_CFG_TX_RESET;
1911 TSO1_REG(0x2f) |= TSO_SVQ_TX_CFG_TX_RESET;
1912 TSO1_REG(0x2f) &= ~TSO_SVQ_TX_CFG_TX_RESET;
1913
1914 TSO1_REG(0x1b) |= TSO_SVQ_TX_CFG_SVQ_EN;
1915 }
1916
1917 if(_u16TSORegArray[0][0x43] & 0x0004)
1918 {
1919 TSO0_REG(0x43) |= 0x0004;
1920 TSO0_REG(0x43) &= ~0x0004;
1921 }
1922
1923 //enable TSO setting
1924 TSO0_REG(0x1d) |= TSO_CFG1_PKT_PARAM_LD;
1925 TSO0_REG(0x1d) &= ~TSO_CFG1_PKT_PARAM_LD;
1926
1927 //set lpcr2, TSO file in start
1928 u32temp = 0;
1929 u32jj = 0;
1930 for(u32ii = 0; u32ii < TSO_FILE_IF_NUM; u32ii++)
1931 {
1932 if(_u16TSORegArray[0][u32temp+0x64] & 0x0003)
1933 {
1934 TSO0_REG(u32ii+0x79) = _u16TSORegArray[0][u32ii+0x79] | TSO_FICFG_LPCR2_WLD;
1935 TSO0_REG(u32jj+0x6c) = _u16TSORegArray[0][u32jj+0x6c];
1936 TSO0_REG(u32jj+0x6d) = _u16TSORegArray[0][u32jj+0x6d];
1937 TSO0_REG(u32ii+0x79) = _u16TSORegArray[0][u32ii+0x79] & ~TSO_FICFG_LPCR2_WLD;
1938 TSO0_REG(u32temp+0x64) = _u16TSORegArray[0][u32temp+0x64];
1939 }
1940 u32temp += 5;
1941 u32jj += 2;
1942 }
1943
1944 return TRUE;
1945 }
1946
1947 #endif //MSOS_TYPE_LINUX_KERNEL
1948
1949
1950