int main(int argc, char** argv) { if(argc != 3) { fprintf(stderr, "Usage: %s <port> /dev/sgX\n", argv[0]); return 1; } struct stlink *sl = stlink_quirk_open(argv[2], 0); if (sl == NULL) return 1; if(stlink_current_mode(sl) != STLINK_DEV_DEBUG_MODE) stlink_enter_swd_mode(sl); 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 & 0xFFF)) { 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: 0x%x bytes, Flash: up to 0x%x bytes in pages of 0x%x bytes\n", params->sram_size, params->max_flash_size, params->flash_pagesize); FLASH_PAGE = params->flash_pagesize; uint32_t flash_size; stlink_read_mem32(sl, 0x1FFFF7E0, 4); flash_size = sl->q_buf[0] | (sl->q_buf[1] << 8); printf("Flash size is %d KiB.\n", flash_size); // memory map is in 1k blocks. current_memory_map = make_memory_map(params, flash_size * 0x400); int port = atoi(argv[1]); while(serve(sl, port) == 0); stlink_close(sl); return 0; }
int main(int argc, char** argv) { stlink_t *sl = NULL; st_state_t state; memset(&state, 0, sizeof(state)); // set defaults... state.stlink_version = 2; state.logging_level = DEFAULT_LOGGING_LEVEL; state.listen_port = DEFAULT_GDB_LISTEN_PORT; parse_options(argc, argv, &state); switch (state.stlink_version) { case 2: sl = stlink_open_usb(state.logging_level); if(sl == NULL) return 1; break; case 1: sl = stlink_v1_open(state.logging_level); if(sl == NULL) return 1; break; } printf("Chip ID is %08x, Core ID is %08x.\n", sl->chip_id, sl->core_id); sl->verbose=0; current_memory_map = make_memory_map(sl); #ifdef __MINGW32__ WSADATA wsadata; if (WSAStartup(MAKEWORD(2,2),&wsadata) !=0 ) { goto winsock_error; } #endif while(serve(sl, state.listen_port, state.elf_filename) == 0); #ifdef __MINGW32__ winsock_error: WSACleanup(); #endif /* Switch back to mass storage mode before closing. */ stlink_run(sl); stlink_exit_debug_mode(sl); stlink_close(sl); return 0; }
int main(int argc, char** argv) { sl = NULL; st_state_t state; memset(&state, 0, sizeof(state)); // set defaults... state.stlink_version = 2; state.logging_level = DEFAULT_LOGGING_LEVEL; state.listen_port = DEFAULT_GDB_LISTEN_PORT; parse_options(argc, argv, &state); switch (state.stlink_version) { case 2: sl = stlink_open_usb(state.logging_level); if(sl == NULL) return 1; break; case 1: sl = stlink_v1_open(state.logging_level); if(sl == NULL) return 1; break; } signal(SIGINT, catcher); printf("Chip ID is %08x, Core ID is %08x.\n", sl->chip_id, sl->core_id); sl->verbose=0; current_memory_map = make_memory_map(sl); while(serve(sl, state.listen_port) == state.perist_mode); /* Switch back to mass storage mode before closing. */ stlink_reset(sl); stlink_run(sl); stlink_exit_debug_mode(sl); stlink_close(sl); return 0; }
int main(int argc, char** argv) { int32_t voltage; stlink_t *sl = NULL; st_state_t state; memset(&state, 0, sizeof(state)); // set defaults... state.stlink_version = 2; state.logging_level = DEFAULT_LOGGING_LEVEL; state.listen_port = DEFAULT_GDB_LISTEN_PORT; state.reset = 1; /* By default, reset board */ parse_options(argc, argv, &state); switch (state.stlink_version) { case 2: sl = stlink_open_usb(state.logging_level, 0); if(sl == NULL) return 1; break; case 1: sl = stlink_v1_open(state.logging_level, 0); if(sl == NULL) return 1; break; } connected_stlink = sl; signal(SIGINT, &cleanup); signal(SIGTERM, &cleanup); if (state.reset) { stlink_reset(sl); } ILOG("Chip ID is %08x, Core ID is %08x.\n", sl->chip_id, sl->core_id); voltage = stlink_target_voltage(sl); if (voltage != -1) { ILOG("Target voltage is %d mV.\n", voltage); } sl->verbose=0; current_memory_map = make_memory_map(sl); #ifdef __MINGW32__ WSADATA wsadata; if (WSAStartup(MAKEWORD(2,2),&wsadata) !=0 ) { goto winsock_error; } #endif do { serve(sl, &state); /* Continue */ stlink_run(sl); } while (state.persistent); #ifdef __MINGW32__ winsock_error: WSACleanup(); #endif /* Switch back to mass storage mode before closing. */ stlink_exit_debug_mode(sl); stlink_close(sl); return 0; }
int main(int argc, char** argv) { stlink_t *sl = NULL; st_state_t state; memset(&state, 0, sizeof(state)); // set defaults... state.stlink_version = 2; state.logging_level = DEFAULT_LOGGING_LEVEL; state.listen_port = DEFAULT_GDB_LISTEN_PORT; parse_options(argc, argv, &state); switch (state.stlink_version) { case 2: sl = stlink_open_usb(state.logging_level); if(sl == NULL) return 1; break; case 1: sl = stlink_v1_open(state.logging_level); if(sl == NULL) return 1; break; } if (stlink_current_mode(sl) != STLINK_DEV_DEBUG_MODE) { if (stlink_current_mode(sl) == STLINK_DEV_DFU_MODE) { stlink_exit_dfu_mode(sl); } stlink_enter_swd_mode(sl); } uint32_t chip_id = stlink_chip_id(sl); uint32_t core_id = stlink_core_id(sl); /* Fix chip_id for F4 */ if (((chip_id & 0xFFF) == 0x411) && (core_id == CORE_M4_R0)) { printf("Fixing wrong chip_id for STM32F4 Rev A errata\n"); chip_id = 0x413; } printf("Chip ID is %08x, Core ID is %08x.\n", chip_id, core_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 & 0xFFF)) { 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: 0x%x bytes, Flash: up to 0x%x bytes in pages of 0x%x bytes\n", params->sram_size, params->max_flash_size, params->flash_pagesize); FLASH_PAGE = params->flash_pagesize; uint32_t flash_size; stlink_read_mem32(sl, params->flash_size_reg, 4); flash_size = sl->q_buf[0] | (sl->q_buf[1] << 8); printf("Flash size is %d KiB.\n", flash_size); // memory map is in 1k blocks. current_memory_map = make_memory_map(params, flash_size * 0x400); while(serve(sl, state.listen_port) == 0); /* Switch back to mass storage mode before closing. */ stlink_run(sl); stlink_exit_debug_mode(sl); stlink_close(sl); return 0; }