diff -Narup old/isp.c new/isp.c --- old/isp.c 2007-08-01 21:54:20.000000000 +0900 +++ new/isp.c 2007-08-01 21:56:02.000000000 +0900 @@ -17,9 +17,33 @@ void spiHWenable() { - /* enable SPI, master, 375kHz SCK */ - SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1); - SPSR = (1 << SPI2X); + DDRC &= ~(1<<3); + PORTC |= (1<<3); + asm volatile("nop\n"::); + asm volatile("nop\n"::); + if (!(PINC & (1<<3))){ + /* PC3 = L */ + /* enable SPI, master, 188kHz SCK */ + SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1); + SPSR = 0; + } else { + DDRC |= (1<<2); + PORTC &= ~(1<<2); + asm volatile("nop\n"::); + asm volatile("nop\n"::); + if (!(PINC & (1<<3))){ + /* PC2 = PC3 */ + /* enable SPI, master, 94kHz SCK */ + SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1) | (1 << SPR0); + SPSR = 0; + } else { + /* enable SPI, master, 375kHz SCK */ + SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR1); + SPSR = (1 << SPI2X); + } + DDRC &= ~(1<<2); + PORTC |= (1<<2); + } } void ispSetSCKOption(uchar option) { @@ -46,6 +70,11 @@ void ispDelay() { void ispConnect() { + /* added by Yuki */ + ISP_OUT |= (1 << ISP_MISO); // MISO pull up + DDRC |= (1 << 5); // PC5 OE + PORTC &= ~(1 << 5); // OE=L + /* all ISP pins are inputs before */ /* now set output pins */ ISP_DDR |= (1 << ISP_RST) | (1 << ISP_SCK) | (1 << ISP_MOSI); @@ -72,6 +101,9 @@ void ispDisconnect() { /* switch pullups off */ ISP_OUT &= ~((1 << ISP_RST) | (1 << ISP_SCK) | (1 << ISP_MOSI)); + /* added by Yuki */ + DDRC &= ~(1 << 5); // PC5 OE off + /* disable hardware SPI */ spiHWdisable(); } @@ -98,10 +130,11 @@ uchar ispTransmit_sw(uchar send_byte) { } /* pulse SCK */ + ispDelay(); /* moved by Yuki */ ISP_OUT |= (1 << ISP_SCK); /* SCK high */ ispDelay(); ISP_OUT &= ~(1 << ISP_SCK); /* SCK low */ - ispDelay(); + /* ispDelay(); */ /* moved by Yuki */ } return rec_byte;