forked from mfulz_github/qmk_firmware
Started implementing the low level PDI protocol in the AVRISP project, for XMEGA device programming.
This commit is contained in:
parent
f92b56191d
commit
f69f03cb0d
File diff suppressed because one or more lines are too long
|
@ -70,7 +70,6 @@ void SetupHardware(void)
|
||||||
/* Hardware Initialization */
|
/* Hardware Initialization */
|
||||||
LEDs_Init();
|
LEDs_Init();
|
||||||
USB_Init();
|
USB_Init();
|
||||||
SerialStream_Init(9600, true);
|
|
||||||
|
|
||||||
#if defined(ADC)
|
#if defined(ADC)
|
||||||
/* Initialize the ADC converter for VTARGET level detection on supported AVR models */
|
/* Initialize the ADC converter for VTARGET level detection on supported AVR models */
|
||||||
|
|
|
@ -47,7 +47,6 @@
|
||||||
#include <LUFA/Version.h>
|
#include <LUFA/Version.h>
|
||||||
#include <LUFA/Drivers/Board/LEDs.h>
|
#include <LUFA/Drivers/Board/LEDs.h>
|
||||||
#include <LUFA/Drivers/USB/USB.h>
|
#include <LUFA/Drivers/USB/USB.h>
|
||||||
#include <LUFA/Drivers/Peripheral/SerialStream.h>
|
|
||||||
|
|
||||||
#if defined(ADC)
|
#if defined(ADC)
|
||||||
#include <LUFA/Drivers/Peripheral/ADC.h>
|
#include <LUFA/Drivers/Peripheral/ADC.h>
|
||||||
|
|
|
@ -61,7 +61,7 @@ void ISPProtocol_EnterISPMode(void)
|
||||||
|
|
||||||
CurrentAddress = 0;
|
CurrentAddress = 0;
|
||||||
|
|
||||||
V2Protocol_DelayMS(Enter_ISP_Params.ExecutionDelayMS);
|
V2Protocol_DelayMS(Enter_ISP_Params.ExecutionDelayMS);
|
||||||
SPI_Init(ISPTarget_GetSPIPrescalerMask() | SPI_SCK_LEAD_RISING | SPI_SAMPLE_LEADING | SPI_MODE_MASTER);
|
SPI_Init(ISPTarget_GetSPIPrescalerMask() | SPI_SCK_LEAD_RISING | SPI_SAMPLE_LEADING | SPI_MODE_MASTER);
|
||||||
|
|
||||||
while (Enter_ISP_Params.SynchLoops-- && (ResponseStatus == STATUS_CMD_FAILED))
|
while (Enter_ISP_Params.SynchLoops-- && (ResponseStatus == STATUS_CMD_FAILED))
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
* PDI Protocol handler, to process V2 Protocol wrapped PDI commands used in Atmel programmer devices.
|
* PDI Protocol handler, to process V2 Protocol wrapped PDI commands used in Atmel programmer devices.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define INCLUDE_FROM_XPROG_C
|
#define INCLUDE_FROM_PDIPROTOCOL_C
|
||||||
#include "PDIProtocol.h"
|
#include "PDIProtocol.h"
|
||||||
|
|
||||||
uint32_t XPROG_Param_NVMBase;
|
uint32_t XPROG_Param_NVMBase;
|
||||||
|
@ -91,6 +91,59 @@ void PDIProtocol_XPROG_Command(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void PDIProtocol_EnterXPROGMode(void)
|
||||||
|
{
|
||||||
|
uint8_t ReturnStatus = XPRG_ERR_OK;
|
||||||
|
|
||||||
|
Endpoint_ClearOUT();
|
||||||
|
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
|
||||||
|
|
||||||
|
PDIDATA_LINE_DDR |= PDIDATA_LINE_MASK;
|
||||||
|
PDICLOCK_LINE_DDR |= PDICLOCK_LINE_MASK;
|
||||||
|
|
||||||
|
PDIDATA_LINE_PORT |= PDIDATA_LINE_MASK;
|
||||||
|
|
||||||
|
_delay_us(1);
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < 16; i++)
|
||||||
|
{
|
||||||
|
PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK;
|
||||||
|
PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const uint8_t NVMKey[8] = {0x12, 0x89, 0xAB, 0x45, 0xCD, 0xD8, 0x88, 0xFF};
|
||||||
|
|
||||||
|
PDITarget_SendByte(PDI_CMD_KEY);
|
||||||
|
for (uint8_t i = 0; i < 8; i++)
|
||||||
|
PDITarget_SendByte(NVMKey[i]);
|
||||||
|
|
||||||
|
PDITarget_SendByte(PDI_CMD_LDCS | PD_STATUS_REG);
|
||||||
|
if (!(PDITarget_ReceiveByte() & PDI_STATUS_NVM))
|
||||||
|
ReturnStatus = XPRG_ERR_FAILED;
|
||||||
|
|
||||||
|
Endpoint_Write_Byte(CMD_XPROG);
|
||||||
|
Endpoint_Write_Byte(XPRG_CMD_ENTER_PROGMODE);
|
||||||
|
Endpoint_Write_Byte(ReturnStatus);
|
||||||
|
Endpoint_ClearIN();
|
||||||
|
}
|
||||||
|
|
||||||
|
static void PDIProtocol_LeaveXPROGMode(void)
|
||||||
|
{
|
||||||
|
Endpoint_ClearOUT();
|
||||||
|
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
|
||||||
|
|
||||||
|
PDIDATA_LINE_DDR &= ~PDIDATA_LINE_MASK;
|
||||||
|
PDICLOCK_LINE_DDR &= ~PDICLOCK_LINE_MASK;
|
||||||
|
|
||||||
|
PDIDATA_LINE_PORT &= ~PDIDATA_LINE_MASK;
|
||||||
|
PDICLOCK_LINE_PORT &= ~PDICLOCK_LINE_MASK;
|
||||||
|
|
||||||
|
Endpoint_Write_Byte(CMD_XPROG);
|
||||||
|
Endpoint_Write_Byte(XPRG_CMD_LEAVE_PROGMODE);
|
||||||
|
Endpoint_Write_Byte(XPRG_ERR_OK);
|
||||||
|
Endpoint_ClearIN();
|
||||||
|
}
|
||||||
|
|
||||||
static void PDIProtocol_EraseChip(void)
|
static void PDIProtocol_EraseChip(void)
|
||||||
{
|
{
|
||||||
uint8_t ReturnStatus = XPRG_ERR_OK;
|
uint8_t ReturnStatus = XPRG_ERR_OK;
|
||||||
|
@ -209,34 +262,6 @@ static void PDIProtocol_ReadCRC(void)
|
||||||
Endpoint_ClearIN();
|
Endpoint_ClearIN();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void PDIProtocol_EnterXPROGMode(void)
|
|
||||||
{
|
|
||||||
uint8_t ReturnStatus = XPRG_ERR_OK;
|
|
||||||
|
|
||||||
Endpoint_ClearOUT();
|
|
||||||
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
|
|
||||||
|
|
||||||
// TODO: Enter device programming mode here via PDI protocol
|
|
||||||
|
|
||||||
Endpoint_Write_Byte(CMD_XPROG);
|
|
||||||
Endpoint_Write_Byte(XPRG_CMD_ENTER_PROGMODE);
|
|
||||||
Endpoint_Write_Byte(ReturnStatus);
|
|
||||||
Endpoint_ClearIN();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void PDIProtocol_LeaveXPROGMode(void)
|
|
||||||
{
|
|
||||||
Endpoint_ClearOUT();
|
|
||||||
Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN);
|
|
||||||
|
|
||||||
// TODO: Exit device programming mode here via PDI protocol
|
|
||||||
|
|
||||||
Endpoint_Write_Byte(CMD_XPROG);
|
|
||||||
Endpoint_Write_Byte(XPRG_CMD_LEAVE_PROGMODE);
|
|
||||||
Endpoint_Write_Byte(XPRG_ERR_OK);
|
|
||||||
Endpoint_ClearIN();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void PDIProtocol_SetParam(void)
|
static void PDIProtocol_SetParam(void)
|
||||||
{
|
{
|
||||||
uint8_t ReturnStatus = XPRG_ERR_OK;
|
uint8_t ReturnStatus = XPRG_ERR_OK;
|
||||||
|
|
|
@ -41,6 +41,7 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "V2Protocol.h"
|
#include "V2Protocol.h"
|
||||||
|
#include "PDITarget.h"
|
||||||
|
|
||||||
/* Macros: */
|
/* Macros: */
|
||||||
#define XPRG_CMD_ENTER_PROGMODE 0x01
|
#define XPRG_CMD_ENTER_PROGMODE 0x01
|
||||||
|
@ -87,7 +88,7 @@
|
||||||
void PDIProtocol_XPROG_SetMode(void);
|
void PDIProtocol_XPROG_SetMode(void);
|
||||||
void PDIProtocol_XPROG_Command(void);
|
void PDIProtocol_XPROG_Command(void);
|
||||||
|
|
||||||
#if defined(INCLUDE_FROM_XPROG_C)
|
#if defined(INCLUDE_FROM_PDIPROTOCOL_C)
|
||||||
static void PDIProtocol_EnterXPROGMode(void);
|
static void PDIProtocol_EnterXPROGMode(void);
|
||||||
static void PDIProtocol_LeaveXPROGMode(void);
|
static void PDIProtocol_LeaveXPROGMode(void);
|
||||||
static void PDIProtocol_SetParam(void);
|
static void PDIProtocol_SetParam(void);
|
||||||
|
|
|
@ -0,0 +1,105 @@
|
||||||
|
/*
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if defined(ENABLE_XPROG_PROTOCOL)
|
||||||
|
|
||||||
|
/** \file
|
||||||
|
*
|
||||||
|
* Target-related functions for the PDI Protocol decoder.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define INCLUDE_FROM_PDITARGET_C
|
||||||
|
#include "PDITarget.h"
|
||||||
|
|
||||||
|
void PDITarget_SendByte(uint8_t Byte)
|
||||||
|
{
|
||||||
|
PDIDATA_LINE_PORT &= ~PDIDATA_LINE_MASK;
|
||||||
|
|
||||||
|
PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK;
|
||||||
|
PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK;
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
if (Byte & 0x01)
|
||||||
|
PDIDATA_LINE_PORT |= PDIDATA_LINE_MASK;
|
||||||
|
else
|
||||||
|
PDIDATA_LINE_PORT &= ~PDIDATA_LINE_MASK;
|
||||||
|
|
||||||
|
Byte >>= 1;
|
||||||
|
|
||||||
|
PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK;
|
||||||
|
PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
PDIDATA_LINE_PORT |= PDIDATA_LINE_MASK;
|
||||||
|
|
||||||
|
PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK;
|
||||||
|
PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK;
|
||||||
|
PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK;
|
||||||
|
PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint8_t PDITarget_ReceiveByte(void)
|
||||||
|
{
|
||||||
|
uint8_t ReceivedByte = 0;
|
||||||
|
|
||||||
|
PDIDATA_LINE_DDR &= ~PDIDATA_LINE_MASK;
|
||||||
|
|
||||||
|
bool FoundStartBit;
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK;
|
||||||
|
PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK;
|
||||||
|
FoundStartBit = !(PDIDATA_LINE_PIN & PDIDATA_LINE_MASK);
|
||||||
|
} while (!FoundStartBit);
|
||||||
|
|
||||||
|
for (uint8_t i = 0; i < 8; i++)
|
||||||
|
{
|
||||||
|
if (PDIDATA_LINE_PIN & PDIDATA_LINE_MASK)
|
||||||
|
ReceivedByte |= 0x01;
|
||||||
|
|
||||||
|
ReceivedByte <<= 1;
|
||||||
|
|
||||||
|
PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK;
|
||||||
|
PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK;
|
||||||
|
}
|
||||||
|
|
||||||
|
PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK;
|
||||||
|
PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK;
|
||||||
|
PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK;
|
||||||
|
PDICLOCK_LINE_PORT ^= PDICLOCK_LINE_MASK;
|
||||||
|
|
||||||
|
PDIDATA_LINE_DDR |= PDIDATA_LINE_MASK;
|
||||||
|
|
||||||
|
return ReceivedByte;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,74 @@
|
||||||
|
/*
|
||||||
|
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 PDITarget.c.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _PDI_TARGET_
|
||||||
|
#define _PDI_TARGET_
|
||||||
|
|
||||||
|
/* Includes: */
|
||||||
|
#include <avr/io.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
/* Defines: */
|
||||||
|
#define PDIDATA_LINE_PORT PORTB
|
||||||
|
#define PDIDATA_LINE_DDR DDRB
|
||||||
|
#define PDIDATA_LINE_PIN PINB
|
||||||
|
#define PDIDATA_LINE_MASK (1 << 2)
|
||||||
|
|
||||||
|
#define PDICLOCK_LINE_PORT RESET_LINE_PORT
|
||||||
|
#define PDICLOCK_LINE_DDR RESET_LINE_DDR
|
||||||
|
#define PDICLOCK_LINE_MASK RESET_LINE_MASK
|
||||||
|
|
||||||
|
#define PDI_CMD_LDS 0x00
|
||||||
|
#define PDI_CMD_LD 0x20
|
||||||
|
#define PDI_CMD_STS 0x40
|
||||||
|
#define PDI_CMD_ST 0x60
|
||||||
|
#define PDI_CMD_LDCS 0x80
|
||||||
|
#define PDI_CMD_REPEAT 0xA0
|
||||||
|
#define PDI_CMD_STCS 0xC0
|
||||||
|
#define PDI_CMD_KEY 0xE0
|
||||||
|
|
||||||
|
#define PD_STATUS_REG 0
|
||||||
|
#define PD_RESET_REG 1
|
||||||
|
#define PD_CTRL_REG 2
|
||||||
|
|
||||||
|
#define PDI_STATUS_NVM (1 << 1)
|
||||||
|
#define PDI_RESET_KEY 0x59
|
||||||
|
|
||||||
|
|
||||||
|
/* Function Prototypes: */
|
||||||
|
void PDITarget_SendByte(uint8_t Byte);
|
||||||
|
uint8_t PDITarget_ReceiveByte(void);
|
||||||
|
|
||||||
|
#endif
|
|
@ -132,7 +132,7 @@ SRC = $(TARGET).c \
|
||||||
Lib/ISPProtocol.c \
|
Lib/ISPProtocol.c \
|
||||||
Lib/ISPTarget.c \
|
Lib/ISPTarget.c \
|
||||||
Lib/PDIProtocol.c \
|
Lib/PDIProtocol.c \
|
||||||
$(LUFA_PATH)/LUFA/Drivers/Peripheral/SerialStream.c \
|
Lib/PDITarget.c \
|
||||||
$(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/DevChapter9.c \
|
$(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/DevChapter9.c \
|
||||||
$(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Endpoint.c \
|
$(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Endpoint.c \
|
||||||
$(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Host.c \
|
$(LUFA_PATH)/LUFA/Drivers/USB/LowLevel/Host.c \
|
||||||
|
|
|
@ -68,7 +68,7 @@ void SoftUART_Init(void)
|
||||||
{
|
{
|
||||||
OCR2B = TCNT2 + 1; // force first compare
|
OCR2B = TCNT2 + 1; // force first compare
|
||||||
TCCR2A = (1 << COM2B1) | (1 << COM2B0); // T1 mode 0
|
TCCR2A = (1 << COM2B1) | (1 << COM2B0); // T1 mode 0
|
||||||
TCCR2B = (1 << FOC2B) | (1 << CS21); // CLK/8, T1 mode 0
|
TCCR2B = (1 << FOC2B) | (1 << CS21); // CLK/8, T1 mode 0
|
||||||
TIMSK2 = (1 << OCIE2B); // enable tx and wait for start
|
TIMSK2 = (1 << OCIE2B); // enable tx and wait for start
|
||||||
EICRA = (1 << ISC01); // -ve edge
|
EICRA = (1 << ISC01); // -ve edge
|
||||||
EIMSK = (1 << INT0); // enable INT0 interrupt
|
EIMSK = (1 << INT0); // enable INT0 interrupt
|
||||||
|
@ -76,7 +76,7 @@ void SoftUART_Init(void)
|
||||||
stx_count = 0; // nothing to send
|
stx_count = 0; // nothing to send
|
||||||
srx_done = 0; // nothing received
|
srx_done = 0; // nothing received
|
||||||
STXPORT |= 1 << STX; // TX output
|
STXPORT |= 1 << STX; // TX output
|
||||||
STXDDR |= 1 << STX; // TX output
|
STXDDR |= 1 << STX; // TX output
|
||||||
SRXPORT |= (1 << SRX); // pullup on INT0
|
SRXPORT |= (1 << SRX); // pullup on INT0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue