//------------------------------------------------------------------------------ int __attribute__((OS_main)) main(void) { const int* isr = isrJump; // read array from program memory, saves copy step for( unsigned char i=0; i<6; i+=2 ) { boot_page_fill( i, pgm_read_word(isr++) ); // install RESET trampoline } commitPage( 0 ); rnaInit(); for(;;) { rnaPoll(); // everything else happens through the RNA bus } }
//------------------------------------------------------------------------------ int __attribute__((OS_main)) main(void) { dnaUsbInit(); enableLed(); usbCommand = ceCommandIdle; usbRNAPacketExpected = 1; TCCR0B = 1<<CS01 | 1<<CS00; // set 8-bit timer prescaler to div/64 TIMSK0 = 1<<TOIE0; // enable the interrupt rnaInit(); sei(); setLedOff(); for(;;) { rnaPoll(); if ( rnaPacketAvail ) { setLedOn(); rnaPacketAvail = 0; _delay_ms( 50 ); while ( !rnaSend(usbRNATo, usbRNAPacket, usbRNAPacketExpected) ) { _delay_ms(1); } setLedOff(); } /* if ( usbRNAPacketPos == usbRNAPacketExpected ) { usbRNAPacketPos = 0; if ( *usbRNAPacket == RNATypeDebugString ) { usbRNAPacket[usbRNAPacketExpected] = 0; usbprint( (char *)usbRNAPacket + 1, usbRNAPacketExpected ); } } */ } }
//------------------------------------------------------------------------------ int __attribute__((OS_main)) main(void) { DDRD = 0x0; PORTD = 0b00000100; // turn on pullup for D2 (RNA bus) // if the source of the reset was a watchdog timeout, indicating a software // request of bootloader entry, disable the watchdog and enter the // bootloader if ( WDTCSR & (1<<WDE) ) { MCUSR = 0; WDTCSR |= (1<<WDCE) | (1<<WDE); WDTCSR = 0; } else { _delay_us(50); // give state a chance to settle for( unsigned int i=4000; i; i-- ) { _delay_ms(1); // pin must be HELD low, make sure spurious RNA requests do not reset us! if ( PIND & 0b00000100 ) { goto jumpToZero; } } } rnaInit(); for(;;) { rnaPoll(); // everything else happens through the RNA bus if ( jumpToApp ) { jumpToZero: boot_rww_enable(); asm volatile ("ijmp" ::"z" (0)); // in with both feet... } } }