// Process DAP Vendor command and prepare response // Default function (can be overridden) // request: pointer to request data // response: pointer to response data // return: number of bytes in response // this function is declared as __weak in DAP.c uint32_t DAP_ProcessVendorCommand(uint8_t *request, uint8_t *response) { // get unique ID command if (*request == ID_DAP_Vendor0) { const char *id_str = info_get_unique_id(); uint8_t len = strlen(id_str); *response = ID_DAP_Vendor0; *(response + 1) = len; memcpy(response + 2, id_str, len); return (len + 2); } else if (*request == ID_DAP_Vendor8) { *response = ID_DAP_Vendor8; *(response + 1) = 1; if (0 == request[1]) { main_usb_set_test_mode(false); } else if (1 == request[1]) { main_usb_set_test_mode(true); } else { *(response + 1) = 0; } } // else return invalid command else { *response = ID_DAP_Invalid; } return (1); }
// Fill buf with the contents of the mbed redirect file by // expanding the special characters in mbed_redirect_file. static void update_html_file(uint8_t *buf, uint32_t bufsize) { uint32_t size_left; uint8_t *orig_buf = buf; uint8_t *insert_string; // Zero out buffer so strlen operations don't go out of bounds memset(buf, 0, bufsize); memcpy(buf, mbed_redirect_file, strlen((const char *)mbed_redirect_file)); do { // Look for key or the end of the string while ((*buf != '@') && (*buf != 0)) buf++; // If key was found then replace it if ('@' == *buf) { switch(*(buf+1)) { case 'm': case 'M': // MAC address insert_string = (uint8_t *)info_get_mac(); break; case 'u': case 'U': // UUID insert_string = (uint8_t *)info_get_unique_id(); break; case 'b': case 'B': // Board ID insert_string = (uint8_t *)info_get_board_id(); break; case 'h': case 'H': // Host ID insert_string = (uint8_t *)info_get_host_id(); break; case 't': case 'T': // Target ID insert_string = (uint8_t *)info_get_target_id(); break; case 'd': case 'D': // HDK insert_string = (uint8_t *)info_get_hdk_id(); break; case 'v': case 'V': // Firmware version insert_string = (uint8_t *)info_get_version(); break; case 'r': case 'R': // URL replacement insert_string = (uint8_t *)daplink_target_url; break; default: insert_string = (uint8_t *)"ERROR"; break; } insert(buf, insert_string, 2); } } while(*buf != '\0'); size_left = buf - orig_buf; memset(buf, 0, bufsize - size_left); }
// 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; }