/**************************************************************************** * * NAME: vAppMain * * DESCRIPTION: * Entry point for application from a cold start. * * RETURNS: * Never returns. * ****************************************************************************/ PUBLIC void vAppMain(void) { /* Initialise the debug diagnostics module to use UART0 at 115K Baud; * UART 1 cannot be used as it shares DIO with the LEDS */ DBG_vUartInit(DBG_E_UART_0, DBG_E_UART_BAUD_RATE_115200); /* * Initialise the stack overflow exception to trigger if the end of the * stack is reached. See the linker command file to adjust the allocated * stack size. */ vAHI_SetStackOverflow(TRUE, (uint32)&stack_low_water_mark); /* * Catch resets due to watchdog timer expiry. */ if (bAHI_WatchdogResetEvent()) { DBG_vPrintf(TRACE_APP, "APP: Watchdog timer has reset device!\n"); /* un-comment to trap watchdog resets here */ //vAHI_WatchdogStop(); //while (1); } /* initialise ROM based software modules */ u32AppApiInit(NULL, NULL, NULL, NULL, NULL, NULL); /* Un-comment this line in order to enable high power module */ //vAHI_HighPowerModuleEnable(TRUE, TRUE); /* start the RTOS */ OS_vStart(vInitialiseApp, vUnclaimedInterrupt); /* idle task commences here */ while (TRUE) { /* Re-load the watch-dog timer. Execution must return through the idle * task before the CPU is suspended by the power manager. This ensures * that at least one task / ISR has executed with in the watchdog period * otherwise the system will be reset. APP_bAppHealthy is a belt-and-braces check * on correct application functionality and is a flag set by the main sensor task. */ if (APP_bAppHealthy) { vAHI_WatchdogRestart(); APP_bAppHealthy = FALSE; } /* * suspends CPU operation when the system is idle or puts the device to * sleep if there are no activities in progress */ PWRM_vManagePower(); } }
/**************************************************************************** * * NAME: vAppMain * * DESCRIPTION: * Entry point for application from a cold start. * * RETURNS: * void * ****************************************************************************/ PUBLIC void vAppMain(void) { #if JENNIC_CHIP_FAMILY == JN516x /* Wait until FALSE i.e. on XTAL - otherwise uart data will be at wrong speed */ while (bAHI_GetClkSource() == TRUE); /* Now we are running on the XTAL, optimise the flash memory wait states */ vAHI_OptimiseWaitStates(); #endif /* * Don't use RTS/CTS pins on UART0 as they are used for buttons * */ vAHI_UartSetRTSCTS(E_AHI_UART_0, FALSE); /* * Initialize the debug diagnostics module to use UART0 at 115K Baud; * Do not use UART 1 if LEDs are used, as it shares DIO with the LEDS * */ DBG_vUartInit(DBG_E_UART_0, DBG_E_UART_BAUD_RATE_115200); DBG_vPrintf(TRACE_START, "\nAPP Start: Switch Power Up"); /* * Initialise the stack overflow exception to trigger if the end of the * stack is reached. See the linker command file to adjust the allocated * stack size. */ vAHI_SetStackOverflow(TRUE, (uint32)&_stack_low_water_mark); /* * Catch resets due to watchdog timer expiry. Comment out to harden code. */ if (bAHI_WatchdogResetEvent()) { DBG_vPrintf(TRACE_START, "\nAPP Start: Watchdog timer has reset device!"); DBG_vDumpStack(); #if HALT_ON_EXCEPTION vAHI_WatchdogStop(); while (1); #endif } /* initialise ROM based software modules */ #ifndef JENNIC_MAC_MiniMacShim u32AppApiInit(NULL, NULL, NULL, NULL, NULL, NULL); #endif /* Define HIGH_POWER_ENABLE to enable high power module */ #ifdef HIGH_POWER_ENABLE vAHI_HighPowerModuleEnable(TRUE, TRUE); #endif /* start the RTOS */ OS_vStart(vInitialiseApp, vUnclaimedInterrupt, vOSError); DBG_vPrintf(TRACE_START, "OS started\n"); /* idle task commences here */ while (TRUE) { /* Re-load the watch-dog timer. Execution must return through the idle * task before the CPU is suspended by the power manager. This ensures * that at least one task / ISR has executed with in the watchdog period * otherwise the system will be reset. */ DBG_vPrintf(TRACE_START, "#"); vAHI_WatchdogRestart(); /* * suspends CPU operation when the system is idle or puts the device to * sleep if there are no activities in progress */ PWRM_vManagePower(); DBG_vPrintf(TRACE_START, "?"); } }
/*---------------------------------------------------------------------------*/ #if WITH_TINYOS_AUTO_IDS uint16_t TOS_NODE_ID = 0x1234; /* non-zero */ uint16_t TOS_LOCAL_ADDRESS = 0x1234; /* non-zero */ #endif /* WITH_TINYOS_AUTO_IDS */ int main(void) { /* Set stack overflow address for detecting overflow in runtime */ vAHI_SetStackOverflow(TRUE, ((uint32_t *)&heap_location)[0]); /* Initialize random with a seed from the SoC random generator. * This must be done before selecting the high-precision external oscillator. */ vAHI_StartRandomNumberGenerator(E_AHI_RND_SINGLE_SHOT, E_AHI_INTS_DISABLED); random_init(u16AHI_ReadRandomNumber()); clock_init(); rtimer_init(); #if JN516X_EXTERNAL_CRYSTAL_OSCILLATOR /* initialize the 32kHz crystal and wait for ready */ xosc_init(); /* need to reinitialize because the wait-for-ready process uses system timers */ clock_init(); rtimer_init(); #endif watchdog_init(); leds_init(); leds_on(LEDS_ALL); init_node_mac(); energest_init(); ENERGEST_ON(ENERGEST_TYPE_CPU); node_id_restore(); #if WITH_TINYOS_AUTO_IDS node_id = TOS_NODE_ID; #endif /* WITH_TINYOS_AUTO_IDS */ /* for setting "hardcoded" IEEE 802.15.4 MAC addresses */ #ifdef IEEE_802154_MAC_ADDRESS { uint8_t ieee[] = IEEE_802154_MAC_ADDRESS; memcpy(node_mac, ieee, sizeof(uip_lladdr.addr)); node_mac[7] = node_id & 0xff; } #endif process_init(); ctimer_init(); uart0_init(UART_BAUD_RATE); /* Must come before first PRINTF */ #if NETSTACK_CONF_WITH_IPV4 slip_arch_init(UART_BAUD_RATE); #endif /* NETSTACK_CONF_WITH_IPV4 */ /* check for reset source */ if(bAHI_WatchdogResetEvent()) { PRINTF("Init: Watchdog timer has reset device!\r\n"); } process_start(&etimer_process, NULL); set_linkaddr(); netstack_init(); #if NETSTACK_CONF_WITH_IPV6 #if UIP_CONF_IPV6_RPL PRINTF(CONTIKI_VERSION_STRING " started with IPV6, RPL\n"); #else PRINTF(CONTIKI_VERSION_STRING " started with IPV6\n"); #endif #elif NETSTACK_CONF_WITH_IPV4 PRINTF(CONTIKI_VERSION_STRING " started with IPV4\n"); #else PRINTF(CONTIKI_VERSION_STRING " started\n"); #endif if(node_id > 0) { PRINTF("Node id is set to %u.\n", node_id); } else { PRINTF("Node id is not set.\n"); } #if NETSTACK_CONF_WITH_IPV6 memcpy(&uip_lladdr.addr, node_mac, sizeof(uip_lladdr.addr)); queuebuf_init(); #endif /* NETSTACK_CONF_WITH_IPV6 */ PRINTF("%s %s %s\n", NETSTACK_LLSEC.name, NETSTACK_MAC.name, NETSTACK_RDC.name); #if !NETSTACK_CONF_WITH_IPV4 && !NETSTACK_CONF_WITH_IPV6 uart0_set_input(serial_line_input_byte); serial_line_init(); #endif #if TIMESYNCH_CONF_ENABLED timesynch_init(); timesynch_set_authority_level((linkaddr_node_addr.u8[0] << 4) + 16); #endif /* TIMESYNCH_CONF_ENABLED */ #if NETSTACK_CONF_WITH_IPV4 process_start(&tcpip_process, NULL); process_start(&uip_fw_process, NULL); /* Start IP output */ process_start(&slip_process, NULL); slip_set_input_callback(set_gateway); { uip_ipaddr_t hostaddr, netmask; uip_init(); uip_ipaddr(&hostaddr, 172, 16, linkaddr_node_addr.u8[0], linkaddr_node_addr.u8[1]); uip_ipaddr(&netmask, 255, 255, 0, 0); uip_ipaddr_copy(&meshif.ipaddr, &hostaddr); uip_sethostaddr(&hostaddr); uip_setnetmask(&netmask); uip_over_mesh_set_net(&hostaddr, &netmask); /* uip_fw_register(&slipif);*/ uip_over_mesh_set_gateway_netif(&slipif); uip_fw_default(&meshif); uip_over_mesh_init(UIP_OVER_MESH_CHANNEL); PRINTF("uIP started with IP address %d.%d.%d.%d\n", uip_ipaddr_to_quad(&hostaddr)); } #endif /* NETSTACK_CONF_WITH_IPV4 */ watchdog_start(); NETSTACK_LLSEC.init(); #if NETSTACK_CONF_WITH_IPV6 start_uip6(); #endif /* NETSTACK_CONF_WITH_IPV6 */ /* need this to reliably generate the first rtimer callback and callbacks in other auto-start processes */ (void)u32AHI_Init(); start_autostart_processes(); leds_off(LEDS_ALL); main_loop(); return -1; }