📄 sim.c
字号:
//
// // Set Configuration bits
// p->c->conf1 = p->conf1 = SIM_CONF1_SRSTLEV | SIM_CONF1_SCLKEN;
// p->c->conf2 = 0x0940;
//
// //enable VCC
// #if(ANALOG == 1)
// SPIABB_wa_VRPC (SPIRead_ABB_Register (PAGE1,VRPCCTRL1) | MODE_ENA_VCC);
// #elif(ANALOG == 2)
// SPIABB_wa_VRPC (SPIRead_ABB_Register (PAGE1,VRPCSIM) | MODE_ENA_VCC);
// #endif
// p->c->cmd = (p->c->cmd & MASK_CMD) | SIM_CMD_START;
//
//#endif
/*-----------------------------------------------------------*/
while (p->PTS_Try != 5)
{
while (ATR_Attempt != 0)
{
// Treat ATR response
BackValue = SIM_ATRdynamictreatement (p, cP);
if (BackValue == SIM_ERR_NOCARD)
{
SIM_PowerOff ();
return (SIM_ERR_NOCARD);
}
// ATR received but wrong characters value
// Comply with Test 27.11.2.4.5 and Test 27.11.1.3
else if (BackValue == SIM_ERR_CARDREJECT)
{
if (ATR_Attempt >= 3)
{
SIM_PowerOff ();
return ((SYS_UWORD16)BackValue);
}
ATR_Attempt++;
SIM_WARMReset(p); // assert a reset during at least 400 ETU
}
else if (BackValue != 0) //SIM_ERR_WAIT
{
if (ATR_Attempt == 3)
{ // switch to 5V (ANALOG1) or 3V (ANALOG2) if card send wrong ATR 3 consecutive times
// Apply 3 consecutive resets at 5V (ANALOG1) or 3V (ANALOG2)
// fix prb for old chinese card not GSM compliant
if ((BackValue = SIM_SwitchVolt()) != SIM_OK)
{
// SIM cannot be supplied at 3V (ANALOG2), because of an Hardware failure
SIM_PowerOff ();
return((SYS_UWORD16)BackValue);
}
ATR_Attempt++;
goto COLD_RESET;
}
if (ATR_Attempt >= 6)
{
SIM_PowerOff ();
return ((SYS_UWORD16)BackValue);
}
ATR_Attempt++;
SIM_WARMReset(p); // assert a reset during at least 400 ETU
}
else
{
ATR_Attempt = 0;
}
}
/*-----------------------------------------------------------*/
// PTS procedure
BackValue = SIM_PTSprocedure(cP,p); //assert PTS if needed
// need upgrade with FIFO use to avoid CPU overloading
if (BackValue)
{
if (BackValue == SIM_ERR_CARDREJECT)
{
SIM_PowerOff (); //must be done by protocol stack
return (SIM_ERR_CARDREJECT);
}
if (p->PTS_Try <= 4) //else error treatement
{
SIM_WARMReset(p); // assert a reset during at least 400 ETU
}
}
else
{
p->PTS_Try = 5;
}
}
/*-----------------------------------------------------------*/
//interpret SIM coding concerning SIM supply voltage
if (SIM_GetFileCharacteristics(p))
{
#if ((SIM_TYPE == SIM_TYPE_3V) || (SIM_TYPE == SIM_TYPE_1_8V))
SIM_PowerOff(); // Needed for tests 27.17.1.5.1 and 27.17.1.5.5
#endif
return (SIM_ERR_READ);
}
// JYT, certainly unused because of previous test
if(p->errorSIM)
{
return(p->errorSIM);
}
if ((p->FileC & SIM_MASK_INFO_VOLT) == SIM_5V)
{
#if ((SIM_TYPE == SIM_TYPE_3V ) || (SIM_TYPE == SIM_TYPE_1_8_3V) || (SIM_TYPE == SIM_TYPE_1_8V))
SIM_PowerOff (); // required by ETSI if 5V only card is detected and 3V only ME chosen
return (SIM_ERR_CARDREJECT); // Test 27.17.1.5.2
#elif (SIM_TYPE == SIM_TYPE_3_5V)
if (CurrentVolt == SIM_3V) //if 5V only SIM present -> the ME may switch to 5V operation
{
if ((BackValue = SIM_SwitchVolt()) != SIM_OK) // switch to 5V
{
SIM_PowerOff ();
return ((SYS_UWORD16)BackValue);
}
ATR_Attempt = 1;
goto COLD_RESET; // Test 27.17.1.5.3
}
#endif
}
else
{
if ((p->FileC & SIM_MASK_INFO_VOLT) == SIM_3V)
{
#if (SIM_TYPE == SIM_TYPE_1_8V)
SIM_PowerOff (); // required by ETSI if 3V only card is detected and 1.8V only ME chosen
return (SIM_ERR_CARDREJECT); // Test 27.17.1.5.2
#elif (SIM_TYPE == SIM_TYPE_1_8_3V)
if (CurrentVolt == SIM_1_8V) //if 3V only SIM present -> the ME may switch to 3V operation
{
if ((BackValue = SIM_SwitchVolt()) != SIM_OK) // switch to 3V
{
SIM_PowerOff ();
return ((SYS_UWORD16)BackValue);
}
ATR_Attempt = 1;
goto COLD_RESET; // Test 27.17.1.5.3
}
#endif
}
else
{
if ((p->FileC & SIM_MASK_INFO_VOLT) == SIM_1_8V)
{
#if (SIM_TYPE == SIM_TYPE_5V)
SIM_PowerOff (); // required by ETSI if 5V only card is detected and 3V only ME chosen
return (SIM_ERR_CARDREJECT); // Test 27.17.1.5.2
#endif
}
else
{
// future class of sim card voltage !!!!!! never use it
SIM_PowerOff (); // Rec. 11.18
return (SIM_ERR_CARDREJECT);
}
}
}
SIM_Interpret_FileCharacteristics(p); //find which frequency (13/4 or 13/8 Mhz)
if(p->errorSIM)
{
return(p->errorSIM);
}
status_os_sim = NU_Control_Timer (&SIM_timer, NU_ENABLE_TIMER);
//enable starting of the os timer for sleep mode
if (p->InsertFunc != NULL)
(p->InsertFunc)();
return(0);
}
/* SIM manual start
*
* purpose : manage manual start of the SIM interface
* input : pointer on sim structure SIM_PORT
* output : none
*/
SYS_UWORD16 SIM_ManualStart (SIM_PORT *p)
{
volatile int i;
//!!
p->c->conf1 = p->conf1 = 0x8004; //set conf1 to automatic mode SIO low
//enable sim interface clock module
p->c->cmd = SIM_CMD_CLKEN;
//#if (SW_WRK_AROUND_H_S == 1)
// Mask all interrupts
p->c->maskit = SIM_MASK_NATR | SIM_MASK_WT | SIM_MASK_OV |
SIM_MASK_TX | SIM_MASK_RX | SIM_MASK_CD;
// Unmask interrupt controller
IQ_Unmask (IQ_SIM);
p->c->cmd = (p->c->cmd & MASK_CMD) | SIM_CMD_STOP;
ind_os_sleep (4); //wait 5 TDMA due to SVCC falling down duration
p->c->cmd = (p->c->cmd & MASK_CMD) | SIM_CMD_SWRST;
ind_os_sleep (1); //wait 5 TDMA due to SVCC falling down duration
p->c->conf2 = 0x0940;
i = p->c->it;
// Unmask all sources of interrupts except WT and OV and NATR
p->c->maskit = SIM_MASK_WT | SIM_MASK_OV | SIM_MASK_NATR;
//enter in manual mode to start the ATR sequence
p->c->conf1 = p->conf1 |= SIM_CONF1_BYPASS;
ind_os_sleep(1);
p->c->conf1 = p->conf1 |= SIM_CONF1_SVCCLEV;
ind_os_sleep(1);
#if(ANALOG == 1)
//set OMEGA to 3V mode
//enable VCC
ABB_wa_VRPC (ABB_Read_Register_on_page(PAGE1,VRPCCTRL1) | MODE_ENA_SIMLDOEN);
ind_os_sleep(1);
ABB_wa_VRPC (ABB_Read_Register_on_page(PAGE1,VRPCCTRL1) | MODE_ENA_SIMEN);
ind_os_sleep(1);
#elif(ANALOG == 2)
//set IOTA to 3V mode
//enable VCC
ABB_wa_VRPC (ABB_Read_Register_on_page(PAGE1,VRPCSIM) | MODE_ENA_SIMEN);
ind_os_sleep(1);
#elif(ANALOG == 3)
//set SYREN to 3V mode
//enable VCC
ABB_wa_VRPC (ABB_Read_Register_on_page(PAGE1,VRPCSIMR) | MODE_ENA_SIMEN);
ind_os_sleep(1);
#endif
p->c->conf1 = p->conf1 &= ~SIM_CONF1_SIOLOW;
ind_os_sleep(1);
p->c->conf1 = p->conf1 |= SIM_CONF1_SCLKEN;
p->c->conf1 = p->conf1 &= ~SIM_CONF1_TXRX; //set to receive mode
if(p->errorSIM) //check for card detection
{
return(p->errorSIM);
}
i = 0;
while ((p->rx_index == 0) && (i < 3)) //wait 40000*Tsclk
{
ind_os_sleep (1);
i++;
}
if ((p->rx_index == 0) && (i >= 3)) //external reset card ATR treatement
{
i = 0;
p->c->conf1 = p->conf1 |= SIM_CONF1_SRSTLEV;//set reset level to high level
while ((p->rx_index == 0) && (i < 3)) //wait 40000*Tsclk
{
ind_os_sleep (1);
i++;
}
}
return (0);
}
/* SIM manual stop
*
* purpose : manage manual start of the SIM interface
* input : pointer on sim structure SIM_PORT
* output : none
*/
void SIM_ManualStop (SIM_PORT *p)
{
// to write
}
/* Power off SIM == SIM_CMD_STOP
* input : none
* output : none
*/
void SIM_PowerOff(void)
{
SIM_PORT *p;
volatile SYS_UWORD16 cmd;
// Initialize pointers
p = &(Sim[0]);
// Reset and wait a while
cmd = p->c->cmd;
p->c->cmd = (cmd & MASK_CMD) | SIM_CMD_STOP;
ind_os_sleep(5); //wait for falling of SIM signals (RESET/CLK/IO)
#if(ANALOG == 1)
//disable VCC : disable level shifter then SVDD
ABB_wa_VRPC (ABB_Read_Register_on_page(PAGE1,VRPCCTRL1) & MODE_DIS_SIMEN);
ABB_wa_VRPC (ABB_Read_Register_on_page(PAGE1,VRPCCTRL1) & MODE_DIS_SIMLDOEN);
#elif(ANALOG == 2)
//disable VCC : disable level shifter then SVDD
ABB_wa_VRPC (ABB_Read_Register_on_page(PAGE1,VRPCSIM) & MODE_DIS_SIMEN);
ABB_wa_VRPC (ABB_Read_Register_on_page(PAGE1,VRPCSIM) & MODE_DIS_SIMLDOEN);
#elif(ANALOG == 3)
//disable VCC : disable level shifter then SVDD
ABB_wa_VRPC (ABB_Read_Register_on_page(PAGE1,VRPCSIMR) & MODE_DIS_SIMEN);
ABB_wa_VRPC (ABB_Read_Register_on_page(PAGE1,VRPCSIMR) & MODE_DIS_SIMLDOEN);
#endif
ind_os_sleep(10); //wait for falling of VCC commanf by ABB
p->c->cmd = 0x0000; //disable clock of sim module
if ((SIM_sleep_status == SIM_SLEEP_DESACT) || (SIM_sleep_status == SIM_SLEEP_ACT))
{ //SIM sleep timer is not more needed
status_os_sim = NU_Delete_Timer (&SIM_timer);
}
}
/*
* SIM_Init
*
* Function for backward compatibility only
*
*/
void SIM_Init(void (Insert(void)), void (Remove(void)))
{
// Call SIM Registration function.
(void) SIM_Register (Insert, Remove);
}
/*
* SIM_Initialize
*
* Initialize data structures.
*
*/
void SIM_Initialize(void)
{
int n;
SIM_PORT *p;
volatile SYS_UWORD32 dum;
// Initialize registers
p = &(Sim[0]);
p->c = (SIM_CONTROLLER *) SIM_CMD;
p->errorSIM = 0;
dum = (volatile SYS_UWORD32) SIM_Dummy; // to force linking SIM32
status_os_sim = NU_Create_Timer (&SIM_timer, "SIM_sleep_timer", &SIM_SleepMode_In,
0, SIM_SLEEP_WAITING_TIME, 0, NU_DISABLE_TIMER);
//timer start only with NU_Control_Timer function
//waiting time set to 2.3s
SIM_sleep_status = SIM_SLEEP_NONE;
#ifdef SIM_RETRY
SimRetries = 0;
#endif
//glowing,2004-06-08,add hall init
Hall_Init();
}
/*
* SIM_Register
*
* SIM Registration function: Initialize callback functions
*
* Insert(void) : pointer to the function called when a card is inserted
* Remove(void) : pointer to the function called when the card is removed
*
*/
SYS_UWORD16 SIM_Register(void (Insert(void)), void (Remove(void)))
{
SIM_PORT *p;
// Initialize pointers
p = &(Sim[0]);
p->InsertFunc = Insert;
p->RemoveFunc = Remove;
return (SIM_OK);
}
/*
* High level routines : mapped to GSM 11.11 function calls
*
* Uses a Nucleus semaphore to ensure no simultaneous access to SIM and buffer
*
* Each routine does :
* write command
* sleep long enough for the expected transmission and reception
* return rest code
*
* SYS_UWORD8 *result : pointer to the string return by the SIM card
* SYS_UWORD8 *rcvSize : size of the string return by the SIM card
*
* other parameters : parameters needed by the SIM card to
* execute the function.
*
*/
/*
* SIM_Select
*
* Select a DF or a EF
*/
SYS_UWORD16 SIM_Select(SYS_UWORD16 id, SYS_UWORD8 *dat, SYS_UWORD8 *rcvSize)
{
SIM_PORT *p;
int res;
p = &(Sim[0]);
p->xbuf[0] = GSM_CLASS;
p->xbuf[1] = SIM_SELECT;
p->xbuf[2] = 0;
p->xbuf[3] = 0;
p->xbuf[4] = 2;
p->xbuf[5] = id >> 8; // high byte
p->xbuf[6] = id & 0xFF; // low byte
res = SIM_Command(p, 2, dat, rcvSize);
/* Change from to 10 to 15 for specific SIM card (Racal) */
#ifdef SIM_DEBUG_TRACE
SIM_dbg_write_trace((SYS_UWORD8 *)"AACMD", 5);
SIM_dbg_write_trace(p->xbuf, 7);
SIM_dbg_write_trace((SYS_UWORD8 *)"AAANS", 5);
SIM_dbg_tmp[0] = (SYS_WORD8)(res>>8);
SIM_dbg_tmp[1] = (SYS_WORD8)res;
SIM_dbg_write_trace(SIM_dbg_tmp, 2);
SIM_dbg_write_trace(SIM_dbg_null, SIM_DBG_NULL);
if (SIM_dbg_tdma_diff > SIM_dbg_max_interchardelay)
SIM_dbg_max_interchardelay = SIM_dbg_tdma_diff;
SIM_dbg_tmp[0] = (SYS_UWORD8)(SIM_dbg_tdma_diff >> 8);
SIM_dbg_tmp[1] = (SYS_UWORD8)(SIM_dbg_tdma_diff);
SIM_dbg_write_trace(SIM_dbg_tmp, 2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -