Working on AVR support.
authortravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Wed, 7 Oct 2009 08:47:45 +0000 (08:47 +0000)
committertravisutk <travisutk@12e2690d-a6be-4b82-a7b7-67c4a43b65c8>
Wed, 7 Oct 2009 08:47:45 +0000 (08:47 +0000)
git-svn-id: https://svn.code.sf.net/p/goodfet/code/trunk@188 12e2690d-a6be-4b82-a7b7-67c4a43b65c8

firmware/apps/avr/avr.c [new file with mode: 0644]
firmware/goodfet.c
firmware/include/avr.h [new file with mode: 0644]
firmware/include/command.h

diff --git a/firmware/apps/avr/avr.c b/firmware/apps/avr/avr.c
new file mode 100644 (file)
index 0000000..47ae68e
--- /dev/null
@@ -0,0 +1,93 @@
+/*! \file avr.c
+  \author Travis Goodspeed
+  \brief AVR SPI Programmer
+*/
+
+#include "platform.h"
+#include "command.h"
+
+#include <signal.h>
+#include <io.h>
+#include <iomacros.h>
+
+#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<len;i++)
+      cmddata[i]=spitrans8(cmddata[i]);
+    txdata(app,verb,len);
+    break;
+  case SETUP:
+    avrsetup();
+    txdata(app,verb,0);
+    break;
+  case START:
+    avrconnect();
+    txdata(app,verb,0);
+    break;
+  case PEEK:
+  case POKE:
+  default:
+    debugstr("Verb unimplemented in AVR application.");
+    txdata(app,NOK,0);
+    break;
+  }
+}
+
index 8ff94b6..467ebae 100644 (file)
@@ -30,8 +30,11 @@ void init(){
   \r
   //Enable Interrupts.\r
   //eint();\r
   \r
   //Enable Interrupts.\r
   //eint();\r
+\r
+\r
 }\r
 \r
 }\r
 \r
+\r
 //! Handle a command.\r
 void handle(unsigned char app,\r
            unsigned char verb,\r
 //! Handle a command.\r
 void handle(unsigned char app,\r
            unsigned char verb,\r
diff --git a/firmware/include/avr.h b/firmware/include/avr.h
new file mode 100644 (file)
index 0000000..75cd504
--- /dev/null
@@ -0,0 +1,37 @@
+/*! \file avr.h
+  \author Travis Goodspeed
+  \brief AVR SPI Programmer
+*/
+
+#include "spi.h"
+
+//! Setup the AVR pins.
+void avrsetup();
+
+//! Initialized an attached AVR.
+void avrconnect();
+
+//! Enable AVR programming mode.
+void avr_prgen();
+//! Read AVR device code.
+u8 avr_devicecode();
+
+
+//Command codes.
+//! Performa  chip erase.
+#define AVR_ERASE 0xF0
+//! Fetch RDY/!BSY byte.
+#define AVR_RDYBSY 0xF1
+
+//! Read Program Memory
+#define AVR_PEEKPGM 0x80
+//! Read EEPROM
+#define AVR_PEEKEEPROM 0x81
+//! Read lock bits.
+#define AVR_PEEKLOCK 0x82
+//! Read signature.
+#define AVR_PEEKSIG 0x83
+//! Read fuse bits.
+#define AVR_READFUSES 0x84
+//! Read calibration byte.
+#define AVR_READCAL 0x85
index 88f0de2..4eda217 100644 (file)
@@ -3,12 +3,18 @@
   \brief Command codes and buffers.
 */
 
   \brief Command codes and buffers.
 */
 
-//! Global data buffer.
+
+//Types
+#define u8 unsigned char
+#define u16 unsigned int
+#define u32 unsigned long
+
 
 #ifndef CMDDATALEN
 #define CMDDATALEN 0x204
 #endif
 
 
 #ifndef CMDDATALEN
 #define CMDDATALEN 0x204
 #endif
 
+//! Global data buffer.
 extern unsigned char cmddata[CMDDATALEN];
 extern unsigned char silent;
 
 extern unsigned char cmddata[CMDDATALEN];
 extern unsigned char silent;