Beispiel #1
0
bool stm32f1_probe(struct target_s *target)
{

	target->idcode = adiv5_ap_mem_read(adiv5_target_ap(target), DBGMCU_IDCODE) & 0xfff;
	switch(target->idcode) {
	case 0x410:  /* Medium density */
	case 0x412:  /* Low denisty */
	case 0x420:  /* Value Line, Low-/Medium density */
		target->driver = stm32f1_driver_str;
		target->xml_mem_map = stm32f1_xml_memory_map;
		target->flash_erase = stm32md_flash_erase;
		target->flash_write = stm32f1_flash_write;
		target_add_commands(target, stm32f1_cmd_list, "STM32 LD/MD");
		return true;
	case 0x414:	 /* High density */
	case 0x418:  /* Connectivity Line */
	case 0x428:	 /* Value Line, High Density */
		target->driver = stm32hd_driver_str;
		target->xml_mem_map = stm32hd_xml_memory_map;
		target->flash_erase = stm32hd_flash_erase;
		target->flash_write = stm32f1_flash_write;
		target_add_commands(target, stm32f1_cmd_list, "STM32 HD/CL");
		return true;
	case 0x422:  /* STM32F30x */
	case 0x432:  /* STM32F37x */
		target->driver = stm32f3_driver_str;
		target->xml_mem_map = stm32hd_xml_memory_map;
		target->flash_erase = stm32hd_flash_erase;
		target->flash_write = stm32f1_flash_write;
		target_add_commands(target, stm32f1_cmd_list, "STM32F3");
		return true;
	}

	target->idcode = adiv5_ap_mem_read(adiv5_target_ap(target), DBGMCU_IDCODE_F0) & 0xfff;
	switch(target->idcode) {
	case 0x444:  /* STM32F03 */
	case 0x440:  /* STM32F05 */
	case 0x448:  /* STM32F07 */
		switch(target->idcode) {
		case 0x444:  /* STM32F03 */
			target->driver = stm32f03_driver_str;
			break;
		case 0x440:  /* STM32F05 */
			target->driver = stm32f05_driver_str;
			break;
		case 0x448:  /* STM32F07 */
			target->driver = stm32f07_driver_str;
			break;
		}
		target->xml_mem_map = stm32f1_xml_memory_map;
		target->flash_erase = stm32md_flash_erase;
		target->flash_write = stm32f1_flash_write;
		target_add_commands(target, stm32f1_cmd_list, "STM32F0");
		return true;
	}

	return false;
}
Beispiel #2
0
bool stm32f4_probe(target *t)
{
	bool f2 = false;
	uint32_t idcode;

	idcode = target_mem_read32(t, DBGMCU_IDCODE);
	idcode &= 0xFFF;

	if (idcode == 0x411)
	{
		/* F405 revision A have a wrong IDCODE, use ARM_CPUID to make the
		 * distinction with F205. Revision is also wrong (0x2000 instead
		 * of 0x1000). See F40x/F41x errata. */
		uint32_t cpuid = target_mem_read32(t, ARM_CPUID);
		if ((cpuid & 0xFFF0) == 0xC240)
			idcode = 0x413;
		else
			f2 = true;
	}

	switch(idcode) {
	case 0x419: /* 427/437 */
		/* Second bank for 2M parts. */
		stm32f4_add_flash(t, 0x8100000, 0x10000, 0x4000, 12);
		stm32f4_add_flash(t, 0x8110000, 0x10000, 0x10000, 16);
		stm32f4_add_flash(t, 0x8120000, 0xE0000, 0x20000, 17);
		/* Fall through for stuff common to F40x/F41x */
	case 0x411: /* F205 */
	case 0x413: /* F405 */
	case 0x421: /* F446 */
	case 0x423: /* F401 B/C RM0368 Rev.3 */
	case 0x431: /* F411     RM0383 Rev.4 */
	case 0x433: /* F401 D/E RM0368 Rev.3 */
		t->driver = f2 ? stm32f2_driver_str : stm32f4_driver_str;
		if (!f2)
			target_add_ram(t, 0x10000000, 0x10000);
		target_add_ram(t, 0x20000000, 0x30000);
		stm32f4_add_flash(t, 0x8000000, 0x10000, 0x4000, 0);
		stm32f4_add_flash(t, 0x8010000, 0x10000, 0x10000, 4);
		stm32f4_add_flash(t, 0x8020000, 0xE0000, 0x20000, 5);
		target_add_commands(t, stm32f4_cmd_list, f2 ? "STM32F2" :
		                    "STM32F4");
		break;
	case 0x449: /* F7x6 RM0385 Rev.2 */
		t->driver = stm32f7_driver_str;
		target_add_ram(t, 0x00000000, 0x4000);
		target_add_ram(t, 0x20000000, 0x50000);
		stm32f4_add_flash(t, 0x8000000, 0x20000, 0x8000, 0);
		stm32f4_add_flash(t, 0x8020000, 0x20000, 0x20000, 4);
		stm32f4_add_flash(t, 0x8040000, 0xC0000, 0x40000, 5);
		target_add_commands(t, stm32f4_cmd_list, "STM32F7");
		break;
	default:
		return false;
	}
	t->idcode = idcode;
	return true;
}
Beispiel #3
0
bool stm32f4_probe(target *t)
{
	uint32_t idcode;

	idcode = target_mem_read32(t, DBGMCU_IDCODE);
	switch(idcode & 0xFFF) {
	case 0x419: /* 427/437 */
		/* Second bank for 2M parts. */
		stm32f4_add_flash(t, 0x8100000, 0x10000, 0x4000, 12);
		stm32f4_add_flash(t, 0x8110000, 0x10000, 0x10000, 16);
		stm32f4_add_flash(t, 0x8120000, 0xE0000, 0x20000, 17);
		/* Fall through for stuff common to F40x/F41x */
	case 0x411: /* Documented to be 0x413! This is what I read... */
	case 0x413: /* F407VGT6 */
	case 0x423: /* F401 B/C RM0368 Rev.3 */
	case 0x431: /* F411     RM0383 Rev.4 */
	case 0x433: /* F401 D/E RM0368 Rev.3 */
		t->driver = stm32f4_driver_str;
		target_add_ram(t, 0x10000000, 0x10000);
		target_add_ram(t, 0x20000000, 0x30000);
		stm32f4_add_flash(t, 0x8000000, 0x10000, 0x4000, 0);
		stm32f4_add_flash(t, 0x8010000, 0x10000, 0x10000, 4);
		stm32f4_add_flash(t, 0x8020000, 0xE0000, 0x20000, 5);
		target_add_commands(t, stm32f4_cmd_list, "STM32F4");
		return true;
	}
	return false;
}
Beispiel #4
0
void kinetis_mdm_probe(ADIv5_AP_t *ap)
{
	switch(ap->idr) {
	case KINETIS_MDM_IDR_KZ03:
	case KINETIS_MDM_IDR_K22F:
		break;
	default:
		return;
	}

	target *t = target_new();
	adiv5_ap_ref(ap);
	t->priv = ap;
	t->priv_free = (void*)adiv5_ap_unref;

	t->driver = "Kinetis Recovery (MDM-AP)";
	t->attach = (void*)nop_function;
	t->detach = (void*)nop_function;
	t->check_error = (void*)nop_function;
	t->mem_read = (void*)nop_function;
	t->mem_write = (void*)nop_function;
	t->regs_size = 4;
	t->regs_read = (void*)nop_function;
	t->regs_write = (void*)nop_function;
	t->reset = (void*)nop_function;
	t->halt_request = (void*)nop_function;
	t->halt_poll = mdm_halt_poll;
	t->halt_resume = (void*)nop_function;

	target_add_commands(t, kinetis_mdm_cmd_list, t->driver);
}
Beispiel #5
0
bool msp432_probe(target *t)
{
	/* Check for the right device info tag in the TLV ROM structure */
	if (target_mem_read32(t, DEVINFO_TAG_ADDR) != DEVINFO_TAG_VALUE)
		return false;

	/* Check for the right device info length tag in the TLV ROM structure */
	if (target_mem_read32(t, DEVINFO_LEN_ADDR) != DEVINFO_LEN_VALUE)
		return false;

	/* Check for the right HW revision: at least C, as no flash support for B */
	if (target_mem_read32(t, HWREV_ADDR) < HWREV_MIN_VALUE)
		return false;

	/* If we got till this point, we are most probably looking at a real TLV  */
	/* Device Information structure. Now check for the correct device         */
	switch (target_mem_read32(t, DEVID_ADDR)) { 
	case DEVID_MSP432P401RIPZ:
	case DEVID_MSP432P401RIZXH:
	case DEVID_MSP432P401RIRGC:
		/* R series: 256kB Flash, 64kB RAM */
		t->driver = "MSP432P401R 256KB Flash 64KB RAM";
		break;

	case DEVID_MSP432P401MIPZ:
	case DEVID_MSP432P401MIZXH:
	case DEVID_MSP432P401MIRGC:
		/* M series: 128kB Flash, 32kB RAM */
		t->driver = "MSP432P401M 128KB Flash 32KB RAM";
		break;

	default:
		/* Unknown device, not an MSP432 or not a real TLV */
		return false;
	}
	/* SRAM region, SRAM zone */
	target_add_ram(t, SRAM_BASE, target_mem_read32(t, SYS_SRAM_SIZE));
	/* Flash bank size */
	uint32_t banksize = target_mem_read32(t, SYS_FLASH_SIZE) / 2;
	/* Main Flash Bank 0 */
	msp432_add_flash(t, MAIN_FLASH_BASE, banksize, MAIN_BANK0_WEPROT);
	/* Main Flash Bank 1 */
	msp432_add_flash(t, MAIN_FLASH_BASE + banksize, banksize, MAIN_BANK1_WEPROT);
	/* Info Flash Bank 0 */
	msp432_add_flash(t, INFO_FLASH_BASE, INFO_BANK_SIZE, INFO_BANK0_WEPROT);
	/* Info Flash Bank 1 */
	msp432_add_flash(t, INFO_FLASH_BASE + INFO_BANK_SIZE, INFO_BANK_SIZE, INFO_BANK1_WEPROT);

	/* Connect the optional commands */
	target_add_commands(t, msp432_cmd_list, "MSP432P401x");

	/* All done */
	return true;
}
Beispiel #6
0
bool stm32f4_probe(struct target_s *target)
{
	uint32_t idcode;

	idcode = adiv5_ap_mem_read(adiv5_target_ap(target), DBGMCU_IDCODE);
	switch(idcode & 0xFFF) {
	case 0x411: /* Documented to be 0x413! This is what I read... */
	case 0x413:
	case 0x423: /* F401 */
	case 0x419: /* 427/437 */
		target->driver = stm32f4_driver_str;
		target->xml_mem_map = stm32f4_xml_memory_map;
		target->flash_erase = stm32f4_flash_erase;
		target->flash_write = stm32f4_flash_write;
		target_add_commands(target, stm32f4_cmd_list, "STM32F4");
		return true;
	}
	return false;
}
Beispiel #7
0
bool stm32l4_probe(target *t)
{
	uint32_t idcode;
	uint32_t size;
	uint32_t options;
	uint32_t bank1_start = 0x08040000;

	idcode = target_mem_read32(t, DBGMCU_IDCODE);
	switch(idcode & 0xFFF) {
	case 0x415: /*  */
		t->driver = stm32l4_driver_str;
		target_add_ram(t, 0x10000000, 1 << 15);
		target_add_ram(t, 0x20000000, 3 << 15);
		size    = (target_mem_read32(t, FLASH_SIZE_REG) & 0xffff);
		options =  target_mem_read32(t, FLASH_OPTR);
		if ((size < 0x400) && (options & OR_DUALBANK))
			bank1_start =  0x08000000 + (size << 9);
		stm32l4_add_flash(t, 0x08000000, size << 10, PAGE_SIZE, bank1_start);
		target_add_commands(t, stm32l4_cmd_list, "STM32L4");
		return true;
	}
	return false;
}
Beispiel #8
0
bool stm32f1_probe(target *t)
{
	size_t flash_size;
	size_t block_size = 0x400;
	t->idcode = target_mem_read32(t, DBGMCU_IDCODE) & 0xfff;
	switch(t->idcode) {
	case 0x410:  /* Medium density */
	case 0x412:  /* Low denisty */
	case 0x420:  /* Value Line, Low-/Medium density */
		t->driver = "STM32F1 medium density";
		target_add_ram(t, 0x20000000, 0x5000);
		stm32f1_add_flash(t, 0x8000000, 0x20000, 0x400);
		target_add_commands(t, stm32f1_cmd_list, "STM32 LD/MD");
		return true;
	case 0x414:	 /* High density */
	case 0x418:  /* Connectivity Line */
	case 0x428:	 /* Value Line, High Density */
		t->driver = "STM32F1 high density";
		target_add_ram(t, 0x20000000, 0x10000);
		stm32f1_add_flash(t, 0x8000000, 0x80000, 0x800);
		target_add_commands(t, stm32f1_cmd_list, "STM32 HD/CL");
		return true;
	case 0x438:  /* STM32F303x6/8 and STM32F328 */
	case 0x422:  /* STM32F30x */
	case 0x446:  /* STM32F303xD/E and STM32F398xE */
		target_add_ram(t, 0x10000000, 0x4000);
		/* fall through */
	case 0x432:  /* STM32F37x */
	case 0x439:  /* STM32F302C8 */
		t->driver = "STM32F3";
		target_add_ram(t, 0x20000000, 0x10000);
		stm32f1_add_flash(t, 0x8000000, 0x80000, 0x800);
		target_add_commands(t, stm32f1_cmd_list, "STM32F3");
		return true;
	}

	t->idcode = target_mem_read32(t, DBGMCU_IDCODE_F0) & 0xfff;
	switch(t->idcode) {
	case 0x444:  /* STM32F03 RM0091 Rev.7, STM32F030x[4|6] RM0360 Rev. 4*/
		t->driver = "STM32F03";
		flash_size = 0x8000;
		break;
	case 0x445:  /* STM32F04 RM0091 Rev.7, STM32F070x6 RM0360 Rev. 4*/
		t->driver = "STM32F04/F070x6";
		flash_size = 0x8000;
		break;
	case 0x440:  /* STM32F05 RM0091 Rev.7, STM32F030x8 RM0360 Rev. 4*/
		t->driver = "STM32F05/F030x8";
		flash_size = 0x10000;
		break;
	case 0x448:  /* STM32F07 RM0091 Rev.7, STM32F070xB RM0360 Rev. 4*/
		t->driver = "STM32F07";
		flash_size = 0x20000;
		block_size = 0x800;
		break;
	case 0x442:  /* STM32F09 RM0091 Rev.7, STM32F030xC RM0360 Rev. 4*/
		t->driver = "STM32F09/F030xC";
		flash_size = 0x40000;
		block_size = 0x800;
		break;
	default:     /* NONE */
		return false;
	}

	target_add_ram(t, 0x20000000, 0x5000);
	stm32f1_add_flash(t, 0x8000000, flash_size, block_size);
	target_add_commands(t, stm32f1_cmd_list, "STM32F0");
	return true;
}
Beispiel #9
0
bool nrf51_probe(target *t)
{
	t->idcode = target_mem_read32(t, NRF51_FICR_CONFIGID) & 0xFFFF;

	switch (t->idcode) {
	case 0x001D: /* nRF51822 (rev 1) QFAA CA/C0 */
	case 0x001E: /* nRF51422 (rev 1) QFAA CA */
	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 */
	case 0x0031: /* nRF51422 (rev 1) CEAA A0A */
	case 0x003C: /* nRF51822 (rev 2) QFAA G0 */
	case 0x0057: /* nRF51422 (rev 2) QFAA G2 */
	case 0x0040: /* nRF51822 (rev 2) CEAA CA0 */
	case 0x0044: /* nRF51822 (rev 2) QFAA GC0 */
	case 0x0047: /* nRF51822 (rev 2) CEAA DA0 */
	case 0x004D: /* nRF51822 (rev 2) CEAA D00 */
	case 0x0050: /* nRF51422 (rev 2) CEAA B0 */
	case 0x0072: /* nRF51822 (rev 3) QFAA H0 */
	case 0x0073: /* nRF51422 (rev 3) QFAA F0 */
	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 */
	case 0x0114: /* nRF51802 (rev ?) QFAA A1 */
		t->driver = "Nordic nRF51";
		target_add_ram(t, 0x20000000, 0x4000);
		nrf51_add_flash(t, 0x00000000, 0x40000, NRF51_PAGE_SIZE);
		nrf51_add_flash(t, NRF51_UICR, 0x100, 0x100);
		target_add_commands(t, nrf51_cmd_list, "nRF51");
		return true;
	case 0x0026: /* nRF51822 (rev 1) QFAB AA */
	case 0x0027: /* nRF51822 (rev 1) QFAB A0 */
	case 0x004C: /* nRF51822 (rev 2) QFAB B0 */
	case 0x0061: /* nRF51422 (rev 2) QFAB A00 */
	case 0x007B: /* nRF51822 (rev 3) QFAB C0 */
	case 0x007C: /* nRF51422 (rev 3) QFAB B0 */
	case 0x007D: /* nRF51822 (rev 3) CDAB A0 */
	case 0x007E: /* nRF51422 (rev 3) CDAB A0 */
		t->driver = "Nordic nRF51";
		target_add_ram(t, 0x20000000, 0x4000);
		nrf51_add_flash(t, 0x00000000, 0x20000, NRF51_PAGE_SIZE);
		nrf51_add_flash(t, NRF51_UICR, 0x100, 0x100);
		target_add_commands(t, nrf51_cmd_list, "nRF51");
		return true;
	case 0x0071: /* nRF51422 (rev 3) QFAC AB */
	case 0x0083: /* nRF51822 (rev 3) QFAC A0 */
	case 0x0084: /* nRF51422 (rev 3) QFAC A1 */
	case 0x0085: /* nRF51422 (rev 3) QFAC A0 */
	case 0x0086: /* nRF51422 (rev 3) QFAC A1 */
	case 0x0087: /* nRF51822 (rev 3) CFAC A0 */
	case 0x0088: /* nRF51422 (rev 3) CFAC A0 */
		t->driver = "Nordic nRF51";
		target_add_ram(t, 0x20000000, 0x8000);
		nrf51_add_flash(t, 0x00000000, 0x40000, NRF51_PAGE_SIZE);
		nrf51_add_flash(t, NRF51_UICR, 0x100, 0x100);
		target_add_commands(t, nrf51_cmd_list, "nRF51");
		return true;
	case 0x00AC: /* nRF52832 Preview QFAA BA0 */
	case 0x00C7: /* nRF52832 Revision 1 QFAA B00 */
	case 0x00E3: /* nRF52832-CIAA CSP */
		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;
}
Beispiel #10
0
bool sam3x_probe(target *t)
{
	t->idcode = target_mem_read32(t, SAM3X_CHIPID_CIDR);
	size_t size = sam_flash_size(t->idcode);
	switch (t->idcode & (CHIPID_CIDR_ARCH_MASK | CHIPID_CIDR_EPROC_MASK)) {
	case CHIPID_CIDR_ARCH_SAM3XxC | CHIPID_CIDR_EPROC_CM3:
	case CHIPID_CIDR_ARCH_SAM3XxE | CHIPID_CIDR_EPROC_CM3:
	case CHIPID_CIDR_ARCH_SAM3XxG | CHIPID_CIDR_EPROC_CM3:
		t->driver = "Atmel SAM3X";
		target_add_ram(t, 0x20000000, 0x200000);
		/* 2 Flash memories back-to-back starting at 0x80000 */
		sam3_add_flash(t, SAM3X_EEFC_BASE(0), 0x80000, size/2);
		sam3_add_flash(t, SAM3X_EEFC_BASE(1), 0x80000 + size/2, size/2);
		target_add_commands(t, sam3x_cmd_list, "SAM3X");
		return true;
	}

	t->idcode = target_mem_read32(t, SAM34NSU_CHIPID_CIDR);
	size = sam_flash_size(t->idcode);
	switch (t->idcode & (CHIPID_CIDR_ARCH_MASK | CHIPID_CIDR_EPROC_MASK)) {
	case CHIPID_CIDR_ARCH_SAM3NxA | CHIPID_CIDR_EPROC_CM3:
	case CHIPID_CIDR_ARCH_SAM3NxB | CHIPID_CIDR_EPROC_CM3:
	case CHIPID_CIDR_ARCH_SAM3NxC | CHIPID_CIDR_EPROC_CM3:
	case CHIPID_CIDR_ARCH_SAM3SxA | CHIPID_CIDR_EPROC_CM3:
	case CHIPID_CIDR_ARCH_SAM3SxB | CHIPID_CIDR_EPROC_CM3:
	case CHIPID_CIDR_ARCH_SAM3SxC | CHIPID_CIDR_EPROC_CM3:
		t->driver = "Atmel SAM3N/S";
		target_add_ram(t, 0x20000000, 0x200000);
		/* These devices only have a single bank */
		size = sam_flash_size(t->idcode);
		sam3_add_flash(t, SAM3N_EEFC_BASE, 0x400000, size);
		target_add_commands(t, sam3x_cmd_list, "SAM3N/S");
		return true;
	case CHIPID_CIDR_ARCH_SAM3UxC | CHIPID_CIDR_EPROC_CM3:
	case CHIPID_CIDR_ARCH_SAM3UxE | CHIPID_CIDR_EPROC_CM3:
		t->driver = "Atmel SAM3U";
		target_add_ram(t, 0x20000000, 0x200000);
		/* One flash up to 512K at 0x80000 */
		sam3_add_flash(t, SAM3U_EEFC_BASE(0), 0x80000, MIN(size, 0x80000));
		if (size >= 0x80000) {
			/* Larger devices have a second bank at 0x100000 */
			sam3_add_flash(t, SAM3U_EEFC_BASE(1),
			               0x100000, 0x80000);
		}
		target_add_commands(t, sam3x_cmd_list, "SAM3U");
		return true;
	case CHIPID_CIDR_ARCH_SAM4SxA | CHIPID_CIDR_EPROC_CM4:
	case CHIPID_CIDR_ARCH_SAM4SxB | CHIPID_CIDR_EPROC_CM4:
	case CHIPID_CIDR_ARCH_SAM4SxC | CHIPID_CIDR_EPROC_CM4:
		t->driver = "Atmel SAM4S";
		target_add_ram(t, 0x20000000, 0x400000);
		size_t size = sam_flash_size(t->idcode);
		if (size <= 0x80000) {
			/* Smaller devices have a single bank */
			sam4_add_flash(t, SAM4S_EEFC_BASE(0), 0x400000, size);
		} else {
			/* Larger devices are split evenly between 2 */
			sam4_add_flash(t, SAM4S_EEFC_BASE(0), 0x400000, size/2);
			sam4_add_flash(t, SAM4S_EEFC_BASE(1),
			               0x400000 + size/2, size/2);
		}
		target_add_commands(t, sam3x_cmd_list, "SAM4S");
		return true;
	}

	return false;
}
Beispiel #11
0
bool efm32_probe(target *t)
{
	/* Read the IDCODE register from the SW-DP */
	ADIv5_AP_t *ap = cortexm_ap(t);
	uint32_t ap_idcode = ap->dp->idcode;

	/* Check the idcode is silabs. See AN0062 Section 2.2 */
	if (ap_idcode == 0x2BA01477) {
		/* Cortex M3, Cortex M4 */
	} else if (ap_idcode == 0x0BC11477) {
		/* Cortex M0+ */
	} else {
		return false;
	}

	/* Read the part number and family */
	uint16_t part_number = efm32_read_part_number(t);
	uint8_t part_family = efm32_read_part_family(t);
	uint16_t radio_number, radio_number_short;  /* optional, for ezr parts */
	uint32_t flash_page_size; uint16_t flash_kb;

	switch(part_family) {
		case EFM32_DI_PART_FAMILY_GECKO:
			sprintf(variant_string,
				"EFM32 Gecko");
			flash_page_size = 512;
			break;
		case EFM32_DI_PART_FAMILY_GIANT_GECKO:
			sprintf(variant_string,
				"EFM32 Giant Gecko");
			flash_page_size = 2048; /* Could be 2048 or 4096, assume 2048 */
			break;
		case EFM32_DI_PART_FAMILY_TINY_GECKO:
			sprintf(variant_string,
				"EFM32 Tiny Gecko");
			flash_page_size = 512;
			break;
		case EFM32_DI_PART_FAMILY_LEOPARD_GECKO:
			sprintf(variant_string,
				"EFM32 Leopard Gecko");
			flash_page_size = 2048; /* Could be 2048 or 4096, assume 2048 */
			break;
		case EFM32_DI_PART_FAMILY_WONDER_GECKO:
			sprintf(variant_string,
				"EFM32 Wonder Gecko");
			flash_page_size = 2048;
			break;
		case EFM32_DI_PART_FAMILY_ZERO_GECKO:
			sprintf(variant_string,
				"EFM32 Zero Gecko");
			flash_page_size = 1024;
			break;
		case EFM32_DI_PART_FAMILY_HAPPY_GECKO:
			sprintf(variant_string,
				"EFM32 Happy Gecko");
			flash_page_size = 1024;
			break;
		case EFM32_DI_PART_FAMILY_EZR_WONDER_GECKO:
			radio_number = efm32_read_radio_part_number(t); /* on-chip radio */
			radio_number_short = radio_number % 100;
			flash_kb = efm32_read_flash_size(t);

			sprintf(variant_string,
				"EZR32WG%dF%dR%d (radio si%d)",
				part_number, flash_kb,
				radio_number_short, radio_number);

			flash_page_size = 2048;
			break;
		case EFM32_DI_PART_FAMILY_EZR_LEOPARD_GECKO:
			radio_number = efm32_read_radio_part_number(t); /* on-chip radio */
			radio_number_short = radio_number % 100;
			flash_kb = efm32_read_flash_size(t);

			sprintf(variant_string,
				"EZR32LG%dF%dR%d (radio si%d)",
				part_number, flash_kb,
				radio_number_short, radio_number);

			flash_page_size = 2048;
			break;
		default:	/* Unknown family */
			return false;
	}

	/* Read memory sizes, convert to bytes */
	uint32_t flash_size = efm32_read_flash_size(t) * 0x400;
	uint32_t ram_size   = efm32_read_ram_size(t)   * 0x400;

	/* Setup Target */
	t->target_options |= CORTEXM_TOPT_INHIBIT_SRST;
	t->driver = variant_string;
	tc_printf(t, "flash size %d page size %d\n", flash_size, flash_page_size);
	target_add_ram (t, SRAM_BASE, ram_size);
	efm32_add_flash(t, 0x00000000, flash_size, flash_page_size);
	target_add_commands(t, efm32_cmd_list, "EFM32");

	return true;
}
Beispiel #12
0
bool kinetis_probe(target *t)
{
	uint32_t sdid = target_mem_read32(t, SIM_SDID);
	switch (sdid >> 20) {
	case 0x251:
		t->driver = "KL25";
		target_add_ram(t, 0x1ffff000, 0x1000);
		target_add_ram(t, 0x20000000, 0x3000);
		kl_gen_add_flash(t, 0x00000000, 0x20000, 0x400, KL_WRITE_LEN);
		break;
	case 0x231:
		t->driver = "KL27x128"; // MKL27 >=128kb
		target_add_ram(t, 0x1fffe000, 0x2000);
		target_add_ram(t, 0x20000000, 0x6000);
		kl_gen_add_flash(t, 0x00000000, 0x40000, 0x400, KL_WRITE_LEN);
		break;
	case 0x271:
		switch((sdid>>16)&0x0f){
			case 4:
				t->driver = "KL27x32";
				target_add_ram(t, 0x1ffff800, 0x0800);
				target_add_ram(t, 0x20000000, 0x1800);
				kl_gen_add_flash(t, 0x00000000, 0x8000, 0x400, KL_WRITE_LEN);
				break;
			case 5:
				t->driver = "KL27x64";
				target_add_ram(t, 0x1ffff000, 0x1000);
				target_add_ram(t, 0x20000000, 0x3000);
				kl_gen_add_flash(t, 0x00000000, 0x10000, 0x400, KL_WRITE_LEN);
				break;
			default:
				return false;
		}
		break;
	case 0x021: /* KL02 family */
		switch((sdid>>16) & 0x0f){
			case 3:
				t->driver = "KL02x32";
				target_add_ram(t, 0x1FFFFC00, 0x400);
				target_add_ram(t, 0x20000000, 0xc00);
				kl_gen_add_flash(t, 0x00000000, 0x7FFF, 0x400, KL_WRITE_LEN);
				break;
			case 2:
				t->driver = "KL02x16";
				target_add_ram(t, 0x1FFFFE00, 0x200);
				target_add_ram(t, 0x20000000, 0x600);
				kl_gen_add_flash(t, 0x00000000, 0x3FFF, 0x400, KL_WRITE_LEN);
				break;
			case 1:
				t->driver = "KL02x8";
				target_add_ram(t, 0x1FFFFF00, 0x100);
				target_add_ram(t, 0x20000000, 0x300);
				kl_gen_add_flash(t, 0x00000000, 0x1FFF, 0x400, KL_WRITE_LEN);
				break;
			default:
				return false;
			}
		break;
	case 0x031: /* KL03 family */
		t->driver = "KL03";
		target_add_ram(t, 0x1ffffe00, 0x200);
		target_add_ram(t, 0x20000000, 0x600);
		kl_gen_add_flash(t, 0, 0x8000, 0x400, KL_WRITE_LEN);
		break;
	case 0x220: /* K22F family */
		t->driver = "K22F";
		target_add_ram(t, 0x1c000000, 0x4000000);
		target_add_ram(t, 0x20000000, 0x100000);
		kl_gen_add_flash(t, 0, 0x40000, 0x800, KL_WRITE_LEN);
		kl_gen_add_flash(t, 0x40000, 0x40000, 0x800, KL_WRITE_LEN);
		break;
	case 0x620: /* K64F family. */
		/* This should be 0x640, but according to the  errata sheet
		 * (KINETIS_1N83J) K64 and K24's will show up with the
		 * subfamily nibble as 2
		 */
		t->driver = "K64";
		target_add_ram(t, 0x1FFF0000,  0x10000);
		target_add_ram(t, 0x20000000,  0x30000);
		kl_gen_add_flash(t, 0, 0x80000, 0x1000, K64_WRITE_LEN);
		kl_gen_add_flash(t, 0x80000, 0x80000, 0x1000, K64_WRITE_LEN);
		break;
	default:
		return false;
	}
	unsafe_enabled = false;
	target_add_commands(t, kinetis_cmd_list, t->driver);
	return true;
}
Beispiel #13
0
bool stm32f1_probe(target *t)
{
	size_t flash_size;
	size_t block_size = 0x400;
	t->idcode = target_mem_read32(t, DBGMCU_IDCODE) & 0xfff;
	switch(t->idcode) {
	case 0x410:  /* Medium density */
	case 0x412:  /* Low denisty */
	case 0x420:  /* Value Line, Low-/Medium density */
		t->driver = "STM32F1 medium density";
		target_add_ram(t, 0x20000000, 0x5000);
		stm32f1_add_flash(t, 0x8000000, 0x20000, 0x400);
		target_add_commands(t, stm32f1_cmd_list, "STM32 LD/MD");
		return true;
	case 0x414:	 /* High density */
	case 0x418:  /* Connectivity Line */
	case 0x428:	 /* Value Line, High Density */
		t->driver = "STM32F1 high density";
		target_add_ram(t, 0x20000000, 0x10000);
		stm32f1_add_flash(t, 0x8000000, 0x80000, 0x800);
		target_add_commands(t, stm32f1_cmd_list, "STM32 HD/CL");
		return true;
	case 0x422:  /* STM32F30x */
	case 0x432:  /* STM32F37x */
	case 0x439:  /* STM32F302C8 */
		t->driver = "STM32F3";
		target_add_ram(t, 0x20000000, 0x10000);
		stm32f1_add_flash(t, 0x8000000, 0x80000, 0x800);
		target_add_commands(t, stm32f1_cmd_list, "STM32F3");
		return true;
	}

	t->idcode = target_mem_read32(t, DBGMCU_IDCODE_F0) & 0xfff;
	switch(t->idcode) {
	case 0x444:  /* STM32F03 RM0091 Rev.7 */
		t->driver = "STM32F03";
		break;
	case 0x445:  /* STM32F04 RM0091 Rev.7 */
		t->driver = "STM32F04";
		break;
	case 0x440:  /* STM32F05 RM0091 Rev.7 */
		t->driver = "STM32F05";
		break;
	case 0x448:  /* STM32F07 RM0091 Rev.7 */
		t->driver = "STM32F07";
		block_size = 0x800;
		break;
	case 0x442:  /* STM32F09 RM0091 Rev.7 */
		t->driver = "STM32F09";
		block_size = 0x800;
		break;
	default:     /* NONE */
		return false;
	}

	flash_size = (target_mem_read32(t, FLASHSIZE_F0) & 0xffff) *0x400;
	tc_printf(t, "flash size %d block_size %d\n", flash_size, block_size);
	target_add_ram(t, 0x20000000, 0x5000);
	stm32f1_add_flash(t, 0x8000000, flash_size, block_size);
	target_add_commands(t, stm32f1_cmd_list, "STM32F0");
	return true;
}
Beispiel #14
0
bool nrf51_probe(target *t)
{
	t->idcode = target_mem_read32(t, NRF51_FICR_CONFIGID) & 0xFFFF;

	switch (t->idcode) {
	case 0x001D: /* nRF51822 (rev 1) QFAA CA/C0 */
	case 0x001E: /* nRF51422 (rev 1) QFAA CA */
	case 0x0020: /* nRF51822 (rev 1) CEAA BA */
	case 0x0024: /* nRF51422 (rev 1) QFAA C0 */
	case 0x002A: /* nRF51822 (rev 2) QFAA FA0 */
	case 0x002D: /* nRF51422 (rev 2) QFAA DAA */
	case 0x002E: /* nRF51422 (rev 2) QFAA E0 */
	case 0x002F: /* nRF51822 (rev 1) CEAA B0 */
	case 0x0031: /* nRF51422 (rev 1) CEAA A0A */
	case 0x003C: /* nRF51822 (rev 2) QFAA G0 */
	case 0x0040: /* nRF51822 (rev 2) CEAA CA0 */
	case 0x0044: /* nRF51822 (rev 2) QFAA GC0 */
	case 0x0047: /* nRF51822 (rev 2) CEAA DA0 */
	case 0x004D: /* nRF51822 (rev 2) CEAA D00 */
	case 0x0050: /* nRF51422 (rev 2) CEAA B0 */
	case 0x0072: /* nRF51822 (rev 3) QFAA H0 */
	case 0x0073: /* nRF51422 (rev 3) QFAA F0 */
	case 0x0079: /* nRF51822 (rev 3) CEAA E0 */
	case 0x007A: /* nRF51422 (rev 3) CEAA C0 */
		t->driver = "Nordic nRF51";
		target_add_ram(t, 0x20000000, 0x4000);
		nrf51_add_flash(t, 0x00000000, 0x40000, NRF51_PAGE_SIZE);
		nrf51_add_flash(t, NRF51_UICR, 0x100, 0x100);
		target_add_commands(t, nrf51_cmd_list, "nRF51");
		return true;
	case 0x0026: /* nRF51822 (rev 1) QFAB AA */
	case 0x0027: /* nRF51822 (rev 1) QFAB A0 */
	case 0x004C: /* nRF51822 (rev 2) QFAB B0 */
	case 0x0061: /* nRF51422 (rev 2) QFAB A00 */
	case 0x007B: /* nRF51822 (rev 3) QFAB C0 */
	case 0x007C: /* nRF51422 (rev 3) QFAB B0 */
	case 0x007D: /* nRF51822 (rev 3) CDAB A0 */
	case 0x007E: /* nRF51422 (rev 3) CDAB A0 */
		t->driver = "Nordic nRF51";
		target_add_ram(t, 0x20000000, 0x4000);
		nrf51_add_flash(t, 0x00000000, 0x20000, NRF51_PAGE_SIZE);
		nrf51_add_flash(t, NRF51_UICR, 0x100, 0x100);
		target_add_commands(t, nrf51_cmd_list, "nRF51");
		return true;
	case 0x0071: /* nRF51422 (rev 3) QFAC AB */
	case 0x0083: /* nRF51822 (rev 3) QFAC A0 */
	case 0x0084: /* nRF51422 (rev 3) QFAC A1 */
	case 0x0085: /* nRF51422 (rev 3) QFAC A0 */
	case 0x0086: /* nRF51422 (rev 3) QFAC A1 */
	case 0x0087: /* nRF51822 (rev 3) CFAC A0 */
	case 0x0088: /* nRF51422 (rev 3) CFAC A0 */
		t->driver = "Nordic nRF51";
		target_add_ram(t, 0x20000000, 0x8000);
		nrf51_add_flash(t, 0x00000000, 0x40000, NRF51_PAGE_SIZE);
		nrf51_add_flash(t, NRF51_UICR, 0x100, 0x100);
		target_add_commands(t, nrf51_cmd_list, "nRF51");
		return true;
	}

	return false;
}
Beispiel #15
0
bool stm32f4_probe(target *t)
{
	bool f2 = false;
	uint32_t idcode;

	idcode = target_mem_read32(t, DBGMCU_IDCODE);
	idcode &= 0xFFF;

	if (idcode == ID_STM32F20X)
	{
		/* F405 revision A have a wrong IDCODE, use ARM_CPUID to make the
		 * distinction with F205. Revision is also wrong (0x2000 instead
		 * of 0x1000). See F40x/F41x errata. */
		uint32_t cpuid = target_mem_read32(t, ARM_CPUID);
		if ((cpuid & 0xFFF0) == 0xC240)
			idcode = ID_STM32F40X;
		else
			f2 = true;
	}

	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);
		stm32f4_add_flash(t, 0x8120000, 0xE0000, 0x20000, 17);
		/* Fall through for stuff common to F40x/F41x */
	case ID_STM32F20X: /* F205 */
	case ID_STM32F40X: /* F405 */
		if (!f2)
			target_add_ram(t, 0x10000000, 0x10000);
		/* Fall through for devices w/o CCMRAM */
	case ID_STM32F446: /* F446 */
	case ID_STM32F401C: /* F401 B/C RM0368 Rev.3 */
	case ID_STM32F411: /* F411     RM0383 Rev.4 */
	case ID_STM32F412: /* F412     RM0402 Rev.4, 256 kB Ram */
	case ID_STM32F401E: /* F401 D/E RM0368 Rev.3 */
		t->driver = f2 ? stm32f2_driver_str : stm32f4_driver_str;
		target_add_ram(t, 0x20000000, 0x40000);
		stm32f4_add_flash(t, 0x8000000, 0x10000, 0x4000, 0);
		stm32f4_add_flash(t, 0x8010000, 0x10000, 0x10000, 4);
		stm32f4_add_flash(t, 0x8020000, 0xE0000, 0x20000, 5);
		target_add_commands(t, stm32f4_cmd_list, f2 ? "STM32F2" :
		                    "STM32F4");
		break;
	case ID_STM32F413: /* F413     RM0430 Rev.2, 320 kB Ram, 1.5 MB flash. */
		t->driver = stm32f4_driver_str;
		target_add_ram(t, 0x20000000, 0x50000);
		stm32f4_add_flash(t, 0x8000000, 0x10000, 0x4000, 0);
		stm32f4_add_flash(t, 0x8010000, 0x10000, 0x10000, 4);
		stm32f4_add_flash(t, 0x8020000, 0x160000, 0x20000, 5);
		target_add_commands(t, stm32f4_cmd_list, "STM32F413");
		break;
	case ID_STM32F74X: /* F74x RM0385 Rev.4 */
		t->driver = stm32f7_driver_str;
		target_add_ram(t, 0x00000000, 0x4000);
		target_add_ram(t, 0x20000000, 0x50000);
		/* AXIM Flash access */
		stm32f4_add_flash(t, 0x8000000, 0x20000, 0x8000, 0);
		stm32f4_add_flash(t, 0x8020000, 0x20000, 0x20000, 4);
		stm32f4_add_flash(t, 0x8040000, 0xC0000, 0x40000, 5);
		/* Flash aliased as ITCM */
		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, "STM32F74x");
		break;
	case ID_STM32F76X: /* F76x F77x RM0410 */
		t->driver = stm32f7_driver_str;
		target_add_ram(t, 0x00000000, 0x4000);
		target_add_ram(t, 0x20000000, 0x80000);
		/* AXIM Flash access */
		stm32f4_add_flash(t, 0x8000000, 0x020000, 0x8000, 0);
		stm32f4_add_flash(t, 0x8020000, 0x020000, 0x20000, 4);
		stm32f4_add_flash(t, 0x8040000, 0x1C0000, 0x40000, 5);
		/* Flash aliased as ITCM */
		stm32f4_add_flash(t, 0x200000, 0x020000, 0x8000, 0);
		stm32f4_add_flash(t, 0x220000, 0x020000, 0x20000, 4);
		stm32f4_add_flash(t, 0x240000, 0x1C0000, 0x40000, 5);
		target_add_commands(t, stm32f4_cmd_list, "STM32F76x");
		break;
	case ID_STM32F72X: /* F72x F73x RM0431 */
		t->driver = stm32f7_driver_str;
		target_add_ram(t, 0x00000000, 0x2000);
		target_add_ram(t, 0x20000000, 0x40000);
		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, "STM32F72x");
		break;
	default:
		return false;
	}
	t->idcode = idcode;
	return true;
}