265 lines
12 KiB
C
265 lines
12 KiB
C
/***********************************************************************
|
|
* $Id:: mw_usbd_dfuuser.h 202 2011-06-12 21:50:01Z usb06052 $
|
|
*
|
|
* Project: USB device ROM Stack
|
|
*
|
|
* Description:
|
|
* Device Firmware Upgrade Class Custom User Module Definitions.
|
|
*
|
|
***********************************************************************
|
|
* Copyright(C) 2011, NXP Semiconductor
|
|
* All rights reserved.
|
|
*
|
|
* Software that is described herein is for illustrative purposes only
|
|
* which provides customers with programming information regarding the
|
|
* products. This software is supplied "AS IS" without any warranties.
|
|
* NXP Semiconductors assumes no responsibility or liability for the
|
|
* use of the software, conveys no license or title under any patent,
|
|
* copyright, or mask work right to the product. NXP Semiconductors
|
|
* reserves the right to make changes in the software without
|
|
* notification. NXP Semiconductors also make no representation or
|
|
* warranty that such application will be suitable for the specified
|
|
* use without further testing or modification.
|
|
**********************************************************************/
|
|
|
|
#ifndef __DFUUSER_H__
|
|
#define __DFUUSER_H__
|
|
|
|
#include "mw_usbd.h"
|
|
#include "mw_usbd_dfu.h"
|
|
#include "mw_usbd_core.h"
|
|
|
|
/** \file
|
|
* \brief Device Firmware Upgrade (DFU) API structures and function prototypes.
|
|
*
|
|
* Definition of functions exported by ROM based DFU function driver.
|
|
*
|
|
*/
|
|
|
|
|
|
/** \ingroup Group_USBD
|
|
* @defgroup USBD_DFU Device Firmware Upgrade (DFU) Class Function Driver
|
|
* \section Sec_MSCModDescription Module Description
|
|
* DFU Class Function Driver module. This module contains an internal implementation of the USB DFU Class.
|
|
* User applications can use this class driver instead of implementing the DFU class manually
|
|
* via the low-level USBD_HW and USBD_Core APIs.
|
|
*
|
|
* This module is designed to simplify the user code by exposing only the required interface needed to interface with
|
|
* Devices using the USB DFU Class.
|
|
*/
|
|
|
|
/** \brief USB descriptors data structure.
|
|
* \ingroup USBD_DFU
|
|
*
|
|
* \details This module exposes functions which interact directly with USB device stack's core layer.
|
|
* The application layer uses this component when it has to implement custom class function driver or
|
|
* standard class function driver which is not part of the current USB device stack.
|
|
* The functions exposed by this interface are to register class specific EP0 handlers and corresponding
|
|
* utility functions to manipulate EP0 state machine of the stack. This interface also exposes
|
|
* function to register custom endpoint interrupt handler.
|
|
*
|
|
*/
|
|
typedef struct USBD_DFU_INIT_PARAM
|
|
{
|
|
/* memory allocation params */
|
|
uint32_t mem_base; /**< Base memory location from where the stack can allocate
|
|
data and buffers. \note The memory address set in this field
|
|
should be accessible by USB DMA controller. Also this value
|
|
should be aligned on 4 byte boundary.
|
|
*/
|
|
uint32_t mem_size; /**< The size of memory buffer which stack can use.
|
|
\note The \em mem_size should be greater than the size
|
|
returned by USBD_DFU_API::GetMemSize() routine.*/
|
|
/* DFU paramas */
|
|
uint16_t wTransferSize; /**< DFU transfer block size in number of bytes.
|
|
This value should match the value set in DFU descriptor
|
|
provided as part of the descriptor array
|
|
(\em high_speed_desc) passed to Init() through
|
|
\ref USB_CORE_DESCS_T structure. */
|
|
|
|
uint16_t pad;
|
|
/** Pointer to the DFU interface descriptor within the descriptor
|
|
* array (\em high_speed_desc) passed to Init() through \ref USB_CORE_DESCS_T
|
|
* structure.
|
|
*/
|
|
uint8_t* intf_desc;
|
|
/* user defined functions */
|
|
/**
|
|
* DFU Write callback function.
|
|
*
|
|
* This function is provided by the application software. This function gets called
|
|
* when host sends a write command. For application using zero-copy buffer scheme
|
|
* this function is called for the first time with \em length parameter set to 0.
|
|
* The application code should update the buffer pointer.
|
|
*
|
|
* \param[in] block_num Destination start address.
|
|
* \param[in, out] src Pointer to a pointer to the source of data. Pointer-to-pointer
|
|
* is used to implement zero-copy buffers. See \ref USBD_ZeroCopy
|
|
* for more details on zero-copy concept.
|
|
* \param[out] bwPollTimeout Pointer to a 3 byte buffer which the callback implementer
|
|
* should fill with the amount of minimum time, in milliseconds,
|
|
* that the host should wait before sending a subsequent
|
|
* DFU_GETSTATUS request.
|
|
* \param[in] length Number of bytes to be written.
|
|
* \return Returns DFU_STATUS_ values defined in mw_usbd_dfu.h.
|
|
*
|
|
*/
|
|
uint8_t (*DFU_Write)( uint32_t block_num, uint8_t** src, uint32_t length, uint8_t* bwPollTimeout);
|
|
|
|
/**
|
|
* DFU Read callback function.
|
|
*
|
|
* This function is provided by the application software. This function gets called
|
|
* when host sends a read command.
|
|
*
|
|
* \param[in] block_num Destination start address.
|
|
* \param[in, out] dst Pointer to a pointer to the source of data. Pointer-to-pointer
|
|
* is used to implement zero-copy buffers. See \ref USBD_ZeroCopy
|
|
* for more details on zero-copy concept.
|
|
* \param[in] length Amount of data copied to destination buffer.
|
|
* \return Returns DFU_STATUS_ values defined in mw_usbd_dfu.h.
|
|
*
|
|
*/
|
|
uint32_t (*DFU_Read)( uint32_t block_num, uint8_t** dst, uint32_t length);
|
|
|
|
/**
|
|
* DFU done callback function.
|
|
*
|
|
* This function is provided by the application software. This function gets called
|
|
* after download is finished.
|
|
*
|
|
* \return Nothing.
|
|
*
|
|
*/
|
|
void (*DFU_Done)(void);
|
|
|
|
/**
|
|
* DFU detach callback function.
|
|
*
|
|
* This function is provided by the application software. This function gets called
|
|
* after USB_REQ_DFU_DETACH is recieved. Applications which set USB_DFU_WILL_DETACH
|
|
* bit in DFU descriptor should define this function. As part of this function
|
|
* application can call Connect() routine to disconnect and then connect back with
|
|
* host. For application which rely on WinUSB based host application should use this
|
|
* feature since USB reset can be invoked only by kernel drivers on Windows host.
|
|
* By implementing this feature host doen't have to issue reset instead the device
|
|
* has to do it automatically by disconnect and connect procedure.
|
|
*
|
|
* \param[in] hUsb Handle DFU control structure.
|
|
* \return Nothing.
|
|
*
|
|
*/
|
|
void (*DFU_Detach)(USBD_HANDLE_T hUsb);
|
|
|
|
/**
|
|
* Optional user overridable function to replace the default DFU class handler.
|
|
*
|
|
* The application software could override the default EP0 class handler with their
|
|
* own by providing the handler function address as this data member of the parameter
|
|
* structure. Application which like the default handler should set this data member
|
|
* to zero before calling the USBD_DFU_API::Init().
|
|
* \n
|
|
* \note
|
|
*
|
|
* \param[in] hUsb Handle to the USB device stack.
|
|
* \param[in] data Pointer to the data which will be passed when callback function is called by the stack.
|
|
* \param[in] event Type of endpoint event. See \ref USBD_EVENT_T for more details.
|
|
* \return The call back should returns \ref ErrorCode_t type to indicate success or error condition.
|
|
* \retval LPC_OK On success.
|
|
* \retval ERR_USBD_UNHANDLED Event is not handled hence pass the event to next in line.
|
|
* \retval ERR_USBD_xxx For other error conditions.
|
|
*
|
|
*/
|
|
ErrorCode_t (*DFU_Ep0_Hdlr) (USBD_HANDLE_T hUsb, void* data, uint32_t event);
|
|
|
|
} USBD_DFU_INIT_PARAM_T;
|
|
|
|
|
|
/** \brief DFU class API functions structure.
|
|
* \ingroup USBD_DFU
|
|
*
|
|
* This module exposes functions which interact directly with USB device controller hardware.
|
|
*
|
|
*/
|
|
typedef struct USBD_DFU_API
|
|
{
|
|
/** \fn uint32_t GetMemSize(USBD_DFU_INIT_PARAM_T* param)
|
|
* Function to determine the memory required by the DFU function driver module.
|
|
*
|
|
* This function is called by application layer before calling pUsbApi->dfu->Init(), to allocate memory used
|
|
* by DFU function driver module. The application should allocate the memory which is accessible by USB
|
|
* controller/DMA controller.
|
|
* \note Some memory areas are not accessible by all bus masters.
|
|
*
|
|
* \param[in] param Structure containing DFU function driver module initialization parameters.
|
|
* \return Returns the required memory size in bytes.
|
|
*/
|
|
uint32_t (*GetMemSize)(USBD_DFU_INIT_PARAM_T* param);
|
|
|
|
/** \fn ErrorCode_t init(USBD_HANDLE_T hUsb, USBD_DFU_INIT_PARAM_T* param)
|
|
* Function to initialize DFU function driver module.
|
|
*
|
|
* This function is called by application layer to initialize DFU function driver module.
|
|
*
|
|
* \param[in] hUsb Handle to the USB device stack.
|
|
* \param[in, out] param Structure containing DFU function driver module initialization parameters.
|
|
* \return Returns \ref ErrorCode_t type to indicate success or error condition.
|
|
* \retval LPC_OK On success
|
|
* \retval ERR_USBD_BAD_MEM_BUF Memory buffer passed is not 4-byte aligned or smaller than required.
|
|
* \retval ERR_API_INVALID_PARAM2 Either DFU_Write() or DFU_Done() or DFU_Read() callbacks are not defined.
|
|
* \retval ERR_USBD_BAD_DESC
|
|
* - USB_DFU_DESCRIPTOR_TYPE is not defined immediately after
|
|
* interface descriptor.
|
|
* - wTransferSize in descriptor doesn't match the value passed
|
|
* in param->wTransferSize.
|
|
* - DFU_Detach() is not defined while USB_DFU_WILL_DETACH is set
|
|
* in DFU descriptor.
|
|
* \retval ERR_USBD_BAD_INTF_DESC Wrong interface descriptor is passed.
|
|
*/
|
|
ErrorCode_t (*init)(USBD_HANDLE_T hUsb, USBD_DFU_INIT_PARAM_T* param, uint32_t init_state);
|
|
|
|
} USBD_DFU_API_T;
|
|
|
|
/*-----------------------------------------------------------------------------
|
|
* Private functions & structures prototypes
|
|
*-----------------------------------------------------------------------------*/
|
|
/** @cond ADVANCED_API */
|
|
|
|
typedef struct _USBD_DFU_CTRL_T
|
|
{
|
|
/*ALIGNED(4)*/ DFU_STATUS_T dfu_req_get_status;
|
|
uint16_t pad;
|
|
uint8_t dfu_state;
|
|
uint8_t dfu_status;
|
|
uint8_t download_done;
|
|
uint8_t if_num; /* interface number */
|
|
|
|
uint8_t* xfr_buf;
|
|
USB_DFU_FUNC_DESCRIPTOR* dfu_desc;
|
|
|
|
USB_CORE_CTRL_T* pUsbCtrl;
|
|
/* user defined functions */
|
|
/* return DFU_STATUS_ values defined in mw_usbd_dfu.h */
|
|
uint8_t (*DFU_Write)( uint32_t block_num, uint8_t** src, uint32_t length, uint8_t* bwPollTimeout);
|
|
/* return
|
|
* DFU_STATUS_ : values defined in mw_usbd_dfu.h in case of errors
|
|
* 0 : If end of memory reached
|
|
* length : Amount of data copied to destination buffer
|
|
*/
|
|
uint32_t (*DFU_Read)( uint32_t block_num, uint8_t** dst, uint32_t length);
|
|
/* callback called after download is finished */
|
|
void (*DFU_Done)(void);
|
|
/* callback called after USB_REQ_DFU_DETACH is recived */
|
|
void (*DFU_Detach)(USBD_HANDLE_T hUsb);
|
|
|
|
} USBD_DFU_CTRL_T;
|
|
|
|
/** @cond DIRECT_API */
|
|
uint32_t mwDFU_GetMemSize(USBD_DFU_INIT_PARAM_T* param);
|
|
extern ErrorCode_t mwDFU_init(USBD_HANDLE_T hUsb, USBD_DFU_INIT_PARAM_T* param, uint32_t init_state);
|
|
/** @endcond */
|
|
|
|
/** @endcond */
|
|
|
|
#endif /* __DFUUSER_H__ */
|