Skip to content

Commit 23cbdbf

Browse files
committed
altera: changed max10_flow_erase to perform a full erase or sectors per sectors
1 parent 7ed6260 commit 23cbdbf

File tree

2 files changed

+46
-31
lines changed

2 files changed

+46
-31
lines changed

src/altera.cpp

Lines changed: 19 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -296,35 +296,13 @@ uint32_t Altera::idCode()
296296
#define MAX10_ISC_ENABLE {0xcc, 0x02}
297297
#define MAX10_ISC_DISABLE {0x01, 0x02}
298298
#define MAX10_ISC_ADDRESS_SHIFT {0x03, 0x02}
299+
#define MAX10_ISC_ERASE {0xf2, 0x02}
299300
#define MAX10_ISC_PROGRAM {0xf4, 0x02}
300301
#define MAX10_DSM_ICB_PROGRAM {0xF4, 0x03}
301302
#define MAX10_DSM_VERIFY {0x07, 0x03}
302303
#define MAX10_DSM_CLEAR {0xf2, 0x03}
303304
#define MAX10_BYPASS {0xFF, 0x03}
304305

305-
typedef struct {
306-
uint32_t check_addr0; // something to check before sequence
307-
uint32_t dsm_addr;
308-
uint32_t dsm_len; // 32bits
309-
uint32_t ufm_addr; // UFM1 addr
310-
uint32_t ufm_len[2];
311-
uint32_t cfm_addr; // CFM2 addr
312-
uint32_t cfm_len[3];
313-
uint32_t done_bit_addr;
314-
uint32_t pgm_success_addr;
315-
} max10_mem_t;
316-
317-
static const std::map<uint32_t, max10_mem_t> max10_memory_map = {
318-
{0x031820dd, {
319-
0x80005, // check_addr0
320-
0x0000, 512, // DSM
321-
0x0200, {4096, 4096}, // UFM
322-
0x2200, {35840, 14848, 20992}, // CFM
323-
0x0009, // done bit
324-
0x000b} // program success addr
325-
},
326-
};
327-
328306
void Altera::max10_program()
329307
{
330308
POFParser _bit(_filename, _verbose);
@@ -402,7 +380,7 @@ void Altera::max10_program()
402380
// Start!
403381
max10_flow_enable();
404382

405-
max10_flow_erase();
383+
max10_flow_erase(mem);
406384
max10_dsm_verify();
407385

408386
/* Write */
@@ -464,16 +442,28 @@ static void word_to_array(uint32_t in, uint8_t *out) {
464442
out[3] = (in >> 24) & 0xff;
465443
}
466444

467-
void Altera::max10_flow_erase()
445+
void Altera::max10_flow_erase(const max10_mem_t &mem, const uint8_t erase_sectors)
468446
{
469447
const uint32_t dsm_clear_delay = 350000120 / _clk_period;
470448
const uint8_t dsm_clear[2] = MAX10_DSM_CLEAR;
449+
const uint8_t isc_erase[2] = MAX10_ISC_ERASE;
471450

472-
max10_addr_shift(0x000000);
451+
/* All sectors must be erased: DSM_CLEAR is better */
452+
if (erase_sectors == 0x1f) {
453+
max10_addr_shift(0x000000);
473454

474-
_jtag->shiftIR((unsigned char *)dsm_clear, NULL, IRLENGTH);
475-
_jtag->set_state(Jtag::RUN_TEST_IDLE);
476-
_jtag->toggleClk(dsm_clear_delay);
455+
_jtag->shiftIR((unsigned char *)dsm_clear, NULL, IRLENGTH);
456+
_jtag->set_state(Jtag::RUN_TEST_IDLE);
457+
_jtag->toggleClk(dsm_clear_delay);
458+
} else {
459+
/* each bit is a sector to erase */
460+
for (int sect = 0; sect < 5; sect++) {
461+
if ((erase_sectors >> sect) & 0x01) {
462+
max10_addr_shift(mem.sectors_erase_addr[sect]);
463+
_jtag->shiftIR((unsigned char *)isc_erase, NULL, IRLENGTH);
464+
}
465+
}
466+
}
477467
}
478468

479469
void Altera::writeXFM(const uint8_t *cfg_data, uint32_t base_addr, uint32_t offset, uint32_t len)

src/altera.hpp

Lines changed: 27 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,11 +91,36 @@ class Altera: public Device, SPIInterface {
9191
CYCLONE10_FAMILY = 3,
9292
STRATIXV_FAMILY = 3,
9393
CYCLONE_MISC = 10, // Fixme: idcode shared
94-
UNKNOWN_FAMILY = 999
94+
UNKNOWN_FAMILY = 999
9595
};
9696
/*************************/
9797
/* max10 specific */
9898
/*************************/
99+
struct max10_mem_t {
100+
uint32_t check_addr0; // something to check before sequence
101+
uint32_t dsm_addr;
102+
uint32_t dsm_len; // 32bits
103+
uint32_t ufm_addr; // UFM1 addr
104+
uint32_t ufm_len[2];
105+
uint32_t cfm_addr; // CFM2 addr
106+
uint32_t cfm_len[3];
107+
uint32_t sectors_erase_addr[5]; // UFM1, UFM0, CFM2, CFM1, CFM0
108+
uint32_t done_bit_addr;
109+
uint32_t pgm_success_addr;
110+
};
111+
112+
std::map<uint32_t, max10_mem_t> max10_memory_map = {
113+
{0x031820dd, {
114+
.check_addr0 = 0x80005, // check_addr0
115+
.dsm_addr = 0x0000, 512, // DSM
116+
.ufm_addr = 0x0200, .ufm_len = {4096, 4096}, // UFM
117+
.cfm_addr = 0x2200, .cfm_len = {35840, 14848, 20992}, // CFM
118+
.sectors_erase_addr = {0, 1, 2, 3, 4}, // sectors erase address
119+
.done_bit_addr = 0x0009, // done bit
120+
.pgm_success_addr = 0x000b} // program success addr
121+
},
122+
};
123+
99124
void max10_program();
100125
void writeXFM(const uint8_t *cfg_data, uint32_t base_addr, uint32_t offset, uint32_t len);
101126
uint32_t verifyxFM(const uint8_t *cfg_data, uint32_t base_addr, uint32_t offset,
@@ -105,7 +130,7 @@ class Altera: public Device, SPIInterface {
105130
void max10_addr_shift(uint32_t addr);
106131
void max10_flow_enable();
107132
void max10_flow_disable();
108-
void max10_flow_erase();
133+
void max10_flow_erase(const max10_mem_t &mem, const uint8_t erase_sectors=0x1f);
109134
void max10_dsm_program(const uint8_t *dsm_data, const uint32_t dsm_len);
110135
bool max10_dsm_verify();
111136
bool max10_dump();

0 commit comments

Comments
 (0)