📄 serialswitch.c
字号:
*/
#ifdef BT_UART_USED_MODEM
memcpy (ser_cfg_info, "RB", NUMBER_OF_TR_UART);
#else
memcpy (ser_cfg_info, "BR", NUMBER_OF_TR_UART);
#endif
#endif
}
/*
* The serial data flow functions set is initialized.
*/
flow = 0;
while (flow < SER_MAX_NUMBER_OF_FLOWS) {
serial_driver = (T_SerialDriver)
(((*pt_current_config) >> (12 - flow * 4)) & 0x000F);
set_flow_functions (flow, serial_driver);
flow++;
}
/*
* Checks if both UARTs are used.
* If not, performs minimum initialization including Sleep Mode.
* Checks also if at least one UART is used by a Trace flow.
* If so, create a HISR in order to reset and restart the sleep timer
* in case of incoming characters.
*/
uart_used = 0;
uart_used_for_trace = 0;
for (uart_id = 0; uart_id < NUMBER_OF_TR_UART; uart_id++) {
if (!(int_uart[uart_id].device_used))
initialize_uart_sleep (uart_id);
else { /* if (int_uart[uart_id].device_used) */
uart_used = 1; /* At least one UART is used */
if (int_uart[uart_id].flow_type == TRACE_FLOW) {
/* At least one UART used by a Trace flow */
uart_used_for_trace = 1;
}
}
}
/*
* If at least one uart is used, create a timer to figure out if the system
* can enter deep sleep mode regarding the UARTs.
*/
if (uart_used) {
(void) NU_Create_Timer (
&uart_sleep_timer,
"Sleep",
&analyze_uart_sleep_timer_expiration,
0, /* Parameter supplied to the routine: not used. */
WAKE_UP_TIME_IN_TDMA,
0, /* The timer expires once. */
NU_DISABLE_TIMER);
/*
* If at least one uart is used by a Trace flow, create a HISR to reset
* and restart the sleep timer.
*/
if (uart_used_for_trace) {
/*
* The stack is entirely filled with the pattern 0xFE.
*/
memset (&(timer_hisr_stack[0]), 0xFE, TIMER_HISR_STACK_SIZE);
/*
* The HISR entry function is the same function than the one called
* by the Rx HISR of the UARTFAX, since the only aim is to reset
* and restart the sleep timer in case of incoming characters on
* the Trace UART.
*/
(void) NU_Create_HISR (
&timer_hisr_ctrl_block,
"Tim_HISR",
SER_restart_uart_sleep_timer,
TIMER_HISR_PRIORITY,
&(timer_hisr_stack[0]),
TIMER_HISR_STACK_SIZE);
}
}
}
/*******************************************************************************
*
* SER_WriteConfig
*
* Purpose: TBD
*
* Parameters: In : new_config: TBD
* write_to_flash: TBD
* Out: none
*
* Return: 0 (FALSE) : In case of error while trying to write file in FFS
* >= 1 (TRUE) : Successful operation.
*
******************************************************************************/
SYS_BOOL
SER_WriteConfig (char *new_config,
SYS_BOOL write_to_flash)
{
#if (defined BLUETOOTH && (CHIPSET != 12))
int uart_id;
SYS_BOOL status = 1;
for (uart_id = 0; uart_id < NUMBER_OF_TR_UART; uart_id++)
ser_new_cfg[uart_id] = *new_config++;
/*
* Write in flash the new serial configuration if requested.
*/
if (write_to_flash) {
if (ffs_fwrite (uart_config_file,
ser_new_cfg,
NUMBER_OF_TR_UART) < EFFS_OK) {
status = 0;
}
}
return (status);
#else
/*
* Real Dynamic Switch is only available with Bluetooth and with all chips
* but Calypso+.
*/
return (1);
#endif
}
/*******************************************************************************
*
* SER_ImmediateSwitch
*
* Purpose: TBD
*
* Parameters: In : none
* Out: none
*
* Return: 0 (FALSE) : In case of error.
* >= 1 (TRUE) : Successful operation.
*
******************************************************************************/
SYS_BOOL
SER_ImmediateSwitch (void)
{
#if (defined BLUETOOTH && (CHIPSET != 12))
int uart_id;
SYS_BOOL valid_config = 0;
T_AppliSerialInfo *serial_info = &appli_ser_cfg_info;
SYS_UWORD8 nb_allowed_config = serial_info->num_config;
SYS_UWORD16 *allowed_config;
int flow;
T_SerialDriver serial_flows[SER_MAX_NUMBER_OF_FLOWS];
T_tr_UartId uart_nb;
/*
* First check if the new serial configuration is actually different from
* the previous one. A return is used to simplify the code.
*/
if (!memcmp (ser_new_cfg,
ser_cfg_info,
NUMBER_OF_TR_UART))
return (1); /* new config and old config are identical => nothing to do */
/*
* Then check if the new serial config is valid or not.
* At that point, we assume that a serial config is valid if and only if the
* Bluetooth HCI flow is still enabled and still uses the same UART.
* Reset the current serial config, and compute the new one.
*/
serial_cfg = 0x0048; /* All dummies */
for (uart_id = 0; uart_id < NUMBER_OF_TR_UART; uart_id++) {
switch (ser_new_cfg[uart_id]) {
case G23_PANEL:
serial_cfg = serial_cfg +
((uart_id + 1) << (12 - (4 * SER_PROTOCOL_STACK)));
break;
case RIVIERA_TRACE_MUX:
serial_cfg = serial_cfg +
((uart_id + 1) << (12 - (4 * SER_LAYER_1)));
break;
case FD_AT_COMMAND:
serial_cfg = serial_cfg +
((uart_id + 1) << (12 - (4 * SER_FAX_DATA)));
break;
case BLUETOOTH_HCI:
serial_cfg = serial_cfg +
((uart_id + 1) << (12 - (4 * SER_BLUETOOTH_HCI)));
/*
* Check if the Bluetooth HCI flow is enabled on the same UART.
*/
if (ser_cfg_info[uart_id] == BLUETOOTH_HCI)
valid_config = 1;
break;
case DUMMY:
break;
}
}
if (!valid_config)
return (0); /* Bluetooth HCI flow not enabled in the new serial config,
or enabled but using a different UART. */
/*
* Finally check if the new serial config is allowed by the application.
*/
valid_config = 0;
while ((nb_allowed_config > 0) && !valid_config) {
nb_allowed_config--;
allowed_config = (SYS_UWORD16 *)
&(serial_info->allowed_config[nb_allowed_config]);
if (serial_cfg == *allowed_config)
valid_config = 1;
}
if (!valid_config) /* the new config is not allowed by the application */
return (0);
/*
* From now on, Dynamic Switch is being processed.
*/
dynamic_switch = 1;
/*
* Disable UART interrupts until new serial config setup is complete.
*/
#if ((CHIPSET == 4) || (CHIPSET == 5) || (CHIPSET == 6) || (CHIPSET == 7) || (CHIPSET == 8) || (CHIPSET == 9) || (CHIPSET == 10) || (CHIPSET == 11))
IQ_Mask (IQ_UART_IRDA_IT);
#endif
IQ_Mask (IQ_UART_IT);
/*
* Reset UARTs set-up.
*/
for (uart_id = 0; uart_id < NUMBER_OF_TR_UART; uart_id++) {
int_uart[uart_id].device_used = 0;
int_uart[uart_id].deep_sleep_set_up = 0;
int_uart[uart_id].interrupt_handler = NULL;
}
/*
* All function pointers are set to dummy functions.
*/
rvf_disable (21); /* beginning of the critical section */
for (flow = 0; flow < SER_MAX_NUMBER_OF_FLOWS; flow++)
tr_functions[flow] = &dummy_trace;
fd_functions = &dummy_fax_data;
bt_functions = &dummy_bt_hci;
rvf_enable (); /* end of the critical section */
/*
* Calls the Exit function of the UARTFAX driver if it was previously used.
*/
if (uart_fd_initialized) {
/*
* UART IrDA can't be used for F&D/AT-Cmd flow => UART Modem was used
* by the F&D/AT-Cmd flow.
*/
if (UAF_Exit (UAF_UART_1) == FD_OK) {
uart_fd_initialized = 0;
}
}
else {
/*
* AT that point, since the Bluetooth HCI flow already uses one UART,
* and since the second UART was not used by the F&D/AT-Cmd flow, we
* assume it was used by a Trace flow. Therefore, the HISR used to
* reset and restart the sleep timer is deleted.
*/
(void) NU_Delete_HISR (&timer_hisr_ctrl_block);
}
/*
* Initialization of the new flows (Only AT-Cmd/F&D or Riviera/Layer1 Trace)
* and their associated UARTs HW (Irda or Modem) & SW (Trace or Fax&Data).
*/
for (flow = 0; flow < SER_MAX_NUMBER_OF_FLOWS; flow++) {
serial_flows[flow] = (T_SerialDriver)
((serial_cfg >> (12 - flow * 4)) & 0x000F);
switch (serial_flows[flow]) {
/*
* For Riviera/Layer1 Trace flow, default baudrate is 115200 bps
* and callback function is defined in rvt_def_i.h.
*/
case UART_IRDA_TRACE:
case UART_MODEM_TRACE:
if (serial_flows[flow] == UART_IRDA_TRACE)
uart_nb = UA_UART_0;
else /* if (serial_flows[flow] == UART_MODEM_TRACE) */
uart_nb = UA_UART_1;
if (flow == SER_LAYER_1) {
UA_Init (uart_nb,
TR_BAUD_115200,
rvt_activate_RX_HISR);
/*
* Create the HISR used to reset and restart the sleep
* timer in case of incoming characters on the Trace flow.
* The stack is entirely filled with the pattern 0xFE.
*/
memset (&(timer_hisr_stack[0]),
0xFE,
TIMER_HISR_STACK_SIZE);
(void) NU_Create_HISR (
&timer_hisr_ctrl_block,
"Tim_HISR",
SER_restart_uart_sleep_timer,
TIMER_HISR_PRIORITY,
&(timer_hisr_stack[0]),
TIMER_HISR_STACK_SIZE);
}
else /* Other Trace flows are disabled */
initialize_uart_sleep (uart_nb);
break;
/*
* For At-Cmd/F&D flow, functions are called in the appropriate
* order with the saved parameters.
* This has been figured out from the G23 initialization.
*/
case UART_MODEM_FAX_DATA:
/* Global Initialization */
if (UAF_Init (UAF_UART_1) == FD_OK) {
uart_fd_initialized = 1;
}
/* Disable the driver */
UAF_Enable (UAF_UART_1,
0);
/* Set the SW Buffers parameters */
UAF_SetBuffer (UAF_UART_1,
data_flow_parameters.bufSize,
data_flow_parameters.rxThreshold,
data_flow_parameters.txThreshold);
/* Set the Escape Sequence parameters (1st call) */
UAF_SetEscape (UAF_UART_1,
data_flow_parameters.escChar[0],
data_flow_parameters.guardPeriod[0]);
/* Set the Communication parameters (1st call) */
UAF_SetComPar (UAF_UART_1,
data_flow_parameters.baudrate[0],
data_flow_parameters.bpc[0],
data_flow_parameters.sb[0],
data_flow_parameters.parity[0]);
/* Set the Flow Control parameters (1st call) */
UAF_SetFlowCtrl (UAF_UART_1,
data_flow_parameters.fcMode[0],
data_flow_parameters.XON[0],
data_flow_parameters.XOFF[0]);
/* Set the Communication parameters (2nd call) */
UAF_SetComPar (UAF_UART_1,
data_flow_parameters.baudrate[1],
data_flow_parameters.bpc[1],
data_flow_parameters.sb[1],
data_flow_parameters.parity[1]);
/* Set the Flow Control parameters (2nd call) */
UAF_SetFlowCtrl (UAF_UART_1,
data_flow_parameters.fcMode[1],
data_flow_parameters.XON[1],
data_flow_parameters.XOFF[1]);
/* Set the Escape Sequence parameters (2nd call) */
UAF_SetEscape (UAF_UART_1,
data_flow_parameters.escChar[1],
data_flow_parameters.guardPeriod[1]);
/* Enable the driver */
UAF_Enable (UAF_UART_1,
1);
/* Get the number of input bytes available */
UAF_InpAvail (UAF_UART_1);
/* Set the readOutFunc and the suspend mode */
UAF_ReadData (UAF_UART_1,
data_flow_parameters.suspend_rd,
data_flow_parameters.readOutFunc);
/* Get the number of output bytes available (1st call) */
UAF_OutpAvail (UAF_UART_1);
/* Set the states of the V.24 status lines (1st call) */
UAF_SetLineState (UAF_UART_1,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -