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__ */
 |