add: flash memory support

This commit is contained in:
iceman1001 2018-02-13 14:12:28 +01:00
commit 0495e93b6d
4 changed files with 348 additions and 1 deletions

View file

@ -52,7 +52,7 @@ SRC_CRAPTO1 = crypto1.c des.c aes.c desfire_key.c desfire_crypto.c mifaredesfire
SRC_CRC = crc.c crc16.c crc32.c SRC_CRC = crc.c crc16.c crc32.c
SRC_ICLASS = iclass.c optimized_cipher.c SRC_ICLASS = iclass.c optimized_cipher.c
SRC_LEGIC = legicrf.c legic_prng.c SRC_LEGIC = legicrf.c legic_prng.c
SRC_FLASH = flash.c SRC_FLASH = flashmem.c
SRC_BEE = bee.c SRC_BEE = bee.c
#the FPGA bitstream files. Note: order matters! #the FPGA bitstream files. Note: order matters!
@ -77,6 +77,7 @@ THUMBSRC = start.c \
$(SRC_LF) \ $(SRC_LF) \
$(SRC_ZLIB) \ $(SRC_ZLIB) \
$(SRC_LEGIC) \ $(SRC_LEGIC) \
$(SRC_FLASH) \
appmain.c \ appmain.c \
printf.c \ printf.c \
util.c \ util.c \

193
armsrc/flashmem.c Normal file
View file

@ -0,0 +1,193 @@
#include "flashmem.h"
#include "proxmark3.h"
#include "apps.h"
#define address_length 3
#define data_len 3
extern void Dbprintf(const char *fmt, ...);
// IO spi write or read
uint8_t EXFLASH_spi_write_read(uint8_t wData) {
uint8_t i, tmp = 0;
SCK_LOW;
NCS_3_LOW;
for (i = 0; i < 8; i++) {
SCK_LOW;
SpinDelayUs(2);
if (wData&0x80) {
MOSI_HIGH;
} else {
MOSI_LOW;
SpinDelayUs(2);
}
wData <<= 1;
SCK_HIGH;
tmp <<= 1;
tmp |= MISO_VALUE;
}
SCK_LOW;
return tmp;
}
uint8_t EXFLASH_readStat1(void) {
uint8_t stat1 = 3;
EXFLASH_spi_write_read(READSTAT1);
stat1 = EXFLASH_spi_write_read(0xff);
NCS_3_HIGH;
return stat1;
}
uint8_t EXFLASH_readStat2(void) {
uint8_t stat2;
EXFLASH_spi_write_read(READSTAT2);
stat2 = EXFLASH_spi_write_read(0xff);
NCS_3_HIGH;
return stat2;
}
bool ESFLASH_NOTBUSY(void) {
uint8_t state, count = 0;
do {
state = EXFLASH_readStat1();
if (count > 100) {
return false;
}
count++;
} while (state & BUSY);
return true;
}
void EXFLASH_Write_Enable(void) {
EXFLASH_spi_write_read(WRITEENABLE);
NCS_3_HIGH;
}
uint8_t EXFLASH_Read(uint8_t address[]) {
uint8_t i, tmp;
if (!ESFLASH_NOTBUSY())
return false;
EXFLASH_spi_write_read(READDATA);
for (i=0; i < address_length; i++) {
EXFLASH_spi_write_read(address[i]);
}
tmp = EXFLASH_spi_write_read(0XFF);
NCS_3_HIGH;
return tmp;
}
uint8_t EXFLASH_Program(uint8_t address[],uint8_t array[], uint8_t len) {
uint8_t state1, count = 0, i;
EXFLASH_Write_Enable();
do {
state1 = EXFLASH_readStat1();
if (count > 100) {
return false;
}
count++;
} while ((state1 & WRTEN) != WRTEN);
EXFLASH_spi_write_read(PAGEPROG);
for (i=0; i<address_length; i++) {
EXFLASH_spi_write_read(address[i]);
}
for (i=0; i<len; i++) {
EXFLASH_spi_write_read(array[i]);
}
NCS_3_HIGH;
return true;
}
uint8_t EXFLASH_ReadID(void) {
uint8_t ManID; // DevID
if (!ESFLASH_NOTBUSY())
return true;
EXFLASH_spi_write_read(MANID);
EXFLASH_spi_write_read(0x00);
EXFLASH_spi_write_read(0x00);
EXFLASH_spi_write_read(0x00);
ManID=EXFLASH_spi_write_read(0xff);
// DevID=EXFLASH_spi_write_read(0xff);
NCS_3_HIGH;
return ManID;
}
bool EXFLASH_Erase(void) {
uint8_t state1, count = 0;
EXFLASH_Write_Enable();
do {
state1 = EXFLASH_readStat1();
if (count > 100) {
return false;
}
count++;
} while ((state1 & WRTEN) != WRTEN);
EXFLASH_spi_write_read(CHIPERASE);
NCS_3_HIGH;
return true;
}
bool EXFLASH_Reset(void) {
LED_A_ON(); //blue
SetupSpi(SPI_MEM_MODE);
if (!ESFLASH_NOTBUSY())
return false;
EXFLASH_spi_write_read(Enable_Reset);
NCS_3_HIGH;
EXFLASH_spi_write_read(Reset);
NCS_3_HIGH;
SpinDelayUs(10);
LED_A_ON();
return true;
}
void EXFLASH_Init(void) {
EXFLASH_Reset();
}
void EXFLASH_TEST(void) {
uint8_t a[3] = {0x00,0x00,0x00};
uint8_t b[data_len] = {0x00,0x01,0x02};
uint8_t f[3] = {0x00,0x00,0x01};
uint8_t e[3] = {0x00,0x00,0x02};
uint8_t d = 0;
EXFLASH_Init();
// c = EXFLASH_ReadID();
//EXFLASH_Write_Enable();
//EXFLASH_readStat1();
Dbprintf("%s \r\n", "write 012 to 0x00 0x01 0x02");
Dbprintf("%s \r\n"," wait... ");
EXFLASH_Program(a, b, data_len);
d = EXFLASH_Read(a);
Dbprintf(" %d ", d);
d = EXFLASH_Read(f);
Dbprintf(" %d ", d);
d = EXFLASH_Read(e);
Dbprintf(" %d ", d);
Dbprintf("%s \r\n","TEST done!");
EXFLASH_Erase();
}

137
armsrc/flashmem.h Normal file
View file

@ -0,0 +1,137 @@
/* Arduino SPIFlash Library v.2.5.0
* Copyright (C) 2015 by Prajwal Bhattaram
* Modified by Prajwal Bhattaram - 13/11/2016
*
* This file is part of the Arduino SPIFlash Library. This library is for
* Winbond NOR flash memory modules. In its current form it enables reading
* and writing individual data variables, structs and arrays from and to various locations;
* reading and writing pages; continuous read functions; sector, block and chip erase;
* suspending and resuming programming/erase and powering down for low power operation.
*
* This Library 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 3 of the License, or
* (at your option) any later version.
*
* This Library 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 v3.0
* along with the Arduino SPIFlash Library. If not, see
* <http://www.gnu.org/licenses/>.
*/
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// Common Instructions //
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
#ifndef __FLASHMEM_H
#define __FLASHMEM_H
#include "proxmark3.h"
#include "apps.h"
#define MANID 0x90
#define PAGEPROG 0x02
#define READDATA 0x03
#define FASTREAD 0x0B
#define WRITEDISABLE 0x04
#define READSTAT1 0x05
#define READSTAT2 0x35
#define WRITESTAT 0x01
#define WRITEENABLE 0x06
#define SECTORERASE 0x20
#define BLOCK32ERASE 0x52
#define CHIPERASE 0xC7
#define SUSPEND 0x75
#define ID 0x90
#define RESUME 0x7A
#define JEDECID 0x9F
#define RELEASE 0xAB
#define POWERDOWN 0xB9
#define BLOCK64ERASE 0xD8
#define Enable_Reset 0x66
#define Reset 0x99
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// Chip specific instructions //
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
//~~~~~~~~~~~~~~~~~~~~~~~~~ Winbond ~~~~~~~~~~~~~~~~~~~~~~~~~//
#define WINBOND_MANID 0xEF
#define PAGESIZE 0x100
//~~~~~~~~~~~~~~~~~~~~~~~~ Microchip ~~~~~~~~~~~~~~~~~~~~~~~~//
#define MICROCHIP_MANID 0xBF
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// Definitions //
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
#define BUSY 0x01
#define SPI_CLK 104000000 //Hex equivalent of 104MHz
#define WRTEN 0x02
#define SUS 0x40
#define DUMMYBYTE 0xEE
#define NULLBYTE 0x00
#define NULLINT 0x0000
#define NO_CONTINUE 0x00
#define PASS 0x01
#define FAIL 0x00
#define arrayLen(x) (sizeof(x) / sizeof(*x))
#define lengthOf(x) (sizeof(x))/sizeof(byte)
#define maxAddress capacity
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// Arduino Due DMA definitions //
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// Use SAM3X DMAC if nonzero
#define USE_SAM3X_DMAC 1
// Use extra Bus Matrix arbitration fix if nonzero
#define USE_SAM3X_BUS_MATRIX_FIX 0
// Time in ms for DMA receive timeout
#define SAM3X_DMA_TIMEOUT 100
// chip select register number
#define SPI_CHIP_SEL 3
// DMAC receive channel
#define SPI_DMAC_RX_CH 1
// DMAC transmit channel
#define SPI_DMAC_TX_CH 0
// DMAC Channel HW Interface Number for SPI TX.
#define SPI_TX_IDX 1
// DMAC Channel HW Interface Number for SPI RX.
#define SPI_RX_IDX 2
// Set DUE SPI clock div (any integer from 2 - 255)
#define DUE_SPI_CLK 2
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// List of Error codes //
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
#define SUCCESS 0x00
#define CALLBEGIN 0x01
#define UNKNOWNCHIP 0x02
#define UNKNOWNCAP 0x03
#define CHIPBUSY 0x04
#define OUTOFBOUNDS 0x05
#define CANTENWRITE 0x06
#define PREVWRITTEN 0x07
#define LOWRAM 0x08
#define NOSUSPEND 0x09
#define UNKNOWNERROR 0xFF
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
uint8_t EXFLASH_spi_write_read(uint8_t wData);
uint8_t EXFLASH_readStat1(void) ;
uint8_t EXFLASH_readStat2(void) ;
bool ESFLASH_NOTBUSY(void);
void EXFLASH_Write_Enable(void) ;
uint8_t EXFLASH_Read(uint8_t address[]);
uint8_t EXFLASH_Program(uint8_t address[],uint8_t array[], uint8_t len) ;
uint8_t EXFLASH_ReadID(void) ;
bool EXFLASH_Erase(void) ;
bool EXFLASH_Reset(void);
void EXFLASH_Init(void);
void EXFLASH_TEST(void);
#endif

View file

@ -82,6 +82,22 @@
#define LED_D_ON() HIGH(GPIO_LED_D) #define LED_D_ON() HIGH(GPIO_LED_D)
#define LED_D_OFF() LOW(GPIO_LED_D) #define LED_D_OFF() LOW(GPIO_LED_D)
#define LED_D_INV() INVBIT(GPIO_LED_D) #define LED_D_INV() INVBIT(GPIO_LED_D)
#define SCK_LOW LOW(GPIO_SPCK)
#define SCK_HIGH HIGH(GPIO_SPCK)
#define MOSI_HIGH HIGH(GPIO_MOSI)
#define MOSI_LOW LOW(GPIO_MOSI)
// fpga
#define NCS_0_LOW LOW(GPIO_NCS0)
#define NCS_0_HIGH HIGH(GPIO_NCS0)
// lcd
#define NCS_2_LOW LOW(GPIO_NCS2)
#define NCS_2_HIGH HIGH(GPIO_NCS2)
// flash mem
#define NCS_3_LOW LOW(GPIO_NCS3)
#define NCS_3_HIGH HIGH(GPIO_NCS3)
#define MISO_VALUE (AT91C_BASE_PIOA->PIO_PDSR & GPIO_MISO)
#define RELAY_ON() HIGH(GPIO_RELAY) #define RELAY_ON() HIGH(GPIO_RELAY)
#define RELAY_OFF() LOW(GPIO_RELAY) #define RELAY_OFF() LOW(GPIO_RELAY)
#define BUTTON_PRESS() !((AT91C_BASE_PIOA->PIO_PDSR & GPIO_BUTTON) == GPIO_BUTTON) #define BUTTON_PRESS() !((AT91C_BASE_PIOA->PIO_PDSR & GPIO_BUTTON) == GPIO_BUTTON)