NOR/STR7X: review scope of data
[fw/openocd] / src / flash / nor / lpc2000.c
index c14df1f879903a311df01203c50a70baaa43131e..438ab544c21be51684a06377d3febb87768c91ef 100644 (file)
 #include "lpc2000.h"
 #include <helper/binarybuffer.h>
 #include <target/algorithm.h>
+#include <target/arm_opcodes.h>
 #include <target/armv7m.h>
 
 
-/* flash programming support for NXP LPC17xx and LPC2xxx devices
+/**
+ * @file
+ * flash programming support for NXP LPC17xx and LPC2xxx devices.
+ *
+ * @todo Provide a way to update CCLK after declaring the flash bank.
+ * The value which is correct after chip reset will rarely still work
+ * right after the clocks switch to use the PLL (e.g. 4MHz --> 100 MHz).
+ */
+/*
  * currently supported devices:
  * variant 1 (lpc2000_v1):
  * - 2104 | 5 | 6
@@ -242,7 +251,7 @@ static int lpc2000_iap_call(struct flash_bank *bank, int code, uint32_t param_ta
        struct target *target = bank->target;
        struct mem_param mem_params[2];
        struct reg_param reg_params[5];
-       struct armv4_5_algorithm armv4_5_info; /* for LPC2000 */
+       struct arm_algorithm armv4_5_info; /* for LPC2000 */
        struct armv7m_algorithm armv7m_info;   /* for LPC1700 */
        uint32_t status_code;
        uint32_t iap_entry_point = 0; /* to make compiler happier */
@@ -263,8 +272,10 @@ static int lpc2000_iap_call(struct flash_bank *bank, int code, uint32_t param_ta
                switch(lpc2000_info->variant)
                {
                        case lpc1700:
-                               target_buffer_set_u32(target, jump_gate, ARMV7M_T_BX(12));
-                               target_buffer_set_u32(target, jump_gate + 4, ARMV7M_T_B(0xfffffe));
+                               target_buffer_set_u32(target, jump_gate,
+                                               ARMV4_5_T_BX(12));
+                               target_buffer_set_u32(target, jump_gate + 4,
+                                               ARMV5_T_BKPT(0));
                                break;
                        case lpc2000_v1:
                        case lpc2000_v2:
@@ -292,7 +303,7 @@ static int lpc2000_iap_call(struct flash_bank *bank, int code, uint32_t param_ta
                        break;
                case lpc2000_v1:
                case lpc2000_v2:
-                       armv4_5_info.common_magic = ARMV4_5_COMMON_MAGIC;
+                       armv4_5_info.common_magic = ARM_COMMON_MAGIC;
                        armv4_5_info.core_mode = ARM_MODE_SVC;
                        armv4_5_info.core_state = ARM_STATE_ARM;
                        iap_entry_point = 0x7ffffff1;
@@ -340,7 +351,7 @@ static int lpc2000_iap_call(struct flash_bank *bank, int code, uint32_t param_ta
                case lpc2000_v1:
                case lpc2000_v2:
                        /* IAP stack */
-                       init_reg_param(&reg_params[3], "r13_svc", 32, PARAM_OUT);
+                       init_reg_param(&reg_params[3], "sp_svc", 32, PARAM_OUT);
                        buf_set_u32(reg_params[3].value, 0, 32, lpc2000_info->iap_working_area->address + 0xb4);
 
                        /* return address */
@@ -780,7 +791,7 @@ COMMAND_HANDLER(lpc2000_handle_part_id_command)
 static const struct command_registration lpc2000_exec_command_handlers[] = {
        {
                .name = "part_id",
-               .handler = &lpc2000_handle_part_id_command,
+               .handler = lpc2000_handle_part_id_command,
                .mode = COMMAND_EXEC,
                .help = "print part id of lpc2000 flash bank <num>",
        },
@@ -797,17 +808,15 @@ static const struct command_registration lpc2000_command_handlers[] = {
 };
 
 struct flash_driver lpc2000_flash = {
-               .name = "lpc2000",
-               .commands = lpc2000_command_handlers,
-               .flash_bank_command = &lpc2000_flash_bank_command,
-               .erase = &lpc2000_erase,
-               .protect = &lpc2000_protect,
-               .write = &lpc2000_write,
-               .probe = &lpc2000_probe,
-               .auto_probe = &lpc2000_probe,
-               .erase_check = &lpc2000_erase_check,
-               .protect_check = &lpc2000_protect_check,
-               .info = &lpc2000_info,
-       };
-
-
+       .name = "lpc2000",
+       .commands = lpc2000_command_handlers,
+       .flash_bank_command = lpc2000_flash_bank_command,
+       .erase = lpc2000_erase,
+       .protect = lpc2000_protect,
+       .write = lpc2000_write,
+       .probe = lpc2000_probe,
+       .auto_probe = lpc2000_probe,
+       .erase_check = lpc2000_erase_check,
+       .protect_check = lpc2000_protect_check,
+       .info = lpc2000_info,
+};