Merge pull request #364 from Icenowy/gw5ast-138k
Add GW5AST-138 support
This commit is contained in:
commit
e634b479b0
|
|
@ -180,6 +180,13 @@ int FsParser::parse()
|
||||||
case 0x0000281b: /* GW2A-55 */
|
case 0x0000281b: /* GW2A-55 */
|
||||||
nb_line = 2038;
|
nb_line = 2038;
|
||||||
break;
|
break;
|
||||||
|
case 0x0001081b: /* GW5AST-138 */
|
||||||
|
/*
|
||||||
|
* FIXME: Lack of information,
|
||||||
|
* so just accept everything.
|
||||||
|
*/
|
||||||
|
nb_line = 65535;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
printWarn("Warning: Unknown IDCODE");
|
printWarn("Warning: Unknown IDCODE");
|
||||||
nb_line = 0;
|
nb_line = 0;
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,7 @@ Gowin::Gowin(Jtag *jtag, const string filename, const string &file_type, std::st
|
||||||
Device::prog_type_t prg_type, bool external_flash,
|
Device::prog_type_t prg_type, bool external_flash,
|
||||||
bool verify, int8_t verbose): Device(jtag, filename, file_type,
|
bool verify, int8_t verbose): Device(jtag, filename, file_type,
|
||||||
verify, verbose), is_gw1n1(false), is_gw2a(false),
|
verify, verbose), is_gw1n1(false), is_gw2a(false),
|
||||||
|
is_gw5a(false),
|
||||||
_external_flash(external_flash),
|
_external_flash(external_flash),
|
||||||
_spi_sck(BSCAN_SPI_SCK), _spi_cs(BSCAN_SPI_CS),
|
_spi_sck(BSCAN_SPI_SCK), _spi_cs(BSCAN_SPI_CS),
|
||||||
_spi_di(BSCAN_SPI_DI), _spi_do(BSCAN_SPI_DO),
|
_spi_di(BSCAN_SPI_DI), _spi_do(BSCAN_SPI_DO),
|
||||||
|
|
@ -160,6 +161,15 @@ Gowin::Gowin(Jtag *jtag, const string filename, const string &file_type, std::st
|
||||||
/* FIXME: implement GW2 checksum calculation */
|
/* FIXME: implement GW2 checksum calculation */
|
||||||
skip_checksum = true;
|
skip_checksum = true;
|
||||||
is_gw2a = true;
|
is_gw2a = true;
|
||||||
|
break;
|
||||||
|
case 0x0001081b: /* GW5AST-138 */
|
||||||
|
case 0x0001181b: /* GW5AT-138 */
|
||||||
|
case 0x0001281b: /* GW5A-25 */
|
||||||
|
_external_flash = true;
|
||||||
|
/* FIXME: implement GW5 checksum calculation */
|
||||||
|
skip_checksum = true;
|
||||||
|
is_gw5a = true;
|
||||||
|
break;
|
||||||
};
|
};
|
||||||
|
|
||||||
if (mcufw.size() > 0) {
|
if (mcufw.size() > 0) {
|
||||||
|
|
@ -256,6 +266,8 @@ void Gowin::program(unsigned int offset, bool unprotect_flash)
|
||||||
length = _fs->getLength();
|
length = _fs->getLength();
|
||||||
|
|
||||||
if (_mode == FLASH_MODE) {
|
if (_mode == FLASH_MODE) {
|
||||||
|
if (is_gw5a)
|
||||||
|
throw std::runtime_error("Error: write to flash on GW5A is not yet supported");
|
||||||
if (!_external_flash) { /* write into internal flash */
|
if (!_external_flash) { /* write into internal flash */
|
||||||
programFlash();
|
programFlash();
|
||||||
} else { /* write bitstream into external flash */
|
} else { /* write bitstream into external flash */
|
||||||
|
|
@ -302,6 +314,13 @@ void Gowin::program(unsigned int offset, bool unprotect_flash)
|
||||||
|
|
||||||
wr_rd(READ_IDCODE, NULL, 0, NULL, 0);
|
wr_rd(READ_IDCODE, NULL, 0, NULL, 0);
|
||||||
|
|
||||||
|
/* Work around FPGA stuck in Bad Command status */
|
||||||
|
if (is_gw5a) {
|
||||||
|
reset();
|
||||||
|
_jtag->set_state(Jtag::RUN_TEST_IDLE);
|
||||||
|
_jtag->toggleClk(1000000);
|
||||||
|
}
|
||||||
|
|
||||||
/* erase SRAM */
|
/* erase SRAM */
|
||||||
if (!EnableCfg())
|
if (!EnableCfg())
|
||||||
return;
|
return;
|
||||||
|
|
@ -618,6 +637,11 @@ bool Gowin::flashSRAM(uint8_t *data, int length)
|
||||||
|
|
||||||
ProgressBar progress("Flash SRAM", byte_length, 50, _quiet);
|
ProgressBar progress("Flash SRAM", byte_length, 50, _quiet);
|
||||||
|
|
||||||
|
/* UG704 3.4.3 */
|
||||||
|
if (is_gw5a) {
|
||||||
|
wr_rd(INIT_ADDR, NULL, 0, NULL, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/* 2.2.6.4 */
|
/* 2.2.6.4 */
|
||||||
wr_rd(XFER_WRITE, NULL, 0, NULL, 0);
|
wr_rd(XFER_WRITE, NULL, 0, NULL, 0);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -63,6 +63,7 @@ class Gowin: public Device, SPIInterface {
|
||||||
ConfigBitstreamParser *_fs;
|
ConfigBitstreamParser *_fs;
|
||||||
bool is_gw1n1;
|
bool is_gw1n1;
|
||||||
bool is_gw2a;
|
bool is_gw2a;
|
||||||
|
bool is_gw5a;
|
||||||
bool skip_checksum; /**< bypass checksum verification (GW2A) */
|
bool skip_checksum; /**< bypass checksum verification (GW2A) */
|
||||||
bool _external_flash; /**< select between int or ext flash */
|
bool _external_flash; /**< select between int or ext flash */
|
||||||
uint8_t _spi_sck; /**< clk signal offset in bscan SPI */
|
uint8_t _spi_sck; /**< clk signal offset in bscan SPI */
|
||||||
|
|
|
||||||
|
|
@ -227,6 +227,11 @@ static std::map <uint32_t, fpga_model> fpga_list = {
|
||||||
/* Gowin GW2 */
|
/* Gowin GW2 */
|
||||||
{0x0000081b, {"Gowin", "GW2A", "GW2A(R)-18(C)", 8}},
|
{0x0000081b, {"Gowin", "GW2A", "GW2A(R)-18(C)", 8}},
|
||||||
|
|
||||||
|
/* Gowin GW5 */
|
||||||
|
{0x0001081b, {"Gowin", "GW5AST", "GW5AST-138", 8}},
|
||||||
|
{0x0001181b, {"Gowin", "GW5AT", "GW5AT-138", 8}},
|
||||||
|
{0x0001281b, {"Gowin", "GW5A", "GW5A-25", 8}},
|
||||||
|
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
/* CologneChip */
|
/* CologneChip */
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue