343 lines
17 KiB
C
343 lines
17 KiB
C
|
/***********************************************************************
|
||
|
* $Id:: mw_usbd_cdcuser.h 202 2011-06-12 21:50:01Z usb06052 $
|
||
|
*
|
||
|
* Project: USB device ROM Stack
|
||
|
*
|
||
|
* Description:
|
||
|
* USB Communication Device Class 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 __CDCUSER_H__
|
||
|
#define __CDCUSER_H__
|
||
|
|
||
|
#include "error.h"
|
||
|
#include "mw_usbd.h"
|
||
|
#include "mw_usbd_cdc.h"
|
||
|
|
||
|
/** \file
|
||
|
* \brief Communication Device Class (CDC) API structures and function prototypes.
|
||
|
*
|
||
|
* Definition of functions exported by ROM based CDC function driver.
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
/** \ingroup Group_USBD
|
||
|
* @defgroup USBD_CDC Communication Device Class (CDC) Function Driver
|
||
|
* \section Sec_CDCModDescription Module Description
|
||
|
* CDC Class Function Driver module. This module contains an internal implementation of the USB CDC Class.
|
||
|
* User applications can use this class driver instead of implementing the CDC 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 CDC Class.
|
||
|
*/
|
||
|
|
||
|
/*----------------------------------------------------------------------------
|
||
|
We need a buffer for incomming data on USB port because USB receives
|
||
|
much faster than UART transmits
|
||
|
*---------------------------------------------------------------------------*/
|
||
|
/* Buffer masks */
|
||
|
#define CDC_BUF_SIZE (128) /* Output buffer in bytes (power 2) */
|
||
|
/* large enough for file transfer */
|
||
|
#define CDC_BUF_MASK (CDC_BUF_SIZE-1ul)
|
||
|
|
||
|
/** \brief Communication Device Class function driver initilization parameter data structure.
|
||
|
* \ingroup USBD_CDC
|
||
|
*
|
||
|
* \details This data structure is used to pass initialization parameters to the
|
||
|
* Communication Device Class function driver's init function.
|
||
|
*
|
||
|
*/
|
||
|
typedef struct USBD_CDC_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_CDC_API::GetMemSize() routine.*/
|
||
|
/** Pointer to the control interface descriptor within the descriptor
|
||
|
* array (\em high_speed_desc) passed to Init() through \ref USB_CORE_DESCS_T
|
||
|
* structure. The stack assumes both HS and FS use same BULK endpoints.
|
||
|
*/
|
||
|
uint8_t* cif_intf_desc;
|
||
|
/** Pointer to the data interface descriptor within the descriptor
|
||
|
* array (\em high_speed_desc) passed to Init() through \ref USB_CORE_DESCS_T
|
||
|
* structure. The stack assumes both HS and FS use same BULK endpoints.
|
||
|
*/
|
||
|
uint8_t* dif_intf_desc;
|
||
|
|
||
|
/* user defined functions */
|
||
|
|
||
|
/* required functions */
|
||
|
/**
|
||
|
* Communication Interface Class specific get request callback function.
|
||
|
*
|
||
|
* This function is provided by the application software. This function gets called
|
||
|
* when host sends CIC management element get requests. The setup packet data (\em pSetup)
|
||
|
* is passed to the callback so that application can extract the CIC request type
|
||
|
* and other associated data. By default the stack will ssign \em pBuffer pointer
|
||
|
* to \em EP0Buff allocated at init. The application code can directly write data
|
||
|
* into this buffer as long as data is less than 64 byte. If more data has to be sent
|
||
|
* then application code should update \em pBuffer pointer and length accordingly.
|
||
|
*
|
||
|
*
|
||
|
* \param[in] hCdc Handle to CDC function driver.
|
||
|
* \param[in] pSetup Pointer to setup packet recived from host.
|
||
|
* \param[in, out] pBuffer Pointer to a pointer of data buffer containing request data.
|
||
|
* Pointer-to-pointer is used to implement zero-copy buffers.
|
||
|
* See \ref USBD_ZeroCopy for more details on zero-copy concept.
|
||
|
* \param[in, out] length Amount of data to be sent back to host.
|
||
|
* \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 (*CIC_GetRequest)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuffer, uint16_t* length);
|
||
|
|
||
|
/**
|
||
|
* Communication Interface Class specific set request callback function.
|
||
|
*
|
||
|
* This function is provided by the application software. This function gets called
|
||
|
* when host sends a CIC management element requests. The setup packet data (\em pSetup)
|
||
|
* is passed to the callback so that application can extract the CIC request type
|
||
|
* and other associated data. If a set request has data associated, then this callback
|
||
|
* is called twice.
|
||
|
* (1) First when setup request is recived, at this time application code could update
|
||
|
* \em pBuffer pointer to point to the intended destination. The length param is set to 0
|
||
|
* so that application code knows this is first time. By default the stack will
|
||
|
* assign \em pBuffer pointer to \em EP0Buff allocated at init. Note, if data length is
|
||
|
* greater than 64 bytes and application code doesn't update \em pBuffer pointer the
|
||
|
* stack will send STALL condition to host.
|
||
|
* (2) Second when the data is recived from the host. This time the length param is set
|
||
|
* with number of data bytes recived.
|
||
|
*
|
||
|
* \param[in] hCdc Handle to CDC function driver.
|
||
|
* \param[in] pSetup Pointer to setup packet recived from host.
|
||
|
* \param[in, out] pBuffer Pointer to a pointer of data buffer containing request 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 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 (*CIC_SetRequest)( USBD_HANDLE_T hCdc, USB_SETUP_PACKET* pSetup, uint8_t** pBuffer, uint16_t length);
|
||
|
|
||
|
/**
|
||
|
* Communication Device Class specific BULK IN endpoint handler.
|
||
|
*
|
||
|
* The application software should provide the BULK IN endpoint handler.
|
||
|
* Applications should transfer data depending on the communication protocol type set in descriptors.
|
||
|
* \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 (*CDC_BulkIN_Hdlr) (USBD_HANDLE_T hUsb, void* data, uint32_t event);
|
||
|
|
||
|
/**
|
||
|
* Communication Device Class specific BULK OUT endpoint handler.
|
||
|
*
|
||
|
* The application software should provide the BULK OUT endpoint handler.
|
||
|
* Applications should transfer data depending on the communication protocol type set in descriptors.
|
||
|
* \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 (*CDC_BulkOUT_Hdlr) (USBD_HANDLE_T hUsb, void* data, uint32_t event);
|
||
|
|
||
|
ErrorCode_t (*SendEncpsCmd) (USBD_HANDLE_T hCDC, uint8_t* buffer, uint16_t len);
|
||
|
ErrorCode_t (*GetEncpsResp) (USBD_HANDLE_T hCDC, uint8_t** buffer, uint16_t* len);
|
||
|
ErrorCode_t (*SetCommFeature) (USBD_HANDLE_T hCDC, uint16_t feature, uint8_t* buffer, uint16_t len);
|
||
|
ErrorCode_t (*GetCommFeature) (USBD_HANDLE_T hCDC, uint16_t feature, uint8_t** pBuffer, uint16_t* len);
|
||
|
ErrorCode_t (*ClrCommFeature) (USBD_HANDLE_T hCDC, uint16_t feature);
|
||
|
ErrorCode_t (*SetCtrlLineState) (USBD_HANDLE_T hCDC, uint16_t state);
|
||
|
ErrorCode_t (*SendBreak) (USBD_HANDLE_T hCDC, uint16_t mstime);
|
||
|
ErrorCode_t (*SetLineCode) (USBD_HANDLE_T hCDC, CDC_LINE_CODING* line_coding);
|
||
|
|
||
|
/**
|
||
|
* Optional Communication Device Class specific INTERRUPT IN endpoint handler.
|
||
|
*
|
||
|
* The application software should provide the INT IN endpoint handler.
|
||
|
* Applications should transfer data depending on the communication protocol type set in descriptors.
|
||
|
* \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 (*CDC_InterruptEP_Hdlr) (USBD_HANDLE_T hUsb, void* data, uint32_t event);
|
||
|
|
||
|
/**
|
||
|
* Optional user overridable function to replace the default CDC 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_CDC_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 (*CDC_Ep0_Hdlr) (USBD_HANDLE_T hUsb, void* data, uint32_t event);
|
||
|
|
||
|
} USBD_CDC_INIT_PARAM_T;
|
||
|
|
||
|
/** \brief CDC class API functions structure.
|
||
|
* \ingroup USBD_CDC
|
||
|
*
|
||
|
* This module exposes functions which interact directly with USB device controller hardware.
|
||
|
*
|
||
|
*/
|
||
|
typedef struct USBD_CDC_API
|
||
|
{
|
||
|
/** \fn uint32_t GetMemSize(USBD_CDC_INIT_PARAM_T* param)
|
||
|
* Function to determine the memory required by the CDC function driver module.
|
||
|
*
|
||
|
* This function is called by application layer before calling pUsbApi->CDC->Init(), to allocate memory used
|
||
|
* by CDC 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 CDC function driver module initialization parameters.
|
||
|
* \return Returns the required memory size in bytes.
|
||
|
*/
|
||
|
uint32_t (*GetMemSize)(USBD_CDC_INIT_PARAM_T* param);
|
||
|
|
||
|
/** \fn ErrorCode_t init(USBD_HANDLE_T hUsb, USBD_CDC_INIT_PARAM_T* param)
|
||
|
* Function to initialize CDC function driver module.
|
||
|
*
|
||
|
* This fuction is called by application layer to initialize CDC function driver module.
|
||
|
*
|
||
|
* \param[in] hUsb Handle to the USB device stack.
|
||
|
* \param[in, out] param Structure containing CDC 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 CDC_Write() or CDC_Read() or
|
||
|
* CDC_Verify() callbacks are not defined.
|
||
|
* \retval ERR_USBD_BAD_INTF_DESC Wrong interface descriptor is passed.
|
||
|
* \retval ERR_USBD_BAD_EP_DESC Wrong endpoint descriptor is passed.
|
||
|
*/
|
||
|
ErrorCode_t (*init)(USBD_HANDLE_T hUsb, USBD_CDC_INIT_PARAM_T* param, USBD_HANDLE_T* phCDC);
|
||
|
|
||
|
/** \fn ErrorCode_t SendNotification(USBD_HANDLE_T hCdc, uint8_t bNotification, uint16_t data)
|
||
|
* Function to initialize CDC function driver module.
|
||
|
*
|
||
|
* This fuction is called by application layer to initialize CDC function driver module.
|
||
|
*
|
||
|
* \param[in] hUsb Handle to the USB device stack.
|
||
|
* \param[in, out] param Structure containing CDC 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 CDC_Write() or CDC_Read() or
|
||
|
* CDC_Verify() callbacks are not defined.
|
||
|
* \retval ERR_USBD_BAD_INTF_DESC Wrong interface descriptor is passed.
|
||
|
* \retval ERR_USBD_BAD_EP_DESC Wrong endpoint descriptor is passed.
|
||
|
*/
|
||
|
ErrorCode_t (*SendNotification)(USBD_HANDLE_T hCdc, uint8_t bNotification, uint16_t data);
|
||
|
|
||
|
} USBD_CDC_API_T;
|
||
|
|
||
|
/*-----------------------------------------------------------------------------
|
||
|
* Private functions & structures prototypes
|
||
|
*-----------------------------------------------------------------------------*/
|
||
|
/** @cond ADVANCED_API */
|
||
|
|
||
|
typedef struct _CDC_CTRL_T
|
||
|
{
|
||
|
USB_CORE_CTRL_T* pUsbCtrl;
|
||
|
/* notification buffer */
|
||
|
uint8_t notice_buf[12];
|
||
|
CDC_LINE_CODING line_coding;
|
||
|
uint8_t pad0;
|
||
|
|
||
|
uint8_t cif_num; /* control interface number */
|
||
|
uint8_t dif_num; /* data interface number */
|
||
|
uint8_t epin_num; /* BULK IN endpoint number */
|
||
|
uint8_t epout_num; /* BULK OUT endpoint number */
|
||
|
uint8_t epint_num; /* Interrupt IN endpoint number */
|
||
|
uint8_t pad[3];
|
||
|
/* user defined functions */
|
||
|
ErrorCode_t (*SendEncpsCmd) (USBD_HANDLE_T hCDC, uint8_t* buffer, uint16_t len);
|
||
|
ErrorCode_t (*GetEncpsResp) (USBD_HANDLE_T hCDC, uint8_t** buffer, uint16_t* len);
|
||
|
ErrorCode_t (*SetCommFeature) (USBD_HANDLE_T hCDC, uint16_t feature, uint8_t* buffer, uint16_t len);
|
||
|
ErrorCode_t (*GetCommFeature) (USBD_HANDLE_T hCDC, uint16_t feature, uint8_t** pBuffer, uint16_t* len);
|
||
|
ErrorCode_t (*ClrCommFeature) (USBD_HANDLE_T hCDC, uint16_t feature);
|
||
|
ErrorCode_t (*SetCtrlLineState) (USBD_HANDLE_T hCDC, uint16_t state);
|
||
|
ErrorCode_t (*SendBreak) (USBD_HANDLE_T hCDC, uint16_t state);
|
||
|
ErrorCode_t (*SetLineCode) (USBD_HANDLE_T hCDC, CDC_LINE_CODING* line_coding);
|
||
|
|
||
|
/* virtual functions */
|
||
|
ErrorCode_t (*CIC_GetRequest)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuffer, uint16_t* length);
|
||
|
ErrorCode_t (*CIC_SetRequest)( USBD_HANDLE_T hCdc, USB_SETUP_PACKET* pSetup, uint8_t** pBuffer, uint16_t length);
|
||
|
|
||
|
}USB_CDC_CTRL_T;
|
||
|
|
||
|
/** @cond DIRECT_API */
|
||
|
extern uint32_t mwCDC_GetMemSize(USBD_CDC_INIT_PARAM_T* param);
|
||
|
extern ErrorCode_t mwCDC_init(USBD_HANDLE_T hUsb, USBD_CDC_INIT_PARAM_T* param, USBD_HANDLE_T* phCDC);
|
||
|
extern ErrorCode_t mwCDC_SendNotification (USBD_HANDLE_T hCdc, uint8_t bNotification, uint16_t data);
|
||
|
/** @endcond */
|
||
|
|
||
|
/** @endcond */
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
#endif /* __CDCUSER_H__ */
|