From e2a75fc68bc3cedaadb2db57b9e579a0f4468380 Mon Sep 17 00:00:00 2001 From: travisutk Date: Wed, 7 Oct 2009 08:47:45 +0000 Subject: [PATCH 1/1] Working on AVR support. git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@188 12e2690d-a6be-4b82-a7b7-67c4a43b65c8 --- firmware/apps/avr/avr.c | 93 ++++++++++++++++++++++++++++++++++++++ firmware/goodfet.c | 3 ++ firmware/include/avr.h | 37 +++++++++++++++ firmware/include/command.h | 8 +++- 4 files changed, 140 insertions(+), 1 deletion(-) create mode 100644 firmware/apps/avr/avr.c create mode 100644 firmware/include/avr.h diff --git a/firmware/apps/avr/avr.c b/firmware/apps/avr/avr.c new file mode 100644 index 0000000..47ae68e --- /dev/null +++ b/firmware/apps/avr/avr.c @@ -0,0 +1,93 @@ +/*! \file avr.c + \author Travis Goodspeed + \brief AVR SPI Programmer +*/ + +#include "platform.h" +#include "command.h" + +#include +#include +#include + +#include "avr.h" + +//! Setup the AVR pins. +void avrsetup(){ + spisetup(); +} + +//! Initialized an attached AVR. +void avrconnect(){ + register int i; + avrsetup();//set I/O pins + + //Pulse !RST (SS) at least twice while CLK is low. + CLRSS; + CLRCLK; + + for(i=0;i<5;i++){ + SETSS; + CLRSS; + } + + //Enable programming + avr_prgen(); +} + +//! Perform a 4-byte exchange. +u8 avrexchange(u8 a, u8 b, u8 c, u8 d){ + spitrans8(a); + spitrans8(b); + if(spitrans8(c)!=b){ + debugstr("AVR sync error, b not returned as c."); + } + spitrans8(c); + return spitrans8(d); +} + +//! Enable AVR programming mode. +void avr_prgen(){ + avrexchange(0xac, 0x53, 0, 0); +} + +//! Read AVR device code. +u8 avr_devicecode(){ + return avrexchange(0x30, //Read signature byte + 0x00, + 0x00, //&0x03 is sig adr + 0x00 //don't care. + ); +} + +//! Handles an AVR command. +void avrhandle(unsigned char app, + unsigned char verb, + unsigned long len){ + unsigned long i; + + + switch(verb){ + case READ: + case WRITE: + for(i=0;i