void macData_BC_Request( u8 len, u8 * data) { ftData *data_frame = (ftData*)(mac_buffer_tx+1); // Create a struct pointer to the global variable... // if we have not found a channel to broadcast on do nothing if (panDescriptor.logicalChannel == 0xff) return; Led1_on(); debugMsgStr("\r\nmacData_BC_Request->"); // Build the frame. data_frame->fcf=FCF_DATA_NOACK; //FCF Data frame no ACK -- to prevent multiple acks data_frame->seq = macConfig.dsn++; data_frame->panid = macConfig.panId; data_frame->srcAddr = macConfig.shortAddress; data_frame->originAddr = macConfig.shortAddress; data_frame->finalDestAddr = BROADCASTADDR; data_frame->destAddr = BROADCASTADDR; data_frame->type =DATA_FRAME; u8 i; for(i=0; i<len; i++) ((u8*)&data_frame->payload)[i] = *data++; *mac_buffer_tx = len + ftDataHeaderSize; // save length away macConfig.busy = true; // this locks out debug tasks radioSendData(*mac_buffer_tx, (u8*)data_frame); Led1_off(); }
//! @brief This function manages the HOST mass storage application //! void host_ms_task(void) { if( Is_host_ready() ) { // Here, Enumeration successfull, device is operationnal if(Is_new_device_connection_event()) { // Update MS driver in case of if( host_mem_install() ) { #if (HOST_UPGRADE_MODE==ENABLE) b_new_msc_connected = TRUE; #endif Led1_on(); } } #if (HOST_SYNC_MODE==ENABLE) // Sync operating mode(if available) if( 0 != host_mem_get_lun() ) { if(Is_joy_right()) // Sync device to host stream { Led0_on(); sync_on_going=1; copy_dir( (U8 code *)dir_usb_out_name, (U8 code *)dir_local_in_name, 1 ); sync_on_going=0; Led3_off(); Led0_off(); } if(Is_joy_left()) // Sync host to device stream { Led0_on(); sync_on_going=1; copy_dir( (U8 code *)dir_local_out_name, (U8 code *)dir_usb_in_name, 1 ); sync_on_going=0; Led0_off(); Led3_off(); } } #endif #if (HOST_UPGRADE_MODE==ENABLE) if( b_new_msc_connected ) { // A new MSC is connected then start upgrade routine b_new_msc_connected = FALSE; firm_upgrade_run(); } #endif } // Device disconnection... if( Is_device_disconnection_event() ) { // Update MS driver in case of host_mem_uninstall(); Led1_off(); } }
//! This function enables switches interruptions and enters the CPU in power down mode. //! //! @verbatim //! This function is executed when a suspend is received. //! @endverbatim //! void suspend_action(void) { #if (USB_REMOTE_WAKEUP_FEATURE == ENABLED) if (remote_wakeup_feature == ENABLED) { Switches_enable_it(); } Led1_off(); Enable_interrupt(); Enter_power_down_mode(); Led1_on(); #endif }
void rxtx_led_update(void) { // turn off LED's if necessary if (led1_timer) { led1_timer--; if(led1_timer&(1<<2)) Led1_on(); else Led1_off(); } else Led1_off(); if (led2_timer) { led2_timer--; if(led2_timer&(1<<2)) Led2_on(); else Led2_off(); } else Led2_off(); }
/*-----------------------------Low level initialization--------------------*/ static void initialize(void) { watchdog_init(); watchdog_start(); #if CONFIG_STACK_MONITOR /* Simple stack pointer highwater monitor. The 'm' command in cdc_task.c * looks for the first overwritten magic number. */ { extern uint16_t __bss_end; uint16_t p=(uint16_t)&__bss_end; do { *(uint16_t *)p = 0x4242; p+=100; } while (p<RAMEND-100); } #endif /* Initialize hardware */ // Checks for "finger", jumps to DFU if present. init_lowlevel(); /* Clock */ clock_init(); #if USB_CONF_RS232 /* Use rs232 port for serial out (tx, rx, gnd are the three pads behind jackdaw leds */ rs232_init(RS232_PORT_0, USART_BAUD_57600,USART_PARITY_NONE | USART_STOP_BITS_1 | USART_DATA_BITS_8); /* Redirect stdout to second port */ rs232_redirect_stdout(RS232_PORT_0); #if ANNOUNCE printf_P(PSTR("\n\n\n********BOOTING CONTIKI*********\n")); #endif #endif Leds_init(); /* rtimer init needed for low power protocols */ rtimer_init(); /* Process subsystem. */ process_init(); /* etimer process must be started before ctimer init */ process_start(&etimer_process, NULL); #if RF230BB ctimer_init(); /* Start radio and radio receive process */ /* Note this starts RF230 process, so must be done after process_init */ NETSTACK_RADIO.init(); /* Set addresses BEFORE starting tcpip process */ memset(&tmp_addr, 0, sizeof(rimeaddr_t)); if(!get_eui64_from_eeprom(tmp_addr.u8)) { #if JACKDAW_CONF_RANDOM_MAC // It doesn't look like we have a valid EUI-64 address // so let's try to make a new one from scratch. Leds_off(); Led2_on(); generate_new_eui64(tmp_addr.u8); if(!set_eui64_to_eeprom(tmp_addr.u8)) { watchdog_periodic(); int i; for(i=0;i<20;i++) { Led1_toggle(); _delay_ms(100); } Led1_off(); } Led2_off(); #else tmp_addr.u8[0]=0x02; tmp_addr.u8[1]=0x12; tmp_addr.u8[2]=0x13; tmp_addr.u8[3]=0xff; tmp_addr.u8[4]=0xfe; tmp_addr.u8[5]=0x14; tmp_addr.u8[6]=0x15; tmp_addr.u8[7]=0x16; #endif /* JACKDAW_CONF_RANDOM_MAC */ } //Fix MAC address init_net(); #if UIP_CONF_IPV6 memcpy(&uip_lladdr.addr, &tmp_addr.u8, 8); #endif rf230_set_pan_addr( get_panid_from_eeprom(), get_panaddr_from_eeprom(), (uint8_t *)&tmp_addr.u8 ); #if JACKDAW_CONF_USE_SETTINGS /* Allow radio code to overrite power for testing miniature Raven mesh */ #ifndef RF230_MAX_TX_POWER rf230_set_txpower(settings_get_uint8(SETTINGS_KEY_TXPOWER,0)); #endif #endif rimeaddr_set_node_addr(&tmp_addr); /* Initialize stack protocols */ queuebuf_init(); NETSTACK_RDC.init(); NETSTACK_MAC.init(); NETSTACK_NETWORK.init(); rf230_set_channel(get_channel_from_eeprom()); #if ANNOUNCE && USB_CONF_RS232 printf_P(PSTR("MAC address %x:%x:%x:%x:%x:%x:%x:%x\n\r"),tmp_addr.u8[0],tmp_addr.u8[1],tmp_addr.u8[2],tmp_addr.u8[3],tmp_addr.u8[4],tmp_addr.u8[5],tmp_addr.u8[6],tmp_addr.u8[7]); printf_P(PSTR("%s %s, channel %u"),NETSTACK_MAC.name, NETSTACK_RDC.name,rf230_get_channel()); if (NETSTACK_RDC.channel_check_interval) { unsigned short tmp; tmp=CLOCK_SECOND / (NETSTACK_RDC.channel_check_interval == 0 ? 1:\ NETSTACK_RDC.channel_check_interval()); if (tmp<65535) printf_P(PSTR(", check rate %u Hz"),tmp); } printf_P(PSTR("\n")); #endif #if UIP_CONF_IPV6_RPL #if RPL_BORDER_ROUTER process_start(&tcpip_process, NULL); process_start(&border_router_process, NULL); PRINTF ("RPL Border Router Started\n"); #else process_start(&tcpip_process, NULL); PRINTF ("RPL Started\n"); #endif #if RPL_HTTPD_SERVER extern struct process httpd_process; process_start(&httpd_process, NULL); PRINTF ("Webserver Started\n"); #endif #endif /* UIP_CONF_IPV6_RPL */ #else /* RF230BB */ /* The order of starting these is important! */ process_start(&mac_process, NULL); process_start(&tcpip_process, NULL); #endif /* RF230BB */ /* Setup USB */ process_start(&usb_process, NULL); #if USB_CONF_SERIAL process_start(&cdc_process, NULL); #endif process_start(&usb_eth_process, NULL); #if USB_CONF_STORAGE process_start(&storage_process, NULL); #endif #if ANNOUNCE #if USB_CONF_SERIAL&&!USB_CONF_RS232 {unsigned short i; printf_P(PSTR("\n\n\n********BOOTING CONTIKI*********\n\r")); /* Allow USB CDC to keep up with printfs */ for (i=0;i<8000;i++) process_run(); #if RF230BB printf_P(PSTR("MAC address %x:%x:%x:%x:%x:%x:%x:%x\n\r"),tmp_addr.u8[0],tmp_addr.u8[1],tmp_addr.u8[2],tmp_addr.u8[3],tmp_addr.u8[4],tmp_addr.u8[5],tmp_addr.u8[6],tmp_addr.u8[7]); for (i=0;i<8000;i++) process_run(); printf_P(PSTR("%s %s, channel %u"),NETSTACK_MAC.name, NETSTACK_RDC.name,rf230_get_channel()); if (NETSTACK_RDC.channel_check_interval) { i=CLOCK_SECOND / (NETSTACK_RDC.channel_check_interval == 0 ? 1:\ NETSTACK_RDC.channel_check_interval()); if (i<65535) printf_P(PSTR(", check rate %u Hz"),i); } printf_P(PSTR("\n\r")); for (i=0;i<8000;i++) process_run(); #endif /* RF230BB */ printf_P(PSTR("System online.\n\r")); } #elif USB_CONF_RS232 printf_P(PSTR("System online.\n")); #endif #endif /* ANNOUNCE */ }
void nodeSleep(u16 tenthSeconds) { // ************** Power down the other board peripherals Leds_off(); // ************** Power down the radio // wait for radio to be done u8 state = BUSY_TX_ARET; while (state == BUSY_TX_ARET || state == BUSY_RX_AACK) state = radioGetTrxState(); // Now put radio to sleep radioEnterSleepMode(); // TODO: figure out what needs to be put to sleep to minimize current consumption // ************** Power down the on-chip modules // PRR = 0xbf; ??? // Disable ADC // ADCSRA &= ~(1 << ADEN); // Turn off comparator // ACSR |= (1 << // turn off ports etc // Turn off BOD // This should only be done once -- No need to do it over again /* AVR_ENTER_CRITICAL_REGION(); #define BODS 6 #define BODSE 5 MCUCR |= (1 << BODSE) | (1<< BODS); MCUCR &= ~(1 << BODSE); AVR_LEAVE_CRITICAL_REGION(); */ // ************** Set the timer to wake up // Set TIMER2 Asyncronous Mode. ASSR |= (1 << AS2); // Set TIMER2 Prescaler to 1024. TCCR2B |= ((1 << CS22)|(1 << CS21)|(1 << CS20)); // Wait for TCNT2 write to finish. while(ASSR & (1 << TCR2BUB)) ; // Sleep as many times as needed to sleep for the full time while (tenthSeconds) { // This is to get the node manually out of sleeping mode -- // Might take up to 7.5Sec to detect button press // if (BUTTON_PRESSED() ) { Led1_on(); macConfig.sleeping = false; while (BUTTON_PRESSED()) ; Led1_off(); break; // exit the Sleeping loop } // Set TIMER2 output compare register from user. if (tenthSeconds > 75) { // Just decrement by the max timeout OCR2A = 240; // 7.5 seconds, max timeout tenthSeconds -= 75; } else { // Can measure the remaining time in one timer cycle tenthSeconds = tenthSeconds * 16 / 5; if (!tenthSeconds) tenthSeconds++; OCR2A = tenthSeconds; tenthSeconds = 0; } // Wait for OCR2 write to finish. while(ASSR & (1 << OCR2AUB)) ; // Reset TIMER2 timer counter value. TCNT2 = 0; // Wait for TCNT2 write to finish before entering sleep. while(ASSR & (1 << TCN2UB)) ; // Clear interrupt flag TIFR2 |= (1 << OCF2A); // Enable TIMER2 output compare interrupt. TIMSK2 |= (1 << OCIE2A); // ************** Go to sleep AVR_ENTER_CRITICAL_REGION(); set_sleep_mode( SLEEP_MODE_PWR_SAVE); sleep_enable(); sei(); sleep_cpu(); // sleeping right here sleep_disable(); AVR_LEAVE_CRITICAL_REGION(); wdt_disable(); } // ************** Awake now, wake up everything // PRR = 0x03; ?? if (SERIAL) serial_init(NULL); debugMsgStr("\r\nNode slept"); if ( macConfig.associated) HAL_ADC_INIT(); // Bring SPI port back up (must re-init after sleep) radio_spi_init(); // Wake up radio. radioLeaveSleepMode(); // Set RF212 to 250KB mode. // TODO: do I need to call this?? //radioSetup900(); radioSetTrxState(PLL_ON); }