diff options
Diffstat (limited to 'utils/hwstub/hwstub_protocol.h')
-rw-r--r-- | utils/hwstub/hwstub_protocol.h | 129 |
1 files changed, 129 insertions, 0 deletions
diff --git a/utils/hwstub/hwstub_protocol.h b/utils/hwstub/hwstub_protocol.h new file mode 100644 index 0000000000..41be3957e8 --- /dev/null +++ b/utils/hwstub/hwstub_protocol.h @@ -0,0 +1,129 @@ +/*************************************************************************** + * __________ __ ___. + * Open \______ \ ____ ____ | | _\_ |__ _______ ___ + * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / + * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < + * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ + * \/ \/ \/ \/ \/ + * $Id$ + * + * Copyright (C) 2012 by Amaury Pouly + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY + * KIND, either express or implied. + * + ****************************************************************************/ +#ifndef __HWSTUB_PROTOCOL__ +#define __HWSTUB_PROTOCOL__ + +#define HWSTUB_CLASS 0xfe +#define HWSTUB_SUBCLASS 0xac +#define HWSTUB_PROTOCOL 0x1d + +#define HWSTUB_VERSION_MAJOR 2 +#define HWSTUB_VERSION_MINOR 9 +#define HWSTUB_VERSION_REV 2 + +#define HWSTUB_USB_VID 0xfee1 +#define HWSTUB_USB_PID 0xdead + +/** + * Control commands + * + * These commands are sent to the device, using the standard bRequest field + * of the SETUP packet. This is to take advantage of both wIndex and wValue + * although it would have been more correct to send them to the interface. + */ + +/* list of commands */ +#define HWSTUB_GET_INFO 0 /* mandatory */ +#define HWSTUB_GET_LOG 1 /* optional */ +#define HWSTUB_RW_MEM 2 /* optional */ +#define HWSTUB_CALL 3 /* optional */ +#define HWSTUB_JUMP 4 /* optional */ +#define HWSTUB_AES_OTP 5 /* optional */ + +/** + * HWSTUB_GET_INFO: get some information about an aspect of the device. + * The wIndex field of the SETUP specifies which information to get. */ + +/* list of possible information */ +#define HWSTUB_INFO_VERSION 0 +#define HWSTUB_INFO_LAYOUT 1 +#define HWSTUB_INFO_STMP 2 +#define HWSTUB_INFO_FEATURES 3 + +struct usb_resp_info_version_t +{ + uint8_t major; + uint8_t minor; + uint8_t revision; +} __attribute__((packed)); + +struct usb_resp_info_layout_t +{ + /* describe the range of memory used by the running code */ + uint32_t oc_code_start; + uint32_t oc_code_size; + /* describe the range of memory used by the stack */ + uint32_t oc_stack_start; + uint32_t oc_stack_size; + /* describe the range of memory available as a buffer */ + uint32_t oc_buffer_start; + uint32_t oc_buffer_size; +} __attribute__((packed)); + +struct usb_resp_info_stmp_t +{ + uint16_t chipid; /* 0x3780 for STMP3780 for example */ + uint8_t rev; /* 0=TA1 on STMP3780 for example */ + uint8_t is_supported; /* 1 if the chip is supported */ +} __attribute__((packed)); + +/* list of possible features */ +#define HWSTUB_FEATURE_LOG (1 << 0) +#define HWSTUB_FEATURE_MEM (1 << 1) +#define HWSTUB_FEATURE_CALL (1 << 2) +#define HWSTUB_FEATURE_JUMP (1 << 2) +#define HWSTUB_FEATURE_AES_OTP (1 << 3) + +struct usb_resp_info_features_t +{ + uint32_t feature_mask; +}; + +/** + * HWSTUB_GET_LOG: only if has HWSTUB_FEATURE_LOG. + * The log is returned as part of the control transfer. + */ + +/** + * HWSTUB_RW_MEM: only if has HWSTUB_FEATURE_MEM. + * The 32-bit address is split into two parts. + * The low 16-bit are stored in wValue and the upper + * 16-bit are stored in wIndex. Depending on the transfer direction, + * the transfer is either a read or a write. + * The read/write on the device are guaranteed to be 16-bit/32-bit when + * possible, making it suitable to read/write registers. */ + +/** + * HWSTUB_x: only if has HWSTUB_FEATURE_x where x=CALL or JUMP. + * The 32-bit address is split into two parts. + * The low 16-bit are stored in wValue and the upper + * 16-bit are stored in wIndex. Depending on the transfer direction, + * the transfer is either a read or a write. */ + +/** + * HWSTUB_AES_OTP: only if has HWSTUB_FEATURE_AES_OTP. + * The control transfer contains the data to be en/decrypted and the data + * is sent back on the interrupt endpoint. The first 16-bytes of the data + * are interpreted as the IV. The output format is the same. + * The wValue field contains the parameters of the process. */ +#define HWSTUB_AES_OTP_ENCRYPT (1 << 0) + +#endif /* __HWSTUB_PROTOCOL__ */ |