diff --git a/.travis.yml b/.travis.yml index 0512f661..c879677d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,10 +1,11 @@ +dist: trusty sudo: required before_install: - sudo add-apt-repository -y ppa:team-gcc-arm-embedded/ppa - sudo apt-get update -qq - sudo apt-get install -y build-essential libftdi-dev gcc-arm-embedded - - sudo pip install intelhex + - pip install --user intelhex install: true diff --git a/scripts/gdb.py b/scripts/gdb.py index ed0b4e26..eb28ed88 100644 --- a/scripts/gdb.py +++ b/scripts/gdb.py @@ -291,7 +291,7 @@ class Target: def flash_write_prepare(self, address, data): for m in self.mem: - if (address >= m.offset) and (address + len(data) < m.offset + m.length): + if (address >= m.offset) and (address + len(data) <= m.offset + m.length): m.prog(address, data) def flash_commit(self, progress_cb=None): diff --git a/scripts/stm32_mem.py b/scripts/stm32_mem.py index 9f2e2287..780da327 100755 --- a/scripts/stm32_mem.py +++ b/scripts/stm32_mem.py @@ -39,6 +39,16 @@ def stm32_erase(dev, addr): if status.bState == dfu.STATE_DFU_DOWNLOAD_IDLE: break +def stm32_set_address(dev, addr): + set_address_cmd = struct.pack("target_options |= CORTEXM_TOPT_INHIBIT_SRST; return true; + + case 0x1022: /* TM4C1230C3PM */ + t->driver = lmi_driver_str; + target_add_ram(t, 0x20000000, 0x6000); + lmi_add_flash(t, 0x10000); + t->target_options |= CORTEXM_TOPT_INHIBIT_SRST; + return true; } return false; } diff --git a/src/target/lpc11xx.c b/src/target/lpc11xx.c index e929d6ac..248e7ee7 100644 --- a/src/target/lpc11xx.c +++ b/src/target/lpc11xx.c @@ -89,6 +89,13 @@ lpc11xx_probe(target *t) target_add_ram(t, 0x10000000, 0x2000); lpc11xx_add_flash(t, 0x00000000, 0x20000, 0x1000); return true; + + case 0x0A24902B: + case 0x1A24902B: + t->driver = "LPC1112"; + target_add_ram(t, 0x10000000, 0x1000); + lpc11xx_add_flash(t, 0x00000000, 0x10000, 0x1000); + return true; } idcode = target_mem_read32(t, LPC8XX_DEVICE_ID); diff --git a/src/target/nrf51.c b/src/target/nrf51.c index 2e361c62..91f1d43f 100644 --- a/src/target/nrf51.c +++ b/src/target/nrf51.c @@ -112,6 +112,7 @@ bool nrf51_probe(target *t) case 0x0020: /* nRF51822 (rev 1) CEAA BA */ case 0x0024: /* nRF51422 (rev 1) QFAA C0 */ case 0x002A: /* nRF51822 (rev 2) QFAA FA0 */ + case 0x004A: /* nRF51822 (rev 3) QFAA G1 */ case 0x002D: /* nRF51422 (rev 2) QFAA DAA */ case 0x002E: /* nRF51422 (rev 2) QFAA E0 */ case 0x002F: /* nRF51822 (rev 1) CEAA B0 */ @@ -128,6 +129,7 @@ bool nrf51_probe(target *t) case 0x0079: /* nRF51822 (rev 3) CEAA E0 */ case 0x007A: /* nRF51422 (rev 3) CEAA C0 */ case 0x008F: /* nRF51822 (rev 3) QFAA H1 See https://devzone.nordicsemi.com/question/97769/can-someone-conform-the-config-id-code-for-the-nrf51822qfaah1/ */ + case 0x00D1: /* nRF51822 (rev 3) QFAA H2 */ t->driver = "Nordic nRF51"; target_add_ram(t, 0x20000000, 0x4000); nrf51_add_flash(t, 0x00000000, 0x40000, NRF51_PAGE_SIZE); @@ -162,13 +164,20 @@ bool nrf51_probe(target *t) target_add_commands(t, nrf51_cmd_list, "nRF51"); return true; case 0x00AC: /* nRF52832 Preview QFAA BA0 */ - case 0x00C7: /* nRF52832 Revision 1 QFAA B00 */ + case 0x00C7: /* nRF52832 Revision 1 QFAA B00 */ t->driver = "Nordic nRF52"; target_add_ram(t, 0x20000000, 64*1024); nrf51_add_flash(t, 0x00000000, 512*1024, NRF52_PAGE_SIZE); nrf51_add_flash(t, NRF51_UICR, 0x100, 0x100); target_add_commands(t, nrf51_cmd_list, "nRF52"); return true; + case 0x00EB: /* nRF52840 Preview QIAA AA0 */ + t->driver = "Nordic nRF52"; + target_add_ram(t, 0x20000000, 256*1024); + nrf51_add_flash(t, 0x00000000, 1024*1024, NRF52_PAGE_SIZE); + nrf51_add_flash(t, NRF51_UICR, 0x100, 0x100); + target_add_commands(t, nrf51_cmd_list, "nRF52"); + return true; } return false; diff --git a/src/target/stm32f1.c b/src/target/stm32f1.c index 3c723845..c9823db3 100644 --- a/src/target/stm32f1.c +++ b/src/target/stm32f1.c @@ -25,6 +25,11 @@ * ST doc - RM0008 * Reference manual - STM32F101xx, STM32F102xx, STM32F103xx, STM32F105xx * and STM32F107xx advanced ARM-based 32-bit MCUs + * ST doc - RM0091 + * Reference manual - STM32F0x1/STM32F0x2/STM32F0x8 + * advanced ARMĀ®-based 32-bit MCUs + * ST doc - RM0360 + * Reference manual - STM32F030x4/x6/x8/xC and STM32F070x6/xB * ST doc - PM0075 * Programming manual - STM32F10xxx Flash memory microcontrollers */ @@ -145,21 +150,21 @@ bool stm32f1_probe(target *t) t->idcode = target_mem_read32(t, DBGMCU_IDCODE_F0) & 0xfff; switch(t->idcode) { - case 0x444: /* STM32F03 RM0091 Rev.7 */ + case 0x444: /* STM32F03 RM0091 Rev.7, STM32F030x[4|6] RM0360 Rev. 4*/ t->driver = "STM32F03"; break; - case 0x445: /* STM32F04 RM0091 Rev.7 */ - t->driver = "STM32F04"; + case 0x445: /* STM32F04 RM0091 Rev.7, STM32F070x6 RM0360 Rev. 4*/ + t->driver = "STM32F04/F070x6"; break; - case 0x440: /* STM32F05 RM0091 Rev.7 */ - t->driver = "STM32F05"; + case 0x440: /* STM32F05 RM0091 Rev.7, STM32F030x8 RM0360 Rev. 4*/ + t->driver = "STM32F05/F030x8"; break; - case 0x448: /* STM32F07 RM0091 Rev.7 */ + case 0x448: /* STM32F07 RM0091 Rev.7, STM32F070xB RM0360 Rev. 4*/ t->driver = "STM32F07"; block_size = 0x800; break; - case 0x442: /* STM32F09 RM0091 Rev.7 */ - t->driver = "STM32F09"; + case 0x442: /* STM32F09 RM0091 Rev.7, STM32F030xC RM0360 Rev. 4*/ + t->driver = "STM32F09/F030xC"; block_size = 0x800; break; default: /* NONE */ diff --git a/src/target/stm32f4.c b/src/target/stm32f4.c index eaf6d272..477584b5 100644 --- a/src/target/stm32f4.c +++ b/src/target/stm32f4.c @@ -37,10 +37,12 @@ static bool stm32f4_cmd_erase_mass(target *t); static bool stm32f4_cmd_option(target *t, int argc, char *argv[]); +static bool stm32f4_cmd_psize(target *t, int argc, char *argv[]); const struct command_s stm32f4_cmd_list[] = { {"erase_mass", (cmd_handler)stm32f4_cmd_erase_mass, "Erase entire flash memory"}, {"option", (cmd_handler)stm32f4_cmd_option, "Manipulate option bytes"}, + {"psize", (cmd_handler)stm32f4_cmd_psize, "Configure flash write parallelism: (x8|x32)"}, {NULL, NULL, NULL} }; @@ -122,6 +124,7 @@ static const uint16_t stm32f4_flash_write_x8_stub[] = { struct stm32f4_flash { struct target_flash f; uint8_t base_sector; + uint8_t psize; }; enum ID_STM32F47 { @@ -155,6 +158,7 @@ static void stm32f4_add_flash(target *t, f->align = 4; f->erased = 0xff; sf->base_sector = base_sector; + sf->psize = 32; target_add_flash(t, f); } @@ -180,6 +184,7 @@ bool stm32f4_probe(target *t) switch(idcode) { case ID_STM32F42X: /* 427/437 */ + case ID_STM32F46X: /* 469/479 */ /* Second bank for 2M parts. */ stm32f4_add_flash(t, 0x8100000, 0x10000, 0x4000, 12); stm32f4_add_flash(t, 0x8110000, 0x10000, 0x10000, 16); @@ -223,7 +228,7 @@ bool stm32f4_probe(target *t) stm32f4_add_flash(t, 0x0200000, 0x20000, 0x8000, 0); stm32f4_add_flash(t, 0x0220000, 0x20000, 0x20000, 4); stm32f4_add_flash(t, 0x0240000, 0xC0000, 0x40000, 5); - target_add_commands(t, stm32f4_cmd_list, "STM32F4x"); + target_add_commands(t, stm32f4_cmd_list, "STM32F74x"); break; case ID_STM32F76X: /* F76x F77x RM0410 */ t->driver = stm32f7_driver_str; @@ -246,7 +251,7 @@ bool stm32f4_probe(target *t) stm32f4_add_flash(t, 0x8000000, 0x010000, 0x4000, 0); stm32f4_add_flash(t, 0x8010000, 0x010000, 0x10000, 4); stm32f4_add_flash(t, 0x8020000, 0x060000, 0x20000, 3); - target_add_commands(t, stm32f4_cmd_list, "STM32F76x"); + target_add_commands(t, stm32f4_cmd_list, "STM32F72x"); break; default: return false; @@ -308,8 +313,12 @@ static int stm32f4_flash_write(struct target_flash *f, } /* Write buffer to target ram call stub */ - target_mem_write(f->t, SRAM_BASE, stm32f4_flash_write_x8_stub, - sizeof(stm32f4_flash_write_x8_stub)); + if (((struct stm32f4_flash *)f)->psize == 32) + target_mem_write(f->t, SRAM_BASE, stm32f4_flash_write_x32_stub, + sizeof(stm32f4_flash_write_x32_stub)); + else + target_mem_write(f->t, SRAM_BASE, stm32f4_flash_write_x8_stub, + sizeof(stm32f4_flash_write_x8_stub)); target_mem_write(f->t, STUB_BUFFER_BASE, src, len); return cortexm_run_stub(f->t, SRAM_BASE, dest, STUB_BUFFER_BASE, len, 0); @@ -540,3 +549,33 @@ static bool stm32f4_cmd_option(target *t, int argc, char *argv[]) tc_printf(t, "\n"); return true; } + +static bool stm32f4_cmd_psize(target *t, int argc, char *argv[]) +{ + if (argc == 1) { + uint8_t psize = 8; + for (struct target_flash *f = t->flash; f; f = f->next) { + if (f->write == stm32f4_flash_write) { + psize = ((struct stm32f4_flash *)f)->psize; + } + } + tc_printf(t, "Flash write parallelism: %s\n", + psize == 32 ? "x32" : "x8"); + } else { + uint8_t psize; + if (!strcmp(argv[1], "x8")) { + psize = 8; + } else if (!strcmp(argv[1], "x32")) { + psize = 32; + } else { + tc_printf(t, "usage: monitor psize (x8|x32)\n"); + return false; + } + for (struct target_flash *f = t->flash; f; f = f->next) { + if (f->write == stm32f4_flash_write) { + ((struct stm32f4_flash *)f)->psize = psize; + } + } + } + return true; +}