FreeCalypso > hg > fc-tourmaline
comparison src/gpf/tst/drv/ser.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 +------------------------------------------------------------------------------ | |
3 | File: ser.c | |
4 +------------------------------------------------------------------------------ | |
5 | Copyright 2004 Texas Instruments Deutschland, AG | |
6 | All rights reserved. | |
7 | | |
8 | This file is confidential and a trade secret of Texas | |
9 | Instruments Berlin, AG | |
10 | The receipt of or possession of this file does not convey | |
11 | any rights to reproduce or disclose its contents or to | |
12 | manufacture, use, or sell anything it may describe, in | |
13 | whole, or in part, without the specific written consent of | |
14 | Texas Instruments Deutschland, AG. | |
15 +----------------------------------------------------------------------------- | |
16 | Purpose : This Modul contains the serial driver adaptation | |
17 +----------------------------------------------------------------------------- | |
18 */ | |
19 | |
20 #ifndef __SER_C__ | |
21 #define __SER_C__ | |
22 #endif | |
23 | |
24 #include <windows.h> | |
25 #include <stdio.h> | |
26 #include "usart.h" | |
27 #include "stdlib.h" | |
28 #include "string.h" | |
29 #include "tools.h" | |
30 #include "typedefs.h" | |
31 #include "tstheader.h" | |
32 #include "os.h" | |
33 #include "gdi.h" | |
34 | |
35 /*==== TYPES ======================================================*/ | |
36 | |
37 typedef struct | |
38 { | |
39 USHORT Handle; | |
40 USHORT EnabledSignalType; | |
41 T_DRV_CB_FUNC Callback; | |
42 #ifndef _TARGET_ | |
43 OS_HANDLE TaskHandle; | |
44 #endif | |
45 char Connected; | |
46 } T_SER_DATA; | |
47 | |
48 /*==== CONSTANTS ==================================================*/ | |
49 | |
50 #define ALLOWED_SER_SIGNALS (DRV_SIGTYPE_READ|DRV_SIGTYPE_CONNECT) | |
51 #define MAX_CONFIGSTR_LEN 50 | |
52 | |
53 /*==== EXTERNALS ==================================================*/ | |
54 | |
55 #ifndef _TARGET_ | |
56 extern OS_HANDLE ext_data_pool_handle; | |
57 #endif | |
58 | |
59 /*==== VARIABLES ==================================================*/ | |
60 | |
61 T_SER_DATA SER_Data; | |
62 static T_DRV_SIGNAL Signal; | |
63 GLOBAL int extPort = 1; | |
64 | |
65 #ifndef _TARGET_ | |
66 static char m_last_config[MAX_CONFIGSTR_LEN+1]; | |
67 #endif | |
68 | |
69 #ifdef _TOOLS_ | |
70 OS_TIME extr_creation_time = 0; | |
71 #endif | |
72 | |
73 /*==== FUNCTIONS ==================================================*/ | |
74 | |
75 #ifndef RUN_INT_RAM | |
76 #ifdef _TOOLS_ | |
77 OS_TIME tst_get_init_time ( void ) | |
78 { | |
79 return extr_creation_time; | |
80 } | |
81 #endif | |
82 #endif | |
83 /* | |
84 +--------------------------------------------------------------------+ | |
85 | PROJECT : GSM-Frame (8415) MODULE : SER | | |
86 | STATE : code ROUTINE : Callback | | |
87 +--------------------------------------------------------------------+ | |
88 | |
89 PURPOSE : callback function of the driver | |
90 | |
91 */ | |
92 void Callback ( void ) | |
93 { | |
94 if ( SER_Data.EnabledSignalType & DRV_SIGTYPE_READ ) | |
95 { | |
96 Signal.SignalType = DRV_SIGTYPE_READ; | |
97 Signal.DrvHandle = SER_Data.Handle; | |
98 | |
99 (SER_Data.Callback)( &Signal ); | |
100 } | |
101 } | |
102 | |
103 #ifndef _TARGET_ | |
104 | |
105 GLOBAL void SER_Receiver (void) | |
106 { | |
107 | |
108 for(;;) | |
109 { | |
110 UT_IsChar (); | |
111 Callback(); | |
112 } | |
113 } | |
114 | |
115 #endif | |
116 | |
117 /* | |
118 +--------------------------------------------------------------------+ | |
119 | PROJECT : GSM-Frame (8415) MODULE : SER | | |
120 | STATE : code ROUTINE : SER_Exit | | |
121 +--------------------------------------------------------------------+ | |
122 | |
123 PURPOSE : exit a driver | |
124 | |
125 */ | |
126 void SER_Exit ( void ) | |
127 { | |
128 os_DestroyTask( 0, SER_Data.TaskHandle ); | |
129 SER_Data.TaskHandle = OS_ERROR; | |
130 UT_Close(); | |
131 } | |
132 | |
133 /* | |
134 +--------------------------------------------------------------------+ | |
135 | PROJECT : GSM-Frame (8415) MODULE : SER | | |
136 | STATE : code ROUTINE : SER_Read | | |
137 +--------------------------------------------------------------------+ | |
138 | |
139 PURPOSE : read data from driver | |
140 | |
141 */ | |
142 USHORT SER_Read ( void *Buffer, ULONG *BytesToRead ) | |
143 { | |
144 *BytesToRead = (USHORT)UT_ReadNChars (UT_DEVICE_0, (BYTE *)Buffer, *BytesToRead); | |
145 return DRV_OK; | |
146 } | |
147 | |
148 | |
149 /* | |
150 +--------------------------------------------------------------------+ | |
151 | PROJECT : GSM-Frame (8415) MODULE : SER | | |
152 | STATE : code ROUTINE : SER_Write | | |
153 +--------------------------------------------------------------------+ | |
154 | |
155 PURPOSE : write data to driver | |
156 | |
157 */ | |
158 USHORT SER_Write ( void *Buffer, ULONG *BytesToWrite ) | |
159 { | |
160 ULONG ToWrite = *BytesToWrite & ~PRIM_FLAG_MASK; | |
161 | |
162 UT_WriteNChars(UT_DEVICE_0, (void*)Buffer, ToWrite ); | |
163 return ( DRV_OK ); | |
164 } | |
165 /* | |
166 +--------------------------------------------------------------------+ | |
167 | PROJECT : GSM-Frame (8415) MODULE : SER | | |
168 | STATE : code ROUTINE : SER_SetSignal | | |
169 +--------------------------------------------------------------------+ | |
170 | |
171 PURPOSE : enable signal for the driver | |
172 | |
173 */ | |
174 USHORT SER_SetSignal ( USHORT SignalType ) | |
175 { | |
176 if ( !(SignalType & ALLOWED_SER_SIGNALS) ) | |
177 return DRV_INVALID_PARAMS; | |
178 else | |
179 SER_Data.EnabledSignalType |= SignalType; | |
180 | |
181 return DRV_OK; | |
182 } | |
183 | |
184 /* | |
185 +--------------------------------------------------------------------+ | |
186 | PROJECT : GSM-Frame (8415) MODULE : SER | | |
187 | STATE : code ROUTINE : SER_ResetSignal | | |
188 +--------------------------------------------------------------------+ | |
189 | |
190 PURPOSE : disable signal for the driver | |
191 | |
192 */ | |
193 USHORT SER_ResetSignal ( USHORT SignalType ) | |
194 { | |
195 if ( !(SignalType & ALLOWED_SER_SIGNALS) ) | |
196 return DRV_INVALID_PARAMS; | |
197 else | |
198 SER_Data.EnabledSignalType &= ~SignalType; | |
199 | |
200 return DRV_OK; | |
201 } | |
202 | |
203 /* | |
204 +--------------------------------------------------------------------+ | |
205 | PROJECT : GSM-Frame (8415) MODULE : SER | | |
206 | STATE : code ROUTINE : SER_SetConfig | | |
207 +--------------------------------------------------------------------+ | |
208 | |
209 PURPOSE : set configuration for the driver | |
210 | |
211 */ | |
212 USHORT SER_SetConfig ( char *Buffer ) | |
213 { | |
214 /*lint -e813, suppress Info 813: auto variable 'osver' has size '148' */ | |
215 char token [MAX_PATH+1]; | |
216 /*lint +e813 */ | |
217 unsigned int baudrate=0; | |
218 int mode; | |
219 char flow_ctrl='N'; | |
220 unsigned int len; | |
221 const char *fname=NULL; | |
222 | |
223 if ( !SER_Data.Connected ) | |
224 { | |
225 Signal.SignalType = DRV_SIGTYPE_CONNECT; | |
226 Signal.DrvHandle = SER_Data.Handle; | |
227 Signal.UserData = NULL; | |
228 (SER_Data.Callback)( &Signal ); | |
229 SER_Data.Connected = TRUE; | |
230 extPort=0; | |
231 return DRV_OK; | |
232 } | |
233 | |
234 if (strlen(m_last_config)) | |
235 { | |
236 /* check if we are already configured right */ | |
237 if (strcmp(m_last_config,Buffer)==0) | |
238 { | |
239 #ifdef _DEBUG | |
240 fprintf(stdout,"SER: keeping configuration\n"); | |
241 #endif | |
242 return DRV_OK; | |
243 } | |
244 } | |
245 | |
246 if (!(strcmp(Buffer,"EXIT"))) | |
247 { | |
248 SER_Exit(); | |
249 return DRV_OK; | |
250 } | |
251 /* save configuration string */ | |
252 strncpy(m_last_config,Buffer,MAX_CONFIGSTR_LEN); | |
253 | |
254 /* interprete configuration string */ | |
255 if ( (len = GetNextToken (Buffer, token, " #")) == 0 ) | |
256 return DRV_INVALID_PARAMS; | |
257 else | |
258 Buffer += (len+1); | |
259 | |
260 /* set mode */ | |
261 if (!strcmp(token,"SIM")) | |
262 { | |
263 mode=UT_MODE_SIM; | |
264 printf("TST: simulated USART mode selected\n"); | |
265 } | |
266 else if (!strcmp(token,"FILE")) | |
267 { | |
268 if ( (len = GetNextToken (Buffer, token, "\"")) == 0 ) | |
269 { | |
270 return DRV_INVALID_PARAMS; | |
271 } | |
272 mode=UT_MODE_FILE; | |
273 fname=token; | |
274 printf("TST: file mode selected\n"); | |
275 strcpy(m_last_config,""); /* don't store file-mode */ | |
276 } | |
277 else | |
278 { | |
279 if (!strcmp(token,"NT")) { | |
280 mode=UT_MODE_NT; | |
281 } else if (!strcmp(token,"95")) { | |
282 mode=UT_MODE_95; | |
283 } else if (!strcmp(token,"REAL")) { | |
284 /*lint -e813, suppress Info 813: auto variable 'osver' has size '148' */ | |
285 OSVERSIONINFO osver; | |
286 /*lint +e813 */ | |
287 osver.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); | |
288 GetVersionEx( &osver); | |
289 if (osver.dwPlatformId==VER_PLATFORM_WIN32_NT) { | |
290 mode=UT_MODE_NT; | |
291 } else { | |
292 mode=UT_MODE_95; | |
293 } | |
294 } else { | |
295 return DRV_INVALID_PARAMS; | |
296 } | |
297 | |
298 if (mode==UT_MODE_NT) { | |
299 printf("TST: real USART mode for winNT selected\n"); | |
300 } else { | |
301 printf("TST: real USART mode for win95 selected\n"); | |
302 } | |
303 | |
304 /* com port setting */ | |
305 if ( (len = GetNextToken (Buffer, token, " #")) == 0 ) { | |
306 return DRV_INVALID_PARAMS; | |
307 } else { | |
308 Buffer += (len+1); | |
309 } | |
310 | |
311 extPort=atoi(&token[3]); | |
312 | |
313 /* | |
314 * Get baudrate from configuration string | |
315 */ | |
316 if ( (len = GetNextToken (Buffer, token, " #")) == 0 ) { | |
317 return DRV_INVALID_PARAMS; | |
318 } else { | |
319 Buffer += (len+1); | |
320 } | |
321 | |
322 printf("SER: requested baudrate: %s\n",token); | |
323 switch ( atoi(token) ) | |
324 { | |
325 case 38400: | |
326 baudrate = UT_BAUD_38400; | |
327 break; | |
328 case 19200: | |
329 baudrate = UT_BAUD_19200; | |
330 break; | |
331 case 9600: | |
332 baudrate = UT_BAUD_9600; | |
333 break; | |
334 case 57600: | |
335 baudrate = UT_BAUD_57600; | |
336 break; | |
337 case 115200: | |
338 baudrate = UT_BAUD_115200; | |
339 break; | |
340 case 128000: | |
341 baudrate = UT_BAUD_128000; | |
342 break; | |
343 case 256000: | |
344 baudrate = UT_BAUD_256000; | |
345 break; | |
346 default: | |
347 printf("SER: no CBR_xxx constant found for requested baudrate\n"); | |
348 baudrate = atoi(token); | |
349 break; | |
350 } | |
351 | |
352 /* | |
353 * Get flow control from configuration string | |
354 */ | |
355 if ( (len = GetNextToken (Buffer, token, " #")) == 0 ) { | |
356 return DRV_INVALID_PARAMS; | |
357 } else { | |
358 Buffer += (len+1); | |
359 } | |
360 | |
361 flow_ctrl=token[0]; | |
362 printf("SER: requested flow control: %c\n",flow_ctrl); | |
363 } | |
364 | |
365 /* exit receiver task */ | |
366 if ( SER_Data.TaskHandle != OS_ERROR ) | |
367 { | |
368 os_DestroyTask( 0, SER_Data.TaskHandle ); | |
369 } | |
370 #ifdef _TOOLS_ | |
371 os_GetTime ( 0, &extr_creation_time ); | |
372 #endif | |
373 UT_Close(); | |
374 UT_set_mode(mode); | |
375 if (UT_Init (baudrate, 100, flow_ctrl, NULL, fname)!=0) | |
376 { | |
377 strcpy(m_last_config,""); | |
378 return DRV_INITFAILURE; | |
379 }; | |
380 /* restart receiver task */ | |
381 if ( os_CreateTask ( 0, (char*)"EXTR", (void (*)(OS_HANDLE, ULONG))(SER_Receiver), 2048, 1, | |
382 &SER_Data.TaskHandle, ext_data_pool_handle) != OS_OK || | |
383 os_StartTask ( 0, SER_Data.TaskHandle, 0 ) != OS_OK) | |
384 { | |
385 return DRV_INITFAILURE; | |
386 } | |
387 | |
388 return DRV_OK; | |
389 } | |
390 | |
391 | |
392 /* | |
393 +--------------------------------------------------------------------+ | |
394 | PROJECT : GSM-Frame (8415) MODULE : SER | | |
395 | STATE : code ROUTINE : SER_Init | | |
396 +--------------------------------------------------------------------+ | |
397 | |
398 PURPOSE : initialize driver | |
399 | |
400 */ | |
401 USHORT SER_Init ( USHORT DrvHandle, T_DRV_CB_FUNC CallbackFunc, T_DRV_EXPORT const **DrvInfo ) | |
402 { | |
403 static const T_DRV_EXPORT SER_Info = | |
404 { | |
405 "SER", | |
406 CALLED_FROM_ISR, | |
407 { | |
408 #ifdef _TOOLS_ | |
409 SER_Init, | |
410 #endif | |
411 SER_Exit, | |
412 SER_Read, | |
413 SER_Write, | |
414 NULL, | |
415 NULL, | |
416 NULL, | |
417 SER_SetSignal, | |
418 SER_ResetSignal, | |
419 SER_SetConfig, | |
420 NULL, | |
421 NULL, | |
422 } | |
423 }; | |
424 | |
425 SER_Data.Handle = DrvHandle; | |
426 | |
427 SER_Data.EnabledSignalType = 0; | |
428 | |
429 SER_Data.Callback = CallbackFunc; | |
430 | |
431 SER_Data.Connected = FALSE; | |
432 | |
433 SER_Data.TaskHandle = OS_ERROR; | |
434 | |
435 #ifndef _TOOLS_ | |
436 UT_set_mode(UT_MODE_SIM); | |
437 UT_Init (2, 100, 'N', NULL, NULL); | |
438 UT_SetFlowCtrl ('N'); | |
439 if ( os_CreateTask ( 0, (char*)"EXTR", (void (*)(OS_HANDLE, ULONG))(SER_Receiver), 2048, 1, | |
440 &SER_Data.TaskHandle, ext_data_pool_handle) == OS_OK ) | |
441 { | |
442 if ( os_StartTask ( 0, SER_Data.TaskHandle, 0 ) != OS_OK) | |
443 printf ( "SYSTEM ERROR: Cannot start task EXTR" ); | |
444 } | |
445 else | |
446 printf ( "SYSTEM ERROR: Cannot create task EXTR" ); | |
447 #endif | |
448 | |
449 m_last_config[0]='\0'; | |
450 | |
451 *DrvInfo = &SER_Info; | |
452 | |
453 return DRV_OK; | |
454 } | |
455 |