FreeCalypso > hg > freecalypso-citrine
diff gpf/tst_drv/ser.c @ 0:75a11d740a02
initial import of gsm-fw from freecalypso-sw rev 1033:5ab737ac3ad7
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 09 Jun 2016 00:02:41 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gpf/tst_drv/ser.c Thu Jun 09 00:02:41 2016 +0000 @@ -0,0 +1,455 @@ +/* ++------------------------------------------------------------------------------ +| File: ser.c ++------------------------------------------------------------------------------ +| Copyright 2004 Texas Instruments Deutschland, AG +| All rights reserved. +| +| This file is confidential and a trade secret of Texas +| Instruments Berlin, AG +| The receipt of or possession of this file does not convey +| any rights to reproduce or disclose its contents or to +| manufacture, use, or sell anything it may describe, in +| whole, or in part, without the specific written consent of +| Texas Instruments Deutschland, AG. ++----------------------------------------------------------------------------- +| Purpose : This Modul contains the serial driver adaptation ++----------------------------------------------------------------------------- +*/ + +#ifndef __SER_C__ +#define __SER_C__ +#endif + +#include <windows.h> +#include <stdio.h> +#include "usart.h" +#include "stdlib.h" +#include "string.h" +#include "tools.h" +#include "typedefs.h" +#include "tstheader.h" +#include "os.h" +#include "gdi.h" + +/*==== TYPES ======================================================*/ + +typedef struct +{ + USHORT Handle; + USHORT EnabledSignalType; + T_DRV_CB_FUNC Callback; +#ifndef _TARGET_ + OS_HANDLE TaskHandle; +#endif + char Connected; +} T_SER_DATA; + +/*==== CONSTANTS ==================================================*/ + +#define ALLOWED_SER_SIGNALS (DRV_SIGTYPE_READ|DRV_SIGTYPE_CONNECT) +#define MAX_CONFIGSTR_LEN 50 + +/*==== EXTERNALS ==================================================*/ + +#ifndef _TARGET_ +extern OS_HANDLE ext_data_pool_handle; +#endif + +/*==== VARIABLES ==================================================*/ + +T_SER_DATA SER_Data; +static T_DRV_SIGNAL Signal; +GLOBAL int extPort = 1; + +#ifndef _TARGET_ + static char m_last_config[MAX_CONFIGSTR_LEN+1]; +#endif + +#ifdef _TOOLS_ + OS_TIME extr_creation_time = 0; +#endif + +/*==== FUNCTIONS ==================================================*/ + +#ifndef RUN_INT_RAM +#ifdef _TOOLS_ +OS_TIME tst_get_init_time ( void ) +{ + return extr_creation_time; +} +#endif +#endif +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-Frame (8415) MODULE : SER | +| STATE : code ROUTINE : Callback | ++--------------------------------------------------------------------+ + + PURPOSE : callback function of the driver + +*/ +void Callback ( void ) +{ + if ( SER_Data.EnabledSignalType & DRV_SIGTYPE_READ ) + { + Signal.SignalType = DRV_SIGTYPE_READ; + Signal.DrvHandle = SER_Data.Handle; + + (SER_Data.Callback)( &Signal ); + } +} + +#ifndef _TARGET_ + +GLOBAL void SER_Receiver (void) +{ + + for(;;) + { + UT_IsChar (); + Callback(); + } +} + +#endif + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-Frame (8415) MODULE : SER | +| STATE : code ROUTINE : SER_Exit | ++--------------------------------------------------------------------+ + + PURPOSE : exit a driver + +*/ +void SER_Exit ( void ) +{ + os_DestroyTask( 0, SER_Data.TaskHandle ); + SER_Data.TaskHandle = OS_ERROR; + UT_Close(); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-Frame (8415) MODULE : SER | +| STATE : code ROUTINE : SER_Read | ++--------------------------------------------------------------------+ + + PURPOSE : read data from driver + +*/ +USHORT SER_Read ( void *Buffer, ULONG *BytesToRead ) +{ + *BytesToRead = (USHORT)UT_ReadNChars (UT_DEVICE_0, (BYTE *)Buffer, *BytesToRead); + return DRV_OK; +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-Frame (8415) MODULE : SER | +| STATE : code ROUTINE : SER_Write | ++--------------------------------------------------------------------+ + + PURPOSE : write data to driver + +*/ +USHORT SER_Write ( void *Buffer, ULONG *BytesToWrite ) +{ +ULONG ToWrite = *BytesToWrite & ~PRIM_FLAG_MASK; + + UT_WriteNChars(UT_DEVICE_0, (void*)Buffer, ToWrite ); + return ( DRV_OK ); +} +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-Frame (8415) MODULE : SER | +| STATE : code ROUTINE : SER_SetSignal | ++--------------------------------------------------------------------+ + + PURPOSE : enable signal for the driver + +*/ +USHORT SER_SetSignal ( USHORT SignalType ) +{ + if ( !(SignalType & ALLOWED_SER_SIGNALS) ) + return DRV_INVALID_PARAMS; + else + SER_Data.EnabledSignalType |= SignalType; + + return DRV_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-Frame (8415) MODULE : SER | +| STATE : code ROUTINE : SER_ResetSignal | ++--------------------------------------------------------------------+ + + PURPOSE : disable signal for the driver + +*/ +USHORT SER_ResetSignal ( USHORT SignalType ) +{ + if ( !(SignalType & ALLOWED_SER_SIGNALS) ) + return DRV_INVALID_PARAMS; + else + SER_Data.EnabledSignalType &= ~SignalType; + + return DRV_OK; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-Frame (8415) MODULE : SER | +| STATE : code ROUTINE : SER_SetConfig | ++--------------------------------------------------------------------+ + + PURPOSE : set configuration for the driver + +*/ +USHORT SER_SetConfig ( char *Buffer ) +{ +/*lint -e813, suppress Info 813: auto variable 'osver' has size '148' */ +char token [MAX_PATH+1]; +/*lint +e813 */ +unsigned int baudrate=0; +int mode; +char flow_ctrl='N'; +unsigned int len; +const char *fname=NULL; + + if ( !SER_Data.Connected ) + { + Signal.SignalType = DRV_SIGTYPE_CONNECT; + Signal.DrvHandle = SER_Data.Handle; + Signal.UserData = NULL; + (SER_Data.Callback)( &Signal ); + SER_Data.Connected = TRUE; + extPort=0; + return DRV_OK; + } + + if (strlen(m_last_config)) + { + /* check if we are already configured right */ + if (strcmp(m_last_config,Buffer)==0) + { +#ifdef _DEBUG + fprintf(stdout,"SER: keeping configuration\n"); +#endif + return DRV_OK; + } + } + + if (!(strcmp(Buffer,"EXIT"))) + { + SER_Exit(); + return DRV_OK; + } + /* save configuration string */ + strncpy(m_last_config,Buffer,MAX_CONFIGSTR_LEN); + + /* interprete configuration string */ + if ( (len = GetNextToken (Buffer, token, " #")) == 0 ) + return DRV_INVALID_PARAMS; + else + Buffer += (len+1); + + /* set mode */ + if (!strcmp(token,"SIM")) + { + mode=UT_MODE_SIM; + printf("TST: simulated USART mode selected\n"); + } + else if (!strcmp(token,"FILE")) + { + if ( (len = GetNextToken (Buffer, token, "\"")) == 0 ) + { + return DRV_INVALID_PARAMS; + } + mode=UT_MODE_FILE; + fname=token; + printf("TST: file mode selected\n"); + strcpy(m_last_config,""); /* don't store file-mode */ + } + else + { + if (!strcmp(token,"NT")) { + mode=UT_MODE_NT; + } else if (!strcmp(token,"95")) { + mode=UT_MODE_95; + } else if (!strcmp(token,"REAL")) { + /*lint -e813, suppress Info 813: auto variable 'osver' has size '148' */ + OSVERSIONINFO osver; + /*lint +e813 */ + osver.dwOSVersionInfoSize=sizeof(OSVERSIONINFO); + GetVersionEx( &osver); + if (osver.dwPlatformId==VER_PLATFORM_WIN32_NT) { + mode=UT_MODE_NT; + } else { + mode=UT_MODE_95; + } + } else { + return DRV_INVALID_PARAMS; + } + + if (mode==UT_MODE_NT) { + printf("TST: real USART mode for winNT selected\n"); + } else { + printf("TST: real USART mode for win95 selected\n"); + } + + /* com port setting */ + if ( (len = GetNextToken (Buffer, token, " #")) == 0 ) { + return DRV_INVALID_PARAMS; + } else { + Buffer += (len+1); + } + + extPort=atoi(&token[3]); + + /* + * Get baudrate from configuration string + */ + if ( (len = GetNextToken (Buffer, token, " #")) == 0 ) { + return DRV_INVALID_PARAMS; + } else { + Buffer += (len+1); + } + + printf("SER: requested baudrate: %s\n",token); + switch ( atoi(token) ) + { + case 38400: + baudrate = UT_BAUD_38400; + break; + case 19200: + baudrate = UT_BAUD_19200; + break; + case 9600: + baudrate = UT_BAUD_9600; + break; + case 57600: + baudrate = UT_BAUD_57600; + break; + case 115200: + baudrate = UT_BAUD_115200; + break; + case 128000: + baudrate = UT_BAUD_128000; + break; + case 256000: + baudrate = UT_BAUD_256000; + break; + default: + printf("SER: no CBR_xxx constant found for requested baudrate\n"); + baudrate = atoi(token); + break; + } + + /* + * Get flow control from configuration string + */ + if ( (len = GetNextToken (Buffer, token, " #")) == 0 ) { + return DRV_INVALID_PARAMS; + } else { + Buffer += (len+1); + } + + flow_ctrl=token[0]; + printf("SER: requested flow control: %c\n",flow_ctrl); + } + + /* exit receiver task */ + if ( SER_Data.TaskHandle != OS_ERROR ) + { + os_DestroyTask( 0, SER_Data.TaskHandle ); + } +#ifdef _TOOLS_ + os_GetTime ( 0, &extr_creation_time ); +#endif + UT_Close(); + UT_set_mode(mode); + if (UT_Init (baudrate, 100, flow_ctrl, NULL, fname)!=0) + { + strcpy(m_last_config,""); + return DRV_INITFAILURE; + }; + /* restart receiver task */ + if ( os_CreateTask ( 0, (char*)"EXTR", (void (*)(OS_HANDLE, ULONG))(SER_Receiver), 2048, 1, + &SER_Data.TaskHandle, ext_data_pool_handle) != OS_OK || + os_StartTask ( 0, SER_Data.TaskHandle, 0 ) != OS_OK) + { + return DRV_INITFAILURE; + } + + return DRV_OK; +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-Frame (8415) MODULE : SER | +| STATE : code ROUTINE : SER_Init | ++--------------------------------------------------------------------+ + + PURPOSE : initialize driver + +*/ +USHORT SER_Init ( USHORT DrvHandle, T_DRV_CB_FUNC CallbackFunc, T_DRV_EXPORT const **DrvInfo ) +{ +static const T_DRV_EXPORT SER_Info = +{ + "SER", + CALLED_FROM_ISR, + { +#ifdef _TOOLS_ + SER_Init, +#endif + SER_Exit, + SER_Read, + SER_Write, + NULL, + NULL, + NULL, + SER_SetSignal, + SER_ResetSignal, + SER_SetConfig, + NULL, + NULL, + } +}; + + SER_Data.Handle = DrvHandle; + + SER_Data.EnabledSignalType = 0; + + SER_Data.Callback = CallbackFunc; + + SER_Data.Connected = FALSE; + + SER_Data.TaskHandle = OS_ERROR; + +#ifndef _TOOLS_ + UT_set_mode(UT_MODE_SIM); + UT_Init (2, 100, 'N', NULL, NULL); + UT_SetFlowCtrl ('N'); + if ( os_CreateTask ( 0, (char*)"EXTR", (void (*)(OS_HANDLE, ULONG))(SER_Receiver), 2048, 1, + &SER_Data.TaskHandle, ext_data_pool_handle) == OS_OK ) + { + if ( os_StartTask ( 0, SER_Data.TaskHandle, 0 ) != OS_OK) + printf ( "SYSTEM ERROR: Cannot start task EXTR" ); + } + else + printf ( "SYSTEM ERROR: Cannot create task EXTR" ); +#endif + + m_last_config[0]='\0'; + + *DrvInfo = &SER_Info; + + return DRV_OK; +} +