osmo-asf4-dfu/usb/class/dfu/usb_protocol_dfu.h

151 lines
4.3 KiB
C

/**
* \file
*
* \brief USB Device Firmware Upgrade (DFU) protocol definitions
*
* Copyright (c) 2018 sysmocom -s.f.m.c. GmbH, Author: Kevin Redon <kredon@sysmocom.de>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef _USB_PROTOCOL_DFU_H_
#define _USB_PROTOCOL_DFU_H_
#include "usb_includes.h"
/*
* \ingroup usb_protocol_group
* \defgroup dfu_protocol_group Device Firmware Upgrade Definitions
* \implements USB Device Firmware Upgrade Specification, Revision 1.1
* @{
*/
/**
* \name USB DFU Subclass IDs
*/
//@{
#define USB_DFU_CLASS 0xFE //!< Application Specific Class Code
//@}
//! \name USB DFU Subclass IDs
//@{
#define USB_DFU_SUBCLASS 0x01 //!< Device Firmware Upgrade Code
//@}
//! \name USB DFU Protocol IDs
//@{
#define USB_DFU_PROTOCOL_RUNTIME 0x01 //!< Runtime protocol
#define USB_DFU_PROTOCOL_DFU 0x02 //!< DFU mode protocol
//@}
//! \name USB DFU Attributes bits mask
//@{
#define USB_DFU_ATTRIBUTES_CAN_DOWNLOAD 0x01
#define USB_DFU_ATTRIBUTES_CAN_UPLOAD 0x02
#define USB_DFU_ATTRIBUTES_MANIFEST_TOLERANT 0x04
#define USB_DFU_ATTRIBUTES_WILL_DETACH 0x08
//@}
//! \name USB DFU Request IDs
//@{
#define USB_REQ_DFU_DETACH 0x00
#define USB_REQ_DFU_DNLOAD 0x01
#define USB_REQ_DFU_UPLOAD 0x02
#define USB_REQ_DFU_GETSTATUS 0x03
#define USB_REQ_DFU_CLRSTATUS 0x04
#define USB_REQ_DFU_GETSTATE 0x05
#define USB_REQ_DFU_ABORT 0x06
//@}
/*
* Need to pack structures tightly, or the compiler might insert padding
* and violate the spec-mandated layout.
*/
COMPILER_PACK_SET(1)
//! \name USB DFU Descriptors
//@{
//! DFU Functional Descriptor
typedef struct usb_dfu_func_desc {
uint8_t bFunctionLength; /**< Size of this descriptor, in bytes (always 9) */
uint8_t bDescriptorType; /**< DFU FUNCTIONAL descriptor type (always 0x21) */
uint8_t bmAttributes; /**< DFU attributes bit mask */
le16_t wDetachTimeOut; /**< Time, in milliseconds, that the device will wait after receipt of the DFU_DETACH request */
le16_t wTransferSize; /**< Maximum number of bytes that the device can accept per control-write transaction */
le16_t bcdDFUVersion; /**< Numeric expression identifying the version of the DFU Specification release */
} usb_dfu_func_desc_t;
#define USB_DFU_FUNC_DESC_LEN 9
#define USB_DFU_FUNC_DESC_TYPE 0x21
#define USB_DFU_FUNC_DESC_BYTES(bmAttributes, wDetachTimeOut, wTransferSize, bcdDFUVersion) \
USB_DFU_FUNC_DESC_LEN, /* bFunctionLength */ \
USB_DFU_FUNC_DESC_TYPE, /* bDescriptorType */ \
bmAttributes, \
LE_BYTE0(wDetachTimeOut), LE_BYTE1(wDetachTimeOut), \
LE_BYTE0(wTransferSize), LE_BYTE1(wTransferSize), \
LE_BYTE0(bcdDFUVersion), LE_BYTE1(bcdDFUVersion)
COMPILER_PACK_RESET()
//! @}
//! USB DFU Request IDs
enum usb_dfu_req {
USB_DFU_DETACH,
USB_DFU_DNLOAD,
USB_DFU_UPLOAD,
USB_DFU_GETSTATUS,
USB_DFU_CLRSTATUS,
USB_DFU_GETSTATE,
USB_DFU_ABORT,
};
//! USB DFU Device Status IDs
enum usb_dfu_status {
USB_DFU_STATUS_OK,
USB_DFU_STATUS_ERR_TARGET,
USB_DFU_STATUS_ERR_FILE,
USB_DFU_STATUS_ERR_WRITE,
USB_DFU_STATUS_ERR_ERASE,
USB_DFU_STATUS_ERR_CHECK_ERASED,
USB_DFU_STATUS_ERR_PROG,
USB_DFU_STATUS_ERR_VERIFY,
USB_DFU_STATUS_ERR_ADDRESS,
USB_DFU_STATUS_ERR_NOTDONE,
USB_DFU_STATUS_ERR_FIRMWARE,
USB_DFU_STATUS_ERR_VENDOR,
USB_DFU_STATUS_ERR_USBR,
USB_DFU_STATUS_ERR_POR,
USB_DFU_STATUS_ERR_UNKNOWN,
USB_DFU_STATUS_ERR_STALLEDPKT,
};
//! USB DFU Device State IDs
enum usb_dfu_state {
USB_DFU_STATE_APP_IDLE,
USB_DFU_STATE_APP_DETACH,
USB_DFU_STATE_DFU_IDLE,
USB_DFU_STATE_DFU_DNLOAD_SYNC,
USB_DFU_STATE_DFU_DNBUSY,
USB_DFU_STATE_DFU_DNLOAD_IDLE,
USB_DFU_STATE_DFU_MANIFEST_SYNC,
USB_DFU_STATE_DFU_MANIFEST,
USB_DFU_STATE_DFU_MANIFEST_WAIT_RESET,
USB_DFU_STATE_DFU_UPLOAD_IDLE,
USB_DFU_STATE_DFU_ERROR,
};
#endif // _USB_PROTOCOL_DFU_H_