* 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. *
***************************************************************************/
/***************************************************************************
#include "config.h"
#endif
+#include "jtag/interface.h"
#include "imp.h"
#include <target/algorithm.h>
#include <target/armv7m.h>
};
/* 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;
{0x04, 0xC9, "LM3S1R26"},
{0x04, 0x30, "LM3S1W16"},
{0x04, 0x2F, "LM3S1Z16"},
- {0x01, 0xD4, "LM3S2016"},
{0x01, 0x51, "LM3S2110"},
{0x01, 0x84, "LM3S2139"},
{0x03, 0x39, "LM3S2276"},
{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"},
{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"},
{0x06, 0xA8, "LM3S9U81"},
{0x06, 0x7D, "LM3S9U90"},
{0x06, 0x90, "LM3S9U92"},
- {0x06, 0xB7, "LM3S9U95"},
{0x06, 0x9B, "LM3S9U96"},
{0x05, 0x18, "LM4F110B2QR"},
{0x05, 0x19, "LM4F110C4QR"},
{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"},
{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"}
};
/* 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)
{
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;
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);
destroy_reg_param(®_params[0]);
destroy_reg_param(®_params[1]);
destroy_reg_param(®_params[2]);
+ destroy_reg_param(®_params[3]);
return retval;
}
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);
}
/* de-assert SRST */
- jtag_add_reset(0, 0);
+ adapter_deassert_reset();
retval = jtag_execute_queue();
/* wait 400+ msec ... OK, "1+ second" is simpler */
.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,
};