Ecco la modifica pronta all'uso (testata).
Non mi è chiaro come usi il pulsante perché dici che hai le pullup e che chiude verso Vdd, in questo caso ci deve essere una pull down.
Comunque non è un problema basta che nella if metti il confronto verso 0 logico oppure 1 logico a seconda di come chiude il pulsante.
Io ho impostato che per attivare il bootloader il pin PA0 deve essere a stato logico 1 come dovrebbe essere per la configurazione che hai descritto.
Attenzione che dopo aver caricato il nuovo bootloader non vedrai nessun led lampeggiare perché non trovando il pulsante premuto viene ceduto subito il controllo al programma utente che non c'è, quindi apparentemente il processore sembra non fare nulla.
// codice da inserire subito prima della while (boot_state)
// Setto PA0 come input
DDRA = 0b00000000;
// Attivo pullup interna up su PA0 (usato per il test)
// PORTA = 0b00000001;
if ((PINA & 0b00000001) == 1) // inserire la condizione logica desiderata (1 o 0)
{
while (boot_state==0)
{
while ((!(Serial_Available())) && (boot_state == 0)) // wait for data
{
_delay_ms(0.001);
boot_timer++;
if (boot_timer > boot_timeout)
{
boot_state = 1; // (after ++ -> boot_state=2 bootloader timeout, jump to main 0x00000 )
}
#ifdef BLINK_LED_WHILE_WAITING
if ((boot_timer % 7000) == 0)
{
//* toggle the LED
PROGLED_PORT ^= (1<<PROGLED_PIN); // turn LED ON
}
#endif
}
boot_state++; // ( if boot_state=1 bootloader received byte from UART, enter bootloader mode)
}
}
else boot_state = 0;