diff --git a/hw/application_fpga/fw/tk1/main.c b/hw/application_fpga/fw/tk1/main.c index 3251a0f..d651679 100644 --- a/hw/application_fpga/fw/tk1/main.c +++ b/hw/application_fpga/fw/tk1/main.c @@ -8,6 +8,7 @@ #include "blake2s/blake2s.h" #include "lib.h" #include "partition_table.h" +#include "preload_app.h" #include "proto.h" #include "state.h" @@ -248,6 +249,13 @@ static enum state initial_commands(const struct frame_header *hdr, break; } + case FW_CMD_LOAD_APP_FLASH: + rsp[0] = STATUS_OK; + fwreply(*hdr, FW_RSP_LOAD_APP_FLASH, rsp); + + state = FW_STATE_LOAD_APP_FLASH; + break; + default: htif_puts("Got unknown firmware cmd: 0x"); htif_puthex(cmd[0]); @@ -421,8 +429,6 @@ int main(void) /*@+mustfreeonly@*/ ctx.use_uss = false; - readbyte(); - scramble_ram(); part_table_read(&part_table); @@ -447,6 +453,23 @@ int main(void) state = loading_commands(&hdr, cmd, state, &ctx); break; + case FW_STATE_LOAD_APP_FLASH: + if (preload_start(&part_table) == -1) { + state = FW_STATE_FAIL; + break; + } + + *app_size = part_table.pre_app_data.size; + + int digest_err = compute_app_digest(ctx.digest); + assert(digest_err == 0); + print_digest(ctx.digest); + ctx.use_uss = false; + + state = FW_STATE_RUN; + + break; + case FW_STATE_RUN: run(&ctx); break; // This is never reached! diff --git a/hw/application_fpga/fw/tk1/proto.c b/hw/application_fpga/fw/tk1/proto.c index 5bf9c23..a4f8f89 100644 --- a/hw/application_fpga/fw/tk1/proto.c +++ b/hw/application_fpga/fw/tk1/proto.c @@ -108,6 +108,10 @@ void fwreply(struct frame_header hdr, enum fwcmd rspcode, uint8_t *buf) len = LEN_32; break; + case FW_RSP_LOAD_APP_FLASH: + len = LEN_1; + break; + default: htif_puts("fwreply(): Unknown response code: 0x"); htif_puthex(rspcode); diff --git a/hw/application_fpga/fw/tk1/proto.h b/hw/application_fpga/fw/tk1/proto.h index bd2b305..28c97ec 100644 --- a/hw/application_fpga/fw/tk1/proto.h +++ b/hw/application_fpga/fw/tk1/proto.h @@ -37,6 +37,8 @@ enum fwcmd { FW_CMD_GET_UDI = 0x08, FW_RSP_GET_UDI = 0x09, FW_CMD_MAX = 0x0a, + FW_CMD_LOAD_APP_FLASH = 0xF0, + FW_RSP_LOAD_APP_FLASH = 0xF1, }; // clang-format on diff --git a/hw/application_fpga/fw/tk1/state.h b/hw/application_fpga/fw/tk1/state.h index 694448b..cab6bab 100644 --- a/hw/application_fpga/fw/tk1/state.h +++ b/hw/application_fpga/fw/tk1/state.h @@ -11,6 +11,7 @@ enum state { FW_STATE_LOADING, FW_STATE_RUN, FW_STATE_FAIL, + FW_STATE_LOAD_APP_FLASH, FW_STATE_MAX, }; #endif