static error_t target_flash_uninit(void) { // Resume the target if configured to do so if (config_get_auto_rst()) { target_set_state(RESET_RUN); } swd_off(); return ERROR_SUCCESS; }
static error_t target_flash_uninit(void) { if (config_get_auto_rst()) { // Resume the target if configured to do so target_set_state(RESET_RUN); } else { // Leave the target halted until a reset occurs target_set_state(RESET_PROGRAM); } swd_off(); return ERROR_SUCCESS; }
// File callback to be used with vfs_add_file to return file contents static uint32_t read_file_details_txt(uint32_t sector_offset, uint8_t* data, uint32_t num_sectors) { uint32_t pos; const char * mode_str; char * buf = (char *)data; if (sector_offset != 0) { return 0; } pos = 0; pos += util_write_string(buf + pos, "# DAPLink Firmware - see https://mbed.com/daplink\r\n"); // Unique ID pos += util_write_string(buf + pos, "Unique ID: "); pos += util_write_string(buf + pos, info_get_unique_id()); pos += util_write_string(buf + pos, "\r\n"); // HDK ID pos += util_write_string(buf + pos, "HDK ID: "); pos += util_write_string(buf + pos, info_get_hdk_id()); pos += util_write_string(buf + pos, "\r\n"); // Settings pos += util_write_string(buf + pos, "Auto Reset: "); pos += util_write_string(buf + pos, config_get_auto_rst() ? "1" : "0"); pos += util_write_string(buf + pos, "\r\n"); // Current mode mode_str = daplink_is_bootloader() ? "Bootloader" : "Interface"; pos += util_write_string(buf + pos, "Daplink Mode: "); pos += util_write_string(buf + pos, mode_str); pos += util_write_string(buf + pos, "\r\n"); // Current build's version pos += util_write_string(buf + pos, mode_str); pos += util_write_string(buf + pos, " Version: "); pos += util_write_string(buf + pos, info_get_version()); pos += util_write_string(buf + pos, "\r\n"); // Other builds version (bl or if) if (!daplink_is_bootloader() && info_get_bootloader_present()) { pos += util_write_string(buf + pos, "Bootloader Version: "); pos += util_write_uint32_zp(buf + pos, info_get_bootloader_version(), 4); pos += util_write_string(buf + pos, "\r\n"); } if (!daplink_is_interface() && info_get_interface_present()) { pos += util_write_string(buf + pos, "Interface Version: "); pos += util_write_uint32_zp(buf + pos, info_get_interface_version(), 4); pos += util_write_string(buf + pos, "\r\n"); } // GIT sha pos += util_write_string(buf + pos, "Git SHA: "); pos += util_write_string(buf + pos, GIT_COMMIT_SHA); pos += util_write_string(buf + pos, "\r\n"); // Local modifications when making the build pos += util_write_string(buf + pos, "Local Mods: "); pos += util_write_uint32(buf + pos, GIT_LOCAL_MODS); pos += util_write_string(buf + pos, "\r\n"); // Supported USB endpoints pos += util_write_string(buf + pos, "USB Interfaces: "); #ifdef MSC_ENDPOINT pos += util_write_string(buf + pos, "MSD"); #endif #ifdef HID_ENDPOINT pos += util_write_string(buf + pos, ", CDC"); #endif #ifdef CDC_ENDPOINT pos += util_write_string(buf + pos, ", CMSIS-DAP"); #endif pos += util_write_string(buf + pos, "\r\n"); // CRC of the bootloader (if there is one) if (info_get_bootloader_present()) { pos += util_write_string(buf + pos, "Bootloader CRC: 0x"); pos += util_write_hex32(buf + pos, info_get_crc_bootloader()); pos += util_write_string(buf + pos, "\r\n"); } // CRC of the interface pos += util_write_string(buf + pos, "Interface CRC: 0x"); pos += util_write_hex32(buf + pos, info_get_crc_interface()); pos += util_write_string(buf + pos, "\r\n"); return pos; }
void vfs_user_periodic(uint32_t elapsed_ms) { vfs_user_state_t vfs_state_local; vfs_user_state_t vfs_state_local_prev; sync_assert_usb_thread(); sync_lock(); // Return immediately if the desired state has been reached if (!changing_state()) { sync_unlock(); return; } // Wait until the required amount of time has passed // before changing state if (vfs_state_remaining_ms > 0) { vfs_state_remaining_ms -= MIN(elapsed_ms, vfs_state_remaining_ms); sync_unlock(); return; } vfs_user_printf("vfs_user_periodic()\r\n"); // Transistion to new state vfs_state_local_prev = vfs_state; vfs_state = vfs_state_next; switch (vfs_state) { case VFS_USER_STATE_RECONNECTING: // Transition back to the connected state vfs_state_next = VFS_USER_STATE_CONNECTED; vfs_state_remaining_ms = reconnect_delay_ms; break; default: // No state change logic required in other states break; } vfs_state_local = vfs_state; sync_unlock(); // Processing when leaving a state vfs_user_printf(" state %i->%i\r\n", vfs_state_local_prev, vfs_state_local); switch (vfs_state_local_prev) { case VFS_USER_STATE_DISCONNECTED: // No action needed break; case VFS_USER_STATE_RECONNECTING: // No action needed break; case VFS_USER_STATE_CONNECTED: if (file_transfer_state.stream_open) { error_t status; file_transfer_state.stream_open = false; status = stream_close(); if (ERROR_SUCCESS == fail_reason) { fail_reason = status; } vfs_user_printf(" stream_close ret %i\r\n", status); } // Reset if programming was successful //TODO - move to flash layer if (daplink_is_bootloader() && (ERROR_SUCCESS == fail_reason)) { NVIC_SystemReset(); } // If hold in bootloader has been set then reset after usb is disconnected if (daplink_is_interface() && config_ram_get_hold_in_bl()) { NVIC_SystemReset(); } // Resume the target if configured to do so //TODO - move to flash layer if (config_get_auto_rst()) { target_set_state(RESET_RUN); } break; } // Processing when entering a state switch (vfs_state_local) { case VFS_USER_STATE_DISCONNECTED: USBD_MSC_MediaReady = 0; break; case VFS_USER_STATE_RECONNECTING: USBD_MSC_MediaReady = 0; break; case VFS_USER_STATE_CONNECTED: build_filesystem(); USBD_MSC_MediaReady = 1; break; } return; }