2005-05-10 19:53:56 +00:00
|
|
|
/*
|
|
|
|
* avrdude - A Downloader/Uploader for AVR device programmers
|
|
|
|
* Copyright (C) 2005 Joerg Wunsch <j@uriah.heep.sax.de>
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* 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, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
/* $Id$ */
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
* JTAG ICE mkII definitions
|
|
|
|
* Taken from Appnote AVR067
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Communication with the JTAG ICE works in frames. The protocol
|
|
|
|
* somewhat resembles the STK500v2 protocol, yet it is sufficiently
|
|
|
|
* different to prevent a direct code reuse. :-(
|
|
|
|
*
|
|
|
|
* Frame format:
|
|
|
|
*
|
|
|
|
* +---------------------------------------------------------------+
|
|
|
|
* | 0 | 1 . 2 | 3 . 4 . 5 . 6 | 7 | ... | N-1 . N |
|
|
|
|
* | | | | | | |
|
|
|
|
* | start | LSB MSB | LSB ....... MSB | token | msg | LSB MSB |
|
|
|
|
* | 0x1B | sequence# | message size | 0x0E | | CRC16 |
|
|
|
|
* +---------------------------------------------------------------+
|
|
|
|
*
|
|
|
|
* Each request message will be returned by a response with a matching
|
|
|
|
* sequence #. Sequence # 0xffff is reserved for asynchronous event
|
|
|
|
* notifications that will be sent by the ICE without a request
|
|
|
|
* message (e.g. when the target hit a breakpoint).
|
|
|
|
*
|
|
|
|
* The message size excludes the framing overhead (10 bytes).
|
|
|
|
*
|
|
|
|
* The first byte of the message is always the request or response
|
|
|
|
* code, which is roughly classified as:
|
|
|
|
*
|
|
|
|
* . Messages (commands) use 0x00 through 0x3f. (The documentation
|
|
|
|
* claims that messages start at 0x01, but actually CMND_SIGN_OFF is
|
|
|
|
* 0x00.)
|
|
|
|
* . Internal commands use 0x40 through 0x7f (not documented).
|
|
|
|
* . Success responses use 0x80 through 0x9f.
|
|
|
|
* . Failure responses use 0xa0 through 0xbf.
|
|
|
|
* . Events use 0xe0 through 0xff.
|
|
|
|
*/
|
|
|
|
#define MESSAGE_START 0x1b
|
|
|
|
#define TOKEN 0x0e
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Max message size we are willing to accept. Prevents us from trying
|
|
|
|
* to allocate too much VM in case we received a nonsensical packet
|
|
|
|
* length. We have to allocate the buffer as soon as we've got the
|
|
|
|
* length information (and thus have to trust that information by that
|
|
|
|
* time at first), as the final CRC check can only be done once the
|
|
|
|
* entire packet came it.
|
|
|
|
*/
|
|
|
|
#define MAX_MESSAGE 100000
|
|
|
|
|
|
|
|
/* ICE command codes */
|
|
|
|
#define CMND_CHIP_ERASE 0x13
|
|
|
|
#define CMND_CLEAR_EVENTS 0x22
|
|
|
|
#define CMND_CLR_BREAK 0x1A
|
|
|
|
#define CMND_ENTER_PROGMODE 0x14
|
|
|
|
#define CMND_ERASEPAGE_SPM 0x0D
|
|
|
|
#define CMND_FORCED_STOP 0x0A
|
|
|
|
#define CMND_GET_BREAK 0x12
|
|
|
|
#define CMND_GET_PARAMETER 0x03
|
|
|
|
#define CMND_GET_SIGN_ON 0x01
|
|
|
|
#define CMND_GET_SYNC 0x0f
|
|
|
|
#define CMND_GO 0x08
|
|
|
|
#define CMND_LEAVE_PROGMODE 0x15
|
|
|
|
#define CMND_READ_MEMORY 0x05
|
|
|
|
#define CMND_READ_PC 0x07
|
|
|
|
#define CMND_RESET 0x0B
|
|
|
|
#define CMND_RESTORE_TARGET 0x23
|
|
|
|
#define CMND_RUN_TO_ADDR 0x1C
|
|
|
|
#define CMND_SELFTEST 0x10
|
|
|
|
#define CMND_SET_BREAK 0x11
|
|
|
|
#define CMND_SET_DEVICE_DESCRIPTOR 0x0C
|
|
|
|
#define CMND_SET_N_PARAMETERS 0x16
|
|
|
|
#define CMND_SET_PARAMETER 0x02
|
|
|
|
#define CMND_SIGN_OFF 0x00
|
|
|
|
#define CMND_SINGLE_STEP 0x09
|
|
|
|
#define CMND_SPI_CMD 0x1D
|
|
|
|
#define CMND_WRITE_MEMORY 0x04
|
|
|
|
#define CMND_WRITE_PC 0x06
|
|
|
|
|
|
|
|
/* ICE responses */
|
|
|
|
#define RSP_DEBUGWIRE_SYNC_FAILED 0xAC
|
|
|
|
#define RSP_FAILED 0xA0
|
|
|
|
#define RSP_GET_BREAK 0x83
|
|
|
|
#define RSP_ILLEGAL_BREAKPOINT 0xA8
|
|
|
|
#define RSP_ILLEGAL_COMMAND 0xAA
|
|
|
|
#define RSP_ILLEGAL_EMULATOR_MODE 0xA4
|
|
|
|
#define RSP_ILLEGAL_JTAG_ID 0xA9
|
|
|
|
#define RSP_ILLEGAL_MCU_STATE 0xA5
|
|
|
|
#define RSP_ILLEGAL_MEMORY_TYPE 0xA2
|
|
|
|
#define RSP_ILLEGAL_MEMORY_RANGE 0xA3
|
|
|
|
#define RSP_ILLEGAL_PARAMETER 0xA1
|
|
|
|
#define RSP_ILLEGAL_POWER_STATE 0xAD
|
|
|
|
#define RSP_ILLEGAL_VALUE 0xA6
|
|
|
|
#define RSP_MEMORY 0x82
|
|
|
|
#define RSP_NO_TARGET_POWER 0xAB
|
|
|
|
#define RSP_OK 0x80
|
|
|
|
#define RSP_PARAMETER 0x81
|
|
|
|
#define RSP_PC 0x84
|
|
|
|
#define RSP_SELFTEST 0x85
|
|
|
|
#define RSP_SET_N_PARAMETERS 0xA7
|
|
|
|
#define RSP_SIGN_ON 0x86
|
|
|
|
#define RSP_SPI_DATA 0x88
|
|
|
|
|
|
|
|
/* ICE events */
|
|
|
|
#define EVT_BREAK 0xE0
|
|
|
|
#define EVT_DEBUG 0xE6
|
|
|
|
#define EVT_ERROR_PHY_FORCE_BREAK_TIMEOUT 0xE2
|
|
|
|
#define EVT_ERROR_PHY_MAX_BIT_LENGTH_DIFF 0xED
|
|
|
|
#define EVT_ERROR_PHY_OPT_RECEIVE_TIMEOUT 0xF9
|
|
|
|
#define EVT_ERROR_PHY_OPT_RECEIVED_BREAK 0xFA
|
|
|
|
#define EVT_ERROR_PHY_RECEIVED_BREAK 0xF8
|
|
|
|
#define EVT_ERROR_PHY_RECEIVE_TIMEOUT 0xF7
|
|
|
|
#define EVT_ERROR_PHY_RELEASE_BREAK_TIMEOUT 0xE3
|
|
|
|
#define EVT_ERROR_PHY_SYNC_OUT_OF_RANGE 0xF5
|
|
|
|
#define EVT_ERROR_PHY_SYNC_TIMEOUT 0xF0
|
|
|
|
#define EVT_ERROR_PHY_SYNC_TIMEOUT_BAUD 0xF4
|
|
|
|
#define EVT_ERROR_PHY_SYNC_WAIT_TIMEOUT 0xF6
|
|
|
|
#define EVT_RESULT_PHY_NO_ACTIVITY 0xFB
|
|
|
|
#define EVT_EXT_RESET 0xE7
|
|
|
|
#define EVT_ICE_POWER_ERROR_STATE 0xEA
|
|
|
|
#define EVT_ICE_POWER_OK 0xEB
|
|
|
|
#define EVT_IDR_DIRTY 0xEC
|
|
|
|
#define EVT_NONE 0xEF
|
|
|
|
#define EVT_PDSB_BREAK 0xF2
|
|
|
|
#define EVT_PDSMB_BREAK 0xF3
|
|
|
|
#define EVT_PROGRAM_BREAK 0xF1
|
|
|
|
#define EVT_RUN 0xE1
|
|
|
|
#define EVT_TARGET_POWER_OFF 0xE5
|
|
|
|
#define EVT_TARGET_POWER_ON 0xE4
|
|
|
|
#define EVT_TARGET_SLEEP 0xE8
|
|
|
|
#define EVT_TARGET_WAKEUP 0xE9
|
|
|
|
|
|
|
|
/* memory types for CMND_{READ,WRITE}_MEMORY */
|
|
|
|
#define MTYPE_IO_SHADOW 0x30 /* cached IO registers? */
|
|
|
|
#define MTYPE_SRAM 0x20 /* target's SRAM or [ext.] IO registers */
|
|
|
|
#define MTYPE_EEPROM 0x22 /* EEPROM, what way? */
|
|
|
|
#define MTYPE_EVENT 0x60 /* ICE event memory */
|
|
|
|
#define MTYPE_SPM 0xA0 /* flash through LPM/SPM */
|
|
|
|
#define MTYPE_FLASH_PAGE 0xB0 /* flash in programming mode */
|
|
|
|
#define MTYPE_EEPROM_PAGE 0xB1 /* EEPROM in programming mode */
|
|
|
|
#define MTYPE_FUSE_BITS 0xB2 /* fuse bits in programming mode */
|
|
|
|
#define MTYPE_LOCK_BITS 0xB3 /* lock bits in programming mode */
|
|
|
|
#define MTYPE_SIGN_JTAG 0xB4 /* signature in programming mode */
|
|
|
|
#define MTYPE_OSCCAL_BYTE 0xB5 /* osccal cells in programming mode */
|
|
|
|
#define MTYPE_CAN 0xB6 /* CAN mailbox */
|
|
|
|
|
|
|
|
/* (some) ICE parameters, for CMND_{GET,SET}_PARAMETER */
|
|
|
|
#define PAR_HW_VERSION 0x01
|
|
|
|
#define PAR_FW_VERSION 0x02
|
|
|
|
#define PAR_EMULATOR_MODE 0x03
|
|
|
|
# define EMULATOR_MODE_DEBUGWIRE 0x00
|
|
|
|
# define EMULATOR_MODE_JTAG 0x01
|
|
|
|
# define EMULATOR_MODE_UNKNOWN 0x02
|
|
|
|
# define EMULATOR_MODE_SPI 0x03
|
|
|
|
#define PAR_IREG 0x04
|
|
|
|
#define PAR_BAUD_RATE 0x05
|
2005-05-11 20:48:05 +00:00
|
|
|
# define PAR_BAUD_2400 0x01
|
|
|
|
# define PAR_BAUD_4800 0x02
|
|
|
|
# define PAR_BAUD_9600 0x03
|
|
|
|
# define PAR_BAUD_19200 0x04 /* default */
|
|
|
|
# define PAR_BAUD_38400 0x05
|
|
|
|
# define PAR_BAUD_57600 0x06
|
|
|
|
# define PAR_BAUD_115200 0x07
|
|
|
|
# define PAR_BAUD_14400 0x08
|
2005-05-10 19:53:56 +00:00
|
|
|
#define PAR_OCD_VTARGET 0x06
|
|
|
|
#define PAR_OCD_JTAG_CLK 0x07
|
|
|
|
#define PAR_OCD_BREAK_CAUSE 0x08
|
|
|
|
#define PAR_TIMERS_RUNNING 0x09
|
|
|
|
#define PAR_BREAK_ON_CHANGE_FLOW 0x0A
|
|
|
|
#define PAR_BREAK_ADDR1 0x0B
|
|
|
|
#define PAR_BREAK_ADDR2 0x0C
|
|
|
|
#define PAR_COMBBREAKCTRL 0x0D
|
|
|
|
#define PAR_JTAGID 0x0E
|
|
|
|
#define PAR_UNITS_BEFORE 0x0F
|
|
|
|
#define PAR_UNITS_AFTER 0x10
|
|
|
|
#define PAR_BIT_BEFORE 0x11
|
|
|
|
#define PAR_BIT_ATER 0x12
|
|
|
|
#define PAR_EXTERNAL_RESET 0x13
|
|
|
|
#define PAR_FLASH_PAGE_SIZE 0x14
|
|
|
|
#define PAR_EEPROM_PAGE_SIZE 0x15
|
|
|
|
#define PAR_UNUSED1 0x16
|
|
|
|
#define PAR_PSB0 0x17
|
|
|
|
#define PAR_PSB1 0x18
|
|
|
|
#define PAR_PROTOCOL_DEBUG_EVENT 0x19
|
|
|
|
#define PAR_MCU_STATE 0x1A
|
|
|
|
# define STOPPED 0x00
|
|
|
|
# define RUNNING 0x01
|
|
|
|
# define PROGRAMMING 0x02
|
|
|
|
#define PAR_DAISY_CHAIN_INFO 0x1B
|
|
|
|
#define PAR_BOOT_ADDRESS 0x1C
|
|
|
|
#define PAR_TARGET_SIGNATURE 0x1D
|
|
|
|
#define PAR_DEBUGWIRE_BAUDRATE 0x1E
|
|
|
|
#define PAR_PROGRAM_ENTRY_POINT 0x1F
|
|
|
|
#define PAR_PACKET_PARSING_ERRORS 0x40
|
|
|
|
#define PAR_VALID_PACKETS_RECEIVED 0x41
|
|
|
|
#define PAR_INTERCOMMUNICATION_TX_FAILURES 0x42
|
|
|
|
#define PAR_INTERCOMMUNICATION_RX_FAILURES 0x43
|
|
|
|
#define PAR_CRC_ERRORS 0x44
|
|
|
|
#define PAR_POWER_SOURCE 0x45
|
|
|
|
# define POWER_EXTERNAL 0x00
|
|
|
|
# define POWER_USB 0x01
|
|
|
|
#define PAR_CAN_FLAG 0x22
|
|
|
|
# define DONT_READ_CAN_MAILBOX 0x00
|
|
|
|
# define READ_CAN_MAILBOX 0x01
|
|
|
|
#define PAR_ENABLE_IDR_IN_RUN_MODE 0x23
|
|
|
|
# define ACCESS_OSCCAL 0x00
|
|
|
|
# define ACCESS_IDR 0x01
|
|
|
|
#define PAR_ALLOW_PAGEPROGRAMMING_IN_SCANCHAIN 0x24
|
|
|
|
# define PAGEPROG_NOT_ALLOWED 0x00
|
|
|
|
# define PAGEPROG_ALLOWED 0x01
|
|
|
|
|
|
|
|
/*
|
|
|
|
* In appnote AVR067, struct device_descriptor is written with
|
|
|
|
* int/long field types. We cannot use them directly, as they were
|
|
|
|
* neither properly aligned for portability, nor did they care for
|
|
|
|
* endianess issues. We thus use arrays of unsigned chars, plus
|
|
|
|
* conversion macros.
|
|
|
|
*/
|
|
|
|
struct device_descriptor
|
|
|
|
{
|
|
|
|
unsigned char ucReadIO[8]; /*LSB = IOloc 0, MSB = IOloc63 */
|
|
|
|
unsigned char ucReadIOShadow[8]; /*LSB = IOloc 0, MSB = IOloc63 */
|
|
|
|
unsigned char ucWriteIO[8]; /*LSB = IOloc 0, MSB = IOloc63 */
|
|
|
|
unsigned char ucWriteIOShadow[8]; /*LSB = IOloc 0, MSB = IOloc63 */
|
|
|
|
unsigned char ucReadExtIO[52]; /*LSB = IOloc 96, MSB = IOloc511 */
|
|
|
|
unsigned char ucReadIOExtShadow[52]; /*LSB = IOloc 96, MSB = IOloc511 */
|
|
|
|
unsigned char ucWriteExtIO[52]; /*LSB = IOloc 96, MSB = IOloc511 */
|
|
|
|
unsigned char ucWriteIOExtShadow[52];/*LSB = IOloc 96, MSB = IOloc511 */
|
|
|
|
unsigned char ucIDRAddress; /*IDR address */
|
|
|
|
unsigned char ucSPMCRAddress; /*SPMCR Register address and dW BasePC */
|
|
|
|
unsigned char ucRAMPZAddress; /*RAMPZ Register address in SRAM I/O */
|
|
|
|
/*space */
|
|
|
|
unsigned char uiFlashPageSize[2]; /*Device Flash Page Size, Size = */
|
|
|
|
/*2 exp ucFlashPageSize */
|
|
|
|
unsigned char ucEepromPageSize; /*Device Eeprom Page Size in bytes */
|
|
|
|
unsigned char ulBootAddress[4]; /*Device Boot Loader Start Address */
|
|
|
|
unsigned char uiUpperExtIOLoc[2]; /*Topmost (last) extended I/O */
|
|
|
|
/*location, 0 if no external I/O */
|
|
|
|
unsigned char ulFlashSize[4]; /*Device Flash Size */
|
|
|
|
unsigned char ucEepromInst[20]; /*Instructions for W/R EEPROM */
|
|
|
|
unsigned char ucFlashInst[3]; /*Instructions for W/R FLASH */
|
|
|
|
unsigned char ucSPHaddr; /* stack pointer high */
|
|
|
|
unsigned char ucSPLaddr; /* stack pointer low */
|
|
|
|
/* new as of 16-02-2004 */
|
|
|
|
unsigned char uiFlashpages[2]; /* number of pages in flash */
|
|
|
|
unsigned char ucDWDRAddress; /* DWDR register address */
|
|
|
|
unsigned char ucDWBasePC; /* base/mask value of the PC */
|
|
|
|
/* new as of 30-04-2004 */
|
|
|
|
unsigned char ucAllowFullPageBitstream; /* FALSE on ALL new */
|
|
|
|
/*parts */
|
|
|
|
unsigned char uiStartSmallestBootLoaderSection[2]; /* */
|
|
|
|
/* new as of 18-10-2004 */
|
|
|
|
unsigned char EnablePageProgramming; /* For JTAG parts only, */
|
|
|
|
/* default TRUE */
|
|
|
|
unsigned char ucCacheType; /* CacheType_Normal 0x00, */
|
|
|
|
/* CacheType_CAN 0x01, */
|
|
|
|
/* CacheType_HEIMDALL 0x02 */
|
|
|
|
/* new as of 27-10-2004 */
|
|
|
|
unsigned char uiSramStartAddr[2]; /* Start of SRAM */
|
|
|
|
unsigned char ucResetType; /* Selects reset type. ResetNormal = 0x00 */
|
|
|
|
/* ResetAT76CXXX = 0x01 */
|
|
|
|
unsigned char ucPCMaskExtended; /* For parts with extended PC */
|
|
|
|
unsigned char ucPCMaskHigh; /* PC high mask */
|
|
|
|
unsigned char ucEindAddress; /* Selects reset type. [EIND address...] */
|
Quite some cleanup of the JTAG ICE mkII stuff.
. Implement the new EECRAddress field in the device descriptor that is
required by the 4.x firmware; make an uneducated guess about what
firmware requires what length of device descriptor -- perhaps Atmel
can be convinced to publish an official matrix for that.
. Specify EECR in the config file where required. Obviously, only
locations that differ from the 0x3c default are mentioned in the
XML files, so by now, this only affects the AT90CAN128 for us.
. After clarification with Atmel, EnablePageProgramming should really
default to 1, and only cleared if specified by an XML parameter. So
far, only the XML files for the ATmega256x and ATmega406 do specify
it at all, and they specify a 1, too.
. Drop the entire OCDEN fuse heuristic. If OCDEN is unprogrammed at
startup, issue a warning that single-byte EEPROM updates won't be
possible. Leave it to the user to program the fuse if desired.
That way, we won't run into any issue of prematurely wearing out the
hfuse EEPROM cell. Interestingly enough, this also solved the
problem of the target not restarting from scratch upon sign-off.
git-svn-id: svn://svn.savannah.nongnu.org/avrdude/trunk/avrdude@461 81a1dc3b-b13d-400b-aceb-764788c761c2
2005-05-11 20:06:23 +00:00
|
|
|
/* new as of early 2005, firmware 4.x */
|
|
|
|
unsigned char EECRAddress[2]; /* EECR memory-mapped IO address */
|
2005-05-10 19:53:56 +00:00
|
|
|
};
|