#include /* for EnableInterrupts macro */ #include "derivative.h" /* include peripheral declarations */ #include "gpio.h" #include "RTIconfig.h" #include "tpm.h" #include "kbi.h" #include "vksp_tx_cfg.h" #include "RTIconfig.h" #include "Flash.h" #include "Phy.h" #include "key.h" /* system mode selection */ #define NORMAL_MODE //#define DEBUG_MODE //#define POWER_CONSUMPTION_TEST /* key fob function definition */ #define RKE_LOCK 0 #define RKE_UNLOCK 1 #define RKE_OPEN_TRUNK 2 #define RKE_CAR_LOCATION 3 /* Special Msg Headers, must be used */ #define APP_HDR1 0x11 #define APP_END1 0x83 /* Transmission buffer */ VkspTx_MessageType Vksp_message[19] = {APP_HDR1,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,APP_END1,0x01}; const byte STATE_NORMAL = 0x00; const byte STATE_SLEEP = 0x01; UINT8 gu8McuState = STATE_NORMAL; UINT8 gu8_VkspDelay = 0; UINT8 keyScan_cnt = 0; UINT16 keyScan_Delay = 0; #define KEY_DELAY_TIMEOUT 7500 /* 7500*200us = 1.5s */ #define LED_ON() (PTAD_PTAD4 = 0) #define LED_OFF() (PTAD_PTAD4 = 1) #define LED_TOGGLE() (PTAD_PTAD4 ^= 0x01) /*******************************************************************************/ /** * \brief delay - Heuristic Delay * \author IM * \param void * \return void * \todo */ void delay(void) { unsigned int i; for (i=0;i<0xFFFF;i++) { ; } } /* *********************************************************************** * *Syntax ics_init() *Description: ICS module initilization,FEI mode, ICSOUT = 8MHz *Input : None *Output : None * ************************************************************************ */ void ics_init(void) { ICSTRM = *((byte*)0xffaf); ICSSC = *((byte*)0xffae); ICSC1 = ICSC1_IREFS_MASK | ICSC1_IREFSTEN; ICSC2 = ICSC2_BDIV1_MASK; while(ICSSC_CLKST != 0b00); //make sure PLL out put selected as the ICSOUT clock source } /* *********************************************************************** * *Syntax main() *Description: main *Input : None *Output : None * ************************************************************************ */ void main(void) { /* varialbles definition */ #ifdef DEBUG_MODE SOPT1 = SOPT1_STOPE_MASK+SOPT1_BKGDPE_MASK; /* STOP mode enable and BKGD pin enable*/ #else if NORMAL_MODE SOPT1 = SOPT1_STOPE_MASK; /* STOP mode enable */ #endif SPMSC1_LVDE = 0; SPMSC1_LVDSE = 0; SPMSC2_PDC = 0; SPMSC2_PPDC = 1; ICSTRM = *(unsigned char*)0xFFAF; /* Initialize ICSTRM register from a non volatile memory */ ICSSC = *(unsigned char*)0xFFAE; /* Initialize ICSSC register from a non volatile memory */ /* ICS is defaultly in FEI mode, BUS clock is 4MHz, TPM sourcing from BUS clock, prescaler is 1; */ /* end of MCU Initialization */ /* Drivers Initialization */ InitPort(); LED_ON(); FlashInit(); vfnVkspTx_Init(&sVksp_InitStruct); initRTI(); keyInit(Switch,KEY_NUM_MAX); LED_OFF(); /* enable interrupts */ EnableInterrupts; #ifdef POWER_CONSUMPTION_TEST /* Init Timer */ TPMMODH = 0x03; TPMMODL = 0x20; TPMSC = 0x48; while(1); #endif #ifndef POWER_CONSUMPTION_TEST /* main loop */ for(;;) { if(gu8McuState == STATE_NORMAL) { /* Init Timer */ TPMMODH = 0x03; TPMMODL = 0x20; TPMSC = 0x48; /* end of Timer Initialization */ /* If button SW_CAR_LOCATION long pressed, enter into learning mode */ if (keyGetHoldRelease(&SW_CAR_LOCATION)) { vfnVkspTx_PerformLearningSequence1(&Vksp_message[1]); LED_ON(); vfnPhySendMsg(Vksp_message, 19); LED_OFF(); delay(); vfnVkspTx_PerformLearningSequence2(&Vksp_message[1]); LED_ON(); vfnPhySendMsg(Vksp_message, 19); LED_OFF(); delay(); delay(); delay(); delay(); } /* If button SW_LOCK is pressed */ if (keyGetRelease(&SW_LOCK)) { vfnVkspTx_GenerateFrame(RKE_LOCK,&Vksp_message[1]); LED_ON(); vfnPhySendMsg(Vksp_message, 19); LED_OFF(); delay(); } /* If button SW_UNLOCK is pressed */ if (keyGetRelease(&SW_UNLOCK)) { vfnVkspTx_GenerateFrame(RKE_UNLOCK,&Vksp_message[1]); macroActivateOutput(); LED_ON(); vfnPhySendMsg(Vksp_message, 19); LED_OFF(); delay(); } /* If button SW_OPEN_TRUNK is pressed */ if (keyGetRelease(&SW_OPEN_TRUNK)) { vfnVkspTx_GenerateFrame(RKE_OPEN_TRUNK,&Vksp_message[1]); macroActivateOutput(); LED_ON(); vfnPhySendMsg(Vksp_message, 19); LED_OFF(); delay(); } /* If button SW_CAR_LOCATION is pressed */ if (keyGetRelease(&SW_CAR_LOCATION)) { vfnVkspTx_GenerateFrame(RKE_CAR_LOCATION,&Vksp_message[1]); LED_ON(); vfnPhySendMsg(Vksp_message, 19); LED_OFF(); delay(); } /* prepare enter into low power mode by activating RTI */ while(u8fnPhyGetState() != PHY_STATE_JOB_IDLE){;} if(keyScan_Delay == KEY_DELAY_TIMEOUT) { gu8McuState = STATE_SLEEP; InitKBI(); InitPort(); TPMSC = 0x00; initRTI(); } } if(gu8McuState == STATE_SLEEP) { EnterStopMode(); asm stop; } } /* loop forever */ /* please make sure that you never leave main */ #endif } /*****************************************************************************/ /*****************************************************************************/