AVRisp tested on ATMega88A inspired by various implementations around: - AVR_SPI_Programmer_v2 ( BO Qiang ) - mAVRISP (Aaron Berk) - TestAVRISP(Chester Hamilton)
AVRisp implementation for mBED
AVRISP/AVRISP.h@1:4b883042df7d, 2015-04-28 (annotated)
- Committer:
- Ellips
- Date:
- Tue Apr 28 11:01:19 2015 +0000
- Revision:
- 1:4b883042df7d
- Parent:
- 0:29abe3c0b902
AVRisp , v0.1
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Ellips | 0:29abe3c0b902 | 1 | //****************************************************************************/ |
Ellips | 0:29abe3c0b902 | 2 | // Description: |
Ellips | 0:29abe3c0b902 | 3 | // |
Ellips | 0:29abe3c0b902 | 4 | // Program AVR chips with the AVR910 ISP (in-system programming) protocol, |
Ellips | 0:29abe3c0b902 | 5 | // using an mbed. |
Ellips | 0:29abe3c0b902 | 6 | // |
Ellips | 0:29abe3c0b902 | 7 | // This is a wrapper for AVR_ISP_Programmer_v2 |
Ellips | 0:29abe3c0b902 | 8 | // |
Ellips | 0:29abe3c0b902 | 9 | //****************************************************************************/ |
Ellips | 0:29abe3c0b902 | 10 | |
Ellips | 0:29abe3c0b902 | 11 | #ifndef AVRISP_H |
Ellips | 0:29abe3c0b902 | 12 | #define AVRISP_H |
Ellips | 0:29abe3c0b902 | 13 | |
Ellips | 0:29abe3c0b902 | 14 | //****************************************************************************/ |
Ellips | 0:29abe3c0b902 | 15 | // Includes |
Ellips | 0:29abe3c0b902 | 16 | //****************************************************************************/ |
Ellips | 0:29abe3c0b902 | 17 | #include "mbed.h" |
Ellips | 0:29abe3c0b902 | 18 | |
Ellips | 0:29abe3c0b902 | 19 | //****************************************************************************/ |
Ellips | 0:29abe3c0b902 | 20 | // Definations for: ATMEGA1284p |
Ellips | 0:29abe3c0b902 | 21 | //****************************************************************************/ |
Ellips | 0:29abe3c0b902 | 22 | #if defined(ATMEGA1284P) |
Ellips | 0:29abe3c0b902 | 23 | #define SIGNATURE_BYTE_1 0x1E |
Ellips | 0:29abe3c0b902 | 24 | #define SIGNATURE_BYTE_2 0x97 |
Ellips | 0:29abe3c0b902 | 25 | #define SIGNATURE_BYTE_3 0x05 |
Ellips | 0:29abe3c0b902 | 26 | #define PAGE_SIZE 64 |
Ellips | 0:29abe3c0b902 | 27 | #define NUM_PAGE 512 |
Ellips | 0:29abe3c0b902 | 28 | //****************************************************************************/ |
Ellips | 0:29abe3c0b902 | 29 | // Definations for: ATMEGA88A |
Ellips | 0:29abe3c0b902 | 30 | //****************************************************************************/ |
Ellips | 0:29abe3c0b902 | 31 | #elif defined(ATMEGA88A) |
Ellips | 0:29abe3c0b902 | 32 | #define SIGNATURE_BYTE_1 0x1E |
Ellips | 0:29abe3c0b902 | 33 | #define SIGNATURE_BYTE_2 0x93 |
Ellips | 0:29abe3c0b902 | 34 | #define SIGNATURE_BYTE_3 0x0A |
Ellips | 0:29abe3c0b902 | 35 | #define PAGE_SIZE 32 |
Ellips | 0:29abe3c0b902 | 36 | #define NUM_PAGE 128 |
Ellips | 0:29abe3c0b902 | 37 | #endif |
Ellips | 0:29abe3c0b902 | 38 | |
Ellips | 0:29abe3c0b902 | 39 | class AVRISP |
Ellips | 0:29abe3c0b902 | 40 | { |
Ellips | 0:29abe3c0b902 | 41 | public: |
Ellips | 0:29abe3c0b902 | 42 | typedef enum _SignatureByte{ |
Ellips | 0:29abe3c0b902 | 43 | eSB1 = 0x00, |
Ellips | 0:29abe3c0b902 | 44 | eSB2 = 0x01, |
Ellips | 0:29abe3c0b902 | 45 | eSB3 = 0x02 |
Ellips | 0:29abe3c0b902 | 46 | } SignatureByte; |
Ellips | 0:29abe3c0b902 | 47 | |
Ellips | 0:29abe3c0b902 | 48 | typedef enum _FuseType{ |
Ellips | 0:29abe3c0b902 | 49 | eFTLo, |
Ellips | 0:29abe3c0b902 | 50 | eFTHi, |
Ellips | 0:29abe3c0b902 | 51 | eFTEx, |
Ellips | 0:29abe3c0b902 | 52 | eFTLock, |
Ellips | 0:29abe3c0b902 | 53 | } FuseType; |
Ellips | 0:29abe3c0b902 | 54 | |
Ellips | 0:29abe3c0b902 | 55 | typedef void(*PRGCB)(void); |
Ellips | 0:29abe3c0b902 | 56 | |
Ellips | 0:29abe3c0b902 | 57 | AVRISP(PinName mosi, PinName miso, PinName sclk, PinName reset, uint32_t spiClk, uint16_t pageSize, PRGCB pCB = NULL); |
Ellips | 0:29abe3c0b902 | 58 | virtual ~AVRISP(); |
Ellips | 0:29abe3c0b902 | 59 | |
Ellips | 0:29abe3c0b902 | 60 | bool EnableProgrammingMode(); |
Ellips | 0:29abe3c0b902 | 61 | void LeaveProgrammingMode(); |
Ellips | 0:29abe3c0b902 | 62 | void ChipErase(); |
Ellips | 0:29abe3c0b902 | 63 | |
Ellips | 0:29abe3c0b902 | 64 | bool ProgramFlash(FILE *hexFile); |
Ellips | 0:29abe3c0b902 | 65 | bool VerifyFlash(FILE *hexFile); |
Ellips | 0:29abe3c0b902 | 66 | |
Ellips | 0:29abe3c0b902 | 67 | |
Ellips | 0:29abe3c0b902 | 68 | uint8_t ReadChipSignatureByte(SignatureByte Nr); |
Ellips | 0:29abe3c0b902 | 69 | void WriteFuse( FuseType Typ, uint8_t fuse ); |
Ellips | 0:29abe3c0b902 | 70 | uint8_t ReadFuse( FuseType Typ ); |
Ellips | 0:29abe3c0b902 | 71 | |
Ellips | 0:29abe3c0b902 | 72 | void WriteProgramPage(uint16_t addr); |
Ellips | 0:29abe3c0b902 | 73 | void LoadProgramPage(uint16_t addr,uint8_t lowData,uint8_t highData); |
Ellips | 0:29abe3c0b902 | 74 | uint8_t ReadProgramFlash(uint16_t addr, bool highByte); |
Ellips | 0:29abe3c0b902 | 75 | |
Ellips | 0:29abe3c0b902 | 76 | private: |
Ellips | 0:29abe3c0b902 | 77 | |
Ellips | 0:29abe3c0b902 | 78 | uint8_t ReadByte(FILE *file); |
Ellips | 0:29abe3c0b902 | 79 | void StillProgramming(); |
Ellips | 0:29abe3c0b902 | 80 | SPI spiPort; |
Ellips | 0:29abe3c0b902 | 81 | DigitalOut resetPin; |
Ellips | 0:29abe3c0b902 | 82 | uint16_t mPageSize; |
Ellips | 0:29abe3c0b902 | 83 | |
Ellips | 0:29abe3c0b902 | 84 | PRGCB progressCB; |
Ellips | 0:29abe3c0b902 | 85 | }; |
Ellips | 0:29abe3c0b902 | 86 | |
Ellips | 0:29abe3c0b902 | 87 | #endif |