xref: /utopia/UTPA2-700.0.x/modules/dmx/hal/manhattan/tso/halTSO.c (revision 53ee8cc121a030b8d368113ac3e966b4705770ef)
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