kopia lustrzana https://github.com/stlink-org/stlink
				
				
				
			Add real core identification. Now stlink may debug devices other than STM32F100RB on Discovery.
							rodzic
							
								
									7c294cf6a1
								
							
						
					
					
						commit
						aaf1a0cd84
					
				
							
								
								
									
										112
									
								
								src/gdb-server.c
								
								
								
								
							
							
						
						
									
										112
									
								
								src/gdb-server.c
								
								
								
								
							|  | @ -19,22 +19,44 @@ | |||
| 
 | ||||
| static const char hex[] = "0123456789abcdef"; | ||||
| 
 | ||||
| // configured for STM32F100RB
 | ||||
| static const char* const c_memory_map = | ||||
|   "<?xml version=\"1.0\"?>" | ||||
|   "<!DOCTYPE memory-map PUBLIC \"+//IDN gnu.org//DTD GDB Memory Map V1.0//EN\"" | ||||
|   "     \"http://sourceware.org/gdb/gdb-memory-map.dtd\">" | ||||
|   "<memory-map>" | ||||
|   "  <memory type=\"rom\" start=\"0x00000000\" length=\"0x20000\"/>"    // code = sram or flash
 | ||||
|   "  <memory type=\"ram\" start=\"0x20000000\" length=\"0x2000\"/>"     // sram 8k
 | ||||
|   "  <memory type=\"flash\" start=\"0x08000000\" length=\"0x20000\">"   // flash 128k
 | ||||
|   "    <property name=\"blocksize\">0x400</property>"                   // 1k pages
 | ||||
|   "  </memory>" | ||||
|   "  <memory type=\"ram\" start=\"0x40000000\" length=\"0x1fffffff\"/>" // peripheral regs
 | ||||
|   "  <memory type=\"ram\" start=\"0xe0000000\" length=\"0x1fffffff\"/>" // cortex regs
 | ||||
|   "</memory-map>"; | ||||
| static const char* current_memory_map = NULL; | ||||
| 
 | ||||
| struct chip_params { | ||||
| 	uint32_t chip_id; | ||||
| 	char* description; | ||||
| 	uint32_t flash_base, flash_size, flash_pagesize; | ||||
| 	uint32_t bootrom_base, bootrom_size; | ||||
| 	uint32_t sram_base, sram_size; | ||||
| } const devices[] = { | ||||
| 	{ 0x10016420, "STM32F100 on Discovery", | ||||
| 	  0x08000000, 128  * 1024, 1024, | ||||
| 	  0x1ffff000, 2    * 1024, | ||||
| 	  0x20000000, 8    * 1024}, | ||||
| 	{ 0x10016412, "Low-density device", | ||||
| 	  0x08000000, 32   * 1024, 1024, | ||||
| 	  0x1ffff000, 2    * 1024, | ||||
| 	  0x20000000, 4    * 1024}, | ||||
| 	{ 0x10016410, "Medium-density device", | ||||
| 	  0x08000000, 128  * 1024, 1024, | ||||
| 	  0x1ffff000, 2    * 1024, | ||||
| 	  0x20000000, 8    * 1024}, | ||||
| 	{ 0x10016414, "High-density device", | ||||
| 	  0x08000000, 512  * 1024, 1024, | ||||
| 	  0x1ffff000, 2    * 1024, | ||||
| 	  0x20000000, 8    * 1024}, | ||||
| 	{ 0x10016430, "XL-density device", | ||||
| 	  0x08000000, 1024 * 1024, 2048, | ||||
| 	  0x1fffe000, 6    * 1024, | ||||
| 	  0x20000000, 8    * 1024}, | ||||
| 	{ 0x10016418, "Connectivity line device", | ||||
| 	  0x08000000, 256  * 1024, 2048, | ||||
| 	  0x1fffb000, 18   * 1024, | ||||
| 	  0x20000000, 8    * 1024}, | ||||
| 	{ 0, } | ||||
| }; | ||||
| 
 | ||||
| int serve(struct stlink* sl, int port); | ||||
| char* make_memory_map(const struct chip_params *params); | ||||
| 
 | ||||
| int main(int argc, char** argv) { | ||||
| 	if(argc != 3) { | ||||
|  | @ -49,8 +71,35 @@ int main(int argc, char** argv) { | |||
| 	if(stlink_current_mode(sl) != STLINK_DEV_DEBUG_MODE) | ||||
| 		stlink_enter_swd_mode(sl); | ||||
| 
 | ||||
| 	stlink_core_id(sl); | ||||
| 	printf("Debugging ARM core %08x.\n", sl->core_id); | ||||
| 	uint32_t chip_id; | ||||
| 
 | ||||
| 	stlink_read_mem32(sl, 0xE0042000, 4); | ||||
| 	chip_id = sl->q_buf[0] | (sl->q_buf[1] << 8) | (sl->q_buf[2] << 16) | | ||||
| 		(sl->q_buf[3] << 24); | ||||
| 
 | ||||
| 	printf("Chip ID is %08x.\n", chip_id); | ||||
| 
 | ||||
| 	const struct chip_params* params = NULL; | ||||
| 
 | ||||
| 	for(int i = 0; i < sizeof(devices) / sizeof(devices[0]); i++) { | ||||
| 		if(devices[i].chip_id == chip_id) { | ||||
| 			params = &devices[i]; | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if(params == NULL) { | ||||
| 		fprintf(stderr, "Cannot recognize the connected device!\n"); | ||||
| 		return 0; | ||||
| 	} | ||||
| 
 | ||||
| 	printf("Device connected: %s\n", params->description); | ||||
| 	printf("Device parameters: SRAM @%08x: %x, Flash @%08x: %x (pages of %x bytes), Boot ROM: @%08x, %x\n", | ||||
| 		params->sram_base, params->sram_size, | ||||
| 		params->flash_base, params->flash_size, params->flash_pagesize, | ||||
| 		params->bootrom_base, params->bootrom_size); | ||||
| 
 | ||||
| 	current_memory_map = make_memory_map(params); | ||||
| 
 | ||||
| 	int port = atoi(argv[1]); | ||||
| 
 | ||||
|  | @ -61,6 +110,35 @@ int main(int argc, char** argv) { | |||
| 	return 0; | ||||
| } | ||||
| 
 | ||||
| static const char* const memory_map_template = | ||||
|   "<?xml version=\"1.0\"?>" | ||||
|   "<!DOCTYPE memory-map PUBLIC \"+//IDN gnu.org//DTD GDB Memory Map V1.0//EN\"" | ||||
|   "     \"http://sourceware.org/gdb/gdb-memory-map.dtd\">" | ||||
|   "<memory-map>" | ||||
|   "  <memory type=\"rom\" start=\"0x00000000\" length=\"0x%x\"/>" // code = sram, bootrom or flash; flash is bigger
 | ||||
|   "  <memory type=\"ram\" start=\"0x%08x\" length=\"0x%x\"/>"     // sram 8k
 | ||||
|   "  <memory type=\"flash\" start=\"0x%08x\" length=\"0x%x\">" | ||||
|   "    <property name=\"blocksize\">0x%x</property>" | ||||
|   "  </memory>" | ||||
|   "  <memory type=\"ram\" start=\"0x40000000\" length=\"0x1fffffff\"/>" // peripheral regs
 | ||||
|   "  <memory type=\"ram\" start=\"0xe0000000\" length=\"0x1fffffff\"/>" // cortex regs
 | ||||
|   "  <memory type=\"rom\" start=\"0x%08x\" length=\"0x%x\"/>"           // bootrom
 | ||||
|   "</memory-map>"; | ||||
| 
 | ||||
| char* make_memory_map(const struct chip_params *params) { | ||||
| 	/* This will be freed in serve() */ | ||||
| 	char* map = malloc(4096); | ||||
| 	map[0] = '\0'; | ||||
| 
 | ||||
| 	snprintf(map, 4096, memory_map_template, | ||||
| 	                    params->flash_size, | ||||
| 	                    params->sram_base, params->sram_size, | ||||
| 	                    params->flash_base, params->flash_size, params->flash_pagesize, | ||||
| 	                    params->bootrom_base, params->bootrom_size); | ||||
| 
 | ||||
| 	return map; | ||||
| } | ||||
| 
 | ||||
| #define CODE_BREAK_NUM	6 | ||||
| 
 | ||||
| #define CODE_BREAK_LOW	0x01 | ||||
|  | @ -369,7 +447,7 @@ int serve(struct stlink* sl, int port) { | |||
| 				const char* data = NULL; | ||||
| 
 | ||||
| 				if(!strcmp(type, "memory-map") && !strcmp(op, "read")) | ||||
| 					data = c_memory_map; | ||||
| 					data = current_memory_map; | ||||
| 
 | ||||
| 				if(data) { | ||||
| 					unsigned data_length = strlen(data); | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 Peter Zotov
						Peter Zotov