X-Git-Url: http://git.rot13.org/?p=goodfet;a=blobdiff_plain;f=firmware%2Fapps%2Favr%2Favr.c;h=fdef1aa76ee52b3cca5535131f21ce618dd9fdf8;hp=c86711dec017f558c53a9fa0366af1b2f6e59707;hb=25e355b9e50cee54081024c581501757e7c33b5d;hpb=4d264916c0263052ba7316d7127de6b4cfe8145c diff --git a/firmware/apps/avr/avr.c b/firmware/apps/avr/avr.c index c86711d..fdef1aa 100644 --- a/firmware/apps/avr/avr.c +++ b/firmware/apps/avr/avr.c @@ -19,8 +19,8 @@ void avrsetup(){ //! Initialized an attached AVR. void avrconnect(){ - register int i; - avrsetup();//set I/O pins + //set I/O pins + avrsetup(); //Pulse !RST (SS) at least twice while CLK is low. CLRCLK; @@ -36,7 +36,7 @@ void avrconnect(){ avr_prgen(); } -//! Read and write an SPI byte. +//! Read and write an SPI byte with delays. unsigned char avrtrans8(unsigned char byte){ register unsigned int bit; //This function came from the SPI Wikipedia article. @@ -68,8 +68,7 @@ u8 avrexchange(u8 a, u8 b, u8 c, u8 d){ avrtrans8(b); if(avrtrans8(c)!=b){ debugstr("AVR sync error, b not returned as c."); - }else{ - debugstr("Synced properly."); + //Reconnect here? } return avrtrans8(d); } @@ -79,27 +78,56 @@ void avr_prgen(){ avrexchange(0xAC, 0x53, 0, 0); } +//! Is the AVR ready or busy? +u8 avr_isready(){ + return avrexchange(0xF0, 0, 0, 0); +} + //! Read AVR device code. -u8 avr_devicecode(){ +u8 avr_sig(u8 i){ return avrexchange(0x30, //Read signature byte 0x00, - 0x00, //&0x03 is sig adr - 0x00 //don't care. + i&0x03, //sig adr + 0x00 //don't care. ); } +//! Erase an AVR device +void avr_erase(){ + avrexchange(0xAC, 0x80, 0, 0); +} + +//! Read lock bits. +u8 avr_lockbits(){ + return avrexchange(0x58, 0, 0, 0); +} + +//! Read a byte of EEPROM. +u8 avr_peekeeprom(u16 adr){ + return avrexchange(0xA0, adr>>8, adr&0xFF, 0); +} +//! Read a byte of EEPROM. +u8 avr_pokeeeprom(u16 adr, u8 val){ + return avrexchange(0xC0, adr>>8, adr&0xFF, val); +} + + + //! Handles an AVR command. void avrhandle(unsigned char app, unsigned char verb, unsigned long len){ unsigned long i; + static u8 connected=0; + if(!avr_isready() && connected) + debugstr("AVR is not yet ready."); switch(verb){ case READ: case WRITE: for(i=0;i