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