/*************************************************************************************************** * @fn HalLedOnOff * * @brief Turns specified LED ON or OFF * * @param leds - LED bit mask * mode - LED_ON,LED_OFF, * * @return none ***************************************************************************************************/ void HalLedOnOff (uint8 leds, uint8 mode) { if (leds & HAL_LED_1) { if (mode == HAL_LED_MODE_ON) { HAL_TURN_ON_LED1(); } else { HAL_TURN_OFF_LED1(); } } if (leds & HAL_LED_2) { if (mode == HAL_LED_MODE_ON) { HAL_TURN_ON_LED2(); } else { HAL_TURN_OFF_LED2(); } } if (leds & HAL_LED_3) { if (mode == HAL_LED_MODE_ON) { HAL_TURN_ON_LED3(); } else { HAL_TURN_OFF_LED3(); } } if (leds & HAL_LED_4) { if (mode == HAL_LED_MODE_ON) { HAL_TURN_ON_LED4(); } else { HAL_TURN_OFF_LED4(); } } /* Remember current state */ if (mode) { HalLedState |= leds; } else { HalLedState &= (leds ^ 0xFF); } }
void sleep(void) { if (HAL_STATE_LED2()) { HAL_TURN_OFF_LED1(); HAL_TURN_OFF_LED3(); HAL_TURN_ON_LED2(); for(uint8 n=0;n<30;n++) for(uint8 i=0;i<200;i++) MicroWait(50000); HAL_TURN_OFF_LED2(); //sbBinded = 0; } }
/*************************************************************************************************** * @fn HalLedOnOff * * @brief Turns specified LED ON or OFF * * @param leds - LED bit mask * mode - LED_ON,LED_OFF, * * @return none ***************************************************************************************************/ void HalLedOnOff( uint8 leds, uint8 mode ) { if ( leds & HAL_LED_1 ) { if ( mode == HAL_LED_MODE_ON ) HAL_TURN_ON_LED1(); else HAL_TURN_OFF_LED1(); } if ( leds & HAL_LED_2 ) { if ( mode == HAL_LED_MODE_ON ) HAL_TURN_ON_LED2(); else HAL_TURN_OFF_LED2(); } if ( leds & HAL_LED_3 ) { if ( mode == HAL_LED_MODE_ON ) HAL_TURN_ON_LED3(); else HAL_TURN_OFF_LED3(); } if ( leds & HAL_LED_4 ) { if ( mode == HAL_LED_MODE_ON ) HAL_TURN_ON_LED4(); else HAL_TURN_OFF_LED4(); } // Remember current state if ( mode ) ledState |= leds; else ledState &= (0xff ^ leds); }
/************************************************************************************************** * @fn halAssertHazardLights * * @brief Blink LEDs to indicate an error. * * @param none * * @return none ************************************************************************************************** */ void halAssertHazardLights(void) { enum { DEBUG_DATA_RSTACK_HIGH_OFS, DEBUG_DATA_RSTACK_LOW_OFS, DEBUG_DATA_TX_ACTIVE_OFS, DEBUG_DATA_RX_ACTIVE_OFS, #if (defined HAL_MCU_AVR) || (defined HAL_MCU_CC2430) DEBUG_DATA_INT_MASK_OFS, #elif (defined HAL_MCU_CC2530) || (defined HAL_MCU_CC2533) DEBUG_DATA_INT_MASK0_OFS, DEBUG_DATA_INT_MASK1_OFS, #endif DEBUG_DATA_SIZE }; uint8 buttonHeld; uint8 debugData[DEBUG_DATA_SIZE]; /* disable all interrupts before anything else */ HAL_DISABLE_INTERRUPTS(); /*------------------------------------------------------------------------------- * Initialize LEDs and turn them off. */ HAL_BOARD_INIT(); HAL_TURN_OFF_LED1(); HAL_TURN_OFF_LED2(); HAL_TURN_OFF_LED3(); HAL_TURN_OFF_LED4(); /*------------------------------------------------------------------------------- * Master infinite loop. */ for (;;) { buttonHeld = 0; /*------------------------------------------------------------------------------- * "Hazard lights" loop. A held keypress will exit this loop. */ do { HAL_LED_BLINK_DELAY(); /* toggle LEDS, the #ifdefs are in case HAL has logically remapped non-existent LEDs */ #if (HAL_NUM_LEDS >= 1) HAL_TOGGLE_LED1(); #if (HAL_NUM_LEDS >= 2) HAL_TOGGLE_LED2(); #if (HAL_NUM_LEDS >= 3) HAL_TOGGLE_LED3(); #if (HAL_NUM_LEDS >= 4) HAL_TOGGLE_LED4(); #endif #endif #endif #endif /* escape hatch to continue execution, set escape to '1' to continue execution */ { static uint8 escape = 0; if (escape) { escape = 0; return; } } /* break out of loop if button is held long enough */ if (HAL_PUSH_BUTTON1()) { buttonHeld++; } else { buttonHeld = 0; } } while (buttonHeld != 10); /* loop until button is held specified number of loops */ /*------------------------------------------------------------------------------- * Just exited from "hazard lights" loop. */ /* turn off all LEDs */ HAL_TURN_OFF_LED1(); HAL_TURN_OFF_LED2(); HAL_TURN_OFF_LED3(); HAL_TURN_OFF_LED4(); /* wait for button release */ HAL_DEBOUNCE(!HAL_PUSH_BUTTON1()); /*------------------------------------------------------------------------------- * Load debug data into memory. */ #ifdef HAL_MCU_AVR { uint8 * pStack; pStack = (uint8 *) SP; pStack++; /* point to return address on stack */ debugData[DEBUG_DATA_RSTACK_HIGH_OFS] = *pStack; pStack++; debugData[DEBUG_DATA_RSTACK_LOW_OFS] = *pStack; } debugData[DEBUG_DATA_INT_MASK_OFS] = EIMSK; #endif #if (defined HAL_MCU_CC2430) debugData[DEBUG_DATA_INT_MASK_OFS] = RFIM; #elif (defined HAL_MCU_CC2530) || (defined HAL_MCU_CC2533) debugData[DEBUG_DATA_INT_MASK0_OFS] = RFIRQM0; debugData[DEBUG_DATA_INT_MASK1_OFS] = RFIRQM1; #endif #if (defined HAL_MCU_AVR) || (defined HAL_MCU_CC2430) || (defined HAL_MCU_CC2530) || \ (defined HAL_MCU_CC2533) || (defined HAL_MCU_MSP430) debugData[DEBUG_DATA_TX_ACTIVE_OFS] = macTxActive; debugData[DEBUG_DATA_RX_ACTIVE_OFS] = macRxActive; #endif /* initialize for data dump loop */ { uint8 iBit; uint8 iByte; iBit = 0; iByte = 0; /*------------------------------------------------------------------------------- * Data dump loop. A button press cycles data bits to an LED. */ while (iByte < DEBUG_DATA_SIZE) { /* wait for key press */ while(!HAL_PUSH_BUTTON1()); /* turn on all LEDs for first bit of byte, turn on three LEDs if not first bit */ HAL_TURN_ON_LED1(); HAL_TURN_ON_LED2(); HAL_TURN_ON_LED3(); if (iBit == 0) { HAL_TURN_ON_LED4(); } else { HAL_TURN_OFF_LED4(); } /* wait for debounced key release */ HAL_DEBOUNCE(!HAL_PUSH_BUTTON1()); /* turn off all LEDs */ HAL_TURN_OFF_LED1(); HAL_TURN_OFF_LED2(); HAL_TURN_OFF_LED3(); HAL_TURN_OFF_LED4(); /* output value of data bit to LED1 */ if (debugData[iByte] & (1 << (7 - iBit))) { HAL_TURN_ON_LED1(); } else { HAL_TURN_OFF_LED1(); } /* advance to next bit */ iBit++; if (iBit == 8) { iBit = 0; iByte++; } } } /* * About to enter "hazard lights" loop again. Turn off LED1 in case the last bit * displayed happened to be one. This guarantees all LEDs are off at the start of * the flashing loop which uses a toggle operation to change LED states. */ HAL_TURN_OFF_LED1(); } }
/************************************************************************************************** * @fn main * * @brief C-code main functionality. * * input parameters * * None. * * output parameters * * None. * * @return None. ************************************************************************************************** */ void main(void) { uint8 time_spent_validating; uint8 bootloaderForcedByMainApp = FALSE; uint32 mainAppCommandLocal = mainAppCommand; vddWait(VDD_MIN_RUN); mainAppCommand = MAIN_APP_CMD_NONE; if (mainAppCommandLocal == MAIN_APP_CMD_FORCE_BOOTLOADER) { bootloaderForcedByMainApp = TRUE; } else if ((mainAppCommandLocal == MAIN_APP_CMD_PASS_THROUGH) || ((SLEEPSTA & LRESET) == RESETWD)) { // If reset due to WatchDog Timer - Transfer control to the main application immediately. // WatchDog Timer reset causes the hardware to disconnect the USB. Withought this jump here, // the SBL code will try to initiaize the CDC too early, which causes undesired behavior on the host // (e.g. on beaglebone black - the host gets stuck) asm("LJMP 0x2000\n"); } sblInit(bootloaderForcedByMainApp); HAL_TURN_ON_LED1(); HAL_TURN_ON_LED2(); if ((!bootloaderForcedByMainApp) && (sbImgValid(&time_spent_validating))) { HAL_TURN_OFF_LED2(); if (sblWait(SBL_WAIT_TIME > time_spent_validating ? SBL_WAIT_TIME - time_spent_validating : 0)) { HAL_TURN_OFF_LED1(); sbReportState(SB_STATE_EXECUTING_IMAGE); while(sblIsUartTxPending()) { sbUartPoll(); } SLEEP(0x2600); //Give the last bytes in the HW TX fifo (if any) enough time to be transmitted while (SB1_PRESS || SB2_PRESS); sblUnInit(); // Simulate a reset for the Application code by an absolute jump to location 0x2000. asm("LJMP 0x2000\n"); } } HAL_TURN_OFF_LED1(); HAL_TURN_ON_LED2(); vddWait(VDD_MIN_NV); sblExec(); sblUnInit(); asm("LJMP 0x2000\n"); }