From bff4dbe1897d8c19b4bb9807e76350465ca1f1c4 Mon Sep 17 00:00:00 2001 From: Dean Camera Date: Mon, 24 Aug 2009 09:37:54 +0000 Subject: [PATCH] Fix to V2 Protocol for Fuse/Sig/Lock byte read -- off by one error on the array when writing back the response from the device. FLASH/EEPROM reading and writing currently broken and unfinished, respectively. --- Projects/Incomplete/AVRISP/AVRISP.c | 7 ++-- Projects/Incomplete/AVRISP/AVRISP.h | 1 - Projects/Incomplete/AVRISP/AVRISP.txt | 10 ++++- Projects/Incomplete/AVRISP/Lib/V2Protocol.c | 38 ++++++++++++++++--- Projects/Incomplete/AVRISP/Lib/V2Protocol.h | 7 ++-- .../Incomplete/AVRISP/Lib/V2ProtocolParams.c | 8 ++-- .../Incomplete/AVRISP/Lib/V2ProtocolTarget.c | 6 +-- Projects/Incomplete/AVRISP/makefile | 1 - 8 files changed, 57 insertions(+), 21 deletions(-) diff --git a/Projects/Incomplete/AVRISP/AVRISP.c b/Projects/Incomplete/AVRISP/AVRISP.c index 7564f7c18d..f3634fd706 100644 --- a/Projects/Incomplete/AVRISP/AVRISP.c +++ b/Projects/Incomplete/AVRISP/AVRISP.c @@ -34,6 +34,10 @@ * the project and is responsible for the initial application hardware configuration. */ +// TODO: Add reversed target connector checks +// TODO: Add in software SPI for lower programming speeds below 125KHz +// TODO: Add in VTARGET detection + #include "AVRISP.h" /** Main program entry point. This routine contains the overall program flow, including initial @@ -44,8 +48,6 @@ int main(void) SetupHardware(); V2Params_LoadEEPROMParamValues(); - - printf("AVRISP-MKII Clone\r\n"); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); @@ -68,7 +70,6 @@ void SetupHardware(void) clock_prescale_set(clock_div_1); /* Hardware Initialization */ - SerialStream_Init(9600, false); LEDs_Init(); USB_Init(); } diff --git a/Projects/Incomplete/AVRISP/AVRISP.h b/Projects/Incomplete/AVRISP/AVRISP.h index 8a082f635d..daae7f84c4 100644 --- a/Projects/Incomplete/AVRISP/AVRISP.h +++ b/Projects/Incomplete/AVRISP/AVRISP.h @@ -46,7 +46,6 @@ #include #include - #include #include #include diff --git a/Projects/Incomplete/AVRISP/AVRISP.txt b/Projects/Incomplete/AVRISP/AVRISP.txt index 6ab346c2c9..e26cfb11e4 100644 --- a/Projects/Incomplete/AVRISP/AVRISP.txt +++ b/Projects/Incomplete/AVRISP/AVRISP.txt @@ -50,11 +50,19 @@ * \section SSec_Description Project Description: * * Firmware for an AVRStudio compatible AVRISP-MKII clone programmer. This project will enable the USB AVR series of - * microcontrollers to act as a clone of the official Atmel AVRISP-MKII programmer, usable within AVRStudio. + * microcontrollers to act as a clone of the official Atmel AVRISP-MKII programmer, usable within AVRStudio. In its + * most basic form, it allows for the programming of 5V AVRs from within AVRStudio with no special hardware other than + * the USB AVR and the parts needed for the USB interface. If the user desires, more advanced circuits incorporating + * level conversion can be made to allow for the programming of 3.3V AVR designs. * * This device spoofs Atmel's official AVRISP-MKII device PID so that it remains compatible with Atmel's AVRISP-MKII * drivers. When promted, direct your OS to install Atmel's AVRISP-MKII drivers provided with AVRStudio. * + * Note that this design currently has several limitations: + * - Minimum target clock speed of 500KHz due to hardware SPI used + * - No VTARGET detection and notification + * - No reversed/shorted target connector detection and notification + * * \section SSec_Options Project Options * * The following defines can be found in this demo, which can control the demo behaviour when defined, or changed in value. diff --git a/Projects/Incomplete/AVRISP/Lib/V2Protocol.c b/Projects/Incomplete/AVRISP/Lib/V2Protocol.c index 85e3a382d0..cffb91e025 100644 --- a/Projects/Incomplete/AVRISP/Lib/V2Protocol.c +++ b/Projects/Incomplete/AVRISP/Lib/V2Protocol.c @@ -264,9 +264,36 @@ static void V2Protocol_Command_ProgramMemory(uint8_t V2Command) Endpoint_Read_Stream_LE(&Write_Memory_Params, sizeof(Write_Memory_Params)); Write_Memory_Params.BytesToWrite = SwapEndian_16(Write_Memory_Params.BytesToWrite); - for (uint16_t CurrentByte = 0; CurrentByte < Write_Memory_Params.BytesToWrite; CurrentByte++) + if (Write_Memory_Params.ProgrammingMode & PROG_MODE_PAGED_WRITES_MASK) { - // TODO - Read in programming data, write to device + for (uint16_t CurrentByte = 0; CurrentByte < Write_Memory_Params.BytesToWrite; CurrentByte++) + { + if ((V2Command == CMD_READ_FLASH_ISP) && (CurrentByte & 0x01)) + Write_Memory_Params.ProgrammingCommands[0] ^= READ_WRITE_ODD_BYTE_MASK; + + SPI_SendByte(Write_Memory_Params.ProgrammingCommands[0]); + SPI_SendByte(CurrentAddress >> 8); + SPI_SendByte(CurrentAddress & 0xFF); + SPI_SendByte(Endpoint_Read_Byte()); + + // TODO - Correct Polling + + if (((V2Command == CMD_PROGRAM_FLASH_ISP) && (CurrentByte & 0x01)) || (V2Command == CMD_PROGRAM_EEPROM_ISP)) + CurrentAddress++; + } + + /* If the current page must be committed, send the PROGRAM PAGE command to the target */ + if (Write_Memory_Params.ProgrammingMode & PROG_MODE_COMMIT_PAGE_MASK) + { + SPI_SendByte(Write_Memory_Params.ProgrammingCommands[1]); + SPI_SendByte(CurrentAddress >> 8); + SPI_SendByte(CurrentAddress & 0xFF); + SPI_SendByte(0x00); + } + } + else + { + // TODO - Read in programming data, write to device } Endpoint_ClearOUT(); @@ -294,7 +321,7 @@ static void V2Protocol_Command_ReadMemory(uint8_t V2Command) Endpoint_Write_Byte(V2Command); Endpoint_Write_Byte(STATUS_CMD_OK); - + for (uint16_t CurrentByte = 0; CurrentByte < Read_Memory_Params.BytesToRead; CurrentByte++) { if ((V2Command == CMD_READ_FLASH_ISP) && (CurrentByte & 0x01)) @@ -312,7 +339,8 @@ static void V2Protocol_Command_ReadMemory(uint8_t V2Command) Endpoint_WaitUntilReady(); } - CurrentAddress++; + if (((V2Command == CMD_READ_FLASH_ISP) && (CurrentByte & 0x01)) || (V2Command == CMD_READ_EEPROM_ISP)) + CurrentAddress++; } Endpoint_Write_Byte(STATUS_CMD_OK); @@ -377,7 +405,7 @@ static void V2Protocol_Command_ReadFuseLockSigOSCCAL(uint8_t V2Command) Endpoint_Write_Byte(V2Command); Endpoint_Write_Byte(STATUS_CMD_OK); - Endpoint_Write_Byte(ResponseBytes[Read_FuseLockSigOSCCAL_Params.RetByte]); + Endpoint_Write_Byte(ResponseBytes[Read_FuseLockSigOSCCAL_Params.RetByte - 1]); Endpoint_Write_Byte(STATUS_CMD_OK); Endpoint_ClearIN(); } diff --git a/Projects/Incomplete/AVRISP/Lib/V2Protocol.h b/Projects/Incomplete/AVRISP/Lib/V2Protocol.h index 30d40433f8..39406e465b 100644 --- a/Projects/Incomplete/AVRISP/Lib/V2Protocol.h +++ b/Projects/Incomplete/AVRISP/Lib/V2Protocol.h @@ -45,10 +45,11 @@ #include "V2ProtocolTarget.h" /* Macros: */ - #define PROGRAMMER_ID "AVRISP_MK2" + #define PROGRAMMER_ID "AVRISP_MK2" - #define READ_WRITE_ODD_BYTE_MASK (1 << 3) - #define TARGET_MODE_PAGE_MASK (1 << 0) + #define READ_WRITE_ODD_BYTE_MASK (1 << 3) + #define PROG_MODE_PAGED_WRITES_MASK (1 << 0) + #define PROG_MODE_COMMIT_PAGE_MASK (1 << 7) /* Function Prototypes: */ void V2Protocol_ProcessCommand(void); diff --git a/Projects/Incomplete/AVRISP/Lib/V2ProtocolParams.c b/Projects/Incomplete/AVRISP/Lib/V2ProtocolParams.c index 9e6467244d..74c8f20240 100644 --- a/Projects/Incomplete/AVRISP/Lib/V2ProtocolParams.c +++ b/Projects/Incomplete/AVRISP/Lib/V2ProtocolParams.c @@ -37,7 +37,7 @@ #include "V2ProtocolParams.h" /* Non-Volatile Parameter Values for EEPROM storage */ -uint8_t EEMEM EEPROM_Rest_Polarity; +uint8_t EEMEM EEPROM_Rest_Polarity = 0x00; /* Volatile Parameter Values for RAM storage */ static ParameterItem_t ParameterTable[] = @@ -67,11 +67,11 @@ static ParameterItem_t ParameterTable[] = .ParamPrivellages = PARAM_PRIV_READ }, { .ParamID = PARAM_SCK_DURATION, - .ParamValue = 0xFF, + .ParamValue = 0x06, .ParamPrivellages = PARAM_PRIV_READ | PARAM_PRIV_WRITE }, { .ParamID = PARAM_RESET_POLARITY, - .ParamValue = 0x01, + .ParamValue = 0x00, .ParamPrivellages = PARAM_PRIV_WRITE }, { .ParamID = PARAM_STATUS_TGT_CONN, @@ -133,5 +133,5 @@ void V2Params_SetParameterValue(uint8_t ParamID, uint8_t Value) /* The target RESET line polarity is a non-volatile parameter, save to EEPROM when changed */ if (ParamID == PARAM_RESET_POLARITY) - eeprom_write_byte(&EEPROM_Rest_Polarity, Value); + eeprom_write_byte(&EEPROM_Rest_Polarity, Value); } diff --git a/Projects/Incomplete/AVRISP/Lib/V2ProtocolTarget.c b/Projects/Incomplete/AVRISP/Lib/V2ProtocolTarget.c index 15ac3e5b4a..caa7010ba1 100644 --- a/Projects/Incomplete/AVRISP/Lib/V2ProtocolTarget.c +++ b/Projects/Incomplete/AVRISP/Lib/V2ProtocolTarget.c @@ -71,7 +71,7 @@ void V2Protocol_ChangeTargetResetLine(bool ResetTarget) } else { - RESET_LINE_PORT &= ~RESET_LINE_MASK; + RESET_LINE_PORT &= ~RESET_LINE_MASK; RESET_LINE_DDR &= ~RESET_LINE_MASK; } } @@ -89,13 +89,13 @@ uint8_t V2Protocol_WaitWhileTargetBusy(void) do { - V2Protocol_DelayMS(1); - SPI_SendByte(0xF0); SPI_SendByte(0x00); SPI_SendByte(0x00); ResponseByte = SPI_ReceiveByte(); + + V2Protocol_DelayMS(1); } while ((ResponseByte & 0x01) && (TimeoutMS--)); diff --git a/Projects/Incomplete/AVRISP/makefile b/Projects/Incomplete/AVRISP/makefile index c4e13ac8ae..72b1fd76c5 100644 --- a/Projects/Incomplete/AVRISP/makefile +++ b/Projects/Incomplete/AVRISP/makefile @@ -138,7 +138,6 @@ SRC = $(TARGET).c \ Lib/V2Protocol.c \ Lib/V2ProtocolParams.c \ Lib/V2ProtocolTarget.c \ - $(LUFA_PATH)/LUFA/Drivers/Peripheral/SerialStream.c \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/DevChapter9.c \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Endpoint.c \ $(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Host.c \