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