/* * avrdude - A Downloader/Uploader for AVR device programmers * Copyright (C) 2003-2004 Brian S. Dean * Copyright (C) 2006 Joerg Wunsch * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ /* $Id$ */ #ifndef avrpart_h #define avrpart_h #include #include "lists.h" /* * AVR serial programming instructions */ enum { AVR_OP_READ, AVR_OP_WRITE, AVR_OP_READ_LO, AVR_OP_READ_HI, AVR_OP_WRITE_LO, AVR_OP_WRITE_HI, AVR_OP_LOADPAGE_LO, AVR_OP_LOADPAGE_HI, AVR_OP_LOAD_EXT_ADDR, AVR_OP_WRITEPAGE, AVR_OP_CHIP_ERASE, AVR_OP_PGM_ENABLE, AVR_OP_MAX }; enum { AVR_CMDBIT_IGNORE, /* bit is ignored on input and output */ AVR_CMDBIT_VALUE, /* bit is set to 0 or 1 for input or output */ AVR_CMDBIT_ADDRESS, /* this bit represents an input address bit */ AVR_CMDBIT_INPUT, /* this bit is an input bit */ AVR_CMDBIT_OUTPUT /* this bit is an output bit */ }; enum { /* these are assigned to reset_disposition of AVRPART */ RESET_DEDICATED, /* reset pin is dedicated */ RESET_IO /* reset pin might be configured as an I/O pin */ }; enum ctl_stack_t { CTL_STACK_NONE, /* no control stack defined */ CTL_STACK_PP, /* parallel programming control stack */ CTL_STACK_HVSP /* high voltage serial programming control stack */ }; /* * serial programming instruction bit specifications */ typedef struct cmdbit { int type; /* AVR_CMDBIT_* */ int bitno; /* which input bit to use for this command bit */ int value; /* bit value if type == AVR_CMDBIT_VALUD */ } CMDBIT; typedef struct opcode { CMDBIT bit[32]; /* opcode bit specs */ } OPCODE; #define AVRPART_SERIALOK 0x0001 /* part supports serial programming */ #define AVRPART_PARALLELOK 0x0002 /* part supports parallel programming */ #define AVRPART_PSEUDOPARALLEL 0x0004 /* part has pseudo parallel support */ #define AVRPART_HAS_JTAG 0x0008 /* part has a JTAG i/f */ #define AVRPART_ALLOWFULLPAGEBITSTREAM 0x0010 /* JTAG ICE mkII param. */ #define AVRPART_ENABLEPAGEPROGRAMMING 0x0020 /* JTAG ICE mkII param. */ #define AVRPART_HAS_DW 0x0040 /* part has a debugWire i/f */ #define AVRPART_HAS_PDI 0x0080 /* part has PDI i/f rather than ISP (ATxmega) */ #define AVRPART_AVR32 0x0100 /* part is in AVR32 family */ #define AVRPART_INIT_SMC 0x0200 /* part will undergo chip erase */ #define AVRPART_WRITE 0x0400 /* at least one write operation specified */ #define AVRPART_HAS_TPI 0x0800 /* part has TPI i/f rather than ISP (ATtiny4/5/9/10) */ #define AVRPART_IS_AT90S1200 0x1000 /* part is an AT90S1200 (needs special treatment) */ #define AVR_DESCLEN 64 #define AVR_IDLEN 32 #define CTL_STACK_SIZE 32 #define FLASH_INSTR_SIZE 3 #define EEPROM_INSTR_SIZE 20 #define TAG_ALLOCATED 1 /* memory byte is allocated */ typedef struct avrpart { char desc[AVR_DESCLEN]; /* long part name */ char id[AVR_IDLEN]; /* short part name */ int stk500_devcode; /* stk500 device code */ int avr910_devcode; /* avr910 device code */ int chip_erase_delay; /* microseconds */ unsigned char pagel; /* for parallel programming */ unsigned char bs2; /* for parallel programming */ unsigned char signature[3]; /* expected value of signature bytes */ int reset_disposition; /* see RESET_ enums */ int retry_pulse; /* retry program enable by pulsing this pin (PIN_AVR_*) */ unsigned flags; /* see AVRPART_ masks */ int timeout; /* stk500 v2 xml file parameter */ int stabdelay; /* stk500 v2 xml file parameter */ int cmdexedelay; /* stk500 v2 xml file parameter */ int synchloops; /* stk500 v2 xml file parameter */ int bytedelay; /* stk500 v2 xml file parameter */ int pollindex; /* stk500 v2 xml file parameter */ unsigned char pollvalue; /* stk500 v2 xml file parameter */ int predelay; /* stk500 v2 xml file parameter */ int postdelay; /* stk500 v2 xml file parameter */ int pollmethod; /* stk500 v2 xml file parameter */ enum ctl_stack_t ctl_stack_type; /* what to use the ctl stack for */ unsigned char controlstack[CTL_STACK_SIZE]; /* stk500v2 PP/HVSP ctl stack */ unsigned char flash_instr[FLASH_INSTR_SIZE]; /* flash instructions (debugWire, JTAG) */ unsigned char eeprom_instr[EEPROM_INSTR_SIZE]; /* EEPROM instructions (debugWire, JTAG) */ int hventerstabdelay; /* stk500 v2 hv mode parameter */ int progmodedelay; /* stk500 v2 hv mode parameter */ int latchcycles; /* stk500 v2 hv mode parameter */ int togglevtg; /* stk500 v2 hv mode parameter */ int poweroffdelay; /* stk500 v2 hv mode parameter */ int resetdelayms; /* stk500 v2 hv mode parameter */ int resetdelayus; /* stk500 v2 hv mode parameter */ int hvleavestabdelay; /* stk500 v2 hv mode parameter */ int resetdelay; /* stk500 v2 hv mode parameter */ int chiperasepulsewidth; /* stk500 v2 hv mode parameter */ int chiperasepolltimeout; /* stk500 v2 hv mode parameter */ int chiperasetime; /* stk500 v2 hv mode parameter */ int programfusepulsewidth; /* stk500 v2 hv mode parameter */ int programfusepolltimeout; /* stk500 v2 hv mode parameter */ int programlockpulsewidth; /* stk500 v2 hv mode parameter */ int programlockpolltimeout; /* stk500 v2 hv mode parameter */ int synchcycles; /* stk500 v2 hv mode parameter */ int hvspcmdexedelay; /* stk500 v2 xml file parameter */ unsigned char idr; /* JTAG ICE mkII XML file parameter */ unsigned char rampz; /* JTAG ICE mkII XML file parameter */ unsigned char spmcr; /* JTAG ICE mkII XML file parameter */ unsigned short eecr; /* JTAC ICE mkII XML file parameter */ unsigned int mcu_base; /* Base address of MCU control block in ATxmega devices */ unsigned int nvm_base; /* Base address of NVM controller in ATxmega devices */ int ocdrev; /* OCD revision (JTAGICE3 parameter, from AS6 XML files) */ OPCODE * op[AVR_OP_MAX]; /* opcodes */ LISTID mem; /* avr memory definitions */ char config_file[PATH_MAX]; /* config file where defined */ int lineno; /* config file line number */ } AVRPART; #define AVR_MEMDESCLEN 64 typedef struct avrmem { char desc[AVR_MEMDESCLEN]; /* memory description ("flash", "eeprom", etc) */ int paged; /* page addressed (e.g. ATmega flash) */ int size; /* total memory size in bytes */ int page_size; /* size of memory page (if page addressed) */ int num_pages; /* number of pages (if page addressed) */ unsigned int offset; /* offset in IO memory (ATxmega) */ int min_write_delay; /* microseconds */ int max_write_delay; /* microseconds */ int pwroff_after_write; /* after this memory type is written to, the device must be powered off and back on, see errata http://www.atmel.com/dyn/resources/prod_documents/doc1280.pdf */ unsigned char readback[2]; /* polled read-back values */ int mode; /* stk500 v2 xml file parameter */ int delay; /* stk500 v2 xml file parameter */ int blocksize; /* stk500 v2 xml file parameter */ int readsize; /* stk500 v2 xml file parameter */ int pollindex; /* stk500 v2 xml file parameter */ unsigned char * buf; /* pointer to memory buffer */ unsigned char * tags; /* allocation tags */ OPCODE * op[AVR_OP_MAX]; /* opcodes */ } AVRMEM; #ifdef __cplusplus extern "C" { #endif /* Functions for OPCODE structures */ OPCODE * avr_new_opcode(void); void avr_free_opcode(OPCODE * op); int avr_set_bits(OPCODE * op, unsigned char * cmd); int avr_set_addr(OPCODE * op, unsigned char * cmd, unsigned long addr); int avr_set_input(OPCODE * op, unsigned char * cmd, unsigned char data); int avr_get_output(OPCODE * op, unsigned char * res, unsigned char * data); int avr_get_output_index(OPCODE * op); /* Functions for AVRMEM structures */ AVRMEM * avr_new_memtype(void); int avr_initmem(AVRPART * p); AVRMEM * avr_dup_mem(AVRMEM * m); void avr_free_mem(AVRMEM * m); AVRMEM * avr_locate_mem(AVRPART * p, char * desc); void avr_mem_display(const char * prefix, FILE * f, AVRMEM * m, int type, int verbose); /* Functions for AVRPART structures */ AVRPART * avr_new_part(void); AVRPART * avr_dup_part(AVRPART * d); void avr_free_part(AVRPART * d); AVRPART * locate_part(LISTID parts, char * partdesc); AVRPART * locate_part_by_avr910_devcode(LISTID parts, int devcode); void avr_display(FILE * f, AVRPART * p, const char * prefix, int verbose); typedef void (*walk_avrparts_cb)(const char *name, const char *desc, const char *cfgname, int cfglineno, void *cookie); void walk_avrparts(LISTID avrparts, walk_avrparts_cb cb, void *cookie); void sort_avrparts(LISTID avrparts); #ifdef __cplusplus } #endif #endif /* avrpart_h */