Merge pull request #364 from Icenowy/gw5ast-138k

Add GW5AST-138 support
This commit is contained in:
Gwenhael Goavec-Merou 2023-08-12 07:33:53 +02:00 committed by GitHub
commit e634b479b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 37 additions and 0 deletions

View File

@ -180,6 +180,13 @@ int FsParser::parse()
case 0x0000281b: /* GW2A-55 */
nb_line = 2038;
break;
case 0x0001081b: /* GW5AST-138 */
/*
* FIXME: Lack of information,
* so just accept everything.
*/
nb_line = 65535;
break;
default:
printWarn("Warning: Unknown IDCODE");
nb_line = 0;

View File

@ -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,
bool verify, int8_t verbose): Device(jtag, filename, file_type,
verify, verbose), is_gw1n1(false), is_gw2a(false),
is_gw5a(false),
_external_flash(external_flash),
_spi_sck(BSCAN_SPI_SCK), _spi_cs(BSCAN_SPI_CS),
_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 */
skip_checksum = 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) {
@ -256,6 +266,8 @@ void Gowin::program(unsigned int offset, bool unprotect_flash)
length = _fs->getLength();
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 */
programFlash();
} 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);
/* Work around FPGA stuck in Bad Command status */
if (is_gw5a) {
reset();
_jtag->set_state(Jtag::RUN_TEST_IDLE);
_jtag->toggleClk(1000000);
}
/* erase SRAM */
if (!EnableCfg())
return;
@ -618,6 +637,11 @@ bool Gowin::flashSRAM(uint8_t *data, int length)
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 */
wr_rd(XFER_WRITE, NULL, 0, NULL, 0);

View File

@ -63,6 +63,7 @@ class Gowin: public Device, SPIInterface {
ConfigBitstreamParser *_fs;
bool is_gw1n1;
bool is_gw2a;
bool is_gw5a;
bool skip_checksum; /**< bypass checksum verification (GW2A) */
bool _external_flash; /**< select between int or ext flash */
uint8_t _spi_sck; /**< clk signal offset in bscan SPI */

View File

@ -227,6 +227,11 @@ static std::map <uint32_t, fpga_model> fpga_list = {
/* Gowin GW2 */
{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 */
/**************************************************************************/