summaryrefslogtreecommitdiffstats
path: root/utils/hwstub/hwstub_protocol.h
diff options
context:
space:
mode:
Diffstat (limited to 'utils/hwstub/hwstub_protocol.h')
-rw-r--r--utils/hwstub/hwstub_protocol.h129
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__ */