⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 simd.c

📁 8032底层驱动部分。因为可以移植 所以单独来拿出来
💻 C
📖 第 1 页 / 共 5 页
字号:
/* under construction !*/
/* under construction !*/
/* under construction !*/
/* under construction !*/
  #endif
   /*for clock stop mode*/
   SIM_DisAllIntr();
   
   if (SimCard.clkStop == KAL_TRUE)
   {
      SIM_ActiveClk();
   }
   else
   {
      DRVPDN_Disable(DRVPDN_CON1,DRVPDN_CON1_SIM,PDN_SIM);
   }

   SIM_DisAllIntr();
   
   if( (SimCard.Speed != Speed372) &&
       ((DRV_Reg(SIM_CTRL)) & SIM_CTRL_HALT) 
     )     
   {
      DRV_Reg(SIM_CONF) &= ~SIM_CONF_TOUTEN;
      SIM_SetTOUT(ClkStopTimeTable[SimCard.Speed][0]*TOUT_Factor);
      DRV_Reg(SIM_CONF) |= SIM_CONF_TOUTEN;
      SimCard.cmdState = SIM_ProcessClk;
      DRV_WriteReg(SIM_IRQEN,SIM_IRQEN_TOUT);
      SIM_WaitEvent(SimCard,CLK_PROC);
   }
	else if(SimCard.is_err && SimCard.Speed == Speed32) // to solve ROSSINI SIM issue
	{		
		kal_uint32 t1;
	
		t1 = SIM_GetCurrentTime();
		while((SIM_GetCurrentTime()-t1) < 5); // delay 500 clock cycles (152us) 
		
	}
   DRV_Reg(SIM_CONF) &= ~SIM_CONF_TOUTEN;

   kal_set_eg_events(SimCard.event,0,KAL_AND);  //2: NU_AND
   
   SIM_SetTOUT(TOUTValue);
   SIM_FIFO_Flush();
   *Error = KAL_FALSE;
   SimCard.recDataErr = KAL_FALSE;
	
#ifdef SIM_ADDDMA
   txaddr = (kal_uint32)txData;
   rxaddr = (kal_uint32)result;
#else /*SIM_ADDDMA*/
   SimCard.txbuffer = txData;
   SimCard.txsize = txSize;
   SimCard.rxbuffer = result;
   SimCard.recDataLen = 0;
#ifdef NoT0CTRL 
   SimCard.recsize = expSize;
   SimCard.txindex = 0;
   SimCard.INS = *(txData+1);
#endif   /*NoT0CTRL*/
#endif/*SIM_ADDDMA*/

#ifndef NoT0CTRL
   INS = (kal_uint16)*(txData+1);
   SIM_SetIMP3(*(txData+4));
   SimCard.cmdState = SIM_WaitCmdEnd;
#endif   /*NoT0CTRL*/
   
#ifdef SIM_ADDDMA   
   for(index=0;index<5;index++)
   {
      DRV_WriteReg(SIM_DATA,*(txData+index));
   }
   //DRVPDN_Disable(DRVPDN_CON0,DRVPDN_CON0_DMA,PDN_DMA);
   
   #if ( (defined(MT6205)) || (defined(MT6205B)) )
      DMA2_Stop();
   #else /*!MT6205, MT6205B*/
      DMA_Stop(sim_dmaport);
   #endif   /*MT6205, MT6205B*/
   SIM_SetRXTIDE(1);
   if (expSize == 0)
   {
      SIM_SetTXTIDE(0);
      #if ( defined(MT6205) || defined(MT6205B) )
         SIM_DMAIni(KAL_TRUE); //Transmit
         DMA2_Init((txaddr+5),SIM_DATA,txSize-5,NULL);
         /*DMA2_Start();*/
      #elif defined(MT6218B)
         sim_menu.source  = (kal_uint32)(txaddr+5);  /*1*/
         sim_menu.destination = SIM_DATA;
         sim_input.type = DMA_HWTX; /*2*/
         sim_input.count = txSize-5;       /*3*/
			if(sim_input.count > SIM_TX_DELAY_LEN && SimCard.Speed > Speed372 
				&& SimCard.is_err)
				txDelay = KAL_TRUE;			
         sim_input.callback = NULL;   /*4*/
      #else /*MT6218, MT6219, MT6217, MT6226, MT6227, MT6228, MT6229*/
         sim_menu.addr = (kal_uint32)(txaddr+5);  /*1*/
         sim_input.type = DMA_HWTX; /*2*/
         sim_input.count = txSize-5;       /*3*/
			if(sim_input.count > SIM_TX_DELAY_LEN && SimCard.Speed > Speed372)
				txDelay = KAL_TRUE;
         sim_input.callback = NULL;   /*4*/
         /*DMA_Config(sim_dmaport, &sim_input, KAL_TRUE);     */
      #endif

      INS |= SIM_INS_INSD;
   }
   else
   {
      SIM_SetTXTIDE(0xffff);
      
      #if ( defined(MT6205) || defined(MT6205B) )
         SIM_DMAIni(KAL_FALSE); //Receive
         DMA2_Init(SIM_DATA,rxaddr,expSize,NULL);
         /*DMA2_Start();*/
      #elif defined(MT6218B)
         sim_menu.source  = SIM_DATA;                 /*1*/
 			sim_menu.destination = (kal_uint32)(rxaddr);
         sim_input.type = DMA_HWRX; /*2*/
         sim_input.count = expSize;       /*3*/
         sim_input.callback = NULL;   /*4*/
      #else /*MT6218, MT6219, MT6217, MT6226, MT6227, MT6228, MT6229*/
         sim_menu.addr = (kal_uint32)(rxaddr);  /*1*/
         sim_input.type = DMA_HWRX; /*2*/
         sim_input.count = expSize;       /*3*/
         sim_input.callback = NULL;   /*4*/
         /*DMA_Config(sim_dmaport, &sim_input, KAL_TRUE);  */
      #endif
   }
   temp = DRV_Reg(SIM_STS);
   DRV_WriteReg(SIM_IRQEN,SIM_IRQEN_CMDDMANormal);
#else /*SIM_ADDDMA*/
#ifdef NoT0CTRL
   for(index=0;index<5;index++)
   {
      DRV_WriteReg(SIM_DATA,*(txData+index));
   }
   SimCard.txindex = 5;
   SimCard.cmdState = SIM_WaitProcByte;
   
   if (expSize == 0) //Transmit
   {
      if (txSize == 5)
      {
         SIM_SetRXTIDE(2);
      }
      else
      {
         SIM_SetRXTIDE(1);
      }
   }
   else
   {
      if ((expSize+3) > 15)
      {
         SIM_SetRXTIDE(CMD_RECBUFSIZE-8);
      }
      else
      {
         SIM_SetRXTIDE(expSize+3);
      }
   }
   temp = DRV_Reg(SIM_STS);
   DRV_WriteReg(SIM_IRQEN,SIM_IRQEN_CMDNormal);
#else /*NoT0CTRL*/
   if(txSize <= 15)
   {
      for(index=0;index<txSize;index++)
      {
         DRV_WriteReg(SIM_DATA,*(txData+index));
      }
      SimCard.txindex = txSize;
      temp = DRV_Reg(SIM_STS);
      DRV_WriteReg(SIM_IRQEN,SIM_IRQEN_CMDNormal);
   }
   else
   {
      for(index=0;index<15;index++)
      {
         DRV_WriteReg(SIM_DATA,*(txData+index));
      }
      SimCard.txindex = 15;
      SIM_SetTXTIDE(0);
      temp = DRV_Reg(SIM_STS);
      DRV_WriteReg(SIM_IRQEN,(SIM_IRQEN_CMDNormal|SIM_IRQEN_TX));
   }
  
   if (expSize > 0)
   {
      if (expSize > 15)
      {
         SIM_SetRXTIDE(CMD_RECBUFSIZE);
      }
      else
      {
         SIM_SetRXTIDE(expSize);
      }
      /* maybe changed for 64k rate */
   }
   else
   {
      INS |= SIM_INS_INSD;
   }
#endif /*NoT0CTRL*/
#endif/*SIM_ADDDMA*/

#ifdef SIM_ADDDMA
   #if ( defined(MT6205) || defined(MT6205B) )
      //DMA2_Start();
   #elif defined(MT6218B)
		if(txDelay == KAL_TRUE)
		{
			kal_uint32 i,j;
			
			i = SIM_TX_DELAY_LOOP;
			j = SIM_TX_DELAY_LOOP*10;
			while(j--)
			{
				if(DRV_Reg(SIM_STATUS)&(SIM_STATUS_ACK|SIM_STATUS_NACK))
					break;
			}			
			while(i--);
		}	
      DMA_FullSize_Config(sim_dmaport, &sim_input, KAL_FALSE);
   #else /*MT6218, MT6219, MT6217, MT6226, MT6227, MT6228, MT6229*/
		/* add delay(1ms) between ACK and first transmit data for enhance speed card */
		if(txDelay == KAL_TRUE)
		{
			volatile kal_uint32 t1,t2;
			kal_uint32 loop = SIM_TX_DELAY_LOOP*10;
			
			while(loop--)
			{
				if(DRV_Reg(SIM_STATUS)&(SIM_STATUS_ACK|SIM_STATUS_NACK))
					break;
			}			
			t1 = SIM_GetCurrentTime();
			do{
			t2 = SIM_GetCurrentTime();		
			}while(SIM_GetDurationTick(t1,t2) < 32);
		}	
      DMA_Config(sim_dmaport, &sim_input, KAL_FALSE);
   #endif
#endif   /*SIM_ADDDMA*/

	{
		kal_uint32 savedMask;
		extern void DMA_Run(kal_uint8 channel);
		
		savedMask = SaveAndSetIRQMask();
#ifndef    NoT0CTRL
		SIM_SetCmdINS(INS);
#endif   /*NoT0CTRL*/

#ifdef SIM_ADDDMA
	#if ( defined(MT6205) || defined(MT6205B) )
	DMA2_Start();
	#else	
	DMA_Run(sim_dmaport);	
	#endif
#endif   /*SIM_ADDDMA*/
		RestoreIRQMask(savedMask);
	}

   DRV_Reg(SIM_CONF) |= SIM_CONF_TOUTEN;   
   SIM_WaitEvent(SimCard,CMD_END);

#ifdef SIM_ADDDMA
   #if ( defined(MT6205) || defined(MT6205B) )
      DMA2_Stop();
   #else /*MT6218, MT6218B, MT6219, MT6217, MT6226, MT6227, MT6228, MT6229*/
      DMA_Stop(sim_dmaport);
   #endif
#endif   /*SIM_ADDDMA*/
   
#ifdef NoT0CTRL
   SimCard.initialPower = SimCard.cmdState;
   SimCard.cmdState = SIMD_CmdIdle;
#endif   /*NoT0CTRL*/
   
   if (SimCard.result == SIM_SUCCESS && SimCard.recDataErr == KAL_FALSE)
   {
    #ifdef  SIM_ADDDMA
    if(expSize != 0) 
       *rcvSize = expSize - DRV_Reg(SIM_IMP3);
   //DRVPDN_Enable(DRVPDN_CON0,DRVPDN_CON0_DMA,PDN_DMA);
    #else /*SIM_ADDDMA*/
   *rcvSize = SimCard.recDataLen;
    #endif /*SIM_ADDDMA*/
    
      #ifdef NoT0CTRL
      SW = (SimCard.SW2 | (SimCard.SW1 << 8));
      #else /*NoT0CTRL*/
      SIM_ObtainSW(SW);
      #endif   /*NoT0CTRL*/
      //dbg_print("SW=%x\r\n",SW);
      /*for clock stop mode*/
      if(SimCard.clkStop == KAL_TRUE)
      {
         SIM_DisAllIntr();
         DRV_Reg(SIM_CONF) &= ~SIM_CONF_TOUTEN;
         SIM_SetTOUT(ClkStopTimeTable[SimCard.Speed][1]*TOUT_Factor);
         DRV_Reg(SIM_CONF) |= SIM_CONF_TOUTEN;
         SimCard.cmdState = SIM_StopClk;
         DRV_WriteReg(SIM_IRQEN,SIM_IRQEN_TOUT);
      }
      return SW;
   }
   else
   {
   	kal_sprintf(sim_dbg_str,"[SIM]:SIM_CMD fail status = %d", SimCard.result);
   	kal_print(sim_dbg_str);
      //SimCard.recDataErr = KAL_FALSE;
		SimCard.is_err = KAL_TRUE;
      *Error = KAL_TRUE;
      return 0;
   }
}

/*
* FUNCTION
*	L1sim_Enable_Enhanced_Speed
*
* DESCRIPTION                                                           
*   	The function must call before L1sim_Reset. Otherwise, enhance speed is disable.
*     This function can enable enhance speed mode or not.
*
* CALLS  
*
* PARAMETERS
*	enable: KAL_TRUE: enable enhanced speed. KAL_FALSE: disable it.
*
* RETURNS
*	NULL
*
* GLOBALS AFFECTED
*   external_global
*/
void L1sim_Enable_Enhanced_Speed(kal_bool enable)
{
   PTS_check = enable;
}
/*
* FUNCTION                                                            
*	L1sim_Cmd
*
* DESCRIPTION                                                           
*   	The function is used to implement re-try command mechanism.
*
* CALLS  
*
* PARAMETERS
*	txData: Pointer to the transmitted command and data.
*	txSize:	The size of the transmitted command and data from AL to driver.
*	expSize: The size of expected data from SIM
*	result: Pointer to received data 
* 	rcvSize: Pointer to the size of data received
*	parityError: 1 (parity error) or 0(no parity error)
*
* RETURNS
*	status(high byte:sw1 low byte: sw2)
*
* GLOBALS AFFECTED
*   external_global
*/
sim_card_speed_type L1sim_Get_CardSpeedType(void)
{
   return SimCard.sim_card_speed;
}

/*
* FUNCTION                                                            
*	L1sim_Cmd
*
* DESCRIPTION                                                           
*   	The function is used to implement re-try command mechanism.
*
* CALLS  
*
* PARAMETERS
*	txData: Pointer to the transmitted command and data.
*	txSize:	The size of the transmitted command and data from AL to driver.
*	expSize: The size of expected data from SIM
*	result: Pointer to received data 
* 	rcvSize: Pointer to the size of data received
*	parityError: 1 (parity error) or 0(no parity error)
*
* RETURNS
*	status(high byte:sw1 low byte: sw2)
*
* GLOBALS AFFECTED
*   external_global
*/
kal_uint16 L1sim_Cmd(kal_uint8  *txData,kal_uint16  txSize,kal_uint8  *result,kal_uint16  *rcvSize, kal_uint8 *Error)
{
   kal_uint8 index;
   kal_uint16 SW;
   if (SimCard.State != SIM_PROCESSCMD)
   {
      *Error = KAL_TRUE;
      return 0;
   }   
   // while encounter physical errors, deactivate the SIM immediately
   for(index=0;index<3;index++)
   {
   	SimCard.timeout = KAL_FALSE;
      SW = SIM_CMD(txData,txSize,result,rcvSize,Error);
      #if defined(__USIM_DRV__)
		if(SimCard.timeout && SimCard.app_proto == USIM_PROTOCOL)
		{
			L1sim_PowerOff();	
			return SW;
		}
		#endif
      if (*Error == 0)
         break;
   }
   
   if ( ((SW&0xf000) != 0x6000) && ((SW&0xf000) != 0x9000) )
   {
      *Error = KAL_TRUE;
   }
   return SW;
}

#ifdef MT6218B
void SIM_BaudDMA_START(void)
{
   if ( (SimCard.Speed == Speed372) && (INT_ecoVersion() < GN) )
   {
      dma_ch1_start((kal_uint32)baud_data);
   }
}
#endif   /*MT6218B*/
/*
* FUNCTION                                                            
*	L1sim_Init
*
* DESCRIPTION                                                           
*   	The function L1sim_Init initialize the SIM driver.
*
* CALLS  
*
* PARAMETERS
*	None
*
* RETURNS
*	None
*
* GLOBALS AFFECTED
*   external_global
*/
void L1sim_Init(void)		//Validate
{
	kal_uint16 tmp;
	SimCard.SIM_ENV = SIM_GetCurrentEnv();
	if (SimCard.SIM_ENV == ME_30V_ONLY)
	{
	   SimCard.Power = SIM_30V;
	}
	else
	{
	   SimCard.Power = SIM_18V;
	}

	SimCard.Data_format = SIM_direct;
	SimCard.State = SIM_WAIT_FOR_ATR;
	SimCard.clkStop = KAL_FALSE;
	SimCard.Speed = Speed372;

#if (defined(MT6218B))
   #ifdef SIM_ADDDMA
      if (sim_dmaport == 0)
      {
         kal_uint16 baud_index;
         if (INT_ecoVersion() < GN)
         {
            for(baud_index=0;baud_index<640;baud_index++)
            {
               if (((baud_index+1)&3)!=0)
                  baud_data[baud_index] = (SIM_BRR_CLK_Div4 | SIM_BRR_BAUD_Div372);
               else
                  baud_data[baud_index] = (SIM_BRR_CLK_Div4 | (0x17<<2));
            }
            dma_ch1_init(SIM_BRR,sizeof(baud_data), 0xb9);
         }
         sim_dmaport = DMA_FullSize_GetChannel(DMA_SIM);         
      }
      
      sim_menu.TMOD.burst_mode = 0;
      sim_menu.master = DMA_SIM;
      sim_menu.source = NULL;      /*1*/
      sim_menu.destination = NULL;
      
      sim_input.type = DMA_HWTX; /*2*/
      sim_input.size = DMA_BYTE;
      sim_input.menu = &sim_menu;
      sim_input.count = 0;       /*3*/
      sim_input.callback = NULL;   /*4*/
   #endif   /*SIM_ADDDMA*/
#elif ( (!defined(MT6205)) && (!defined(MT6205B)) )
   /*MT6218,MT6219,MT6217, MT6226, MT6227, MT6228, MT6229*/
   #ifdef SIM_ADDDMA
      if (sim_dmaport == 0)
         sim_dmaport = DMA_GetChannel(DMA_SIM);
      
      sim_menu.TMOD.burst_mode = 0;
      sim_menu.master = DMA_SIM;
      sim_menu.addr = NULL;  /*1*/
      
      sim_input.type = DMA_HWTX; /*2*/
      sim_input.size = DMA_BYTE;
      sim_input.menu = &sim_menu;
      sim_input.count = 0;       /*3*/
      sim_input.callback = NULL;   /*4*/
   #endif   /*SIM_ADDDMA*/
#endif

	tmp = DRV_Reg(SIM_STS);

	if (SimCard.event == NULL)
	   SimCard.event = kal_create_event_group("SIMEVT");

   DRV_Register_HISR(DRV_SIM_HISR_ID, SIM_HISR);
   IRQ_Register_LISR(IRQ_SIM_CODE, SIM_LISR,"SIM handler");

	IRQSensitivity(IRQ_SIM_CODE,LEVEL_SENSITIVE);
	IRQUnmask(IRQ_SIM_CODE);
}
#endif
//================================ Layer type SIM driver start ==================================
/*************************************************************************
* FUNCTION
*  L1sim_Cmd_Layer
*
* DESCRIPTION
*	Layer type sim driver (transport layer) which maps C-APDU into C-TPDU for T=0
*
* PARAMETERS

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -