AVR910 In-System Programming

Dependencies:   mbed

Committer:
aberk
Date:
Wed Jun 16 13:10:04 2010 +0000
Revision:
0:56d5a7ca509d

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aberk 0:56d5a7ca509d 1 //****************************************************************************/
aberk 0:56d5a7ca509d 2 // Description:
aberk 0:56d5a7ca509d 3 //
aberk 0:56d5a7ca509d 4 // Program AVR chips with the AVR910 ISP (in-system programming) protocol,
aberk 0:56d5a7ca509d 5 // using an mbed.
aberk 0:56d5a7ca509d 6 //
aberk 0:56d5a7ca509d 7 // AVR910 Application Note:
aberk 0:56d5a7ca509d 8 //
aberk 0:56d5a7ca509d 9 // http://www.atmel.com/dyn/resources/prod_documents/doc0943.pdf
aberk 0:56d5a7ca509d 10 //****************************************************************************/
aberk 0:56d5a7ca509d 11
aberk 0:56d5a7ca509d 12 #ifndef MBED_AVR910_H
aberk 0:56d5a7ca509d 13 #define MBED_AVR910_H
aberk 0:56d5a7ca509d 14
aberk 0:56d5a7ca509d 15 //****************************************************************************/
aberk 0:56d5a7ca509d 16 // Includes
aberk 0:56d5a7ca509d 17 //****************************************************************************/
aberk 0:56d5a7ca509d 18 #include "mbed.h"
aberk 0:56d5a7ca509d 19
aberk 0:56d5a7ca509d 20 //****************************************************************************/
aberk 0:56d5a7ca509d 21 // Defines
aberk 0:56d5a7ca509d 22 //****************************************************************************/
aberk 0:56d5a7ca509d 23
aberk 0:56d5a7ca509d 24 #define PATH_TO_BINARY "/local/AVRcode.bin"
aberk 0:56d5a7ca509d 25
aberk 0:56d5a7ca509d 26 //Commands
aberk 0:56d5a7ca509d 27 #define ATMEL_VENDOR_CODE 0x1E
aberk 0:56d5a7ca509d 28 #define DEVICE_LOCKED 0x00
aberk 0:56d5a7ca509d 29 #define WRITE_HIGH_BYTE 0x48
aberk 0:56d5a7ca509d 30 #define WRITE_LOW_BYTE 0x40
aberk 0:56d5a7ca509d 31 #define READ_HIGH_BYTE 0x28
aberk 0:56d5a7ca509d 32 #define READ_LOW_BYTE 0x20
aberk 0:56d5a7ca509d 33
aberk 0:56d5a7ca509d 34 #define PAGE_SIZE ATMEGA328P_PAGESIZE
aberk 0:56d5a7ca509d 35 #define NUM_PAGES ATMEGA328P_NUM_PAGES
aberk 0:56d5a7ca509d 36
aberk 0:56d5a7ca509d 37 //ATMega328P
aberk 0:56d5a7ca509d 38 #define ATMEGA328P_PAGESIZE 64 //Size in words.
aberk 0:56d5a7ca509d 39 #define ATMEGA328P_NUM_PAGES 256
aberk 0:56d5a7ca509d 40
aberk 0:56d5a7ca509d 41
aberk 0:56d5a7ca509d 42 class AVR910 {
aberk 0:56d5a7ca509d 43
aberk 0:56d5a7ca509d 44 public:
aberk 0:56d5a7ca509d 45
aberk 0:56d5a7ca509d 46 /**
aberk 0:56d5a7ca509d 47 * Constructor.
aberk 0:56d5a7ca509d 48 *
aberk 0:56d5a7ca509d 49 * Parameters:
aberk 0:56d5a7ca509d 50 *
aberk 0:56d5a7ca509d 51 * mosi - Master out slave in pin for SPI communication.
aberk 0:56d5a7ca509d 52 * miso - Master in slave out pin for SPI communication.
aberk 0:56d5a7ca509d 53 * sclk - Serial clock pin for SPI communication.
aberk 0:56d5a7ca509d 54 * nReset - Not reset line pin on the ISP interface.
aberk 0:56d5a7ca509d 55 */
aberk 0:56d5a7ca509d 56 AVR910(PinName mosi, PinName miso, PinName sclk, PinName nReset);
aberk 0:56d5a7ca509d 57
aberk 0:56d5a7ca509d 58 /**
aberk 0:56d5a7ca509d 59 * Program the AVR microcontroller connected to the mbed.
aberk 0:56d5a7ca509d 60 *
aberk 0:56d5a7ca509d 61 * Parameters:
aberk 0:56d5a7ca509d 62 *
aberk 0:56d5a7ca509d 63 * binary - File pointer to the binary file to be loaded onto the
aberk 0:56d5a7ca509d 64 * AVR microcontroller.
aberk 0:56d5a7ca509d 65 *
aberk 0:56d5a7ca509d 66 * Returns:
aberk 0:56d5a7ca509d 67 *
aberk 0:56d5a7ca509d 68 * 0 -> AVR microcontroller programmed successfully.
aberk 0:56d5a7ca509d 69 * -1 -> Problem during programming.
aberk 0:56d5a7ca509d 70 */
aberk 0:56d5a7ca509d 71 int program(FILE* binary);
aberk 0:56d5a7ca509d 72
aberk 0:56d5a7ca509d 73 /**
aberk 0:56d5a7ca509d 74 * Set the frequency of the SPI communication.
aberk 0:56d5a7ca509d 75 *
aberk 0:56d5a7ca509d 76 * (Wrapper for SPI::frequency)
aberk 0:56d5a7ca509d 77 *
aberk 0:56d5a7ca509d 78 * Parameters:
aberk 0:56d5a7ca509d 79 *
aberk 0:56d5a7ca509d 80 * frequency - Frequency of the SPI communication in hertz.
aberk 0:56d5a7ca509d 81 */
aberk 0:56d5a7ca509d 82 void setFrequency(int frequency);
aberk 0:56d5a7ca509d 83
aberk 0:56d5a7ca509d 84 private:
aberk 0:56d5a7ca509d 85
aberk 0:56d5a7ca509d 86 /**
aberk 0:56d5a7ca509d 87 * Issue an enable programming command to the AVR microcontroller.
aberk 0:56d5a7ca509d 88 *
aberk 0:56d5a7ca509d 89 * Returns:
aberk 0:56d5a7ca509d 90 *
aberk 0:56d5a7ca509d 91 * 0 to indicate programming was enabled successfully.
aberk 0:56d5a7ca509d 92 * -1 to indicate programming was not enabled.
aberk 0:56d5a7ca509d 93 */
aberk 0:56d5a7ca509d 94 int enableProgramming(void);
aberk 0:56d5a7ca509d 95
aberk 0:56d5a7ca509d 96 /**
aberk 0:56d5a7ca509d 97 * Poll the device until it has finished its current operation.
aberk 0:56d5a7ca509d 98 */
aberk 0:56d5a7ca509d 99 void poll(void);
aberk 0:56d5a7ca509d 100
aberk 0:56d5a7ca509d 101 /**
aberk 0:56d5a7ca509d 102 * Read the vendor code of the device.
aberk 0:56d5a7ca509d 103 *
aberk 0:56d5a7ca509d 104 * Returns:
aberk 0:56d5a7ca509d 105 *
aberk 0:56d5a7ca509d 106 * The vendor code - should be 0x1E for Atmel.
aberk 0:56d5a7ca509d 107 * 0x00 -> Device is locked.
aberk 0:56d5a7ca509d 108 */
aberk 0:56d5a7ca509d 109 int readVendorCode(void);
aberk 0:56d5a7ca509d 110
aberk 0:56d5a7ca509d 111 /**
aberk 0:56d5a7ca509d 112 * Read the part family and flash size of the device.
aberk 0:56d5a7ca509d 113 *
aberk 0:56d5a7ca509d 114 * Returns:
aberk 0:56d5a7ca509d 115 *
aberk 0:56d5a7ca509d 116 * Code indicating the family of AVR microcontrollers the device comes
aberk 0:56d5a7ca509d 117 * from and how much flash memory it contains.
aberk 0:56d5a7ca509d 118 * 0xFF -> Device code erased or target missing.
aberk 0:56d5a7ca509d 119 * 0x01 -> Device is locked.
aberk 0:56d5a7ca509d 120 */
aberk 0:56d5a7ca509d 121 int readPartFamilyAndFlashSize(void);
aberk 0:56d5a7ca509d 122
aberk 0:56d5a7ca509d 123 /**
aberk 0:56d5a7ca509d 124 * Read the part number.
aberk 0:56d5a7ca509d 125 *
aberk 0:56d5a7ca509d 126 * Returns:
aberk 0:56d5a7ca509d 127 *
aberk 0:56d5a7ca509d 128 * Code identifying the part number.
aberk 0:56d5a7ca509d 129 * 0xFF -> Device code erased or target missing.
aberk 0:56d5a7ca509d 130 * 0x02 -> Device is locked.
aberk 0:56d5a7ca509d 131 */
aberk 0:56d5a7ca509d 132 int readPartNumber(void);
aberk 0:56d5a7ca509d 133
aberk 0:56d5a7ca509d 134 /**
aberk 0:56d5a7ca509d 135 * Issue a chip erase command to the AVR microcontroller.
aberk 0:56d5a7ca509d 136 */
aberk 0:56d5a7ca509d 137 void chipErase(void);
aberk 0:56d5a7ca509d 138
aberk 0:56d5a7ca509d 139 /**
aberk 0:56d5a7ca509d 140 * Load a byte into the memory page buffer.
aberk 0:56d5a7ca509d 141 *
aberk 0:56d5a7ca509d 142 * Parameters:
aberk 0:56d5a7ca509d 143 *
aberk 0:56d5a7ca509d 144 * highLow - Indicate whether the byte being loaded is a high or low byte.
aberk 0:56d5a7ca509d 145 * data - The data byte to load.
aberk 0:56d5a7ca509d 146 */
aberk 0:56d5a7ca509d 147 void loadMemoryPage(int highLow, char address, char data);
aberk 0:56d5a7ca509d 148
aberk 0:56d5a7ca509d 149 /**
aberk 0:56d5a7ca509d 150 * Write the memory page buffer to flash memory.
aberk 0:56d5a7ca509d 151 *
aberk 0:56d5a7ca509d 152 * Parameters:
aberk 0:56d5a7ca509d 153 *
aberk 0:56d5a7ca509d 154 * pageNumber - The page number to write to in flash memory.
aberk 0:56d5a7ca509d 155 */
aberk 0:56d5a7ca509d 156 void writeFlashMemoryPage(char pageNumber);
aberk 0:56d5a7ca509d 157
aberk 0:56d5a7ca509d 158 /**
aberk 0:56d5a7ca509d 159 * Read a byte from program memory.
aberk 0:56d5a7ca509d 160 *
aberk 0:56d5a7ca509d 161 * Parameters:
aberk 0:56d5a7ca509d 162 *
aberk 0:56d5a7ca509d 163 * highLow - Indicate whether the byte being read is a low or high byte.
aberk 0:56d5a7ca509d 164 * pageNumber - The page number to read from.
aberk 0:56d5a7ca509d 165 * pageOffset - Address of byte in the page.
aberk 0:56d5a7ca509d 166 *
aberk 0:56d5a7ca509d 167 * Returns:
aberk 0:56d5a7ca509d 168 *
aberk 0:56d5a7ca509d 169 * The byte at the specified memory location.
aberk 0:56d5a7ca509d 170 */
aberk 0:56d5a7ca509d 171 char readProgramMemory(int highLow, char pageNumber, char pageOffset);
aberk 0:56d5a7ca509d 172
aberk 0:56d5a7ca509d 173 /**
aberk 0:56d5a7ca509d 174 * Check the binary has been written correctly.
aberk 0:56d5a7ca509d 175 *
aberk 0:56d5a7ca509d 176 * Paramters:
aberk 0:56d5a7ca509d 177 *
aberk 0:56d5a7ca509d 178 * numPages - The number of pages written to the AVR microcontroller.
aberk 0:56d5a7ca509d 179 * binary - File pointer to the binary used.
aberk 0:56d5a7ca509d 180 * Returns:
aberk 0:56d5a7ca509d 181 *
aberk 0:56d5a7ca509d 182 * 0 -> No inconsistencies between binary file and AVR flash memory.
aberk 0:56d5a7ca509d 183 * -1 -> Binary file was not written correctly.
aberk 0:56d5a7ca509d 184 */
aberk 0:56d5a7ca509d 185 int checkMemory(int numPages, FILE* binary);
aberk 0:56d5a7ca509d 186
aberk 0:56d5a7ca509d 187 DigitalOut* nReset_;
aberk 0:56d5a7ca509d 188 SPI* spi_;
aberk 0:56d5a7ca509d 189
aberk 0:56d5a7ca509d 190 };
aberk 0:56d5a7ca509d 191
aberk 0:56d5a7ca509d 192 #endif /* AVR910_H */