c5357940ab
Fix the stub in many way to correctly detect the STMP family and act upon that. Drop some unused commands and bump version. Rewrite the tool to allows scripting in lua and load the register description from an XML file using the regtools. Introduce a new tool to load and run code using the hwstub (either binary format or Rockbox additive scramble format). Also switch to an optimise version of the memcpy/move/set functions to correctly handle alignement issue (like writing a full word/half-word when possible for registers which is crucial) Change-Id: Id1d5cfe0b1b47e8b43900d32c5cd6eafae6414f6
129 lines
4.3 KiB
C
129 lines
4.3 KiB
C
/***************************************************************************
|
|
* __________ __ ___.
|
|
* 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__ */
|