aboutsummaryrefslogtreecommitdiff
path: root/src/flash/nor
diff options
context:
space:
mode:
authorMarek Vasut <marek.vasut@gmail.com>2019-04-21 15:54:38 +0200
committerPaul Fertser <fercerpav@gmail.com>2020-01-05 14:29:57 +0000
commitdb23c13d42f49da238bed548d3421c1651ad7072 (patch)
tree088d4818e45ab8e9aaa4572297c9fd84c674a7f5 /src/flash/nor
parent790bd27181c13f816fcce59f3ab23d3b2f21f94d (diff)
downloadriscv-openocd-db23c13d42f49da238bed548d3421c1651ad7072.zip
riscv-openocd-db23c13d42f49da238bed548d3421c1651ad7072.tar.gz
riscv-openocd-db23c13d42f49da238bed548d3421c1651ad7072.tar.bz2
flash/nor: Factor out CFI memory read/write functions
Create separate memory read/write functions which facilitate access to the CFI NOR, so that they can be replaced by controller-specific functions if necessary. This would become necessary when implementing support for e.g. HyperFlash controllers, which do not directly map the HyperFlash into the address space. Change-Id: I1bba1edfd397cb37bfedb43efe2dd03feb26a375 Signed-off-by: Marek Vasut <marek.vasut@gmail.com> Reviewed-on: http://openocd.zylin.com/5145 Tested-by: jenkins Reviewed-by: Paul Fertser <fercerpav@gmail.com>
Diffstat (limited to 'src/flash/nor')
-rw-r--r--src/flash/nor/cfi.c50
1 files changed, 32 insertions, 18 deletions
diff --git a/src/flash/nor/cfi.c b/src/flash/nor/cfi.c
index 34f200b..c22bcde 100644
--- a/src/flash/nor/cfi.c
+++ b/src/flash/nor/cfi.c
@@ -131,6 +131,20 @@ static inline uint32_t flash_address(struct flash_bank *bank, int sector, uint32
}
}
+static int cfi_target_write_memory(struct target *target, target_addr_t addr,
+ uint32_t size, uint32_t count,
+ const uint8_t *buffer)
+{
+ return target_write_memory(target, addr, size, count, buffer);
+}
+
+static int cfi_target_read_memory(struct target *target, target_addr_t addr,
+ uint32_t size, uint32_t count,
+ uint8_t *buffer)
+{
+ return target_read_memory(target, addr, size, count, buffer);
+}
+
static void cfi_command(struct flash_bank *bank, uint8_t cmd, uint8_t *cmd_buf)
{
int i;
@@ -156,7 +170,7 @@ static int cfi_send_command(struct flash_bank *bank, uint8_t cmd, uint32_t addre
uint8_t command[CFI_MAX_BUS_WIDTH];
cfi_command(bank, cmd, command);
- return target_write_memory(bank->target, address, bank->bus_width, 1, command);
+ return cfi_target_write_memory(bank->target, address, bank->bus_width, 1, command);
}
/* read unsigned 8-bit value from the bank
@@ -170,7 +184,7 @@ static int cfi_query_u8(struct flash_bank *bank, int sector, uint32_t offset, ui
uint8_t data[CFI_MAX_BUS_WIDTH];
int retval;
- retval = target_read_memory(target, flash_address(bank, sector, offset),
+ retval = cfi_target_read_memory(target, flash_address(bank, sector, offset),
bank->bus_width, 1, data);
if (retval != ERROR_OK)
return retval;
@@ -195,7 +209,7 @@ static int cfi_get_u8(struct flash_bank *bank, int sector, uint32_t offset, uint
int i;
int retval;
- retval = target_read_memory(target, flash_address(bank, sector, offset),
+ retval = cfi_target_read_memory(target, flash_address(bank, sector, offset),
bank->bus_width, 1, data);
if (retval != ERROR_OK)
return retval;
@@ -225,13 +239,13 @@ static int cfi_query_u16(struct flash_bank *bank, int sector, uint32_t offset, u
if (cfi_info->x16_as_x8) {
uint8_t i;
for (i = 0; i < 2; i++) {
- retval = target_read_memory(target, flash_address(bank, sector, offset + i),
+ retval = cfi_target_read_memory(target, flash_address(bank, sector, offset + i),
bank->bus_width, 1, &data[i * bank->bus_width]);
if (retval != ERROR_OK)
return retval;
}
} else {
- retval = target_read_memory(target, flash_address(bank, sector, offset),
+ retval = cfi_target_read_memory(target, flash_address(bank, sector, offset),
bank->bus_width, 2, data);
if (retval != ERROR_OK)
return retval;
@@ -255,13 +269,13 @@ static int cfi_query_u32(struct flash_bank *bank, int sector, uint32_t offset, u
if (cfi_info->x16_as_x8) {
uint8_t i;
for (i = 0; i < 4; i++) {
- retval = target_read_memory(target, flash_address(bank, sector, offset + i),
+ retval = cfi_target_read_memory(target, flash_address(bank, sector, offset + i),
bank->bus_width, 1, &data[i * bank->bus_width]);
if (retval != ERROR_OK)
return retval;
}
} else {
- retval = target_read_memory(target, flash_address(bank, sector, offset),
+ retval = cfi_target_read_memory(target, flash_address(bank, sector, offset),
bank->bus_width, 4, data);
if (retval != ERROR_OK)
return retval;
@@ -1997,7 +2011,7 @@ static int cfi_intel_write_word(struct flash_bank *bank, uint8_t *word, uint32_t
if (retval != ERROR_OK)
return retval;
- retval = target_write_memory(target, address, bank->bus_width, 1, word);
+ retval = cfi_target_write_memory(target, address, bank->bus_width, 1, word);
if (retval != ERROR_OK)
return retval;
@@ -2078,7 +2092,7 @@ static int cfi_intel_write_words(struct flash_bank *bank, const uint8_t *word,
if (retval != ERROR_OK)
return retval;
- retval = target_write_memory(target, address, bank->bus_width, bufferwsize, word);
+ retval = cfi_target_write_memory(target, address, bank->bus_width, bufferwsize, word);
if (retval != ERROR_OK)
return retval;
@@ -2119,7 +2133,7 @@ static int cfi_spansion_write_word(struct flash_bank *bank, uint8_t *word, uint3
if (retval != ERROR_OK)
return retval;
- retval = target_write_memory(target, address, bank->bus_width, 1, word);
+ retval = cfi_target_write_memory(target, address, bank->bus_width, 1, word);
if (retval != ERROR_OK)
return retval;
@@ -2181,7 +2195,7 @@ static int cfi_spansion_write_words(struct flash_bank *bank, const uint8_t *word
if (retval != ERROR_OK)
return retval;
- retval = target_write_memory(target, address, bank->bus_width, bufferwsize, word);
+ retval = cfi_target_write_memory(target, address, bank->bus_width, bufferwsize, word);
if (retval != ERROR_OK)
return retval;
@@ -2283,7 +2297,7 @@ static int cfi_read(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, u
LOG_INFO("Fixup %d unaligned read head bytes", align);
/* read a complete word from flash */
- retval = target_read_memory(target, read_p, bank->bus_width, 1, current_word);
+ retval = cfi_target_read_memory(target, read_p, bank->bus_width, 1, current_word);
if (retval != ERROR_OK)
return retval;
@@ -2296,7 +2310,7 @@ static int cfi_read(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, u
align = count / bank->bus_width;
if (align) {
- retval = target_read_memory(target, read_p, bank->bus_width, align, buffer);
+ retval = cfi_target_read_memory(target, read_p, bank->bus_width, align, buffer);
if (retval != ERROR_OK)
return retval;
@@ -2309,7 +2323,7 @@ static int cfi_read(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, u
LOG_INFO("Fixup %" PRIu32 " unaligned read tail bytes", count);
/* read a complete word from flash */
- retval = target_read_memory(target, read_p, bank->bus_width, 1, current_word);
+ retval = cfi_target_read_memory(target, read_p, bank->bus_width, 1, current_word);
if (retval != ERROR_OK)
return retval;
@@ -2354,7 +2368,7 @@ static int cfi_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t of
LOG_INFO("Fixup %d unaligned head bytes", align);
/* read a complete word from flash */
- retval = target_read_memory(target, write_p, bank->bus_width, 1, current_word);
+ retval = cfi_target_read_memory(target, write_p, bank->bus_width, 1, current_word);
if (retval != ERROR_OK)
return retval;
@@ -2474,7 +2488,7 @@ static int cfi_write(struct flash_bank *bank, const uint8_t *buffer, uint32_t of
LOG_INFO("Fixup %" PRId32 " unaligned tail bytes", count);
/* read a complete word from flash */
- retval = target_read_memory(target, write_p, bank->bus_width, 1, current_word);
+ retval = cfi_target_read_memory(target, write_p, bank->bus_width, 1, current_word);
if (retval != ERROR_OK)
return retval;
@@ -2624,11 +2638,11 @@ static int cfi_probe(struct flash_bank *bank)
if (retval != ERROR_OK)
return retval;
- retval = target_read_memory(target, flash_address(bank, 0, 0x00),
+ retval = cfi_target_read_memory(target, flash_address(bank, 0, 0x00),
bank->bus_width, 1, value_buf0);
if (retval != ERROR_OK)
return retval;
- retval = target_read_memory(target, flash_address(bank, 0, 0x01),
+ retval = cfi_target_read_memory(target, flash_address(bank, 0, 0x01),
bank->bus_width, 1, value_buf1);
if (retval != ERROR_OK)
return retval;