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