Commit 7e74bd3e authored by Dean Camera's avatar Dean Camera
Browse files

Moved out target-related V2 protocol commands into a seperate file for the AVRISP project.

Added Load Extended Command functionality to the LOAD ADDRESS V2 Protocol command handler for devices with more than 64KB of memory.
parent f229502d
This diff is collapsed.
......@@ -24,6 +24,7 @@
* - Master LUFA include file rather than per-module includes
* - Add multiple-report HID demo to the library
* - Add dual role Mouse Host/Keyboard Device demo to the library
* - Add Mouse/CDC dual class demo to the library
* - Change makefiles to allow for absolute LUFA location to be used
* - Port LUFA to other architectures
* -# AVR32 UC3B series microcontrollers
......
......@@ -36,77 +36,6 @@
#define INCLUDE_FROM_V2PROTOCOL_C
#include "V2Protocol.h"
uint32_t CurrentAddress;
/* Table of masks for SPI_Init() from a given PARAM_SCK_DURATION value */
static const uint8_t SPIMaskFromSCKDuration[] =
{
#if (F_CPU == 8000000)
SPI_SPEED_FCPU_DIV_2,
#endif
SPI_SPEED_FCPU_DIV_2, SPI_SPEED_FCPU_DIV_4, SPI_SPEED_FCPU_DIV_8,
SPI_SPEED_FCPU_DIV_16, SPI_SPEED_FCPU_DIV_32, SPI_SPEED_FCPU_DIV_64
#if (F_CPU == 16000000)
, SPI_SPEED_FCPU_DIV_128
#endif
};
static uint8_t V2Protocol_GetSPIPrescalerMask(void)
{
uint8_t SCKDuration = V2Params_GetParameterValue(PARAM_SCK_DURATION);
if (SCKDuration >= sizeof(SPIMaskFromSCKDuration))
SCKDuration = (sizeof(SPIMaskFromSCKDuration) - 1);
return SPIMaskFromSCKDuration[SCKDuration];
}
static void V2Protocol_ChangeTargetResetLine(bool ResetTarget)
{
if (ResetTarget)
{
RESET_LINE_DDR |= RESET_LINE_MASK;
if (!(V2Params_GetParameterValue(PARAM_RESET_POLARITY)))
RESET_LINE_PORT |= RESET_LINE_MASK;
}
else
{
RESET_LINE_PORT &= ~RESET_LINE_MASK;
RESET_LINE_DDR &= ~RESET_LINE_MASK;
}
}
static void V2Protocol_DelayMS(uint8_t MS)
{
while (MS--)
_delay_ms(1);
}
static uint8_t V2Protocol_WaitWhileTargetBusy(void)
{
uint8_t TimeoutMS = TARGET_BUST_TIMEOUT_MS;
uint8_t ResponseByte;
do
{
V2Protocol_DelayMS(1);
SPI_SendByte(0xF0);
SPI_SendByte(0x00);
SPI_SendByte(0x00);
ResponseByte = SPI_ReceiveByte();
}
while ((ResponseByte & 0x01) && (TimeoutMS--));
if (!(TimeoutMS))
return STATUS_CMD_TOUT;
else
return STATUS_CMD_OK;
}
void V2Protocol_ProcessCommand(void)
{
uint8_t V2Command = Endpoint_Read_Byte();
......@@ -223,7 +152,8 @@ static void V2Protocol_Command_LoadAddress(void)
Endpoint_ClearOUT();
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
// TODO: Check for extended address
if (CurrentAddress & (1UL << 31))
V2Protocol_LoadExtendedAddress();
Endpoint_Write_Byte(CMD_LOAD_ADDRESS);
Endpoint_Write_Byte(STATUS_CMD_OK);
......
......@@ -37,29 +37,20 @@
#define _V2_PROTOCOL_
/* Includes: */
#include <avr/io.h>
#include <util/delay.h>
#include <LUFA/Drivers/USB/USB.h>
#include <LUFA/Drivers/Peripheral/SPI.h>
#include "../Descriptors.h"
#include "V2ProtocolConstants.h"
#include "V2ProtocolParams.h"
#include "V2ProtocolTarget.h"
/* Macros: */
#define PROGRAMMER_ID "AVRISP_MK2"
#define TARGET_BUST_TIMEOUT_MS 100
/* Function Prototypes: */
void V2Protocol_ProcessCommand(void);
#if defined(INCLUDE_FROM_V2PROTOCOL_C)
static uint8_t V2Protocol_GetSPIPrescalerMask(void);
static void V2Protocol_ChangeTargetResetLine(bool ResetTarget);
static void V2Protocol_DelayMS(uint8_t MS);
static uint8_t V2Protocol_WaitWhileTargetBusy(void);
static void V2Protocol_Command_Unknown(uint8_t V2Command);
static void V2Protocol_Command_SignOn(void);
static void V2Protocol_Command_GetSetParam(uint8_t V2Command);
......
/*
LUFA Library
Copyright (C) Dean Camera, 2009.
dean [at] fourwalledcubicle [dot] com
www.fourwalledcubicle.com
*/
/*
Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, and distribute this software
and its documentation for any purpose and without fee is hereby
granted, provided that the above copyright notice appear in all
copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author disclaim all warranties with regard to this
software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of
this software.
*/
/** \file
*
* Target-related functions for the V2 Protocol decoder.
*/
#include "V2ProtocolTarget.h"
/** Current memory address for FLASH/EEPROM memory read/write commands */
uint32_t CurrentAddress;
/** Table of masks for SPI_Init() from a given PARAM_SCK_DURATION value */
static const uint8_t SPIMaskFromSCKDuration[] =
{
#if (F_CPU == 8000000)
SPI_SPEED_FCPU_DIV_2,
#endif
SPI_SPEED_FCPU_DIV_2, SPI_SPEED_FCPU_DIV_4, SPI_SPEED_FCPU_DIV_8,
SPI_SPEED_FCPU_DIV_16, SPI_SPEED_FCPU_DIV_32, SPI_SPEED_FCPU_DIV_64
#if (F_CPU == 16000000)
, SPI_SPEED_FCPU_DIV_128
#endif
};
uint8_t V2Protocol_GetSPIPrescalerMask(void)
{
uint8_t SCKDuration = V2Params_GetParameterValue(PARAM_SCK_DURATION);
if (SCKDuration >= sizeof(SPIMaskFromSCKDuration))
SCKDuration = (sizeof(SPIMaskFromSCKDuration) - 1);
return SPIMaskFromSCKDuration[SCKDuration];
}
void V2Protocol_ChangeTargetResetLine(bool ResetTarget)
{
if (ResetTarget)
{
RESET_LINE_DDR |= RESET_LINE_MASK;
if (!(V2Params_GetParameterValue(PARAM_RESET_POLARITY)))
RESET_LINE_PORT |= RESET_LINE_MASK;
}
else
{
RESET_LINE_PORT &= ~RESET_LINE_MASK;
RESET_LINE_DDR &= ~RESET_LINE_MASK;
}
}
void V2Protocol_DelayMS(uint8_t MS)
{
while (MS--)
_delay_ms(1);
}
uint8_t V2Protocol_WaitWhileTargetBusy(void)
{
uint8_t TimeoutMS = TARGET_BUSY_TIMEOUT_MS;
uint8_t ResponseByte;
do
{
V2Protocol_DelayMS(1);
SPI_SendByte(0xF0);
SPI_SendByte(0x00);
SPI_SendByte(0x00);
ResponseByte = SPI_ReceiveByte();
}
while ((ResponseByte & 0x01) && (TimeoutMS--));
if (!(TimeoutMS))
return STATUS_CMD_TOUT;
else
return STATUS_CMD_OK;
}
void V2Protocol_LoadExtendedAddress(void)
{
SPI_SendByte(0x4D);
SPI_SendByte(0x00);
SPI_SendByte((CurrentAddress & 0x00FF0000) >> 16);
SPI_SendByte(0x00);
}
/*
LUFA Library
Copyright (C) Dean Camera, 2009.
dean [at] fourwalledcubicle [dot] com
www.fourwalledcubicle.com
*/
/*
Copyright 2009 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Permission to use, copy, modify, and distribute this software
and its documentation for any purpose and without fee is hereby
granted, provided that the above copyright notice appear in all
copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the
software without specific, written prior permission.
The author disclaim all warranties with regard to this
software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of
this software.
*/
/** \file
*
* Header file for V2ProtocolTarget.c.
*/
#ifndef _V2_PROTOCOL_TARGET_
#define _V2_PROTOCOL_TARGET_
/* Includes: */
#include <avr/io.h>
#include <util/delay.h>
#include <LUFA/Drivers/USB/USB.h>
#include <LUFA/Drivers/Peripheral/SPI.h>
#include "../Descriptors.h"
#include "V2ProtocolConstants.h"
#include "V2ProtocolParams.h"
/* Macros: */
#define TARGET_BUSY_TIMEOUT_MS 100
/* External Variables: */
extern uint32_t CurrentAddress;
/* Function Prototypes: */
uint8_t V2Protocol_GetSPIPrescalerMask(void);
void V2Protocol_ChangeTargetResetLine(bool ResetTarget);
void V2Protocol_DelayMS(uint8_t MS);
uint8_t V2Protocol_WaitWhileTargetBusy(void);
void V2Protocol_LoadExtendedAddress(void);
#endif
......@@ -137,6 +137,7 @@ SRC = $(TARGET).c \
Descriptors.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 \
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment