static void generate_new_eui64(uint8_t eui64[8]) { eui64[0] = 0x02; eui64[1] = rng_get_uint8(); eui64[2] = rng_get_uint8(); eui64[3] = 0xFF; eui64[4] = 0xFE; eui64[5] = rng_get_uint8(); eui64[6] = rng_get_uint8(); eui64[7] = rng_get_uint8(); }
/*------Done in a subroutine to keep main routine stack usage small--------*/ void initialize(void) { #ifdef BUZZER buzz_id(); #endif watchdog_init(); watchdog_start(); clock_init(); PRINTD("\n\nChecking MCUSR...\n"); if(MCUSR & (1<<PORF )) PRINTD("Power-on reset.\n"); if(MCUSR & (1<<EXTRF)) PRINTD("External reset!\n"); if(MCUSR & (1<<BORF )) PRINTD("Brownout reset!\n"); if(MCUSR & (1<<WDRF )) PRINTD("Watchdog reset!\n"); if(MCUSR & (1<<JTRF )) PRINTD("JTAG reset!\n"); MCUSR = 0; PRINTD("CLOCK_SECOND %d\n",CLOCK_SECOND); PRINTD("RTIMER_ARCH_SECOND %lu\n",RTIMER_ARCH_SECOND); PRINTD("F_CPU %lu\n",F_CPU); #if STACKMONITOR /* Simple stack pointer highwater monitor. Checks for magic numbers in the main * loop. In conjuction with PERIODICPRINTS, never-used stack will be printed * every STACKMONITOR seconds. */ { extern uint16_t __bss_end; uint16_t p=(uint16_t)&__bss_end; do { *(uint16_t *)p = 0x4242; p+=10; } while (p<SP-10); //don't overwrite our own stack } #endif /* Calibrate internal mcu clock against external 32768Hz watch crystal */ #define CONF_CALIBRATE_OSCCAL 0 #if CONF_CALIBRATE_OSCCAL void calibrate_rc_osc_32k(); { extern uint8_t osccal_calibrated; uint8_t i; PRINTD("\nBefore calibration OSCCAL=%x\n",OSCCAL); for (i=0;i<10;i++) { calibrate_rc_osc_32k(); PRINTD("Calibrated=%x\n",osccal_calibrated); //#include <util/delay_basic.h> //#define delay_us( us ) ( _delay_loop_2(1+(us*F_CPU)/4000000UL) ) // delay_us(50000); } clock_init(); } #endif PRINTA("\n*******Booting %s*******\n",CONTIKI_VERSION_STRING); leds_init(); leds_on(LEDS_RED); /* Initialize USART */ #ifdef CAMERA_INTERFACE camera_init(); #else init_usart(); #endif /* rtimers needed for radio cycling */ rtimer_init(); /* Initialize process subsystem */ process_init(); /* etimers must be started before ctimer_init */ process_start(&etimer_process, NULL); #if RF2XXBB ds2401_init(); node_id_restore(); /* Get a random seed for the 802.15.4 packet sequence number. * Some layers will ignore duplicates found in a history (e.g. Contikimac) * causing the initial packets to be ignored after a short-cycle restart. */ random_init(rng_get_uint8()); ctimer_init(); init_net(); #else /* !RF2XXBB */ /* Original RF230 combined mac/radio driver */ /* mac process must be started before tcpip process! */ process_start(&mac_process, NULL); process_start(&tcpip_process, NULL); #endif /* RF2XXBB */ /* Autostart other processes */ autostart_start(autostart_processes); /*---If using coffee file system create initial web content if necessary---*/ #if COFFEE_FILES int fa = cfs_open( "/index.html", CFS_READ); if (fa<0) { //Make some default web content PRINTA("No index.html file found, creating upload.html!\n"); PRINTA("Formatting FLASH file system for coffee..."); cfs_coffee_format(); PRINTA("Done!\n"); fa = cfs_open( "/index.html", CFS_WRITE); int r = cfs_write(fa, &"It works!", 9); if (r<0) PRINTA("Can''t create /index.html!\n"); cfs_close(fa); // fa = cfs_open("upload.html"), CFW_WRITE); // <html><body><form action="upload.html" enctype="multipart/form-data" method="post"><input name="userfile" type="file" size="50" /><input value="Upload" type="submit" /></form></body></html> } #endif /* COFFEE_FILES */ /* Add addresses for testing */ #if 0 { uip_ip6addr_t ipaddr; uip_ip6addr(&ipaddr, 0xaaaa, 0, 0, 0, 0, 0, 0, 0); uip_ds6_addr_add(&ipaddr, 0, ADDR_AUTOCONF); // uip_ds6_prefix_add(&ipaddr,64,0); } #endif /*--------------------------Announce the configuration---------------------*/ #if ANNOUNCE_BOOT { #if AVR_WEBSERVER uint8_t i; char buf1[40],buf[40]; unsigned int size; for (i=0;i<UIP_DS6_ADDR_NB;i++) { if (uip_ds6_if.addr_list[i].isused) { httpd_cgi_sprint_ip6(uip_ds6_if.addr_list[i].ipaddr,buf); PRINTA("IPv6 Address: %s\n",buf); } } cli(); eeprom_read_block (buf1,eemem_server_name, sizeof(eemem_server_name)); eeprom_read_block (buf,eemem_domain_name, sizeof(eemem_domain_name)); sei(); buf1[sizeof(eemem_server_name)]=0; PRINTA("%s",buf1); buf[sizeof(eemem_domain_name)]=0; size=httpd_fs_get_size(); #ifndef COFFEE_FILES PRINTA(".%s online with fixed %u byte web content\n",buf,size); #elif COFFEE_FILES==1 PRINTA(".%s online with static %u byte EEPROM file system\n",buf,size); #elif COFFEE_FILES==2 PRINTA(".%s online with dynamic %u KB EEPROM file system\n",buf,size>>10); #elif COFFEE_FILES==3 PRINTA(".%s online with static %u byte program memory file system\n",buf,size); #elif COFFEE_FILES==4 PRINTA(".%s online with dynamic %u KB program memory file system\n",buf,size>>10); #endif /* COFFEE_FILES */ #else PRINTA("Online\n"); #endif /* AVR_WEBSERVER */ #endif /* ANNOUNCE_BOOT */ } }