comparison src/cs/layer1/dl1/dl1_com.c @ 0:4e78acac3d88

src/{condat,cs,gpf,nucleus}: import from Selenite
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 16 Oct 2020 06:23:26 +0000
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:4e78acac3d88
1 /*
2 * This module contains the LISR and HISR glue functions for L1
3 * which used to be in the dl1_com module in the Leonardo version.
4 * The LoCosto source from which we got our L1 code no longer has a
5 * dl1_com.c module, and the ISR glue functions in question have been
6 * moved into csw-system/init_common/init.c - an incredibly messy C
7 * module that is mostly devoted to LoCosto BSP initialization.
8 *
9 * The present C code has been extracted from LoCosto's init.c,
10 * guided by the disassembly of dl1_com.obj from the Leonardo version.
11 */
12
13 /* Include Files */
14 #include <assert.h>
15 #include <stdarg.h>
16 #include <stdio.h>
17 #include <stdlib.h>
18 #include <string.h>
19
20 #include "nucleus.h"
21
22 #include "l1_types.h"
23 #include "l1_confg.h"
24 #include "l1_const.h"
25
26 #if TESTMODE
27 #include "l1tm_defty.h"
28 #endif // TESTMODE
29
30 #if (AUDIO_TASK == 1)
31 #include "l1audio_const.h"
32 #include "l1audio_cust.h"
33 #include "l1audio_defty.h"
34 #endif // AUDIO_TASK
35
36 #if (L1_GTT == 1)
37 #include "l1gtt_const.h"
38 #include "l1gtt_defty.h"
39 #endif
40
41 #if (L1_MP3 == 1)
42 #include "l1mp3_defty.h"
43 #endif
44
45 #if (L1_MIDI == 1)
46 #include "l1midi_defty.h"
47 #endif
48
49 #if (L1_AAC == 1)
50 #include "l1aac_defty.h"
51 #endif
52 #if (L1_DYN_DSP_DWNLD == 1)
53 #include "l1_dyn_dwl_defty.h"
54 #endif
55
56 #if (TRACE_TYPE == 4)
57 #include "l1_defty.h"
58 #endif
59
60 #include "armio.h"
61 #include "timer.h"
62
63 #include "iq.h"
64 #include "mem.h"
65 #include "clkm.h"
66 #include "inth.h"
67
68 /*
69 * Timing monitor
70 */
71 #if (TRACE_TYPE == 4)
72 extern T_L1A_L1S_COM l1a_l1s_com;
73 extern T_L1S_GLOBAL l1s;
74 UNSIGNED max_cpu, fn_max_cpu;
75 unsigned short layer_1_sync_end_time;
76 unsigned short max_cpu_flag;
77 #if (DSP >= 38)
78 // DSP CPU load measurement trace variables
79 UWORD32 dsp_max_cpu_load_trace_array[4];
80 UWORD32 dsp_max_cpu_load_idle_frame;
81 unsigned short l1_dsp_cpu_load_trace_flag;
82 #endif
83 #endif
84
85 #if (L1_EXT_AUDIO_MGT == 1)
86 NU_HISR EXT_AUDIO_MGT_hisr;
87 char FAR ext_audio_mgt_hisr_stack[500];
88 extern void Cust_ext_audio_mgt_hisr(void);
89 #endif
90
91 #if ( (L1_MP3 == 1) || (L1_MIDI == 1) || (L1_AAC == 1) || (L1_DYN_DSP_DWNLD == 1) ) // equivalent to an API_HISR flag
92 extern void api_hisr(void);
93 #ifdef __GNUC__
94 #define SECTION_ATTR __attribute__ ((section (".API_HISR_stack")))
95 #else
96 #define SECTION_ATTR
97 #pragma DATA_SECTION (API_HISR_stack,"API_HISR_stack");
98 #endif
99 char FAR API_HISR_stack[0x400] SECTION_ATTR;
100 #undef SECTION_ATTR
101 NU_HISR apiHISR;
102 #endif // (L1_MP3 == 1) || (L1_MIDI == 1) || (L1_DYN_DSP_DWNLD == 1)
103
104 #if (FF_L1_IT_DSP_USF == 1) || (FF_L1_IT_DSP_DTX == 1)
105 char FAR API_MODEM_HISR_stack[0x400]; // stack size to be tuned
106 NU_HISR api_modemHISR;
107 #endif // FF_L1_IT_DSP_USF
108
109 /*
110 * HISR stack and semaphore needed by L1
111 */
112 #if (OP_L1_STANDALONE == 0)
113 #define LAYER_1_SYNC_STACK_SIZE 4000 /* matching Leonardo version */
114 unsigned char layer_1_sync_stack[LAYER_1_SYNC_STACK_SIZE];
115 #else
116 #if TESTMODE
117 char FAR layer_1_sync_stack[2600 /*3600*/]; // Frame interrupt task stack for EVA3
118 #else
119 char FAR layer_1_sync_stack[1600 /* 2600 */]; // Frame interrupt task stack for EVA3
120 #endif
121 #endif /* OP_L1_STANDALONE */
122
123 NU_HISR layer_1_sync_HISR; // Frame interrupt task stack for EVA3
124
125 /* forward declaration */
126 void layer_1_sync_HISR_entry (void);
127
128 /*
129 * l1_create_ISR
130 *
131 * Create L1 HISR. This function is called from l1_pei.
132 */
133 void l1_create_ISR (void)
134 {
135 STATUS status;
136
137 #if (OP_L1_STANDALONE == 0)
138 // Fill the entire stack with the pattern 0xFE
139 memset (layer_1_sync_stack, 0xFE, LAYER_1_SYNC_STACK_SIZE);
140 #endif
141
142 status = NU_Create_HISR (&layer_1_sync_HISR,
143 "L1_HISR",
144 layer_1_sync_HISR_entry,
145 #if (OP_L1_STANDALONE == 0)
146 0,
147 layer_1_sync_stack,
148 LAYER_1_SYNC_STACK_SIZE);
149 #else
150 0,
151 layer_1_sync_stack,
152 sizeof(layer_1_sync_stack));
153 #endif
154
155 #if (L1_EXT_AUDIO_MGT)
156 // Create HISR for Ext MIDI activity
157 //==================================
158 status += NU_Create_HISR(&EXT_AUDIO_MGT_hisr,
159 "H_EXT_AUDIO_MGT",
160 Cust_ext_audio_mgt_hisr,
161 1,
162 ext_audio_mgt_hisr_stack,
163 sizeof(ext_audio_mgt_hisr_stack));
164 #endif
165
166 #if ( (L1_MP3 == 1) || (L1_MIDI == 1) || (L1_AAC == 1) || (L1_DYN_DSP_DWNLD == 1) ) // equivalent to an API_HISR flag
167 status += NU_Create_HISR(&apiHISR,
168 "API_HISR",
169 api_hisr,
170 1,
171 API_HISR_stack,
172 sizeof(API_HISR_stack));
173 #endif // (L1_MP3 == 1) || (L1_MIDI == 1) || (L1_AAC == 1) || (L1_DYN_DSP_DWNLD == 1)
174
175 #if (FF_L1_IT_DSP_USF == 1) || (FF_L1_IT_DSP_DTX == 1) // equivalent to an API_MODEM_HISR flag
176 // Create HISR for USF DSP interrupt !!!!. This HISR needs
177 // to have the highest priority since the USF status needs
178 // to be known before the next block starts.
179 //========================================================
180 status += NU_Create_HISR(&api_modemHISR,
181 "MODEM",
182 api_modem_hisr,
183 0,
184 API_MODEM_HISR_stack,
185 sizeof(API_MODEM_HISR_stack));
186 #endif
187
188 assert (status == 0);
189 }
190
191 /*
192 * The versions of TP_FrameIntHandler() and layer_1_sync_HISR_entry()
193 * in the TCS211 dl1_com.obj module contain CPU load measurement
194 * code. TI changed things for LoCosto, so we have to revert their
195 * changes and restore the TCS211 way.
196 */
197
198 #if (TRACE_TYPE == 4)
199 #define TIMER_RESET_VALUE (0xFFFF)
200 #define TICKS_PER_TDMA (1875)
201 #endif
202
203 /*-------------------------------------------------------*/
204 /* TP_FrameIntHandler() Low Interrupt service routine */
205 /*-------------------------------------------------------*/
206 /* Parameters : */
207 /* Return : */
208 /* Functionality : activate Hisr on each frame interrupt*/
209 /*-------------------------------------------------------*/
210 void TP_FrameIntHandler(void)
211 {
212
213 #if (OP_L1_STANDALONE == 1)
214
215 #if (TRACE_TYPE==1)
216 if (trace_info.current_config->l1_dyn_trace & 1<<L1_DYN_TRACE_L1S_CPU_LOAD)
217 {
218 TM_ResetTimer (2, 0xFFFF, 1, 0);
219 TM_StartTimer (2);
220 }
221 #endif
222
223 #if (TRACE_TYPE==6)
224 TM_ResetTimer (2, 0xFFFF, 1, 0);
225 TM_StartTimer (2);
226 #endif
227
228 #if (TRACE_TYPE==7) /* CPU_LOAD */
229 l1_cpu_load_start();
230 #endif
231
232 #else
233
234 #if (TRACE_TYPE == 4) && (TI_NUC_MONITOR != 1)
235 TM_ResetTimer (2, TIMER_RESET_VALUE, 1, 0);
236 TM_StartTimer (2);
237 #endif
238
239 #if (TI_NUC_MONITOR == 1)
240 /* Copy LISR buffer in Log buffer each end of HISR */
241 ti_nuc_monitor_tdma_action();
242 #endif
243
244 #if WCP_PROF == 1
245 prf_LogFNSwitch(l1s.actual_time.fn_mod42432);
246 #endif
247
248 #endif /* OP_L1_STANDALONE */
249
250 NU_Activate_HISR(&layer_1_sync_HISR); /* Activate HISR interrupt */
251
252 #if (OP_L1_STANDALONE == 0)
253 #if (WCP_PROF == 1)
254 #if (PRF_CALIBRATION == 1)
255 NU_Activate_HISR(&prf_CalibrationHISR);
256 #endif
257 #endif
258 #endif
259
260 }
261
262 /*
263 * layer_1_sync_HISR_entry
264 *
265 * HISR associated to layer 1 sync.
266 */
267
268 void layer_1_sync_HISR_entry (void)
269 {
270 /* automatic var for the CPU load measurement code below */
271 #if (TRACE_TYPE == 4)
272 unsigned long cpu;
273 #endif
274
275 // Call Synchronous Layer1
276 hisr();
277
278 /*
279 * FreeCalypso: the following code has been reconstructed from
280 * the disassembly of the TCS211 binary object; it was found to be
281 * similar to the Trace_L1S_CPU_load() function in l1_trace.c
282 * which appears to have been only for (TRACE_TYPE == 1) originally.
283 */
284 #if (TRACE_TYPE == 4)
285 layer_1_sync_end_time = TIMER_RESET_VALUE - TM_ReadTimer(2);
286
287 cpu = (100 * layer_1_sync_end_time) / TICKS_PER_TDMA;
288 if (cpu > max_cpu)
289 {
290 max_cpu=cpu;
291 fn_max_cpu=l1s.actual_time.fn;
292 max_cpu_flag = 1;
293 /*
294 * TCS211 object has this bogus code here:
295
296 if (some non-understood condition) {
297 static int i;
298 i++; // static var never used anywhere
299 max_cpu_flag = 1;
300 }
301
302 * Because this bogus code does not change the result,
303 * I decided not to bother with reconstructing it.
304 */
305 }
306
307 if (((l1s.actual_time.fn%1326) == 0) && (max_cpu_flag == 0))
308 max_cpu = 0;
309 #endif
310 }
311
312 /* the following stub functions live in the dl1_com module per TCS211 */
313
314 void rx_tch_data (API *data_address,
315 UWORD8 channel_mode,
316 UWORD8 blk_seq_number)
317 {
318 }
319
320 UWORD8 *tx_tch_data (void)
321 {
322 return(NULL);
323 }