X-Git-Url: https://review.openocd.org/gitweb?a=blobdiff_plain;f=src%2Fflash%2Fnor%2Fstellaris.c;h=4e043222c0dceb288c903b4b6d870c90844efbf3;hb=f2f99a9e0a1edff2f688146b923b4d24f93c7abf;hp=712077da233d35c9f20818b35961c3688d3e7d93;hpb=9f0cba528a163645c8ecace413731c23310f2c26;p=openocd.git diff --git a/src/flash/nor/stellaris.c b/src/flash/nor/stellaris.c index 712077da23..4e043222c0 100644 --- a/src/flash/nor/stellaris.c +++ b/src/flash/nor/stellaris.c @@ -18,7 +18,7 @@ * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * - * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. * ***************************************************************************/ /*************************************************************************** @@ -29,6 +29,7 @@ #include "config.h" #endif +#include "jtag/interface.h" #include "imp.h" #include #include @@ -123,7 +124,7 @@ struct stellaris_flash_bank { }; /* Autogenerated by contrib/gen-stellaris-part-header.pl */ -/* From Stellaris Firmware Development Package revision 8049 */ +/* From Stellaris Firmware Development Package revision 9453 */ static struct { uint8_t class; uint8_t partno; @@ -188,7 +189,6 @@ static struct { {0x04, 0xC9, "LM3S1R26"}, {0x04, 0x30, "LM3S1W16"}, {0x04, 0x2F, "LM3S1Z16"}, - {0x01, 0xD4, "LM3S2016"}, {0x01, 0x51, "LM3S2110"}, {0x01, 0x84, "LM3S2139"}, {0x03, 0x39, "LM3S2276"}, @@ -300,9 +300,7 @@ static struct { {0x01, 0x8B, "LM3S6637"}, {0x01, 0xA3, "LM3S6730"}, {0x01, 0x77, "LM3S6753"}, - {0x01, 0xD1, "LM3S6816"}, {0x01, 0xE9, "LM3S6911"}, - {0x01, 0xD3, "LM3S6916"}, {0x01, 0xE8, "LM3S6918"}, {0x01, 0x89, "LM3S6938"}, {0x01, 0x72, "LM3S6950"}, @@ -349,11 +347,9 @@ static struct { {0x04, 0x1E, "LM3S9BN5"}, {0x04, 0x1F, "LM3S9BN6"}, {0x06, 0x70, "LM3S9C97"}, - {0x06, 0x7A, "LM3S9CN5"}, {0x06, 0xA9, "LM3S9D81"}, {0x06, 0x7E, "LM3S9D90"}, {0x06, 0x92, "LM3S9D92"}, - {0x06, 0xC8, "LM3S9D95"}, {0x06, 0x9D, "LM3S9D96"}, {0x06, 0x7B, "LM3S9DN5"}, {0x06, 0x7C, "LM3S9DN6"}, @@ -364,7 +360,6 @@ static struct { {0x06, 0xA8, "LM3S9U81"}, {0x06, 0x7D, "LM3S9U90"}, {0x06, 0x90, "LM3S9U92"}, - {0x06, 0xB7, "LM3S9U95"}, {0x06, 0x9B, "LM3S9U96"}, {0x05, 0x18, "LM4F110B2QR"}, {0x05, 0x19, "LM4F110C4QR"}, @@ -400,6 +395,13 @@ static struct { {0x05, 0x60, "LM4F132E5QC"}, {0x05, 0x61, "LM4F132H5QC"}, {0x05, 0x65, "LM4F132H5QD"}, + {0x05, 0x70, "LM4F210E5QR"}, + {0x05, 0x73, "LM4F210H5QR"}, + {0x05, 0x80, "LM4F211E5QR"}, + {0x05, 0x83, "LM4F211H5QR"}, + {0x05, 0xE9, "LM4F212H5BB"}, + {0x05, 0xC4, "LM4F212H5QC"}, + {0x05, 0xC6, "LM4F212H5QD"}, {0x05, 0xA0, "LM4F230E5QR"}, {0x05, 0xA1, "LM4F230H5QR"}, {0x05, 0xB0, "LM4F231E5QR"}, @@ -409,8 +411,9 @@ static struct { {0x05, 0xC1, "LM4F232H5QC"}, {0x05, 0xC5, "LM4F232H5QD"}, {0x05, 0xE5, "LM4FS1AH5BB"}, + {0x05, 0xEA, "LM4FS1GH5BB"}, {0x05, 0xE4, "LM4FS99H5BB"}, - {0x05, 0xE0, "LM4FSXAH5BB"}, + {0x05, 0xE1, "LM4FSXLH5BB"}, {0xFF, 0x00, "Unknown Part"} }; @@ -958,43 +961,41 @@ static int stellaris_protect(struct flash_bank *bank, int set, int first, int la /* see contib/loaders/flash/stellaris.s for src */ static const uint8_t stellaris_write_code[] = { -/* - Call with : - r0 = buffer address - r1 = destination address - r2 = bytecount (in) - endaddr (work) - - Used registers: - r3 = pFLASH_CTRL_BASE - r4 = FLASHWRITECMD - r5 = #1 - r6 = bytes written - r7 = temp reg -*/ - 0x07, 0x4B, /* ldr r3,pFLASH_CTRL_BASE */ - 0x08, 0x4C, /* ldr r4,FLASHWRITECMD */ - 0x01, 0x25, /* movs r5, 1 */ - 0x00, 0x26, /* movs r6, #0 */ -/* mainloop: */ - 0x19, 0x60, /* str r1, [r3, #0] */ - 0x87, 0x59, /* ldr r7, [r0, r6] */ - 0x5F, 0x60, /* str r7, [r3, #4] */ - 0x9C, 0x60, /* str r4, [r3, #8] */ -/* waitloop: */ - 0x9F, 0x68, /* ldr r7, [r3, #8] */ - 0x2F, 0x42, /* tst r7, r5 */ - 0xFC, 0xD1, /* bne waitloop */ - 0x04, 0x31, /* adds r1, r1, #4 */ - 0x04, 0x36, /* adds r6, r6, #4 */ - 0x96, 0x42, /* cmp r6, r2 */ - 0xF4, 0xD1, /* bne mainloop */ - 0x00, 0xBE, /* bkpt #0 */ -/* pFLASH_CTRL_BASE: */ + /* write: */ + 0xDF, 0xF8, 0x40, 0x40, /* ldr r4, pFLASH_CTRL_BASE */ + 0xDF, 0xF8, 0x40, 0x50, /* ldr r5, FLASHWRITECMD */ + /* wait_fifo: */ + 0xD0, 0xF8, 0x00, 0x80, /* ldr r8, [r0, #0] */ + 0xB8, 0xF1, 0x00, 0x0F, /* cmp r8, #0 */ + 0x17, 0xD0, /* beq exit */ + 0x47, 0x68, /* ldr r7, [r0, #4] */ + 0x47, 0x45, /* cmp r7, r8 */ + 0xF7, 0xD0, /* beq wait_fifo */ + /* mainloop: */ + 0x22, 0x60, /* str r2, [r4, #0] */ + 0x02, 0xF1, 0x04, 0x02, /* add r2, r2, #4 */ + 0x57, 0xF8, 0x04, 0x8B, /* ldr r8, [r7], #4 */ + 0xC4, 0xF8, 0x04, 0x80, /* str r8, [r4, #4] */ + 0xA5, 0x60, /* str r5, [r4, #8] */ + /* busy: */ + 0xD4, 0xF8, 0x08, 0x80, /* ldr r8, [r4, #8] */ + 0x18, 0xF0, 0x01, 0x0F, /* tst r8, #1 */ + 0xFA, 0xD1, /* bne busy */ + 0x8F, 0x42, /* cmp r7, r1 */ + 0x28, 0xBF, /* it cs */ + 0x00, 0xF1, 0x08, 0x07, /* addcs r7, r0, #8 */ + 0x47, 0x60, /* str r7, [r0, #4] */ + 0x01, 0x3B, /* subs r3, r3, #1 */ + 0x03, 0xB1, /* cbz r3, exit */ + 0xE2, 0xE7, /* b wait_fifo */ + /* exit: */ + 0x00, 0xBE, /* bkpt #0 */ + + /* pFLASH_CTRL_BASE: */ 0x00, 0xD0, 0x0F, 0x40, /* .word 0x400FD000 */ -/* FLASHWRITECMD: */ + /* FLASHWRITECMD: */ 0x01, 0x00, 0x42, 0xA4 /* .word 0xA4420001 */ }; - static int stellaris_write_block(struct flash_bank *bank, uint8_t *buffer, uint32_t offset, uint32_t wcount) { @@ -1003,7 +1004,7 @@ static int stellaris_write_block(struct flash_bank *bank, struct working_area *source; struct working_area *write_algorithm; uint32_t address = bank->base + offset; - struct reg_param reg_params[3]; + struct reg_param reg_params[4]; struct armv7m_algorithm armv7m_info; int retval = ERROR_OK; @@ -1039,49 +1040,32 @@ static int stellaris_write_block(struct flash_bank *bank, target_name(target), (unsigned) buffer_size); }; - retval = target_write_buffer(target, write_algorithm->address, + target_write_buffer(target, write_algorithm->address, sizeof(stellaris_write_code), (uint8_t *) stellaris_write_code); armv7m_info.common_magic = ARMV7M_COMMON_MAGIC; - armv7m_info.core_mode = ARMV7M_MODE_ANY; + armv7m_info.core_mode = ARM_MODE_THREAD; init_reg_param(®_params[0], "r0", 32, PARAM_OUT); init_reg_param(®_params[1], "r1", 32, PARAM_OUT); init_reg_param(®_params[2], "r2", 32, PARAM_OUT); + init_reg_param(®_params[3], "r3", 32, PARAM_OUT); - while (wcount > 0) { - uint32_t thisrun_count = (wcount > (buffer_size / 4)) ? (buffer_size / 4) : wcount; - - target_write_buffer(target, source->address, thisrun_count * 4, buffer); - - buf_set_u32(reg_params[0].value, 0, 32, source->address); - buf_set_u32(reg_params[1].value, 0, 32, address); - buf_set_u32(reg_params[2].value, 0, 32, 4*thisrun_count); - LOG_DEBUG("Algorithm flash write %u words to 0x%" PRIx32 - ", %u remaining", - (unsigned) thisrun_count, address, - (unsigned) (wcount - thisrun_count)); - retval = target_run_algorithm(target, 0, NULL, 3, reg_params, - write_algorithm->address, - 0, - 10000, &armv7m_info); - if (retval != ERROR_OK) { - LOG_ERROR("error %d executing stellaris " - "flash write algorithm", - retval); - retval = ERROR_FLASH_OPERATION_FAILED; - break; - } + buf_set_u32(reg_params[0].value, 0, 32, source->address); + buf_set_u32(reg_params[1].value, 0, 32, source->address + source->size); + buf_set_u32(reg_params[2].value, 0, 32, address); + buf_set_u32(reg_params[3].value, 0, 32, wcount); - buffer += thisrun_count * 4; - address += thisrun_count * 4; - wcount -= thisrun_count; - } + retval = target_run_flash_async_algorithm(target, buffer, wcount, 4, + 0, NULL, + 4, reg_params, + source->address, source->size, + write_algorithm->address, 0, + &armv7m_info); - /* REVISIT we could speed up writing multi-section images by - * not freeing the initialized write_algorithm this way. - */ + if (retval == ERROR_FLASH_OPERATION_FAILED) + LOG_ERROR("error %d executing stellaris flash write algorithm", retval); target_free_working_area(target, write_algorithm); target_free_working_area(target, source); @@ -1089,6 +1073,7 @@ static int stellaris_write_block(struct flash_bank *bank, destroy_reg_param(®_params[0]); destroy_reg_param(®_params[1]); destroy_reg_param(®_params[2]); + destroy_reg_param(®_params[3]); return retval; } @@ -1347,7 +1332,7 @@ COMMAND_HANDLER(stellaris_handle_recover_command) LOG_ERROR("Can't recover Stellaris flash without SRST"); return ERROR_FAIL; } - jtag_add_reset(0, 1); + adapter_assert_reset(); for (int i = 0; i < 5; i++) { retval = dap_to_swd(bank->target); @@ -1360,7 +1345,7 @@ COMMAND_HANDLER(stellaris_handle_recover_command) } /* de-assert SRST */ - jtag_add_reset(0, 0); + adapter_deassert_reset(); retval = jtag_execute_queue(); /* wait 400+ msec ... OK, "1+ second" is simpler */ @@ -1414,7 +1399,7 @@ struct flash_driver stellaris_flash = { .read = default_flash_read, .probe = stellaris_probe, .auto_probe = stellaris_probe, - .erase_check = default_flash_mem_blank_check, + .erase_check = default_flash_blank_check, .protect_check = stellaris_protect_check, .info = get_stellaris_info, };