@@ -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-
328306void 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
479469void Altera::writeXFM (const uint8_t *cfg_data, uint32_t base_addr, uint32_t offset, uint32_t len)
0 commit comments