altera: changed max10_flow_erase to perform a full erase or sectors per sectors
This commit is contained in:
parent
7ed62601c7
commit
23cbdbf0eb
|
|
@ -296,35 +296,13 @@ uint32_t Altera::idCode()
|
||||||
#define MAX10_ISC_ENABLE {0xcc, 0x02}
|
#define MAX10_ISC_ENABLE {0xcc, 0x02}
|
||||||
#define MAX10_ISC_DISABLE {0x01, 0x02}
|
#define MAX10_ISC_DISABLE {0x01, 0x02}
|
||||||
#define MAX10_ISC_ADDRESS_SHIFT {0x03, 0x02}
|
#define MAX10_ISC_ADDRESS_SHIFT {0x03, 0x02}
|
||||||
|
#define MAX10_ISC_ERASE {0xf2, 0x02}
|
||||||
#define MAX10_ISC_PROGRAM {0xf4, 0x02}
|
#define MAX10_ISC_PROGRAM {0xf4, 0x02}
|
||||||
#define MAX10_DSM_ICB_PROGRAM {0xF4, 0x03}
|
#define MAX10_DSM_ICB_PROGRAM {0xF4, 0x03}
|
||||||
#define MAX10_DSM_VERIFY {0x07, 0x03}
|
#define MAX10_DSM_VERIFY {0x07, 0x03}
|
||||||
#define MAX10_DSM_CLEAR {0xf2, 0x03}
|
#define MAX10_DSM_CLEAR {0xf2, 0x03}
|
||||||
#define MAX10_BYPASS {0xFF, 0x03}
|
#define MAX10_BYPASS {0xFF, 0x03}
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
uint32_t check_addr0; // something to check before sequence
|
|
||||||
uint32_t dsm_addr;
|
|
||||||
uint32_t dsm_len; // 32bits
|
|
||||||
uint32_t ufm_addr; // UFM1 addr
|
|
||||||
uint32_t ufm_len[2];
|
|
||||||
uint32_t cfm_addr; // CFM2 addr
|
|
||||||
uint32_t cfm_len[3];
|
|
||||||
uint32_t done_bit_addr;
|
|
||||||
uint32_t pgm_success_addr;
|
|
||||||
} max10_mem_t;
|
|
||||||
|
|
||||||
static const std::map<uint32_t, max10_mem_t> max10_memory_map = {
|
|
||||||
{0x031820dd, {
|
|
||||||
0x80005, // check_addr0
|
|
||||||
0x0000, 512, // DSM
|
|
||||||
0x0200, {4096, 4096}, // UFM
|
|
||||||
0x2200, {35840, 14848, 20992}, // CFM
|
|
||||||
0x0009, // done bit
|
|
||||||
0x000b} // program success addr
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
void Altera::max10_program()
|
void Altera::max10_program()
|
||||||
{
|
{
|
||||||
POFParser _bit(_filename, _verbose);
|
POFParser _bit(_filename, _verbose);
|
||||||
|
|
@ -402,7 +380,7 @@ void Altera::max10_program()
|
||||||
// Start!
|
// Start!
|
||||||
max10_flow_enable();
|
max10_flow_enable();
|
||||||
|
|
||||||
max10_flow_erase();
|
max10_flow_erase(mem);
|
||||||
max10_dsm_verify();
|
max10_dsm_verify();
|
||||||
|
|
||||||
/* Write */
|
/* Write */
|
||||||
|
|
@ -464,16 +442,28 @@ static void word_to_array(uint32_t in, uint8_t *out) {
|
||||||
out[3] = (in >> 24) & 0xff;
|
out[3] = (in >> 24) & 0xff;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Altera::max10_flow_erase()
|
void Altera::max10_flow_erase(const max10_mem_t &mem, const uint8_t erase_sectors)
|
||||||
{
|
{
|
||||||
const uint32_t dsm_clear_delay = 350000120 / _clk_period;
|
const uint32_t dsm_clear_delay = 350000120 / _clk_period;
|
||||||
const uint8_t dsm_clear[2] = MAX10_DSM_CLEAR;
|
const uint8_t dsm_clear[2] = MAX10_DSM_CLEAR;
|
||||||
|
const uint8_t isc_erase[2] = MAX10_ISC_ERASE;
|
||||||
|
|
||||||
max10_addr_shift(0x000000);
|
/* All sectors must be erased: DSM_CLEAR is better */
|
||||||
|
if (erase_sectors == 0x1f) {
|
||||||
|
max10_addr_shift(0x000000);
|
||||||
|
|
||||||
_jtag->shiftIR((unsigned char *)dsm_clear, NULL, IRLENGTH);
|
_jtag->shiftIR((unsigned char *)dsm_clear, NULL, IRLENGTH);
|
||||||
_jtag->set_state(Jtag::RUN_TEST_IDLE);
|
_jtag->set_state(Jtag::RUN_TEST_IDLE);
|
||||||
_jtag->toggleClk(dsm_clear_delay);
|
_jtag->toggleClk(dsm_clear_delay);
|
||||||
|
} else {
|
||||||
|
/* each bit is a sector to erase */
|
||||||
|
for (int sect = 0; sect < 5; sect++) {
|
||||||
|
if ((erase_sectors >> sect) & 0x01) {
|
||||||
|
max10_addr_shift(mem.sectors_erase_addr[sect]);
|
||||||
|
_jtag->shiftIR((unsigned char *)isc_erase, NULL, IRLENGTH);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Altera::writeXFM(const uint8_t *cfg_data, uint32_t base_addr, uint32_t offset, uint32_t len)
|
void Altera::writeXFM(const uint8_t *cfg_data, uint32_t base_addr, uint32_t offset, uint32_t len)
|
||||||
|
|
|
||||||
|
|
@ -91,11 +91,36 @@ class Altera: public Device, SPIInterface {
|
||||||
CYCLONE10_FAMILY = 3,
|
CYCLONE10_FAMILY = 3,
|
||||||
STRATIXV_FAMILY = 3,
|
STRATIXV_FAMILY = 3,
|
||||||
CYCLONE_MISC = 10, // Fixme: idcode shared
|
CYCLONE_MISC = 10, // Fixme: idcode shared
|
||||||
UNKNOWN_FAMILY = 999
|
UNKNOWN_FAMILY = 999
|
||||||
};
|
};
|
||||||
/*************************/
|
/*************************/
|
||||||
/* max10 specific */
|
/* max10 specific */
|
||||||
/*************************/
|
/*************************/
|
||||||
|
struct max10_mem_t {
|
||||||
|
uint32_t check_addr0; // something to check before sequence
|
||||||
|
uint32_t dsm_addr;
|
||||||
|
uint32_t dsm_len; // 32bits
|
||||||
|
uint32_t ufm_addr; // UFM1 addr
|
||||||
|
uint32_t ufm_len[2];
|
||||||
|
uint32_t cfm_addr; // CFM2 addr
|
||||||
|
uint32_t cfm_len[3];
|
||||||
|
uint32_t sectors_erase_addr[5]; // UFM1, UFM0, CFM2, CFM1, CFM0
|
||||||
|
uint32_t done_bit_addr;
|
||||||
|
uint32_t pgm_success_addr;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::map<uint32_t, max10_mem_t> max10_memory_map = {
|
||||||
|
{0x031820dd, {
|
||||||
|
.check_addr0 = 0x80005, // check_addr0
|
||||||
|
.dsm_addr = 0x0000, 512, // DSM
|
||||||
|
.ufm_addr = 0x0200, .ufm_len = {4096, 4096}, // UFM
|
||||||
|
.cfm_addr = 0x2200, .cfm_len = {35840, 14848, 20992}, // CFM
|
||||||
|
.sectors_erase_addr = {0, 1, 2, 3, 4}, // sectors erase address
|
||||||
|
.done_bit_addr = 0x0009, // done bit
|
||||||
|
.pgm_success_addr = 0x000b} // program success addr
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
void max10_program();
|
void max10_program();
|
||||||
void writeXFM(const uint8_t *cfg_data, uint32_t base_addr, uint32_t offset, uint32_t len);
|
void writeXFM(const uint8_t *cfg_data, uint32_t base_addr, uint32_t offset, uint32_t len);
|
||||||
uint32_t verifyxFM(const uint8_t *cfg_data, uint32_t base_addr, uint32_t offset,
|
uint32_t verifyxFM(const uint8_t *cfg_data, uint32_t base_addr, uint32_t offset,
|
||||||
|
|
@ -105,7 +130,7 @@ class Altera: public Device, SPIInterface {
|
||||||
void max10_addr_shift(uint32_t addr);
|
void max10_addr_shift(uint32_t addr);
|
||||||
void max10_flow_enable();
|
void max10_flow_enable();
|
||||||
void max10_flow_disable();
|
void max10_flow_disable();
|
||||||
void max10_flow_erase();
|
void max10_flow_erase(const max10_mem_t &mem, const uint8_t erase_sectors=0x1f);
|
||||||
void max10_dsm_program(const uint8_t *dsm_data, const uint32_t dsm_len);
|
void max10_dsm_program(const uint8_t *dsm_data, const uint32_t dsm_len);
|
||||||
bool max10_dsm_verify();
|
bool max10_dsm_verify();
|
||||||
bool max10_dump();
|
bool max10_dump();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue