comparison gsm-fw/g23m-gsm/dl/dl_em.c @ 673:2f7df7a314f8

gsm-fw/g23m-gsm subtree: initial import from LoCosto source
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Sun, 28 Sep 2014 23:20:04 +0000
parents
children b111f8e4aef3
comparison
equal deleted inserted replaced
672:0dc6f9e8e980 673:2f7df7a314f8
1 /*
2 +-----------------------------------------------------------------------------
3 | Project :
4 | Modul :
5 +-----------------------------------------------------------------------------
6 | Copyright 2002 Texas Instruments Berlin, AG
7 | All rights reserved.
8 |
9 | This file is confidential and a trade secret of Texas
10 | Instruments Berlin, AG
11 | The receipt of or possession of this file does not convey
12 | any rights to reproduce or disclose its contents or to
13 | manufacture, use, or sell anything it may describe, in
14 | whole, or in part, without the specific written consent of
15 | Texas Instruments Berlin, AG.
16 +-----------------------------------------------------------------------------
17 | Purpose : This Module defines the engineering mode (EM) device driver for the
18 | G23 protocol stack. This driver is used to control all engineering
19 | mode related functions.
20 +-----------------------------------------------------------------------------
21 */
22
23 #ifndef DL_EM_C
24 #define DL_EM_C
25
26 #define ENTITY_DL
27
28
29 /*==== INCLUDES ===================================================*/
30 #include "typedefs.h"
31 #include <string.h>
32 #include "pconst.cdg"
33 #include "vsi.h"
34 #include "pconst.cdg"
35 #include "custom.h"
36 #include "gsm.h"
37 #include "mon_dl.h"
38 #include "prim.h"
39 #include "pei.h"
40 #include "tok.h"
41 #include "ccdapi.h"
42 #include "dl.h"
43 #include "dl_em.h"
44
45 #ifdef FF_EM_MODE
46 #ifdef _SIMULATION_
47 #pragma message("this build includes engineering mode (FF_EM_MODE)")
48 #endif
49
50 /*==== EXPORT =====================================================*/
51 /*
52 * These variables are used between entities. Even this is not a clean solution
53 * it is a straigth forward way to reduce the overhead to a minimum. A clean
54 * solution would be based on an only usage of primitives which would stress
55 * the OS without aditional advantage!!
56 */
57 GLOBAL UBYTE em_dl_sem_buffer [EM_DL_SEM_SIZE];
58 GLOBAL UBYTE em_dl_sem_index = 0;
59 GLOBAL UBYTE em_dl_sem_read_index = 0;
60
61 /* Event tracing flags for EM */
62 GLOBAL BOOL dl_v[EM_MAX_DL_EVENTS];
63
64 /*==== PRIVAT =====================================================*/
65 static T_HANDLE sem_EM_DL;
66 static UBYTE em_dl_trace_occured;
67
68 #if !defined(INVOKE_SIGNAL)
69 LOCAL UBYTE em_dl_write (UBYTE length, UBYTE * data);
70 LOCAL void dl_em_first_event_check(void);/*for ACI notification of first EM event*/
71 #endif /* !INVOKE_SIGNAL */
72
73 /*==== VARIABLES ==================================================*/
74
75
76
77 /*
78 +------------------------------------------------------------------------------
79 | Function : dl_em_buffer_4
80 +------------------------------------------------------------------------------
81 | Description : Perform buffer check and store corresponding data in it.
82 |
83 | Parameters : Event number, data value1, data value2
84 |
85 | Return : TRUE/FALSE
86 |
87 +------------------------------------------------------------------------------
88 */
89
90 GLOBAL UBYTE em_write_buffer_4 (UBYTE event_no, UBYTE value1, UBYTE value2)
91 {
92 #define THIS_EM_BUFFER_LEN 4
93 UBYTE em_dl_event_buffer[THIS_EM_BUFFER_LEN];
94
95 TRACE_EVENT_WIN ("em_write_buffer_4");
96
97 /*
98 ACI is informed about the first event trace, used for later data processing.
99 */
100
101 dl_em_first_event_check();
102
103 em_dl_event_buffer[0] = event_no; /* Event number */
104 em_dl_event_buffer[1] = THIS_EM_BUFFER_LEN-2; /* Value length - 0 equals no data */
105 em_dl_event_buffer[2] = value1; /* first data info */
106 em_dl_event_buffer[3] = value2; /* second data info */
107
108 return ( em_dl_write (THIS_EM_BUFFER_LEN, em_dl_event_buffer) ); /* Data is stored inside buffer, reset flag */
109 #undef THIS_EM_BUFFER_LEN
110 }
111
112 /*
113 +------------------------------------------------------------------------------
114 | Function : dl_em_write_buffer_5a
115 +------------------------------------------------------------------------------
116 | Description : Perform buffer check and store corresponding data in it.
117 |
118 | Parameters : Event number, data value1, data value2, data cs (USHORT)
119 |
120 | Return : TRUE/FALSE
121 |
122 +------------------------------------------------------------------------------
123 */
124
125 GLOBAL UBYTE em_write_buffer_5a (UBYTE event_no, UBYTE value1, UBYTE value2, USHORT cs)
126 {
127 #define THIS_EM_BUFFER_LEN 6
128 UBYTE em_dl_event_buffer[THIS_EM_BUFFER_LEN];
129
130 TRACE_EVENT_WIN ("em_write_buffer_5a");
131
132 /*
133 ACI is informed about the first event trace, used for later data processing.
134 */
135 dl_em_first_event_check();
136
137 em_dl_event_buffer[0] = event_no; /* Event number */
138 em_dl_event_buffer[1] = THIS_EM_BUFFER_LEN-2; /* Value length - 0 equals no data */
139 em_dl_event_buffer[2] = value1; /* first data info */
140 em_dl_event_buffer[3] = value2; /* second data info */
141 em_dl_event_buffer[4] = (UBYTE)(cs >> 8); /* Data to be stored - MSB first */
142 em_dl_event_buffer[5] = (UBYTE)(cs); /* LSB second */
143
144 return ( em_dl_write (THIS_EM_BUFFER_LEN, em_dl_event_buffer) );/* Data is stored inside buffer, reset flag */
145 #undef THIS_EM_BUFFER_LEN
146 }
147
148 /*
149 +------------------------------------------------------------------------------
150 | Function : em_init_dl_event_trace
151 +------------------------------------------------------------------------------
152 | Description : Initialize the event tracing flags
153 |
154 | Parameters :
155 |
156 | Return :
157 |
158 +------------------------------------------------------------------------------
159 */
160 GLOBAL void em_init_dl_event_trace(void)
161 {
162 UBYTE i;
163
164 TRACE_EVENT_WIN ("em_init_dl_event_trace");
165
166 for(i=1; i<EM_MAX_DL_EVENTS; i++)
167 {
168 dl_v[i] = 0;
169 }
170 }
171
172 /*
173 +------------------------------------------------------------------------------
174 | Function : dl_em_dl_event_req
175 +------------------------------------------------------------------------------
176 | Description : Set the event tracing flags according the bitmask
177 |
178 | Parameters : Primitive - Bitmask
179 |
180 | Return :
181 |
182 +------------------------------------------------------------------------------
183 */
184
185 GLOBAL void dl_em_dl_event_req (T_EM_DL_EVENT_REQ *em_dl_event_req)
186 {
187 UBYTE i;
188
189 TRACE_EVENT_WIN_P1 ("dl_em_dl_event_req: bitmask_dl=%x", em_dl_event_req->bitmask_dl);
190 /*
191 * The event tracing flags are set according the bitmask. dl_v[i] are
192 * the flags belonging to the event number described in 8443.601
193 */
194 for(i=1; i<EM_MAX_DL_EVENTS; i++)
195 {
196 dl_v[i] = ((em_dl_event_req->bitmask_dl & (0x01<<(i-1))) > 0) ? TRUE : FALSE;
197 }
198
199 /*
200 A new event trace is generated therefor the flag is set to 0.
201 */
202 em_dl_trace_occured = 0;
203
204 PFREE(em_dl_event_req);
205 }
206
207 LOCAL void em_dl_sem_clear (void)
208 {
209 ENTER_CRITICAL_SECTION (sem_EM_DL);
210 em_dl_sem_index = em_dl_sem_read_index = 0;
211 LEAVE_CRITICAL_SECTION (sem_EM_DL);
212
213 SYST_TRACE ("DL:em_dl_sem_index cleared");
214 }
215
216 GLOBAL void em_dl_sem_init (void)
217 {
218 sem_EM_DL = vsi_s_open (VSI_CALLER "EM_DL_SEM",1);
219
220 if (sem_EM_DL NEQ VSI_ERROR)
221 {
222 em_dl_sem_clear ();
223 }
224 else
225 {
226 SYST_TRACE ("DL:canīt open semaphore \"EM_DL_SEM\"");
227 }
228
229 em_dl_trace_occured = 0;
230 }
231
232 GLOBAL void em_dl_sem_exit (void)
233 {
234 if (sem_EM_DL NEQ VSI_ERROR)
235 vsi_s_close (VSI_CALLER sem_EM_DL);
236 }
237
238 /*
239 To be able to read the dl-buffer from aci, em_dl_sem_read occupies the semaphor with ENTER_CRITICAL_SECTION.
240 After read process toke place the function em_dl_sem_clear must be called to open the semaphor again and
241 reset the read index.
242 */
243 GLOBAL void em_dl_sem_reset (void)
244 {
245 /*
246 ENTER_CRITICAL_SECTION (sem_EM_DL);
247 */
248 em_dl_sem_index = em_dl_sem_read_index = 0;
249 LEAVE_CRITICAL_SECTION (sem_EM_DL);
250
251 SYST_TRACE ("DL:em_dl_sem_index reseted");
252 }
253
254 GLOBAL void em_dl_sem_read (void)
255 {
256 USHORT semCount;
257 TRACE_EVENT_WIN ( "em_dl_sem_read");
258
259 if (vsi_s_status (VSI_CALLER sem_EM_DL, &semCount) NEQ VSI_OK)
260 {
261 com_semaphore_err();
262 return ;
263 }
264 if (semCount EQ 0)
265 {
266 SYST_TRACE ("DL:semCount == 0");
267 return ;
268 }
269 ENTER_CRITICAL_SECTION (sem_EM_DL);
270 /*
271 The dl semaphor will be read by the engineering mode via aci, therefore the functions em_dl_sem_read
272 and em_dl_sem_reset are defined as global. To ensure that during reading only aci has access to
273 the semaphor the macro LEAVE_CRITICAL_SECTION is called after the read process toke place -
274 in the em_dl_sem_reset function.
275 */
276 }
277
278 /*
279 Return value TRUE/FALSE - TRUE keeps the event flag valid, FALSE indicates a successful flag handle
280 */
281 #if defined(INVOKE_SIGNAL)
282 GLOBAL UBYTE em_dl_write (UBYTE length, UBYTE *data)
283 #else /* INVOKE_SIGNAL */
284 LOCAL UBYTE em_dl_write (UBYTE length, UBYTE *data)
285 #endif /* INVOKE_SIGNAL */
286 {
287 USHORT semCount;
288 GET_INSTANCE_DATA;
289
290 TRACE_EVENT_WIN ("em_dl_write");
291
292 if (dl_data->interrupt_context)
293 {
294 sig_invoke_dl_em_write (length, data);
295 return FALSE;
296 }
297
298 if (vsi_s_status (VSI_CALLER sem_EM_DL, &semCount) NEQ VSI_OK)
299 {
300 com_semaphore_err();
301 return TRUE;
302 }
303
304 if (semCount EQ 0)
305 {
306 TRACE_EVENT_WIN ("semCount == 0");
307 return TRUE;
308 }
309
310 /*
311 * buffer overflow protection - EM_DL_SEM_SIZE = 30
312 */
313 if ( (em_dl_sem_index + length) > EM_DL_SEM_SIZE )
314 {
315 TRACE_EVENT_WIN ("dl em buffer full");
316 return FALSE;
317 }
318
319 if (com_enter_critical_section (sem_EM_DL))
320 return TRUE;
321
322 memcpy (&em_dl_sem_buffer[em_dl_sem_index], data, length);
323 em_dl_sem_index += length;
324
325 com_leave_critical_section (sem_EM_DL);
326 return FALSE; /* indicates that flag was handled */
327 } /* endfunc em_dl_write */
328
329 /*
330 +------------------------------------------------------------------------------
331 | Function : dl_em_first_event_check()
332 +------------------------------------------------------------------------------
333 | Description : Checks if first EM-Event ocured
334 |
335 | Parameters : None
336 |
337 | Return : None
338 |
339 +------------------------------------------------------------------------------
340 */
341
342 /*
343 ACI is informed about the first event trace, used for later data processing.
344 */
345 #if defined(INVOKE_SIGNAL)
346 GLOBAL void dl_em_first_event_check(void)
347 #else
348 LOCAL void dl_em_first_event_check(void)
349 #endif /* !INVOKE_SIGNAL */
350 {
351 if(!em_dl_trace_occured)
352 {
353
354 #if defined(INVOKE_SIGNAL)
355 GET_INSTANCE_DATA;
356 if (dl_data->interrupt_context)
357 {
358 sig_invoke_dl_em_first_event_check ();
359 return;
360 }
361 #endif /* INVOKE_SIGNAL */
362
363 TRACE_FUNCTION("dl_em_first_event_check()");
364
365 {
366 PALLOC(em_notification, EM_DATA_IND);
367 em_notification->entity = EM_DL;
368 PSENDX(MMI, em_notification);
369 }
370
371 em_dl_trace_occured++;
372 }
373 }
374
375 #endif /* FF_EM_MODE */
376
377 #endif /* DL_EM_C */
378