mirror of
https://github.com/trezor/trezor-firmware.git
synced 2024-11-14 03:30:02 +00:00
bootloader: start working on USB processing
This commit is contained in:
parent
80d8ab7825
commit
00f566c434
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
|||||||
|
.vscode/
|
||||||
_attic/
|
_attic/
|
||||||
vendor/src/
|
vendor/src/
|
||||||
emu.config
|
emu.config
|
||||||
|
@ -58,6 +58,7 @@ OBJ_HAL += $(addprefix $(BUILD_MP)/,\
|
|||||||
OBJ_FW += $(addprefix $(BUILD_FW)/, \
|
OBJ_FW += $(addprefix $(BUILD_FW)/, \
|
||||||
bootloader/header.o \
|
bootloader/header.o \
|
||||||
bootloader/main.o \
|
bootloader/main.o \
|
||||||
|
bootloader/messages.o \
|
||||||
extmod/modtrezorui/display.o \
|
extmod/modtrezorui/display.o \
|
||||||
extmod/modtrezorui/inflate.o \
|
extmod/modtrezorui/inflate.o \
|
||||||
extmod/modtrezorui/font_bitmap.o \
|
extmod/modtrezorui/font_bitmap.o \
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
#include STM32_HAL_H
|
#include STM32_HAL_H
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
#include "display.h"
|
#include "display.h"
|
||||||
@ -10,6 +11,8 @@
|
|||||||
#include "usb.h"
|
#include "usb.h"
|
||||||
#include "version.h"
|
#include "version.h"
|
||||||
|
|
||||||
|
#include "messages.h"
|
||||||
|
|
||||||
#define IMAGE_MAGIC 0x465A5254 // TRZF
|
#define IMAGE_MAGIC 0x465A5254 // TRZF
|
||||||
#define IMAGE_MAXSIZE (7 * 128 * 1024)
|
#define IMAGE_MAXSIZE (7 * 128 * 1024)
|
||||||
|
|
||||||
@ -149,17 +152,51 @@ void mainloop(void)
|
|||||||
__fatal_error("usb_init_all failed");
|
__fatal_error("usb_init_all failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
display_bar(0, 0, DISPLAY_RESX, DISPLAY_RESY, 0x001F);
|
uint8_t buf[64];
|
||||||
display_refresh();
|
|
||||||
|
|
||||||
for(;;) {
|
for (;;) {
|
||||||
uint32_t e = touch_read();
|
int iface = usb_hid_read_select(1); // 1ms timeout
|
||||||
if (e & TOUCH_START || e & TOUCH_MOVE) {
|
if (iface < 0) {
|
||||||
int x = (e >> 8) & 0xFF, y = e & 0xFF;
|
continue;
|
||||||
display_bar(x - 1, y - 1, 3, 3, 0xFFFF);
|
}
|
||||||
display_refresh();
|
ssize_t r = usb_hid_read(iface, buf, sizeof(buf));
|
||||||
|
// invalid length
|
||||||
|
if (r != sizeof(buf)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// invalid header
|
||||||
|
if (buf[0] != '?' || buf[1] != '#' || buf[2] != '#') {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
uint16_t msg_id = (buf[3] << 8) + buf[4];
|
||||||
|
uint32_t msg_size = (buf[5] << 24) + (buf[6] << 16) + (buf[7] << 8) + buf[8];
|
||||||
|
(void)msg_size;
|
||||||
|
switch (msg_id) {
|
||||||
|
case 0: // Initialize
|
||||||
|
DPRINTLN("received Initialize");
|
||||||
|
send_msg_features(iface, false);
|
||||||
|
break;
|
||||||
|
case 1: // Ping
|
||||||
|
DPRINTLN("received Ping");
|
||||||
|
send_msg_success(iface);
|
||||||
|
break;
|
||||||
|
case 6: // FirmwareErase
|
||||||
|
DPRINTLN("received FirmwareErase");
|
||||||
|
send_msg_failure(iface);
|
||||||
|
break;
|
||||||
|
case 7: // FirmwareUpload
|
||||||
|
DPRINTLN("received FirmwareUpload");
|
||||||
|
send_msg_failure(iface);
|
||||||
|
break;
|
||||||
|
case 27: // ButtonAck
|
||||||
|
DPRINTLN("received ButtonAck");
|
||||||
|
send_msg_failure(iface);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
DPRINTLN("received garbage");
|
||||||
|
send_msg_failure(iface);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
HAL_Delay(1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
56
micropython/bootloader/messages.c
Normal file
56
micropython/bootloader/messages.c
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
#include "usb.h"
|
||||||
|
#include "version.h"
|
||||||
|
|
||||||
|
#include "messages.h"
|
||||||
|
|
||||||
|
void send_msg_success(int iface)
|
||||||
|
{
|
||||||
|
// send response: Success message (id 2), payload len 0
|
||||||
|
usb_hid_write_blocking(iface, (const uint8_t *)
|
||||||
|
"?##" // header
|
||||||
|
"\x00\x02" // msg_id
|
||||||
|
"\x00\x00\x00\x00" // payload_len
|
||||||
|
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||||
|
, 64, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void send_msg_failure(int iface)
|
||||||
|
{
|
||||||
|
// send response: Failure message (id 3), payload len 2
|
||||||
|
// code = 99 (Failure_FirmwareError)
|
||||||
|
usb_hid_write_blocking(iface, (const uint8_t *)
|
||||||
|
"?##" // header
|
||||||
|
"\x00\x03" // msg_id
|
||||||
|
"\x00\x00\x00\x02" // payload_len
|
||||||
|
"\x08\x63" // data
|
||||||
|
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||||
|
, 64, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void send_msg_features(int iface, bool firmware_present)
|
||||||
|
{
|
||||||
|
// send response: Features message (id 17), payload len 22
|
||||||
|
// vendor = "trezor.io"
|
||||||
|
// major_version = VERSION_MAJOR
|
||||||
|
// minor_version = VERSION_MINOR
|
||||||
|
// patch_version = VERSION_PATCH
|
||||||
|
// bootloader_mode = True
|
||||||
|
// firmware_present = True/False
|
||||||
|
if (firmware_present) {
|
||||||
|
usb_hid_write_blocking(iface, (const uint8_t *)
|
||||||
|
"?##" // header
|
||||||
|
"\x00\x11" // msg_id
|
||||||
|
"\x00\x00\x00\x16" // payload_len
|
||||||
|
"\x0a\x09" "trezor.io\x10" VERSION_MAJOR_CHAR "\x18" VERSION_MINOR_CHAR " " VERSION_PATCH_CHAR "(\x01" // data
|
||||||
|
"\x90\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||||
|
, 64, 1);
|
||||||
|
} else {
|
||||||
|
usb_hid_write_blocking(iface, (const uint8_t *)
|
||||||
|
"?##" // header
|
||||||
|
"\x00\x11" // msg_id
|
||||||
|
"\x00\x00\x00\x16" // payload_len
|
||||||
|
"\x0a\x09" "trezor.io\x10" VERSION_MAJOR_CHAR "\x18" VERSION_MINOR_CHAR " " VERSION_PATCH_CHAR "(\x01" // data
|
||||||
|
"\x90\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
|
||||||
|
, 64, 1);
|
||||||
|
}
|
||||||
|
}
|
10
micropython/bootloader/messages.h
Normal file
10
micropython/bootloader/messages.h
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#ifndef __MESSAGES_H__
|
||||||
|
#define __MESSAGES_H__
|
||||||
|
|
||||||
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
void send_msg_success(int iface);
|
||||||
|
void send_msg_failure(int iface);
|
||||||
|
void send_msg_features(int iface, bool firmware_present);
|
||||||
|
|
||||||
|
#endif
|
@ -3,6 +3,10 @@
|
|||||||
#define VERSION_PATCH 0
|
#define VERSION_PATCH 0
|
||||||
#define VERSION_BUILD 0
|
#define VERSION_BUILD 0
|
||||||
|
|
||||||
|
#define VERSION_MAJOR_CHAR "\x00"
|
||||||
|
#define VERSION_MINOR_CHAR "\x01"
|
||||||
|
#define VERSION_PATCH_CHAR "\x00"
|
||||||
|
|
||||||
#define STR_HELPER(X) #X
|
#define STR_HELPER(X) #X
|
||||||
#define STRINGIZE(X) STR_HELPER(X)
|
#define STRINGIZE(X) STR_HELPER(X)
|
||||||
|
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
#ifndef __TREZORHAL_USB_H__
|
#ifndef __TREZORHAL_USB_H__
|
||||||
#define __TREZORHAL_USB_H__
|
#define __TREZORHAL_USB_H__
|
||||||
|
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
#define USB_EP_DIR_OUT 0x00
|
#define USB_EP_DIR_OUT 0x00
|
||||||
#define USB_EP_DIR_IN 0x80
|
#define USB_EP_DIR_IN 0x80
|
||||||
#define USB_EP_DIR_MSK 0x80
|
#define USB_EP_DIR_MSK 0x80
|
||||||
|
Loading…
Reference in New Issue
Block a user