aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--iceprog/iceprog.c86
1 files changed, 60 insertions, 26 deletions
diff --git a/iceprog/iceprog.c b/iceprog/iceprog.c
index 5a29733..c0a1406 100644
--- a/iceprog/iceprog.c
+++ b/iceprog/iceprog.c
@@ -287,14 +287,48 @@ static int get_cdone()
// FLASH function implementations
// ---------------------------------------------------------
+// the FPGA reset is released so also FLASH chip select should be deasserted
+static void flash_release_reset()
+{
+ set_gpio(1, 1);
+}
+
+// FLASH chip select assert/deassert
+// should only happen while FPGA reset is asserted
+static void flash_chip_select(bool assert)
+{
+ if(assert)
+ set_gpio(0, 0);
+ else
+ set_gpio(1, 0);
+}
+
+// SRAM reset is pretty much the same as flash_chip_select(true)
+// For ease of code reading we use this function instead
+static void sram_reset()
+{
+ // Asserting chip select and reset lines
+ set_gpio(0, 0);
+}
+
+// When accessing FPGA SRAM the reset should be released
+static void sram_chip_select(bool assert)
+{
+ if(assert)
+ set_gpio(0, 1);
+ else
+ set_gpio(1, 1);
+}
+
static void flash_read_id()
{
// fprintf(stderr, "read flash ID..\n");
uint8_t data[21] = { FC_JEDECID };
- set_gpio(0, 0);
+
+ flash_chip_select(true);
xfer_spi(data, 21);
- set_gpio(1, 0);
+ flash_chip_select(false);
fprintf(stderr, "flash ID:");
for (int i = 1; i < 21; i++)
@@ -305,17 +339,17 @@ static void flash_read_id()
static void flash_power_up()
{
uint8_t data[1] = { FC_RPD };
- set_gpio(0, 0);
+ flash_chip_select(true);
xfer_spi(data, 1);
- set_gpio(1, 0);
+ flash_chip_select(false);
}
static void flash_power_down()
{
uint8_t data[1] = { FC_PD };
- set_gpio(0, 0);
+ flash_chip_select(true);
xfer_spi(data, 1);
- set_gpio(1, 0);
+ flash_chip_select(false);
}
static void flash_write_enable()
@@ -324,9 +358,9 @@ static void flash_write_enable()
fprintf(stderr, "write enable..\n");
uint8_t data[1] = { FC_WE };
- set_gpio(0, 0);
+ flash_chip_select(true);
xfer_spi(data, 1);
- set_gpio(1, 0);
+ flash_chip_select(false);
}
static void flash_bulk_erase()
@@ -334,9 +368,9 @@ static void flash_bulk_erase()
fprintf(stderr, "bulk erase..\n");
uint8_t data[1] = { FC_CE };
- set_gpio(0, 0);
+ flash_chip_select(true);
xfer_spi(data, 1);
- set_gpio(1, 0);
+ flash_chip_select(false);
}
static void flash_64kB_sector_erase(int addr)
@@ -345,9 +379,9 @@ static void flash_64kB_sector_erase(int addr)
uint8_t command[4] = { FC_BE64, (uint8_t)(addr >> 16), (uint8_t)(addr >> 8), (uint8_t)addr };
- set_gpio(0, 0);
+ flash_chip_select(true);
send_spi(command, 4);
- set_gpio(1, 0);
+ flash_chip_select(false);
}
static void flash_prog(int addr, uint8_t *data, int n)
@@ -357,10 +391,10 @@ static void flash_prog(int addr, uint8_t *data, int n)
uint8_t command[4] = { FC_PP, (uint8_t)(addr >> 16), (uint8_t)(addr >> 8), (uint8_t)addr };
- set_gpio(0, 0);
+ flash_chip_select(true);
send_spi(command, 4);
send_spi(data, n);
- set_gpio(1, 0);
+ flash_chip_select(false);
if (verbose)
for (int i = 0; i < n; i++)
@@ -374,11 +408,11 @@ static void flash_read(int addr, uint8_t *data, int n)
uint8_t command[4] = { FC_RD, (uint8_t)(addr >> 16), (uint8_t)(addr >> 8), (uint8_t)addr };
- set_gpio(0, 0);
+ flash_chip_select(true);
send_spi(command, 4);
memset(data, 0, n);
xfer_spi(data, n);
- set_gpio(1, 0);
+ flash_chip_select(false);
if (verbose)
for (int i = 0; i < n; i++)
@@ -418,18 +452,18 @@ static void flash_disable_protection()
//WRSR 0x00
uint8_t data[2] = { 0x01, 0x00 };
- set_gpio(0, 0);
+ flash_chip_select(true);
xfer_spi(data, 2);
- set_gpio(1, 0);
+ flash_chip_select(false);
flash_wait();
//RDSR
data[0] = 0x5;
- set_gpio(0, 0);\
+ flash_chip_select(true);
xfer_spi(data, 2);
- set_gpio(1, 0);
+ flash_chip_select(false);
if(data[1] != 0x00)
fprintf(stderr, "failed to disable protection, SR now equal to 0x%02x (expected 0x00)\n", data[1]);
@@ -833,7 +867,7 @@ int main(int argc, char **argv)
fprintf(stderr, "cdone: %s\n", get_cdone() ? "high" : "low");
- set_gpio(1, 1);
+ flash_release_reset();
usleep(100000);
@@ -841,7 +875,7 @@ int main(int argc, char **argv)
{
fprintf(stderr, "reset..\n");
- set_gpio(1, 0);
+ flash_chip_select(false);
usleep(250000);
fprintf(stderr, "cdone: %s\n", get_cdone() ? "high" : "low");
@@ -852,7 +886,7 @@ int main(int argc, char **argv)
flash_power_down();
- set_gpio(1, 1);
+ flash_release_reset();
usleep(250000);
fprintf(stderr, "cdone: %s\n", get_cdone() ? "high" : "low");
@@ -865,10 +899,10 @@ int main(int argc, char **argv)
fprintf(stderr, "reset..\n");
- set_gpio(0, 0);
+ sram_reset();
usleep(100);
- set_gpio(0, 1);
+ sram_chip_select(true);
usleep(2000);
fprintf(stderr, "cdone: %s\n", get_cdone() ? "high" : "low");
@@ -908,7 +942,7 @@ int main(int argc, char **argv)
fprintf(stderr, "reset..\n");
- set_gpio(1, 0);
+ flash_chip_select(false);
usleep(250000);
fprintf(stderr, "cdone: %s\n", get_cdone() ? "high" : "low");