flash/nor/stm32l4x : add structure containers to hold devices' information
[fw/openocd] / src / flash / nor / cfi.c
index 163862817066b6d1d9113f89d1bff4e162cd3cfc..c22bcdecb3c844f731ad4832c7b3bc9453619d61 100644 (file)
@@ -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;
@@ -898,6 +912,23 @@ static int cfi_intel_erase(struct flash_bank *bank, int first, int last)
        return cfi_send_command(bank, 0xff, flash_address(bank, 0, 0x0));
 }
 
+static int cfi_spansion_unlock_seq(struct flash_bank *bank)
+{
+       int retval;
+       struct cfi_flash_bank *cfi_info = bank->driver_priv;
+       struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
+
+       retval = cfi_send_command(bank, 0xaa, flash_address(bank, 0, pri_ext->_unlock1));
+       if (retval != ERROR_OK)
+               return retval;
+
+       retval = cfi_send_command(bank, 0x55, flash_address(bank, 0, pri_ext->_unlock2));
+       if (retval != ERROR_OK)
+               return retval;
+
+       return ERROR_OK;
+}
+
 static int cfi_spansion_erase(struct flash_bank *bank, int first, int last)
 {
        int retval;
@@ -906,11 +937,7 @@ static int cfi_spansion_erase(struct flash_bank *bank, int first, int last)
        int i;
 
        for (i = first; i <= last; i++) {
-               retval = cfi_send_command(bank, 0xaa, flash_address(bank, 0, pri_ext->_unlock1));
-               if (retval != ERROR_OK)
-                       return retval;
-
-               retval = cfi_send_command(bank, 0x55, flash_address(bank, 0, pri_ext->_unlock2));
+               retval = cfi_spansion_unlock_seq(bank);
                if (retval != ERROR_OK)
                        return retval;
 
@@ -918,11 +945,7 @@ static int cfi_spansion_erase(struct flash_bank *bank, int first, int last)
                if (retval != ERROR_OK)
                        return retval;
 
-               retval = cfi_send_command(bank, 0xaa, flash_address(bank, 0, pri_ext->_unlock1));
-               if (retval != ERROR_OK)
-                       return retval;
-
-               retval = cfi_send_command(bank, 0x55, flash_address(bank, 0, pri_ext->_unlock2));
+               retval = cfi_spansion_unlock_seq(bank);
                if (retval != ERROR_OK)
                        return retval;
 
@@ -1988,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;
 
@@ -2069,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;
 
@@ -2102,11 +2125,7 @@ static int cfi_spansion_write_word(struct flash_bank *bank, uint8_t *word, uint3
        struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
        struct target *target = bank->target;
 
-       retval = cfi_send_command(bank, 0xaa, flash_address(bank, 0, pri_ext->_unlock1));
-       if (retval != ERROR_OK)
-               return retval;
-
-       retval = cfi_send_command(bank, 0x55, flash_address(bank, 0, pri_ext->_unlock2));
+       retval = cfi_spansion_unlock_seq(bank);
        if (retval != ERROR_OK)
                return retval;
 
@@ -2114,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;
 
@@ -2137,7 +2156,6 @@ static int cfi_spansion_write_words(struct flash_bank *bank, const uint8_t *word
        int retval;
        struct cfi_flash_bank *cfi_info = bank->driver_priv;
        struct target *target = bank->target;
-       struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
 
        /* Calculate buffer size and boundary mask
         * buffersize is (buffer size per chip) * (number of chips)
@@ -2163,11 +2181,7 @@ static int cfi_spansion_write_words(struct flash_bank *bank, const uint8_t *word
        }
 
        /* Unlock */
-       retval = cfi_send_command(bank, 0xaa, flash_address(bank, 0, pri_ext->_unlock1));
-       if (retval != ERROR_OK)
-               return retval;
-
-       retval = cfi_send_command(bank, 0x55, flash_address(bank, 0, pri_ext->_unlock2));
+       retval = cfi_spansion_unlock_seq(bank);
        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;
@@ -2958,11 +2972,7 @@ static int cfi_spansion_protect_check(struct flash_bank *bank)
        struct cfi_spansion_pri_ext *pri_ext = cfi_info->pri_ext;
        int i;
 
-       retval = cfi_send_command(bank, 0xaa, flash_address(bank, 0, pri_ext->_unlock1));
-       if (retval != ERROR_OK)
-               return retval;
-
-       retval = cfi_send_command(bank, 0x55, flash_address(bank, 0, pri_ext->_unlock2));
+       retval = cfi_spansion_unlock_seq(bank);
        if (retval != ERROR_OK)
                return retval;
 
@@ -3112,7 +3122,7 @@ static void cfi_fixup_0002_write_buffer(struct flash_bank *bank, const void *par
        cfi_info->buf_write_timeout_typ = 0;
 }
 
-struct flash_driver cfi_flash = {
+const struct flash_driver cfi_flash = {
        .name = "cfi",
        .flash_bank_command = cfi_flash_bank_command,
        .erase = cfi_erase,