diff --git a/Projects/Magstripe/Lib/CircularBitBuffer.h b/Projects/Magstripe/Lib/CircularBitBuffer.h index ffbdc86c6b..6220e1b905 100644 --- a/Projects/Magstripe/Lib/CircularBitBuffer.h +++ b/Projects/Magstripe/Lib/CircularBitBuffer.h @@ -53,7 +53,7 @@ #endif /* Type Defines: */ - /* Type define for a pointer to a bit in a bit buffer. */ + /** Type define for a pointer to a bit in a bit buffer. */ typedef struct { uint8_t* CurrentByte; /**< Pointer to the current byte in the buffer */ diff --git a/Projects/Magstripe/Magstripe.txt b/Projects/Magstripe/Magstripe.txt index a38471ac6c..b725b709d4 100644 --- a/Projects/Magstripe/Magstripe.txt +++ b/Projects/Magstripe/Magstripe.txt @@ -110,5 +110,55 @@ * CircularBitBuffer.h * Gives the maximum number of bits per track which can be buffered by the device for later transmission to a host. * + * + * MAG_T1_CLOCK + * Makefile CDEFS + * Mask for the magnetic card reader's CLOCK line for the reader's track 1 output. + * + * + * MAG_T1_DATA + * Makefile CDEFS + * Mask for the magnetic card reader's DATA line for the reader's track 1 output. + * + * + * MAG_T2_CLOCK + * Makefile CDEFS + * Mask for the magnetic card reader's CLOCK line for the reader's track 2 output. + * + * + * MAG_T2_DATA + * Makefile CDEFS + * Mask for the magnetic card reader's DATA line for the reader's track 2 output. + * + * + * MAG_T3_CLOCK + * Makefile CDEFS + * Mask for the magnetic card reader's CLOCK line for the reader's track 3 output. + * + * + * MAG_T3_DATA + * Makefile CDEFS + * Mask for the magnetic card reader's DATA line for the reader's track 3 output. + * + * + * MAG_CARDPRESENT + * Makefile CDEFS + * Mask for the magnetic card reader's card detection output. + * + * + * MAG_PIN + * Makefile CDEFS + * PIN register that the magnetic card reader device is attached to. + * + * + * MAG_PORT + * Makefile CDEFS + * PORT register that the magnetic card reader device is attached to. + * + * + * MAG_DDR + * Makefile CDEFS + * DDR register that the magnetic card reader device is attached to. + * * */ diff --git a/Projects/Unfinished/AVRISP/AVRISP.c b/Projects/Unfinished/AVRISP/AVRISP.c index 1e5f55d0a9..9826dbbd7a 100644 --- a/Projects/Unfinished/AVRISP/AVRISP.c +++ b/Projects/Unfinished/AVRISP/AVRISP.c @@ -43,6 +43,8 @@ int main(void) { SetupHardware(); + V2Protocol_ConfigureHardware(); + printf("AVRISP-MKII Clone\r\n"); LEDs_SetAllLEDs(LEDMASK_USB_NOTREADY); @@ -67,6 +69,7 @@ void SetupHardware(void) /* Hardware Initialization */ SerialStream_Init(9600, false); + SPI_Init(0, true); LEDs_Init(); USB_Init(); } diff --git a/Projects/Unfinished/AVRISP/AVRISP.h b/Projects/Unfinished/AVRISP/AVRISP.h index 94e19a3f60..8a082f635d 100644 --- a/Projects/Unfinished/AVRISP/AVRISP.h +++ b/Projects/Unfinished/AVRISP/AVRISP.h @@ -47,6 +47,7 @@ #include #include #include + #include #include #include "Lib/V2Protocol.h" diff --git a/Projects/Unfinished/AVRISP/AVRISP.txt b/Projects/Unfinished/AVRISP/AVRISP.txt index 9e5a4554f8..0eb26f4e9e 100644 --- a/Projects/Unfinished/AVRISP/AVRISP.txt +++ b/Projects/Unfinished/AVRISP/AVRISP.txt @@ -55,15 +55,38 @@ * 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. * + * This demo contains both FLASH and EEPROM data, as compiled .HEX and .EEP files respectively. Both files must + * be loaded into the device for it to perform correctly. + * * \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. * * * - * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * + * * *
- * None - * Define Name:Location:Description:
RESET_LINE_PORTMakefile CDEFSPORT register for the programmer's target RESET line.
RESET_LINE_PINMakefile CDEFSPIN register for the programmer's target RESET line.
RESET_LINE_DDRMakefile CDEFSDDR register for the programmer's target RESET line.
RESET_LINE_MASKMakefile CDEFSMask for the programmer's target RESET line on the chosen port.
*/ diff --git a/Projects/Unfinished/AVRISP/Lib/V2Protocol.c b/Projects/Unfinished/AVRISP/Lib/V2Protocol.c index 2679ce7f73..27f6fa7dc7 100644 --- a/Projects/Unfinished/AVRISP/Lib/V2Protocol.c +++ b/Projects/Unfinished/AVRISP/Lib/V2Protocol.c @@ -59,6 +59,24 @@ ParameterItem_t ParameterTable[] EEMEM = { .ParameterID = PARAM_DISCHARGEDELAY, .ParameterValue = 0x00 }, }; + +void V2Protocol_ConfigureHardware(void) +{ +#if F_CPU == 8000000 + uint8_t SPIMaskFromSCKDuration[] = {SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128, + SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128}; +#else + uint8_t SPIMaskFromSCKDuration[] = {SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128, + SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128, SPI_SPEED_FCPU_DIV_128}; +#endif + + uint8_t SCKDuration = eeprom_read_byte(&V2Protocol_GetParameterItem(PARAM_SCK_DURATION)->ParameterValue); + + if (SCKDuration > sizeof(SPIMaskFromSCKDuration)) + SCKDuration = SPIMaskFromSCKDuration; + + SPI_Init(SPIMaskFromSCKDuration[SCKDuration], true); +} void V2Protocol_ProcessCommand(void) { @@ -73,6 +91,9 @@ void V2Protocol_ProcessCommand(void) case CMD_GET_PARAMETER: V2Protocol_ProcessCmdGetSetParam(V2Command); break; + case CMD_SPI_MULTI: + V2Protocol_ProcessCmdSPIMulti(); + break; default: while (Endpoint_BytesInEndpoint() == AVRISP_DATA_EPSIZE) { @@ -83,6 +104,7 @@ void V2Protocol_ProcessCommand(void) Endpoint_ClearOUT(); Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); + Endpoint_Write_Byte(V2Command); Endpoint_Write_Byte(STATUS_CMD_UNKNOWN); Endpoint_ClearIN(); break; @@ -90,9 +112,7 @@ void V2Protocol_ProcessCommand(void) printf("COMMAND 0x%02x\r\n", V2Command); - Endpoint_WaitUntilReady(); - - /* Reset Endpoint direction to OUT ready for next command */ + Endpoint_WaitUntilReady(); Endpoint_SetEndpointDirection(ENDPOINT_DIR_OUT); } @@ -113,6 +133,8 @@ static void V2Protocol_ProcessCmdSignOn(void) Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); Endpoint_WaitUntilReady(); + V2Protocol_ConfigureHardware(); + Endpoint_Write_Byte(CMD_SIGN_ON); Endpoint_Write_Byte(STATUS_CMD_OK); Endpoint_Write_Byte(PROGRAMMER_ID_LEN); @@ -131,9 +153,10 @@ static void V2Protocol_ProcessCmdGetSetParam(uint8_t V2Command) ParameterItem_t* ParameterItem = V2Protocol_GetParameterItem(ParamID); + Endpoint_Write_Byte(V2Command); + if (ParameterItem != NULL) { - Endpoint_Write_Byte(V2Command); Endpoint_Write_Byte(STATUS_CMD_OK); if (V2Command == CMD_SET_PARAMETER) @@ -148,3 +171,51 @@ static void V2Protocol_ProcessCmdGetSetParam(uint8_t V2Command) Endpoint_ClearIN(); } + +static void V2Protocol_ProcessCmdSPIMulti(void) +{ + uint8_t TxBytes = Endpoint_Read_Byte(); + uint8_t RxBytes = Endpoint_Read_Byte(); + uint8_t RxStartAddr = Endpoint_Read_Byte(); + uint8_t TxData[255]; + + Endpoint_Read_Stream_LE(TxData, TxBytes); + + Endpoint_ClearOUT(); + Endpoint_SetEndpointDirection(ENDPOINT_DIR_IN); + Endpoint_WaitUntilReady(); + + Endpoint_Write_Byte(CMD_SPI_MULTI); + Endpoint_Write_Byte(STATUS_CMD_OK); + + uint8_t CurrTxPos = 0; + uint8_t CurrRxPos = 0; + + while (CurrTxPos < RxStartAddr) + { + if (CurrTxPos < TxBytes) + SPI_SendByte(TxData[CurrTxPos]); + else + SPI_SendByte(0); + + CurrTxPos++; + } + + while (CurrRxPos < RxBytes) + { + if (CurrTxPos < TxBytes) + { + Endpoint_Write_Byte(SPI_TransferByte(TxData[CurrTxPos])); + CurrTxPos++; + } + else + { + Endpoint_Write_Byte(SPI_ReceiveByte()); + } + + CurrRxPos++; + } + + Endpoint_Write_Byte(STATUS_CMD_OK); + Endpoint_ClearIN(); +} diff --git a/Projects/Unfinished/AVRISP/Lib/V2Protocol.h b/Projects/Unfinished/AVRISP/Lib/V2Protocol.h index 5e8335963f..6c2ff606dd 100644 --- a/Projects/Unfinished/AVRISP/Lib/V2Protocol.h +++ b/Projects/Unfinished/AVRISP/Lib/V2Protocol.h @@ -40,6 +40,7 @@ #include #include + #include #include "../Descriptors.h" #include "V2ProtocolConstants.h" @@ -55,13 +56,15 @@ uint8_t ParameterValue; } ParameterItem_t; - /* Function Prototypes: */ + /* Function Prototypes: */ + void V2Protocol_ConfigureHardware(void); void V2Protocol_ProcessCommand(void); #if defined(INCLUDE_FROM_V2PROTOCOL_C) static ParameterItem_t* V2Protocol_GetParameterItem(uint8_t ParamID); static void V2Protocol_ProcessCmdSignOn(void); static void V2Protocol_ProcessCmdGetSetParam(uint8_t V2Command); + static void V2Protocol_ProcessCmdSPIMulti(void); #endif #endif diff --git a/Projects/Unfinished/AVRISP/makefile b/Projects/Unfinished/AVRISP/makefile index 5f76575876..0877c5d77d 100644 --- a/Projects/Unfinished/AVRISP/makefile +++ b/Projects/Unfinished/AVRISP/makefile @@ -193,6 +193,11 @@ CSTANDARD = -std=gnu99 # Place -D or -U options here for C sources CDEFS = -DF_CPU=$(F_CPU)UL -DF_CLOCK=$(F_CLOCK)UL -DBOARD=BOARD_$(BOARD) $(LUFA_OPTS) +CDEFS += -DRESET_LINE_PORT=PORTA +CDEFS += -DRESET_LINE_PIN=PINA +CDEFS += -DRESET_LINE_DDR=DDRA +CDEFS += -DRESET_LINE_MASK="(1 << 0)" + # Place -D or -U options here for ASM sources ADEFS = -DF_CPU=$(F_CPU)