add windows driver for cdc

add simple echo cdc serial demo
add cdc device send/receive API
refractor descriptor
refractor cdc.h
add usbd driver function
- init
- bus_reset
This commit is contained in:
hathach 2013-11-08 12:03:32 +07:00
parent 3945869cc2
commit 15d3a418bd
38 changed files with 736 additions and 4768 deletions

View File

@ -86,10 +86,11 @@ ServiceBinary=%12%\%DRIVERFILENAME%.sys
[SourceDisksFiles]
[SourceDisksNames]
[DeviceList]
%DESCRIPTION%=DriverInstall, USB\VID_1FC9&PID_2001, USB\VID_1FC9&PID_2003&MI_00, USB\VID_1FC9&PID_2005&MI_00, USB\VID_1FC9&PID_2007&MI_00
%DESCRIPTION%=DriverInstall, USB\VID_1FC9&PID_4001, USB\VID_1FC9&PID_4001&MI_00, USB\VID_1FC9&PID_4003&MI_00, USB\VID_1FC9&PID_4005&MI_00, USB\VID_1FC9&PID_4007&MI_00, USB\VID_1FC9&PID_4009&MI_00, USB\VID_1FC9&PID_400b&MI_00, USB\VID_1FC9&PID_400d&MI_00, USB\VID_1FC9&PID_400f&MI_00, USB\VID_1FC9&PID_4011&MI_00, USB\VID_1FC9&PID_4013&MI_00, USB\VID_1FC9&PID_4015&MI_00, USB\VID_1FC9&PID_4017&MI_00, USB\VID_1FC9&PID_4019&MI_00, USB\VID_1FC9&PID_401b&MI_00, USB\VID_1FC9&PID_401d&MI_00, USB\VID_1FC9&PID_401f&MI_00, USB\VID_1FC9&PID_4021&MI_00, USB\VID_1FC9&PID_4023&MI_00, USB\VID_1FC9&PID_4025&MI_00, USB\VID_1FC9&PID_4027&MI_00, USB\VID_1FC9&PID_4029&MI_00, USB\VID_1FC9&PID_402b&MI_00, USB\VID_1FC9&PID_402d&MI_00, USB\VID_1FC9&PID_402f&MI_00, USB\VID_1FC9&PID_4031&MI_00, USB\VID_1FC9&PID_4033&MI_00, USB\VID_1FC9&PID_4035&MI_00, USB\VID_1FC9&PID_4037&MI_00, USB\VID_1FC9&PID_4039&MI_00, USB\VID_1FC9&PID_403b&MI_00, USB\VID_1FC9&PID_403d&MI_00, USB\VID_1FC9&PID_403f&MI_00
[DeviceList.NTamd64]
%DESCRIPTION%=DriverInstall, USB\VID_1FC9&PID_2001, USB\VID_1FC9&PID_2003&MI_00, USB\VID_1FC9&PID_2005&MI_00, USB\VID_1FC9&PID_2007&MI_00
%DESCRIPTION%=DriverInstall, USB\VID_1FC9&PID_4001, USB\VID_1FC9&PID_4001&MI_00, USB\VID_1FC9&PID_4003&MI_00, USB\VID_1FC9&PID_4005&MI_00, USB\VID_1FC9&PID_4007&MI_00, USB\VID_1FC9&PID_4009&MI_00, USB\VID_1FC9&PID_400b&MI_00, USB\VID_1FC9&PID_400d&MI_00, USB\VID_1FC9&PID_400f&MI_00, USB\VID_1FC9&PID_4011&MI_00, USB\VID_1FC9&PID_4013&MI_00, USB\VID_1FC9&PID_4015&MI_00, USB\VID_1FC9&PID_4017&MI_00, USB\VID_1FC9&PID_4019&MI_00, USB\VID_1FC9&PID_401b&MI_00, USB\VID_1FC9&PID_401d&MI_00, USB\VID_1FC9&PID_401f&MI_00, USB\VID_1FC9&PID_4021&MI_00, USB\VID_1FC9&PID_4023&MI_00, USB\VID_1FC9&PID_4025&MI_00, USB\VID_1FC9&PID_4027&MI_00, USB\VID_1FC9&PID_4029&MI_00, USB\VID_1FC9&PID_402b&MI_00, USB\VID_1FC9&PID_402d&MI_00, USB\VID_1FC9&PID_402f&MI_00, USB\VID_1FC9&PID_4031&MI_00, USB\VID_1FC9&PID_4033&MI_00, USB\VID_1FC9&PID_4035&MI_00, USB\VID_1FC9&PID_4037&MI_00, USB\VID_1FC9&PID_4039&MI_00, USB\VID_1FC9&PID_403b&MI_00, USB\VID_1FC9&PID_403d&MI_00, USB\VID_1FC9&PID_403f&MI_00
;------------------------------------------------------------------------------
; String Definitions
@ -100,6 +101,6 @@ ServiceBinary=%12%\%DRIVERFILENAME%.sys
MFGFILENAME="CDC_vista"
DRIVERFILENAME ="usbser"
MFGNAME="tinyusb.org"
INSTDISK="tinyUSB CDC driver"
DESCRIPTION="Communications Port"
INSTDISK="tinyusb CDC driver"
DESCRIPTION="tinyusb Serial Port"
SERVICE="USB RS-232 Emulation Driver"

View File

@ -0,0 +1,138 @@
/**************************************************************************/
/*!
@file cdcd_app.c
@author hathach (tinyusb.org)
@section LICENSE
Software License Agreement (BSD License)
Copyright (c) 2013, hathach (tinyusb.org)
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holders nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This file is part of the tinyusb stack.
*/
/**************************************************************************/
#include "cdcd_app.h"
#if TUSB_CFG_DEVICE_CDC
//--------------------------------------------------------------------+
// INCLUDE
//--------------------------------------------------------------------+
enum {
CDCD_APP_BUFFER_SIZE = 16
};
//--------------------------------------------------------------------+
// MACRO CONSTANT TYPEDEF
//--------------------------------------------------------------------+
OSAL_TASK_DEF(cdcd_serial_app_task, 128, CDCD_SERIAL_APP_TASK_PRIO);
OSAL_SEM_DEF(cdcd_semaphore);
static osal_semaphore_handle_t sem_hdl;
static uint8_t cdcd_app_recv_buffer[CDCD_APP_BUFFER_SIZE] TUSB_CFG_ATTR_USBRAM;
static uint8_t cdcd_app_send_buffer[CDCD_APP_BUFFER_SIZE] TUSB_CFG_ATTR_USBRAM;
static uint16_t received_bytes; // set by transfer complete callback
//--------------------------------------------------------------------+
// INTERNAL OBJECT & FUNCTION DECLARATION
//--------------------------------------------------------------------+
//--------------------------------------------------------------------+
// IMPLEMENTATION
//--------------------------------------------------------------------+
void cdcd_serial_app_init(void)
{
sem_hdl = osal_semaphore_create( OSAL_SEM_REF(cdcd_semaphore) );
ASSERT_PTR( sem_hdl, VOID_RETURN);
ASSERT( TUSB_ERROR_NONE == osal_task_create( OSAL_TASK_REF(cdcd_serial_app_task) ), VOID_RETURN);
}
void tusbd_cdc_mounted_cb(uint8_t coreid)
{
osal_semaphore_reset(sem_hdl);
received_bytes = 0;
tusbd_cdc_receive(coreid, cdcd_app_recv_buffer, CDCD_APP_BUFFER_SIZE, true);
}
void tusbd_cdc_xfer_isr(uint8_t coreid, tusb_event_t event, cdc_pipeid_t pipe_id, uint32_t xferred_bytes)
{
switch ( pipe_id )
{
case CDC_PIPE_DATA_OUT:
switch(event)
{
case TUSB_EVENT_XFER_COMPLETE:
received_bytes = min16_of(xferred_bytes, CDCD_APP_BUFFER_SIZE); // discard overflow bytes
osal_semaphore_post(sem_hdl); // notify main task
break;
case TUSB_EVENT_XFER_ERROR:
xferred_bytes = 0; // ignore
break;
case TUSB_EVENT_XFER_STALLED:
default :
ASSERT(false, VOID_RETURN);
break;
}
break;
case CDC_PIPE_DATA_IN:
case CDC_PIPE_NOTIFICATION:
default:
break;
}
}
OSAL_TASK_FUNCTION( cdcd_serial_app_task ) (void* p_task_para)
{
tusb_error_t error;
OSAL_TASK_LOOP_BEGIN
osal_semaphore_wait(sem_hdl, OSAL_TIMEOUT_WAIT_FOREVER, &error);
if ( tusbd_cdc_is_configured(0) )
{
if ( received_bytes )
{ // echo back
memcpy(cdcd_app_send_buffer, cdcd_app_recv_buffer, received_bytes);
tusbd_cdc_send(0, cdcd_app_send_buffer, received_bytes, false);
received_bytes = 0;
}
tusbd_cdc_receive(0, cdcd_app_recv_buffer, CDCD_APP_BUFFER_SIZE, true);
}
OSAL_TASK_LOOP_END
}
#endif

View File

@ -0,0 +1,75 @@
/**************************************************************************/
/*!
@file cdcd_app.h
@author hathach (tinyusb.org)
@section LICENSE
Software License Agreement (BSD License)
Copyright (c) 2013, hathach (tinyusb.org)
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holders nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This file is part of the tinyusb stack.
*/
/**************************************************************************/
/** \ingroup TBD
* \defgroup TBD
* \brief TBD
*
* @{
*/
#ifndef _TUSB_CDCD_APP_H_
#define _TUSB_CDCD_APP_H_
#include "boards/board.h"
#include "tusb.h"
#ifdef __cplusplus
extern "C" {
#endif
#if TUSB_CFG_DEVICE_CDC
void cdcd_serial_app_init(void);
OSAL_TASK_FUNCTION( cdcd_serial_app_task ) (void* p_task_para);
#else
#define cdcd_serial_app_init()
#define cdcd_serial_app_task(x)
#endif
#ifdef __cplusplus
}
#endif
#endif /* _TUSB_CDCD_APP_H_ */
/** @} */

View File

@ -49,6 +49,7 @@
#include "mscd_app.h"
#include "keyboardd_app.h"
#include "moused_app.h"
#include "cdcd_app.h"
//--------------------------------------------------------------------+
// MACRO CONSTANT TYPEDEF
@ -68,16 +69,12 @@ void os_none_start_scheduler(void)
{
while (1)
{
// tusb_task_runner();
tusb_task_runner();
led_blinking_task(NULL);
#if TUSB_CFG_DEVICE_HID_KEYBOARD
keyboardd_app_task(NULL);
#endif
#if TUSB_CFG_DEVICE_HID_MOUSE
moused_app_task(NULL);
#endif
cdcd_serial_app_task(NULL);
}
}
#endif
@ -95,6 +92,7 @@ int main(void)
msc_dev_app_init();
keyboardd_app_init();
moused_app_init();
cdcd_serial_app_init();
//------------- start OS scheduler (never return) -------------//
#if TUSB_CFG_OS == TUSB_OS_FREERTOS
@ -112,39 +110,6 @@ int main(void)
while(1) { } // should not be reached here
#if TUSB_CFG_DEVICE_CDC && 0
if (tusb_device_is_configured())
{
uint8_t cdc_char;
if( tusb_cdc_getc(&cdc_char) )
{
switch (cdc_char)
{
#ifdef TUSB_CFG_DEVICE_HID_KEYBOARD
case '1' :
{
uint8_t keys[6] = {HID_USAGE_KEYBOARD_aA + 'e' - 'a'};
tusbd_hid_keyboard_send_report(0x08, keys, 1); // windows + E --> open explorer
}
break;
#endif
#ifdef TUSB_CFG_DEVICE_HID_MOUSE
case '2' :
tusb_hid_mouse_send(0, 10, 10);
break;
#endif
default :
cdc_char = toupper(cdc_char);
tusb_cdc_putc(cdc_char);
break;
}
}
}
#endif
return 0;
}

View File

@ -139,8 +139,8 @@ tusb_descriptor_device_t app_tusb_desc_device =
.bDeviceClass = USB_DEVICE_CLASS_IAD,
.bDeviceSubClass = USB_DEVICE_SUBCLASS_IAD,
.bDeviceProtocol = USB_DEVICE_PROTOCOL_IAD,
#elif defined CFG_USB_CDC
.bDeviceClass = CDC_COMMUNICATION_INTERFACE_CLASS,
#elif TUSB_CFG_DEVICE_CDC
.bDeviceClass = TUSB_CLASS_CDC,
.bDeviceSubClass = 0x00,
.bDeviceProtocol = 0x00,
#else
@ -379,7 +379,7 @@ app_descriptor_configuration_t app_tusb_desc_configuration =
{
.bLength = sizeof(tusb_descriptor_endpoint_t),
.bDescriptorType = TUSB_DESC_TYPE_ENDPOINT,
.bEndpointAddress = 0x83,
.bEndpointAddress = MSC_EDPT_IN,
.bmAttributes = { .xfer = TUSB_XFER_BULK },
.wMaxPacketSize = { .size = TUSB_CFG_DEVICE_FULLSPEED ? 64 : 512 },
.bInterval = 1
@ -389,7 +389,7 @@ app_descriptor_configuration_t app_tusb_desc_configuration =
{
.bLength = sizeof(tusb_descriptor_endpoint_t),
.bDescriptorType = TUSB_DESC_TYPE_ENDPOINT,
.bEndpointAddress = 0x03,
.bEndpointAddress = MSC_EDPT_OUT,
.bmAttributes = { .xfer = TUSB_XFER_BULK },
.wMaxPacketSize = { .size = TUSB_CFG_DEVICE_FULLSPEED ? 64 : 512 },
.bInterval = 1

View File

@ -41,6 +41,9 @@
#include "tusb.h"
#define ENDPOINT_OUT_LOGICAL_TO_PHYSICAL(addr) (addr)
#define ENDPOINT_IN_LOGICAL_TO_PHYSICAL(addr) ((addr) | 0x80)
#define INTERFACE_INDEX_CDC 0
#define INTERFACE_INDEX_HID_KEYBOARD (INTERFACE_INDEX_CDC + 2*TUSB_CFG_DEVICE_CDC )
#define INTERFACE_INDEX_HID_MOUSE (INTERFACE_INDEX_HID_KEYBOARD + TUSB_CFG_DEVICE_HID_KEYBOARD )
@ -50,10 +53,20 @@
#define TOTAL_INTEFACES (2*TUSB_CFG_DEVICE_CDC + TUSB_CFG_DEVICE_HID_KEYBOARD + TUSB_CFG_DEVICE_HID_MOUSE + \
TUSB_CFG_DEVICE_HID_GENERIC + TUSB_CFG_DEVICE_MSC)
// USB Interface Assosication Descriptor
#define USB_DEVICE_CLASS_IAD USB_DEVICE_CLASS_MISCELLANEOUS
#define USB_DEVICE_SUBCLASS_IAD 0x02
#define USB_DEVICE_PROTOCOL_IAD 0x01
/* HID In/Out Endpoint Address */
#define HID_KEYBOARD_EP_IN ENDPOINT_IN_LOGICAL_TO_PHYSICAL(1)
#define HID_MOUSE_EP_IN ENDPOINT_IN_LOGICAL_TO_PHYSICAL(4)
/* CDC Endpoint Address */
#define CDC_NOTIFICATION_EP ENDPOINT_IN_LOGICAL_TO_PHYSICAL(2)
#define CDC_DATA_EP_OUT ENDPOINT_OUT_LOGICAL_TO_PHYSICAL(3)
#define CDC_DATA_EP_IN ENDPOINT_IN_LOGICAL_TO_PHYSICAL(3)
#define CDC_NOTIFICATION_EP_MAXPACKETSIZE 8
#define CDC_DATA_EP_MAXPACKET_SIZE 16
#define MSC_EDPT_IN ENDPOINT_IN_LOGICAL_TO_PHYSICAL(3)
#define MSC_EDPT_OUT ENDPOINT_OUT_LOGICAL_TO_PHYSICAL(3)
// Interface Assosication Descriptor if device is CDC + other class
#define IAD_DESC_REQUIRED ( TUSB_CFG_DEVICE_CDC && (TOTAL_INTEFACES > 2) )
@ -64,7 +77,7 @@
#ifndef TUSB_CFG_PRODUCT_ID
// Bitmap: MassStorage | Generic | Mouse | Key | CDC
#define PRODUCTID_BITMAP(interface, n) ( (TUSB_CFG_DEVICE_##interface) << (n) )
#define TUSB_CFG_PRODUCT_ID (0x2000 | ( PRODUCTID_BITMAP(CDC, 0) | PRODUCTID_BITMAP(HID_KEYBOARD, 1) | \
#define TUSB_CFG_PRODUCT_ID (0x4000 | ( PRODUCTID_BITMAP(CDC, 0) | PRODUCTID_BITMAP(HID_KEYBOARD, 1) | \
PRODUCTID_BITMAP(HID_MOUSE, 2) | PRODUCTID_BITMAP(HID_GENERIC, 3) | \
PRODUCTID_BITMAP(MSC, 4) ) )
#endif

View File

@ -81,8 +81,9 @@ void tusbh_cdc_unmounted_cb(uint8_t dev_addr)
void tusbh_cdc_xfer_isr(uint8_t dev_addr, tusb_event_t event, cdc_pipeid_t pipe_id, uint32_t xferred_bytes)
{
if ( pipe_id == CDC_PIPE_DATA_IN )
switch ( pipe_id )
{
case CDC_PIPE_DATA_IN:
switch(event)
{
case TUSB_EVENT_XFER_COMPLETE:
@ -99,9 +100,13 @@ void tusbh_cdc_xfer_isr(uint8_t dev_addr, tusb_event_t event, cdc_pipeid_t pipe_
ASSERT(false, VOID_RETURN);
break;
}
break;
case CDC_PIPE_DATA_OUT:
case CDC_PIPE_NOTIFICATION:
default:
break;
}
else if (pipe_id == CDC_PIPE_DATA_OUT) { }
else if (pipe_id == CDC_PIPE_NOTIFICATION) { }
}
//--------------------------------------------------------------------+

View File

@ -56,6 +56,15 @@
/** \defgroup ClassDriver_CDC_Common Common Definitions
* @{ */
/// CDC Pipe ID, used to indicate which pipe the API is addressing to (Notification, Out, In)
typedef enum {
CDC_PIPE_NOTIFICATION , ///< Notification pipe
CDC_PIPE_DATA_IN , ///< Data in pipe
CDC_PIPE_DATA_OUT , ///< Data out pipe
CDC_PIPE_ERROR , ///< Invalid Pipe ID
}cdc_pipeid_t;
//--------------------------------------------------------------------+
// CDC COMMUNICATION INTERFACE CLASS
//--------------------------------------------------------------------+
@ -143,49 +152,49 @@ typedef enum{
//--------------------------------------------------------------------+
/// Communication Interface Management Element Request Codes
typedef enum {
SEND_ENCAPSULATED_COMMAND = 0x00, ///< is used to issue a command in the format of the supported control protocol of the Communications Class interface
GET_ENCAPSULATED_RESPONSE = 0x01, ///< is used to request a response in the format of the supported control protocol of the Communications Class interface.
CDC_REQUEST_SEND_ENCAPSULATED_COMMAND = 0x00, ///< is used to issue a command in the format of the supported control protocol of the Communications Class interface
CDC_REQUEST_GET_ENCAPSULATED_RESPONSE = 0x01, ///< is used to request a response in the format of the supported control protocol of the Communications Class interface.
SET_COMM_FEATURE = 0x02,
GET_COMM_FEATURE = 0x03,
CLEAR_COMM_FEATURE = 0x04,
CDC_REQUEST_SET_COMM_FEATURE = 0x02,
CDC_REQUEST_GET_COMM_FEATURE = 0x03,
CDC_REQUEST_CLEAR_COMM_FEATURE = 0x04,
SET_AUX_LINE_STATE = 0x10,
SET_HOOK_STATE = 0x11,
PULSE_SETUP = 0x12,
SEND_PULSE = 0x13,
SET_PULSE_TIME = 0x14,
RING_AUX_JACK = 0x15,
CDC_REQUEST_SET_AUX_LINE_STATE = 0x10,
CDC_REQUEST_SET_HOOK_STATE = 0x11,
CDC_REQUEST_PULSE_SETUP = 0x12,
CDC_REQUEST_SEND_PULSE = 0x13,
CDC_REQUEST_SET_PULSE_TIME = 0x14,
CDC_REQUEST_RING_AUX_JACK = 0x15,
SET_LINE_CODING = 0x20,
GET_LINE_CODING = 0x21,
SET_CONTROL_LINE_STATE = 0x22,
SEND_BREAK = 0x23,
CDC_REQUEST_SET_LINE_CODING = 0x20,
CDC_REQUEST_GET_LINE_CODING = 0x21,
CDC_REQUEST_SET_CONTROL_LINE_STATE = 0x22,
CDC_REQUEST_SEND_BREAK = 0x23,
SET_RINGER_PARMS = 0x30,
GET_RINGER_PARMS = 0x31,
SET_OPERATION_PARMS = 0x32,
GET_OPERATION_PARMS = 0x33,
SET_LINE_PARMS = 0x34,
GET_LINE_PARMS = 0x35,
DIAL_DIGITS = 0x36,
SET_UNIT_PARAMETER = 0x37,
GET_UNIT_PARAMETER = 0x38,
CLEAR_UNIT_PARAMETER = 0x39,
GET_PROFILE = 0x3A,
CDC_REQUEST_SET_RINGER_PARMS = 0x30,
CDC_REQUEST_GET_RINGER_PARMS = 0x31,
CDC_REQUEST_SET_OPERATION_PARMS = 0x32,
CDC_REQUEST_GET_OPERATION_PARMS = 0x33,
CDC_REQUEST_SET_LINE_PARMS = 0x34,
CDC_REQUEST_GET_LINE_PARMS = 0x35,
CDC_REQUEST_DIAL_DIGITS = 0x36,
CDC_REQUEST_SET_UNIT_PARAMETER = 0x37,
CDC_REQUEST_GET_UNIT_PARAMETER = 0x38,
CDC_REQUEST_CLEAR_UNIT_PARAMETER = 0x39,
CDC_REQUEST_GET_PROFILE = 0x3A,
SET_ETHERNET_MULTICAST_FILTERS = 0x40,
SET_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER = 0x41,
GET_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER = 0x42,
SET_ETHERNET_PACKET_FILTER = 0x43,
GET_ETHERNET_STATISTIC = 0x44,
CDC_REQUEST_SET_ETHERNET_MULTICAST_FILTERS = 0x40,
CDC_REQUEST_SET_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER = 0x41,
CDC_REQUEST_GET_ETHERNET_POWER_MANAGEMENT_PATTERN_FILTER = 0x42,
CDC_REQUEST_SET_ETHERNET_PACKET_FILTER = 0x43,
CDC_REQUEST_GET_ETHERNET_STATISTIC = 0x44,
SET_ATM_DATA_FORMAT = 0x50,
GET_ATM_DEVICE_STATISTICS = 0x51,
SET_ATM_DEFAULT_VC = 0x52,
GET_ATM_VC_STATISTICS = 0x53,
CDC_REQUEST_SET_ATM_DATA_FORMAT = 0x50,
CDC_REQUEST_GET_ATM_DEVICE_STATISTICS = 0x51,
CDC_REQUEST_SET_ATM_DEFAULT_VC = 0x52,
CDC_REQUEST_GET_ATM_VC_STATISTICS = 0x53,
MDLM_SEMANTIC_MODEL = 0x60,
CDC_REQUEST_MDLM_SEMANTIC_MODEL = 0x60,
}cdc_management_request_t;
//--------------------------------------------------------------------+
@ -194,7 +203,7 @@ typedef enum {
/// Communication Interface Management Element Notification Codes
typedef enum {
NETWORK_CONNECTION = 0x00, ///< This notification allows the device to notify the host about network connection status.
RESPONSE_AVAILABLE = 0x01, ///< This notification allows the device to notify the hostthat a response is available. This response can be retrieved with a subsequent \ref GET_ENCAPSULATED_RESPONSE request.
RESPONSE_AVAILABLE = 0x01, ///< This notification allows the device to notify the hostthat a response is available. This response can be retrieved with a subsequent \ref CDC_REQUEST_GET_ENCAPSULATED_RESPONSE request.
AUX_JACK_HOOK_STATE = 0x08,
RING_DETECT = 0x09,
@ -358,6 +367,26 @@ static inline uint8_t cdc_functional_desc_typeof(uint8_t const * p_desc)
return p_desc[2];
}
//--------------------------------------------------------------------+
// Requests
//--------------------------------------------------------------------+
typedef ATTR_PACKED_STRUCT(struct) {
uint32_t bit_rate;
uint8_t stop_bits; ///< 0: 1 stop bit - 1: 1.5 stop bits - 2: 2 stop bits
uint8_t parity; ///< 0: None - 1: Odd - 2: Even - 3: Mark - 4: Space
uint8_t data_bits; ///< can be 5, 6, 7, 8 or 16
} cdc_line_coding_t;
STATIC_ASSERT(sizeof(cdc_line_coding_t) == 7, "size is not correct");
typedef ATTR_PACKED_STRUCT(struct) {
uint16_t dte_is_present : 1; ///< Indicates to DCE if DTE is presentor not. This signal corresponds to V.24 signal 108/2 and RS-232 signal DTR.
uint16_t half_duplex_carrier_control : 1;
uint16_t : 14;
} cdc_line_control_state_t;
STATIC_ASSERT(sizeof(cdc_line_control_state_t) == 2, "size is not correct");
/** @} */
#ifdef __cplusplus

239
tinyusb/class/cdc_device.c Normal file
View File

@ -0,0 +1,239 @@
/**************************************************************************/
/*!
@file cdc_device.c
@author hathach (tinyusb.org)
@section LICENSE
Software License Agreement (BSD License)
Copyright (c) 2013, hathach (tinyusb.org)
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holders nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This file is part of the tinyusb stack.
*/
/**************************************************************************/
#include "tusb_option.h"
#if (MODE_DEVICE_SUPPORTED && TUSB_CFG_DEVICE_CDC)
#define _TINY_USB_SOURCE_FILE_
//--------------------------------------------------------------------+
// INCLUDE
//--------------------------------------------------------------------+
#include "common/common.h"
#include "cdc_device.h"
//--------------------------------------------------------------------+
// MACRO CONSTANT TYPEDEF
//--------------------------------------------------------------------+
enum {
INTERFACE_INVALID_NUMBER = UINT8_MAX
};
static cdc_line_coding_t cdcd_line_coding[CONTROLLER_DEVICE_NUMBER] TUSB_CFG_ATTR_USBRAM;
typedef struct {
uint8_t interface_number;
cdc_acm_capability_t acm_capability;
endpoint_handle_t edpt_hdl[3]; // notification, data in, data out
}cdcd_data_t;
//--------------------------------------------------------------------+
// INTERNAL OBJECT & FUNCTION DECLARATION
//--------------------------------------------------------------------+
cdcd_data_t cdcd_data[CONTROLLER_DEVICE_NUMBER];
static inline bool cdcd_is_configured(uint8_t coreid) ATTR_PURE ATTR_ALWAYS_INLINE;
static inline bool cdcd_is_configured(uint8_t coreid)
{
return cdcd_data[coreid].interface_number != INTERFACE_INVALID_NUMBER;
}
tusb_error_t cdcd_xfer(uint8_t coreid, cdc_pipeid_t pipeid, void * p_buffer, uint32_t length, bool is_notify)
{
ASSERT(cdcd_is_configured(coreid), TUSB_ERROR_USBD_INTERFACE_NOT_CONFIGURED);
cdcd_data_t* p_cdc = &cdcd_data[coreid];
ASSERT_FALSE( dcd_pipe_is_busy(p_cdc->edpt_hdl[pipeid]), TUSB_ERROR_INTERFACE_IS_BUSY);
ASSERT_STATUS( dcd_pipe_xfer(p_cdc->edpt_hdl[pipeid], p_buffer, length, is_notify) );
return TUSB_ERROR_NONE;
}
//--------------------------------------------------------------------+
// APPLICATION API
//--------------------------------------------------------------------+
bool tusbd_cdc_is_configured(uint8_t coreid)
{
return cdcd_is_configured(coreid);
}
tusb_error_t tusbd_cdc_receive(uint8_t coreid, void * p_buffer, uint32_t length, bool is_notify)
{
return cdcd_xfer(coreid, CDC_PIPE_DATA_OUT, p_buffer, length, is_notify);
}
tusb_error_t tusbd_cdc_send(uint8_t coreid, void * p_data, uint32_t length, bool is_notify)
{
return cdcd_xfer(coreid, CDC_PIPE_DATA_IN, p_data, length, is_notify);
}
//--------------------------------------------------------------------+
// USBD-CLASS API
//--------------------------------------------------------------------+
void cdcd_init(void)
{
memclr_(cdcd_data, sizeof(cdcd_data_t)*CONTROLLER_DEVICE_NUMBER);
// default line coding is : stop bit = 1, parity = none, data bits = 8
memclr_(cdcd_line_coding, sizeof(cdc_line_coding_t)*CONTROLLER_DEVICE_NUMBER);
for(uint8_t i=0; i<CONTROLLER_DEVICE_NUMBER; i++) cdcd_line_coding[i].data_bits = 8;
}
tusb_error_t cdcd_open(uint8_t coreid, tusb_descriptor_interface_t const * p_interface_desc, uint16_t *p_length)
{
if ( CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL != p_interface_desc->bInterfaceSubClass) return TUSB_ERROR_CDC_UNSUPPORTED_SUBCLASS;
if ( !(is_in_range(CDC_COMM_PROTOCOL_ATCOMMAND, p_interface_desc->bInterfaceProtocol, CDC_COMM_PROTOCOL_ATCOMMAND_CDMA) ||
0xff == p_interface_desc->bInterfaceProtocol) )
{
return TUSB_ERROR_CDC_UNSUPPORTED_PROTOCOL;
}
uint8_t const * p_desc = descriptor_next ( (uint8_t const *) p_interface_desc );
cdcd_data_t * p_cdc = &cdcd_data[coreid];
//------------- Communication Interface -------------//
(*p_length) = sizeof(tusb_descriptor_interface_t);
while( TUSB_DESC_TYPE_INTERFACE_CLASS_SPECIFIC == p_desc[DESCRIPTOR_OFFSET_TYPE] )
{ // Communication Functional Descriptors
if ( CDC_FUNC_DESC_ABSTRACT_CONTROL_MANAGEMENT == cdc_functional_desc_typeof(p_desc) )
{ // save ACM bmCapabilities
p_cdc->acm_capability = ((cdc_desc_func_abstract_control_management_t const *) p_desc)->bmCapabilities;
}
(*p_length) += p_desc[DESCRIPTOR_OFFSET_LENGTH];
p_desc = descriptor_next(p_desc);
}
if ( TUSB_DESC_TYPE_ENDPOINT == p_desc[DESCRIPTOR_OFFSET_TYPE])
{ // notification endpoint if any
p_cdc->edpt_hdl[CDC_PIPE_NOTIFICATION] = dcd_pipe_open(coreid, (tusb_descriptor_endpoint_t const *) p_desc, TUSB_CLASS_CDC);
(*p_length) += p_desc[DESCRIPTOR_OFFSET_LENGTH];
p_desc = descriptor_next(p_desc);
ASSERT(endpointhandle_is_valid(p_cdc->edpt_hdl[CDC_PIPE_NOTIFICATION]), TUSB_ERROR_DCD_OPEN_PIPE_FAILED);
}
//------------- Data Interface (if any) -------------//
if ( (TUSB_DESC_TYPE_INTERFACE == p_desc[DESCRIPTOR_OFFSET_TYPE]) &&
(TUSB_CLASS_CDC_DATA == ((tusb_descriptor_interface_t const *) p_desc)->bInterfaceClass) )
{
(*p_length) += p_desc[DESCRIPTOR_OFFSET_LENGTH];
p_desc = descriptor_next(p_desc);
// data endpoints expected to be in pairs
for(uint32_t i=0; i<2; i++)
{
tusb_descriptor_endpoint_t const *p_endpoint = (tusb_descriptor_endpoint_t const *) p_desc;
ASSERT_INT(TUSB_DESC_TYPE_ENDPOINT, p_endpoint->bDescriptorType, TUSB_ERROR_DESCRIPTOR_CORRUPTED);
ASSERT_INT(TUSB_XFER_BULK, p_endpoint->bmAttributes.xfer, TUSB_ERROR_DESCRIPTOR_CORRUPTED);
endpoint_handle_t * p_edpt_hdl = ( p_endpoint->bEndpointAddress & TUSB_DIR_DEV_TO_HOST_MASK ) ?
&p_cdc->edpt_hdl[CDC_PIPE_DATA_IN] : &p_cdc->edpt_hdl[CDC_PIPE_DATA_OUT] ;
(*p_edpt_hdl) = dcd_pipe_open(coreid, p_endpoint, TUSB_CLASS_CDC);
ASSERT ( endpointhandle_is_valid(*p_edpt_hdl), TUSB_ERROR_DCD_OPEN_PIPE_FAILED );
(*p_length) += p_desc[DESCRIPTOR_OFFSET_LENGTH];
p_desc = descriptor_next( p_desc );
}
}
p_cdc->interface_number = p_interface_desc->bInterfaceNumber;
tusbd_cdc_mounted_cb(coreid);
return TUSB_ERROR_NONE;
}
void cdcd_bus_reset(uint8_t coreid)
{
// no need to close opened pipe, dcd bus reset will put controller's endpoints to default state
memclr_(&cdcd_data[coreid], sizeof(cdcd_data_t));
cdcd_data[coreid].interface_number = INTERFACE_INVALID_NUMBER;
}
tusb_error_t cdcd_control_request(uint8_t coreid, tusb_control_request_t const * p_request)
{
//------------- Class Specific Request -------------//
if (p_request->bmRequestType_bit.type != TUSB_REQUEST_TYPE_CLASS) return TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT;
switch(p_request->bRequest)
{
case CDC_REQUEST_GET_LINE_CODING:
dcd_pipe_control_xfer(coreid, p_request->bmRequestType_bit.direction,
&cdcd_line_coding[coreid], min16_of(sizeof(cdc_line_coding_t), p_request->wLength) );
break;
case CDC_REQUEST_SET_LINE_CODING:
dcd_pipe_control_xfer(coreid, p_request->bmRequestType_bit.direction,
&cdcd_line_coding[coreid], min16_of(sizeof(cdc_line_coding_t), p_request->wLength) );
// TODO notify application
break;
case CDC_REQUEST_SET_CONTROL_LINE_STATE: // TODO extract DTE present
dcd_pipe_control_xfer(coreid, p_request->bmRequestType_bit.direction, NULL, 0);
break;
default: return TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT;
}
return TUSB_ERROR_NONE;
}
void cdcd_isr(endpoint_handle_t edpt_hdl, tusb_event_t event, uint32_t xferred_bytes)
{
cdcd_data_t const * p_cdc = &cdcd_data[edpt_hdl.coreid];
for(cdc_pipeid_t pipeid=CDC_PIPE_NOTIFICATION; pipeid < CDC_PIPE_ERROR; pipeid++ )
{
if ( endpointhandle_is_equal(edpt_hdl, p_cdc->edpt_hdl[pipeid]) )
{
tusbd_cdc_xfer_isr(edpt_hdl.coreid, event, pipeid, xferred_bytes);
return;
}
}
}
#endif

View File

@ -0,0 +1,89 @@
/**************************************************************************/
/*!
@file cdc_device.h
@author hathach (tinyusb.org)
@section LICENSE
Software License Agreement (BSD License)
Copyright (c) 2013, hathach (tinyusb.org)
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holders nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
This file is part of the tinyusb stack.
*/
/**************************************************************************/
/** \ingroup TBD
* \defgroup TBD
* \brief TBD
*
* @{
*/
#ifndef _TUSB_CDC_DEVICE_H_
#define _TUSB_CDC_DEVICE_H_
#include "common/common.h"
#include "device/usbd.h"
#include "cdc.h"
#ifdef __cplusplus
extern "C" {
#endif
//--------------------------------------------------------------------+
// APPLICATION API
//--------------------------------------------------------------------+
bool tusbd_cdc_is_configured(uint8_t coreid);
tusb_error_t tusbd_cdc_send(uint8_t coreid, void * p_data, uint32_t length, bool is_notify);
tusb_error_t tusbd_cdc_receive(uint8_t coreid, void * p_buffer, uint32_t length, bool is_notify);
//------------- Callback -------------//
void tusbd_cdc_mounted_cb(uint8_t coreid);
void tusbd_cdc_unmounted_cb(uint8_t coreid);
void tusbd_cdc_xfer_isr(uint8_t coreid, tusb_event_t event, cdc_pipeid_t pipe_id, uint32_t xferred_bytes);
//--------------------------------------------------------------------+
// USBD-CLASS DRIVER API
//--------------------------------------------------------------------+
#ifdef _TINY_USB_SOURCE_FILE_
void cdcd_init(void);
tusb_error_t cdcd_open(uint8_t coreid, tusb_descriptor_interface_t const * p_interface_desc, uint16_t *p_length);
void cdcd_bus_reset(uint8_t coreid);
tusb_error_t cdcd_control_request(uint8_t coreid, tusb_control_request_t const * p_request);
void cdcd_isr(endpoint_handle_t edpt_hdl, tusb_event_t event, uint32_t xferred_bytes);
#endif
#ifdef __cplusplus
}
#endif
#endif /* _TUSB_CDC_DEVICE_H_ */
/** @} */

View File

@ -165,15 +165,12 @@ tusb_error_t cdch_open_subtask(uint8_t dev_addr, tusb_descriptor_interface_t con
OSAL_SUBTASK_BEGIN
if ( CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL != p_interface_desc->bInterfaceSubClass)
{
return TUSB_ERROR_CDCH_UNSUPPORTED_SUBCLASS;
}
if ( CDC_COMM_SUBCLASS_ABSTRACT_CONTROL_MODEL != p_interface_desc->bInterfaceSubClass) return TUSB_ERROR_CDC_UNSUPPORTED_SUBCLASS;
if ( !(is_in_range(CDC_COMM_PROTOCOL_ATCOMMAND, p_interface_desc->bInterfaceProtocol, CDC_COMM_PROTOCOL_ATCOMMAND_CDMA) ||
0xff == p_interface_desc->bInterfaceProtocol) )
{
return TUSB_ERROR_CDCH_UNSUPPORTED_PROTOCOL;
return TUSB_ERROR_CDC_UNSUPPORTED_PROTOCOL;
}
uint8_t const * p_desc = descriptor_next ( (uint8_t const *) p_interface_desc );

View File

@ -50,13 +50,6 @@
extern "C" {
#endif
/// CDC Pipe ID, used to indicate which pipe the API is addressing to (Notification, Out, In)
typedef enum {
CDC_PIPE_ERROR = 0 , ///< Invalid Pipe ID
CDC_PIPE_NOTIFICATION , ///< Notificaiton pipe
CDC_PIPE_DATA_IN , ///< Data in pipe
CDC_PIPE_DATA_OUT ///< Data out pipe
}cdc_pipeid_t;
//--------------------------------------------------------------------+
// APPLICATION PUBLIC API

View File

@ -248,7 +248,7 @@ static tusb_error_t send_message_get_response_subtask( uint8_t dev_addr, cdch_da
//------------- Send RNDIS Control Message -------------//
OSAL_SUBTASK_INVOKED_AND_WAIT(
usbh_control_xfer_subtask( dev_addr, bm_request_type(TUSB_DIR_HOST_TO_DEV, TUSB_REQUEST_TYPE_CLASS, TUSB_REQUEST_RECIPIENT_INTERFACE),
SEND_ENCAPSULATED_COMMAND, 0, p_cdc->interface_number,
CDC_REQUEST_SEND_ENCAPSULATED_COMMAND, 0, p_cdc->interface_number,
mess_length, p_mess),
error
);
@ -263,7 +263,7 @@ static tusb_error_t send_message_get_response_subtask( uint8_t dev_addr, cdch_da
//------------- Get RNDIS Message Initialize Complete -------------//
OSAL_SUBTASK_INVOKED_AND_WAIT(
usbh_control_xfer_subtask( dev_addr, bm_request_type(TUSB_DIR_DEV_TO_HOST, TUSB_REQUEST_TYPE_CLASS, TUSB_REQUEST_RECIPIENT_INTERFACE),
GET_ENCAPSULATED_RESPONSE, 0, p_cdc->interface_number,
CDC_REQUEST_GET_ENCAPSULATED_RESPONSE, 0, p_cdc->interface_number,
RNDIS_MSG_PAYLOAD_MAX, p_response),
error
);

View File

@ -83,8 +83,8 @@
ENTRY(TUSB_ERROR_HIDD_DESCRIPTOR_INTERFACE )\
ENTRY(TUSB_ERROR_HIDH_NOT_SUPPORTED_PROTOCOL )\
ENTRY(TUSB_ERROR_HIDH_NOT_SUPPORTED_SUBCLASS )\
ENTRY(TUSB_ERROR_CDCH_UNSUPPORTED_SUBCLASS )\
ENTRY(TUSB_ERROR_CDCH_UNSUPPORTED_PROTOCOL )\
ENTRY(TUSB_ERROR_CDC_UNSUPPORTED_SUBCLASS )\
ENTRY(TUSB_ERROR_CDC_UNSUPPORTED_PROTOCOL )\
ENTRY(TUSB_ERROR_CDCH_DEVICE_NOT_MOUNTED )\
ENTRY(TUSB_ERROR_MSC_UNSUPPORTED_PROTOCOL )\
ENTRY(TUSB_ERROR_MSCH_UNKNOWN_SCSI_COMMAND )\
@ -94,7 +94,9 @@
ENTRY(TUSB_ERROR_DCD_FAILED )\
ENTRY(TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT )\
ENTRY(TUSB_ERROR_DCD_NOT_ENOUGH_QTD )\
ENTRY(TUSB_ERROR_DCD_OPEN_PIPE_FAILED )\
ENTRY(TUSB_ERROR_NOT_SUPPORTED_YET )\
ENTRY(TUSB_ERROR_USBD_INTERFACE_NOT_CONFIGURED )\
ENTRY(TUSB_ERROR_FAILED )\

View File

@ -53,8 +53,6 @@
extern "C" {
#endif
#define ENDPOINT_OUT_LOGICAL_TO_PHYSICAL(addr) (addr)
#define ENDPOINT_IN_LOGICAL_TO_PHYSICAL(addr) ((addr) | 0x80)
#define STRING_LEN_BYTE2UNICODE(n) (2 + ((n)<<1))
//--------------------------------------------------------------------+

View File

@ -92,6 +92,7 @@ endpoint_handle_t dcd_pipe_open(uint8_t coreid, tusb_descriptor_endpoint_t const
tusb_error_t dcd_pipe_queue_xfer(endpoint_handle_t edpt_hdl, void * buffer, uint16_t total_bytes) ATTR_WARN_UNUSED_RESULT; // only queue, not transferring yet
tusb_error_t dcd_pipe_xfer(endpoint_handle_t edpt_hdl, void * buffer, uint16_t total_bytes, bool int_on_complete) ATTR_WARN_UNUSED_RESULT;
tusb_error_t dcd_pipe_stall(endpoint_handle_t edpt_hdl) ATTR_WARN_UNUSED_RESULT;
bool dcd_pipe_is_busy(endpoint_handle_t edpt_hdl) ATTR_WARN_UNUSED_RESULT ;
// TODO coreid + endpoint address are part of endpoint handle, not endpoint handle, data toggle also need to be reset
tusb_error_t dcd_pipe_clear_stall(uint8_t coreid, uint8_t edpt_addr);

View File

@ -1,141 +0,0 @@
/***********************************************************************
* $Id:: error.h 228 2011-07-15 18:58:20Z usb06052 $
*
* Project: LPC chip software
*
* Description:
* This file contains unified error codes to be used across driver,
* middleware, applications, hal and demo software.
*
* Notes:
*
***********************************************************************
* 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 __LPC_ERROR_H__
#define __LPC_ERROR_H__
/** \file
* \brief Error code returned by Boot ROM drivers/library functions.
* \ingroup Common
*
* This file contains unified error codes to be used across driver,
* middleware, applications, hal and demo software.
*
*/
/** Error code returned by Boot ROM drivers/library functions
*
* Error codes are a 32-bit value with :
* - The 16 MSB contains the peripheral code number
* - The 16 LSB contains an error code number associated to that peripheral
*
*/
typedef enum
{
/**\b 0x00000000*/ LPC_OK=0, /**< enum value returned on Success */
/**\b 0xFFFFFFFF*/ ERR_FAILED = -1, /**< enum value returned on general failure */
/* ISP related errors */
ERR_ISP_BASE = 0x00000000,
/*0x00000001*/ ERR_ISP_INVALID_COMMAND = ERR_ISP_BASE + 1,
/*0x00000002*/ ERR_ISP_SRC_ADDR_ERROR, /* Source address not on word boundary */
/*0x00000003*/ ERR_ISP_DST_ADDR_ERROR, /* Destination address not on word or 256 byte boundary */
/*0x00000004*/ ERR_ISP_SRC_ADDR_NOT_MAPPED,
/*0x00000005*/ ERR_ISP_DST_ADDR_NOT_MAPPED,
/*0x00000006*/ ERR_ISP_COUNT_ERROR, /* Byte count is not multiple of 4 or is not a permitted value */
/*0x00000007*/ ERR_ISP_INVALID_SECTOR,
/*0x00000008*/ ERR_ISP_SECTOR_NOT_BLANK,
/*0x00000009*/ ERR_ISP_SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION,
/*0x0000000A*/ ERR_ISP_COMPARE_ERROR,
/*0x0000000B*/ ERR_ISP_BUSY, /* Flash programming hardware interface is busy */
/*0x0000000C*/ ERR_ISP_PARAM_ERROR, /* Insufficient number of parameters */
/*0x0000000D*/ ERR_ISP_ADDR_ERROR, /* Address not on word boundary */
/*0x0000000E*/ ERR_ISP_ADDR_NOT_MAPPED,
/*0x0000000F*/ ERR_ISP_CMD_LOCKED, /* Command is locked */
/*0x00000010*/ ERR_ISP_INVALID_CODE, /* Unlock code is invalid */
/*0x00000011*/ ERR_ISP_INVALID_BAUD_RATE,
/*0x00000012*/ ERR_ISP_INVALID_STOP_BIT,
/*0x00000013*/ ERR_ISP_CODE_READ_PROTECTION_ENABLED,
/* ROM API related errors */
ERR_API_BASE = 0x00010000,
/**\b 0x00010001*/ ERR_API_INVALID_PARAMS = ERR_API_BASE + 1, /**< Invalid parameters*/
/**\b 0x00010002*/ ERR_API_INVALID_PARAM1, /**< PARAM1 is invalid */
/**\b 0x00010003*/ ERR_API_INVALID_PARAM2, /**< PARAM2 is invalid */
/**\b 0x00010004*/ ERR_API_INVALID_PARAM3, /**< PARAM3 is invalid */
/**\b 0x00010005*/ ERR_API_MOD_INIT, /**< API is called before module init */
/* SPIFI API related errors */
ERR_SPIFI_BASE = 0x00020000,
/*0x00020001*/ ERR_SPIFI_DEVICE_ERROR =ERR_SPIFI_BASE+1,
/*0x00020002*/ ERR_SPIFI_INTERNAL_ERROR,
/*0x00020003*/ ERR_SPIFI_TIMEOUT,
/*0x00020004*/ ERR_SPIFI_OPERAND_ERROR,
/*0x00020005*/ ERR_SPIFI_STATUS_PROBLEM,
/*0x00020006*/ ERR_SPIFI_UNKNOWN_EXT,
/*0x00020007*/ ERR_SPIFI_UNKNOWN_ID,
/*0x00020008*/ ERR_SPIFI_UNKNOWN_TYPE,
/*0x00020009*/ ERR_SPIFI_UNKNOWN_MFG,
/* Security API related errors */
ERR_SEC_BASE = 0x00030000,
/*0x00030001*/ ERR_SEC_AES_WRONG_CMD=ERR_SEC_BASE+1,
/*0x00030002*/ ERR_SEC_AES_NOT_SUPPORTED,
/*0x00030003*/ ERR_SEC_AES_KEY_ALREADY_PROGRAMMED,
/* USB device stack related errors */
ERR_USBD_BASE = 0x00040000,
/**\b 0x00040001*/ ERR_USBD_INVALID_REQ = ERR_USBD_BASE + 1, /**< invalid request */
/**\b 0x00040002*/ ERR_USBD_UNHANDLED, /**< Callback did not process the event */
/**\b 0x00040003*/ ERR_USBD_STALL, /**< Stall the endpoint on which the call back is called */
/**\b 0x00040004*/ ERR_USBD_SEND_ZLP, /**< Send ZLP packet on the endpoint on which the call back is called */
/**\b 0x00040005*/ ERR_USBD_SEND_DATA, /**< Send data packet on the endpoint on which the call back is called */
/**\b 0x00040006*/ ERR_USBD_BAD_DESC, /**< Bad descriptor*/
/**\b 0x00040007*/ ERR_USBD_BAD_CFG_DESC,/**< Bad config descriptor*/
/**\b 0x00040009*/ ERR_USBD_BAD_INTF_DESC,/**< Bad interface descriptor*/
/**\b 0x0004000a*/ ERR_USBD_BAD_EP_DESC,/**< Bad endpoint descriptor*/
/**\b 0x0004000b*/ ERR_USBD_BAD_MEM_BUF, /**< Bad alignment of buffer passed. */
/**\b 0x0004000c*/ ERR_USBD_TOO_MANY_CLASS_HDLR, /**< Too many class handlers. */
/* CGU related errors */
ERR_CGU_BASE = 0x00050000,
/*0x00050001*/ ERR_CGU_NOT_IMPL=ERR_CGU_BASE+1,
/*0x00050002*/ ERR_CGU_INVALID_PARAM,
/*0x00050003*/ ERR_CGU_INVALID_SLICE,
/*0x00050004*/ ERR_CGU_OUTPUT_GEN,
/*0x00050005*/ ERR_CGU_DIV_SRC,
/*0x00050006*/ ERR_CGU_DIV_VAL,
/*0x00050007*/ ERR_CGU_SRC,
/* I2C related errors */
ERR_I2C_BASE = 0x00060000,
/*0x00060001*/ ERR_I2C_NAK=ERR_I2C_BASE+1,
/*0x00060002*/ ERR_I2C_BUFFER_OVERFLOW,
/*0x00060003*/ ERR_I2C_BYTE_COUNT_ERR,
/*0x00060004*/ ERR_I2C_LOSS_OF_ARBRITRATION,
/*0x00060005*/ ERR_I2C_SLAVE_NOT_ADDRESSED,
/*0x00060006*/ ERR_I2C_LOSS_OF_ARBRITRATION_NAK_BIT,
/*0x00060007*/ ERR_I2C_GENERAL_FAILURE,
/*0x00060008*/ ERR_I2C_REGS_SET_TO_DEFAULT
} ErrorCode_t;
#ifndef offsetof
#define offsetof(s,m) (int)&(((s *)0)->m)
#endif
#define COMPILE_TIME_ASSERT(pred) switch(0){case 0:case pred:;}
#endif /* __LPC_ERROR_H__ */

View File

@ -1,652 +0,0 @@
/***********************************************************************
* $Id:: mw_usbd.h 197 2011-06-12 20:22:41Z usb06052 $
*
* Project: USB device ROM Stack
*
* Description:
* USB 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 __USB_H__
#define __USB_H__
/** \file
* \brief Common definitions and declarations for the USB stack.
*
* Common definitions and declarations for the USB stack.
* \addtogroup USBD_Core
* @{
*/
#include <stdint.h>
#if defined(__GNUC__)
/* As per http://gcc.gnu.org/onlinedocs/gcc/Attribute-Syntax.html#Attribute-Syntax,
6.29 Attributes Syntax
"An attribute specifier list may appear as part of a struct, union or
enum specifier. It may go either immediately after the struct, union
or enum keyword, or after the closing brace. The former syntax is
preferred. Where attribute specifiers follow the closing brace, they
are considered to relate to the structure, union or enumerated type
defined, not to any enclosing declaration the type specifier appears
in, and the type defined is not complete until after the attribute
specifiers."
So use POST_PACK immediately after struct keyword
*/
#define PRE_PACK
#define POST_PACK __attribute__((__packed__))
#define ALIGNED(n) __attribute__((aligned (n)))
#elif defined(__arm)
#define PRE_PACK __packed
#define POST_PACK
#define ALIGNED(n) __align(n)
#endif
/** Structure to pack lower and upper byte to form 16 bit word. */
PRE_PACK struct POST_PACK _WB_T
{
uint8_t L; /**< lower byte */
uint8_t H; /**< upper byte */
};
/** Structure to pack lower and upper byte to form 16 bit word.*/
typedef struct _WB_T WB_T;
/** Union of \ref _WB_T struct and 16 bit word.*/
PRE_PACK union POST_PACK __WORD_BYTE
{
uint16_t W; /**< data member to do 16 bit access */
WB_T WB; /**< data member to do 8 bit access */
} ;
/** Union of \ref _WB_T struct and 16 bit word.*/
typedef union __WORD_BYTE WORD_BYTE;
/** bmRequestType.Dir defines
* @{
*/
/** Request from host to device */
#define REQUEST_HOST_TO_DEVICE 0
/** Request from device to host */
#define REQUEST_DEVICE_TO_HOST 1
/** @} */
/** bmRequestType.Type defines
* @{
*/
/** Standard Request */
#define REQUEST_STANDARD 0
/** Class Request */
#define REQUEST_CLASS 1
/** Vendor Request */
#define REQUEST_VENDOR 2
/** Reserved Request */
#define REQUEST_RESERVED 3
/** @} */
/** bmRequestType.Recipient defines
* @{
*/
/** Request to device */
#define REQUEST_TO_DEVICE 0
/** Request to interface */
#define REQUEST_TO_INTERFACE 1
/** Request to endpoint */
#define REQUEST_TO_ENDPOINT 2
/** Request to other */
#define REQUEST_TO_OTHER 3
/** @} */
/** Structure to define 8 bit USB request.*/
PRE_PACK struct POST_PACK _BM_T
{
uint8_t Recipient : 5; /**< Recipeint type. */
uint8_t Type : 2; /**< Request type. */
uint8_t Dir : 1; /**< Directtion type. */
};
/** Structure to define 8 bit USB request.*/
typedef struct _BM_T BM_T;
/** Union of \ref _BM_T struct and 8 bit byte.*/
PRE_PACK union POST_PACK _REQUEST_TYPE
{
uint8_t B; /**< byte wide access memeber */
BM_T BM; /**< bitfield structure access memeber */
} ;
/** Union of \ref _BM_T struct and 8 bit byte.*/
typedef union _REQUEST_TYPE REQUEST_TYPE;
/** USB Standard Request Codes
* @{
*/
/** GET_STATUS request */
#define USB_REQUEST_GET_STATUS 0
/** CLEAR_FEATURE request */
#define USB_REQUEST_CLEAR_FEATURE 1
/** SET_FEATURE request */
#define USB_REQUEST_SET_FEATURE 3
/** SET_ADDRESS request */
#define USB_REQUEST_SET_ADDRESS 5
/** GET_DESCRIPTOR request */
#define USB_REQUEST_GET_DESCRIPTOR 6
/** SET_DESCRIPTOR request */
#define USB_REQUEST_SET_DESCRIPTOR 7
/** GET_CONFIGURATION request */
#define USB_REQUEST_GET_CONFIGURATION 8
/** SET_CONFIGURATION request */
#define USB_REQUEST_SET_CONFIGURATION 9
/** GET_INTERFACE request */
#define USB_REQUEST_GET_INTERFACE 10
/** SET_INTERFACE request */
#define USB_REQUEST_SET_INTERFACE 11
/** SYNC_FRAME request */
#define USB_REQUEST_SYNC_FRAME 12
/** @} */
/** USB GET_STATUS Bit Values
* @{
*/
/** SELF_POWERED status*/
#define USB_GETSTATUS_SELF_POWERED 0x01
/** REMOTE_WAKEUP capable status*/
#define USB_GETSTATUS_REMOTE_WAKEUP 0x02
/** ENDPOINT_STALL status*/
#define USB_GETSTATUS_ENDPOINT_STALL 0x01
/** @} */
/** USB Standard Feature selectors
* @{
*/
/** ENDPOINT_STALL feature*/
#define USB_FEATURE_ENDPOINT_STALL 0
/** REMOTE_WAKEUP feature*/
#define USB_FEATURE_REMOTE_WAKEUP 1
/** TEST_MODE feature*/
#define USB_FEATURE_TEST_MODE 2
/** @} */
/** USB Default Control Pipe Setup Packet*/
PRE_PACK struct POST_PACK _USB_SETUP_PACKET
{
REQUEST_TYPE bmRequestType; /**< This bitmapped field identifies the characteristics
of the specific request. \sa _BM_T.
*/
uint8_t bRequest; /**< This field specifies the particular request. The
Type bits in the bmRequestType field modify the meaning
of this field. \sa USBD_REQUEST.
*/
WORD_BYTE wValue; /**< Used to pass a parameter to the device, specific
to the request.
*/
WORD_BYTE wIndex; /**< Used to pass a parameter to the device, specific
to the request. The wIndex field is often used in
requests to specify an endpoint or an interface.
*/
uint16_t wLength; /**< This field specifies the length of the data
transferred during the second phase of the control
transfer.
*/
} ;
/** USB Default Control Pipe Setup Packet*/
typedef struct _USB_SETUP_PACKET USB_SETUP_PACKET;
/** USB Descriptor Types
* @{
*/
/** Device descriptor type */
#define USB_DEVICE_DESCRIPTOR_TYPE 1
/** Configuration descriptor type */
#define USB_CONFIGURATION_DESCRIPTOR_TYPE 2
/** String descriptor type */
#define USB_STRING_DESCRIPTOR_TYPE 3
/** Interface descriptor type */
#define USB_INTERFACE_DESCRIPTOR_TYPE 4
/** Endpoint descriptor type */
#define USB_ENDPOINT_DESCRIPTOR_TYPE 5
/** Device qualifier descriptor type */
#define USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE 6
/** Other speed configuration descriptor type */
#define USB_OTHER_SPEED_CONFIG_DESCRIPTOR_TYPE 7
/** Interface power descriptor type */
#define USB_INTERFACE_POWER_DESCRIPTOR_TYPE 8
/** OTG descriptor type */
#define USB_OTG_DESCRIPTOR_TYPE 9
/** Debug descriptor type */
#define USB_DEBUG_DESCRIPTOR_TYPE 10
/** Interface association descriptor type */
#define USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE 11
/** @} */
/** USB Device Classes
* @{
*/
/** Reserved device class */
#define USB_DEVICE_CLASS_RESERVED 0x00
/** Audio device class */
#define USB_DEVICE_CLASS_AUDIO 0x01
/** Communications device class */
#define USB_DEVICE_CLASS_COMMUNICATIONS 0x02
/** Human interface device class */
#define USB_DEVICE_CLASS_HUMAN_INTERFACE 0x03
/** monitor device class */
#define USB_DEVICE_CLASS_MONITOR 0x04
/** physical interface device class */
#define USB_DEVICE_CLASS_PHYSICAL_INTERFACE 0x05
/** power device class */
#define USB_DEVICE_CLASS_POWER 0x06
/** Printer device class */
#define USB_DEVICE_CLASS_PRINTER 0x07
/** Storage device class */
#define USB_DEVICE_CLASS_STORAGE 0x08
/** Hub device class */
#define USB_DEVICE_CLASS_HUB 0x09
/** miscellaneous device class */
#define USB_DEVICE_CLASS_MISCELLANEOUS 0xEF
/** Application device class */
#define USB_DEVICE_CLASS_APP 0xFE
/** Vendor specific device class */
#define USB_DEVICE_CLASS_VENDOR_SPECIFIC 0xFF
/** @} */
/** bmAttributes in Configuration Descriptor
* @{
*/
/** Power field mask */
#define USB_CONFIG_POWERED_MASK 0x40
/** Bus powered */
#define USB_CONFIG_BUS_POWERED 0x80
/** Self powered */
#define USB_CONFIG_SELF_POWERED 0xC0
/** remote wakeup */
#define USB_CONFIG_REMOTE_WAKEUP 0x20
/** @} */
/** bMaxPower in Configuration Descriptor */
#define USB_CONFIG_POWER_MA(mA) ((mA)/2)
/** bEndpointAddress in Endpoint Descriptor
* @{
*/
/** Endopint address mask */
#define USB_ENDPOINT_DIRECTION_MASK 0x80
/** Macro to convert OUT endopint number to endpoint address value. */
#define USB_ENDPOINT_OUT(addr) ((addr) | 0x00)
/** Macro to convert IN endopint number to endpoint address value. */
#define USB_ENDPOINT_IN(addr) ((addr) | 0x80)
/** @} */
/** bmAttributes in Endpoint Descriptor
* @{
*/
/** Endopint type mask */
#define USB_ENDPOINT_TYPE_MASK 0x03
/** Control Endopint type */
#define USB_ENDPOINT_TYPE_CONTROL 0x00
/** isochronous Endopint type */
#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01
/** bulk Endopint type */
#define USB_ENDPOINT_TYPE_BULK 0x02
/** interrupt Endopint type */
#define USB_ENDPOINT_TYPE_INTERRUPT 0x03
/** Endopint sync type mask */
#define USB_ENDPOINT_SYNC_MASK 0x0C
/** no synchronization Endopint */
#define USB_ENDPOINT_SYNC_NO_SYNCHRONIZATION 0x00
/** Asynchronous sync Endopint */
#define USB_ENDPOINT_SYNC_ASYNCHRONOUS 0x04
/** Adaptive sync Endopint */
#define USB_ENDPOINT_SYNC_ADAPTIVE 0x08
/** Synchronous sync Endopint */
#define USB_ENDPOINT_SYNC_SYNCHRONOUS 0x0C
/** Endopint usage type mask */
#define USB_ENDPOINT_USAGE_MASK 0x30
/** Endopint data usage type */
#define USB_ENDPOINT_USAGE_DATA 0x00
/** Endopint feedback usage type */
#define USB_ENDPOINT_USAGE_FEEDBACK 0x10
/** Endopint implicit feedback usage type */
#define USB_ENDPOINT_USAGE_IMPLICIT_FEEDBACK 0x20
/** Endopint reserved usage type */
#define USB_ENDPOINT_USAGE_RESERVED 0x30
/** @} */
/** Control endopint EP0's maximum packet size in high-speed mode.*/
#define USB_ENDPOINT_0_HS_MAXP 64
/** Control endopint EP0's maximum packet size in low-speed mode.*/
#define USB_ENDPOINT_0_LS_MAXP 8
/** Bulk endopint's maximum packet size in high-speed mode.*/
#define USB_ENDPOINT_BULK_HS_MAXP 512
/** USB Standard Device Descriptor */
PRE_PACK struct POST_PACK _USB_DEVICE_DESCRIPTOR
{
uint8_t bLength; /**< Size of this descriptor in bytes. */
uint8_t bDescriptorType; /**< DEVICE Descriptor Type. */
uint16_t bcdUSB; /**< BUSB Specification Release Number in
Binary-Coded Decimal (i.e., 2.10 is 210H).
This field identifies the release of the USB
Specification with which the device and its
descriptors are compliant.
*/
uint8_t bDeviceClass; /**< Class code (assigned by the USB-IF).
If this field is reset to zero, each interface
within a configuration specifies its own
class information and the various
interfaces operate independently.\n
If this field is set to a value between 1 and
FEH, the device supports different class
specifications on different interfaces and
the interfaces may not operate
independently. This value identifies the
class definition used for the aggregate
interfaces. \n
If this field is set to FFH, the device class
is vendor-specific.
*/
uint8_t bDeviceSubClass; /**< Subclass code (assigned by the USB-IF).
These codes are qualified by the value of
the bDeviceClass field. \n
If the bDeviceClass field is reset to zero,
this field must also be reset to zero. \n
If the bDeviceClass field is not set to FFH,
all values are reserved for assignment by
the USB-IF.
*/
uint8_t bDeviceProtocol; /**< Protocol code (assigned by the USB-IF).
These codes are qualified by the value of
the bDeviceClass and the
bDeviceSubClass fields. If a device
supports class-specific protocols on a
device basis as opposed to an interface
basis, this code identifies the protocols
that the device uses as defined by the
specification of the device class. \n
If this field is reset to zero, the device
does not use class-specific protocols on a
device basis. However, it may use classspecific
protocols on an interface basis. \n
If this field is set to FFH, the device uses a
vendor-specific protocol on a device basis.
*/
uint8_t bMaxPacketSize0; /**< Maximum packet size for endpoint zero
(only 8, 16, 32, or 64 are valid). For HS devices
is fixed to 64.
*/
uint16_t idVendor; /**< Vendor ID (assigned by the USB-IF). */
uint16_t idProduct; /**< Product ID (assigned by the manufacturer). */
uint16_t bcdDevice; /**< Device release number in binary-coded decimal. */
uint8_t iManufacturer; /**< Index of string descriptor describing manufacturer. */
uint8_t iProduct; /**< Index of string descriptor describing product. */
uint8_t iSerialNumber; /**< Index of string descriptor describing the device<63>s
serial number.
*/
uint8_t bNumConfigurations; /**< Number of possible configurations. */
} ;
/** USB Standard Device Descriptor */
typedef struct _USB_DEVICE_DESCRIPTOR USB_DEVICE_DESCRIPTOR;
/** USB 2.0 Device Qualifier Descriptor */
PRE_PACK struct POST_PACK _USB_DEVICE_QUALIFIER_DESCRIPTOR
{
uint8_t bLength; /**< Size of descriptor */
uint8_t bDescriptorType; /**< Device Qualifier Type */
uint16_t bcdUSB; /**< USB specification version number (e.g., 0200H for V2.00) */
uint8_t bDeviceClass; /**< Class Code */
uint8_t bDeviceSubClass; /**< SubClass Code */
uint8_t bDeviceProtocol; /**< Protocol Code */
uint8_t bMaxPacketSize0; /**< Maximum packet size for other speed */
uint8_t bNumConfigurations; /**< Number of Other-speed Configurations */
uint8_t bReserved; /**< Reserved for future use, must be zero */
} ;
/** USB 2.0 Device Qualifier Descriptor */
typedef struct _USB_DEVICE_QUALIFIER_DESCRIPTOR USB_DEVICE_QUALIFIER_DESCRIPTOR;
/** USB Standard Configuration Descriptor */
PRE_PACK struct POST_PACK _USB_CONFIGURATION_DESCRIPTOR
{
uint8_t bLength; /**< Size of this descriptor in bytes */
uint8_t bDescriptorType; /**< CONFIGURATION Descriptor Type*/
uint16_t wTotalLength; /**< Total length of data returned for this
configuration. Includes the combined length
of all descriptors (configuration, interface,
endpoint, and class- or vendor-specific)
returned for this configuration.*/
uint8_t bNumInterfaces; /**< Number of interfaces supported by this configuration*/
uint8_t bConfigurationValue; /**< Value to use as an argument to the
SetConfiguration() request to select this
configuration. */
uint8_t iConfiguration; /**< Index of string descriptor describing this
configuration*/
uint8_t bmAttributes; /**< Configuration characteristics \n
D7: Reserved (set to one)\n
D6: Self-powered \n
D5: Remote Wakeup \n
D4...0: Reserved (reset to zero) \n
D7 is reserved and must be set to one for
historical reasons. \n
A device configuration that uses power from
the bus and a local source reports a non-zero
value in bMaxPower to indicate the amount of
bus power required and sets D6. The actual
power source at runtime may be determined
using the GetStatus(DEVICE) request (see
USB 2.0 spec Section 9.4.5). \n
If a device configuration supports remote
wakeup, D5 is set to one.*/
uint8_t bMaxPower; /**< Maximum power consumption of the USB
device from the bus in this specific
configuration when the device is fully
operational. Expressed in 2 mA units
(i.e., 50 = 100 mA). \n
Note: A device configuration reports whether
the configuration is bus-powered or selfpowered.
Device status reports whether the
device is currently self-powered. If a device is
disconnected from its external power source, it
updates device status to indicate that it is no
longer self-powered. \n
A device may not increase its power draw
from the bus, when it loses its external power
source, beyond the amount reported by its
configuration. \n
If a device can continue to operate when
disconnected from its external power source, it
continues to do so. If the device cannot
continue to operate, it fails operations it can
no longer support. The USB System Software
may determine the cause of the failure by
checking the status and noting the loss of the
device<EFBFBD>s power source.*/
} ;
/** USB Standard Configuration Descriptor */
typedef struct _USB_CONFIGURATION_DESCRIPTOR USB_CONFIGURATION_DESCRIPTOR;
/** USB Standard Interface Descriptor */
PRE_PACK struct POST_PACK _USB_INTERFACE_DESCRIPTOR
{
uint8_t bLength; /**< Size of this descriptor in bytes*/
uint8_t bDescriptorType; /**< INTERFACE Descriptor Type*/
uint8_t bInterfaceNumber; /**< Number of this interface. Zero-based
value identifying the index in the array of
concurrent interfaces supported by this
configuration.*/
uint8_t bAlternateSetting; /**< Value used to select this alternate setting
for the interface identified in the prior field*/
uint8_t bNumEndpoints; /**< Number of endpoints used by this
interface (excluding endpoint zero). If this
value is zero, this interface only uses the
Default Control Pipe.*/
uint8_t bInterfaceClass; /**< Class code (assigned by the USB-IF). \n
A value of zero is reserved for future
standardization. \n
If this field is set to FFH, the interface
class is vendor-specific. \n
All other values are reserved for
assignment by the USB-IF.*/
uint8_t bInterfaceSubClass; /**< Subclass code (assigned by the USB-IF). \n
These codes are qualified by the value of
the bInterfaceClass field. \n
If the bInterfaceClass field is reset to zero,
this field must also be reset to zero. \n
If the bInterfaceClass field is not set to
FFH, all values are reserved for
assignment by the USB-IF.*/
uint8_t bInterfaceProtocol; /**< Protocol code (assigned by the USB). \n
These codes are qualified by the value of
the bInterfaceClass and the
bInterfaceSubClass fields. If an interface
supports class-specific requests, this code
identifies the protocols that the device
uses as defined by the specification of the
device class. \n
If this field is reset to zero, the device
does not use a class-specific protocol on
this interface. \n
If this field is set to FFH, the device uses
a vendor-specific protocol for this
interface.*/
uint8_t iInterface; /**< Index of string descriptor describing this interface*/
} ;
/** USB Standard Interface Descriptor */
typedef struct _USB_INTERFACE_DESCRIPTOR USB_INTERFACE_DESCRIPTOR;
/** USB Standard Endpoint Descriptor */
PRE_PACK struct POST_PACK _USB_ENDPOINT_DESCRIPTOR
{
uint8_t bLength; /**< Size of this descriptor in bytes*/
uint8_t bDescriptorType; /**< ENDPOINT Descriptor Type*/
uint8_t bEndpointAddress; /**< The address of the endpoint on the USB device
described by this descriptor. The address is
encoded as follows: \n
Bit 3...0: The endpoint number \n
Bit 6...4: Reserved, reset to zero \n
Bit 7: Direction, ignored for control endpoints
0 = OUT endpoint
1 = IN endpoint. \n \sa USBD_ENDPOINT_ADR_Type*/
uint8_t bmAttributes; /**< This field describes the endpoint<6E>s attributes when it is
configured using the bConfigurationValue. \n
Bits 1..0: Transfer Type
\li 00 = Control
\li 01 = Isochronous
\li 10 = Bulk
\li 11 = Interrupt \n
If not an isochronous endpoint, bits 5..2 are reserved
and must be set to zero. If isochronous, they are
defined as follows: \n
Bits 3..2: Synchronization Type
\li 00 = No Synchronization
\li 01 = Asynchronous
\li 10 = Adaptive
\li 11 = Synchronous \n
Bits 5..4: Usage Type
\li 00 = Data endpoint
\li 01 = Feedback endpoint
\li 10 = Implicit feedback Data endpoint
\li 11 = Reserved \n
Refer to Chapter 5 of USB 2.0 specification for more information. \n
All other bits are reserved and must be reset to zero.
Reserved bits must be ignored by the host.
\n \sa USBD_EP_ATTR_Type*/
uint16_t wMaxPacketSize; /**< Maximum packet size this endpoint is capable of
sending or receiving when this configuration is
selected. \n
For isochronous endpoints, this value is used to
reserve the bus time in the schedule, required for the
per-(micro)frame data payloads. The pipe may, on an
ongoing basis, actually use less bandwidth than that
reserved. The device reports, if necessary, the actual
bandwidth used via its normal, non-USB defined
mechanisms. \n
For all endpoints, bits 10..0 specify the maximum
packet size (in bytes). \n
For high-speed isochronous and interrupt endpoints: \n
Bits 12..11 specify the number of additional transaction
opportunities per microframe: \n
\li 00 = None (1 transaction per microframe)
\li 01 = 1 additional (2 per microframe)
\li 10 = 2 additional (3 per microframe)
\li 11 = Reserved \n
Bits 15..13 are reserved and must be set to zero.*/
uint8_t bInterval; /**< Interval for polling endpoint for data transfers.
Expressed in frames or microframes depending on the
device operating speed (i.e., either 1 millisecond or
125 <EFBFBD>s units).
\li For full-/high-speed isochronous endpoints, this value
must be in the range from 1 to 16. The bInterval value
is used as the exponent for a \f$ 2^(bInterval-1) \f$ value; e.g., a
bInterval of 4 means a period of 8 (\f$ 2^(4-1) \f$).
\li For full-/low-speed interrupt endpoints, the value of
this field may be from 1 to 255.
\li For high-speed interrupt endpoints, the bInterval value
is used as the exponent for a \f$ 2^(bInterval-1) \f$ value; e.g., a
bInterval of 4 means a period of 8 (\f$ 2^(4-1) \f$) . This value
must be from 1 to 16.
\li For high-speed bulk/control OUT endpoints, the
bInterval must specify the maximum NAK rate of the
endpoint. A value of 0 indicates the endpoint never
NAKs. Other values indicate at most 1 NAK each
bInterval number of microframes. This value must be
in the range from 0 to 255. \n
Refer to Chapter 5 of USB 2.0 specification for more information.
*/
} ;
/** USB Standard Endpoint Descriptor */
typedef struct _USB_ENDPOINT_DESCRIPTOR USB_ENDPOINT_DESCRIPTOR;
/** USB String Descriptor */
PRE_PACK struct POST_PACK _USB_STRING_DESCRIPTOR
{
uint8_t bLength; /**< Size of this descriptor in bytes*/
uint8_t bDescriptorType; /**< STRING Descriptor Type*/
uint16_t bString/*[]*/; /**< UNICODE encoded string */
} ;
/** USB String Descriptor */
typedef struct _USB_STRING_DESCRIPTOR USB_STRING_DESCRIPTOR;
/** USB Common Descriptor */
PRE_PACK struct POST_PACK _USB_COMMON_DESCRIPTOR
{
uint8_t bLength; /**< Size of this descriptor in bytes*/
uint8_t bDescriptorType; /**< Descriptor Type*/
} ;
/** USB Common Descriptor */
typedef struct _USB_COMMON_DESCRIPTOR USB_COMMON_DESCRIPTOR;
/** USB Other Speed Configuration */
PRE_PACK struct POST_PACK _USB_OTHER_SPEED_CONFIGURATION
{
uint8_t bLength; /**< Size of descriptor*/
uint8_t bDescriptorType; /**< Other_speed_Configuration Type*/
uint16_t wTotalLength; /**< Total length of data returned*/
uint8_t bNumInterfaces; /**< Number of interfaces supported by this speed configuration*/
uint8_t bConfigurationValue; /**< Value to use to select configuration*/
uint8_t IConfiguration; /**< Index of string descriptor*/
uint8_t bmAttributes; /**< Same as Configuration descriptor*/
uint8_t bMaxPower; /**< Same as Configuration descriptor*/
} ;
/** USB Other Speed Configuration */
typedef struct _USB_OTHER_SPEED_CONFIGURATION USB_OTHER_SPEED_CONFIGURATION;
/** \ingroup USBD_Core
* USB device stack/module handle.
*/
typedef void* USBD_HANDLE_T;
/** @}*/
#endif /* __USB_H__ */

View File

@ -1,31 +0,0 @@
/***********************************************************************
* $Id:: mw_usbd_adcuser.h 165 2011-04-14 17:41:11Z usb10131 $
*
* Project: USB device ROM Stack
*
* Description:
* USB Audio Device Class 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 __ADCUSER_H__
#define __ADCUSER_H__
/* Audio Device Class Requests Callback Functions */
#endif /* __ADCUSER_H__ */

View File

@ -1,377 +0,0 @@
/***********************************************************************
* $Id:: mw_usbd_audio.h 165 2011-04-14 17:41:11Z usb10131 $
*
* Project: USB device ROM Stack
*
* Description:
* USB Audio Device Class 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 __AUDIO_H__
#define __AUDIO_H__
/* Audio Interface Subclass Codes */
#define AUDIO_SUBCLASS_UNDEFINED 0x00
#define AUDIO_SUBCLASS_AUDIOCONTROL 0x01
#define AUDIO_SUBCLASS_AUDIOSTREAMING 0x02
#define AUDIO_SUBCLASS_MIDISTREAMING 0x03
/* Audio Interface Protocol Codes */
#define AUDIO_PROTOCOL_UNDEFINED 0x00
/* Audio Descriptor Types */
#define AUDIO_UNDEFINED_DESCRIPTOR_TYPE 0x20
#define AUDIO_DEVICE_DESCRIPTOR_TYPE 0x21
#define AUDIO_CONFIGURATION_DESCRIPTOR_TYPE 0x22
#define AUDIO_STRING_DESCRIPTOR_TYPE 0x23
#define AUDIO_INTERFACE_DESCRIPTOR_TYPE 0x24
#define AUDIO_ENDPOINT_DESCRIPTOR_TYPE 0x25
/* Audio Control Interface Descriptor Subtypes */
#define AUDIO_CONTROL_UNDEFINED 0x00
#define AUDIO_CONTROL_HEADER 0x01
#define AUDIO_CONTROL_INPUT_TERMINAL 0x02
#define AUDIO_CONTROL_OUTPUT_TERMINAL 0x03
#define AUDIO_CONTROL_MIXER_UNIT 0x04
#define AUDIO_CONTROL_SELECTOR_UNIT 0x05
#define AUDIO_CONTROL_FEATURE_UNIT 0x06
#define AUDIO_CONTROL_PROCESSING_UNIT 0x07
#define AUDIO_CONTROL_EXTENSION_UNIT 0x08
/* Audio Streaming Interface Descriptor Subtypes */
#define AUDIO_STREAMING_UNDEFINED 0x00
#define AUDIO_STREAMING_GENERAL 0x01
#define AUDIO_STREAMING_FORMAT_TYPE 0x02
#define AUDIO_STREAMING_FORMAT_SPECIFIC 0x03
/* Audio Endpoint Descriptor Subtypes */
#define AUDIO_ENDPOINT_UNDEFINED 0x00
#define AUDIO_ENDPOINT_GENERAL 0x01
/* Audio Descriptor Sizes */
#define AUDIO_CONTROL_INTERFACE_DESC_SZ(n) 0x08+n
#define AUDIO_STREAMING_INTERFACE_DESC_SIZE 0x07
#define AUDIO_INPUT_TERMINAL_DESC_SIZE 0x0C
#define AUDIO_OUTPUT_TERMINAL_DESC_SIZE 0x09
#define AUDIO_MIXER_UNIT_DESC_SZ(p,n) 0x0A+p+n
#define AUDIO_SELECTOR_UNIT_DESC_SZ(p) 0x06+p
#define AUDIO_FEATURE_UNIT_DESC_SZ(ch,n) 0x07+(ch+1)*n
#define AUDIO_PROCESSING_UNIT_DESC_SZ(p,n,x) 0x0D+p+n+x
#define AUDIO_EXTENSION_UNIT_DESC_SZ(p,n) 0x0D+p+n
#define AUDIO_STANDARD_ENDPOINT_DESC_SIZE 0x09
#define AUDIO_STREAMING_ENDPOINT_DESC_SIZE 0x07
/* Audio Processing Unit Process Types */
#define AUDIO_UNDEFINED_PROCESS 0x00
#define AUDIO_UP_DOWN_MIX_PROCESS 0x01
#define AUDIO_DOLBY_PROLOGIC_PROCESS 0x02
#define AUDIO_3D_STEREO_PROCESS 0x03
#define AUDIO_REVERBERATION_PROCESS 0x04
#define AUDIO_CHORUS_PROCESS 0x05
#define AUDIO_DYN_RANGE_COMP_PROCESS 0x06
/* Audio Request Codes */
#define AUDIO_REQUEST_UNDEFINED 0x00
#define AUDIO_REQUEST_SET_CUR 0x01
#define AUDIO_REQUEST_GET_CUR 0x81
#define AUDIO_REQUEST_SET_MIN 0x02
#define AUDIO_REQUEST_GET_MIN 0x82
#define AUDIO_REQUEST_SET_MAX 0x03
#define AUDIO_REQUEST_GET_MAX 0x83
#define AUDIO_REQUEST_SET_RES 0x04
#define AUDIO_REQUEST_GET_RES 0x84
#define AUDIO_REQUEST_SET_MEM 0x05
#define AUDIO_REQUEST_GET_MEM 0x85
#define AUDIO_REQUEST_GET_STAT 0xFF
/* Audio Control Selector Codes */
#define AUDIO_CONTROL_UNDEFINED 0x00 /* Common Selector */
/* Terminal Control Selectors */
#define AUDIO_COPY_PROTECT_CONTROL 0x01
/* Feature Unit Control Selectors */
#define AUDIO_MUTE_CONTROL 0x01
#define AUDIO_VOLUME_CONTROL 0x02
#define AUDIO_BASS_CONTROL 0x03
#define AUDIO_MID_CONTROL 0x04
#define AUDIO_TREBLE_CONTROL 0x05
#define AUDIO_GRAPHIC_EQUALIZER_CONTROL 0x06
#define AUDIO_AUTOMATIC_GAIN_CONTROL 0x07
#define AUDIO_DELAY_CONTROL 0x08
#define AUDIO_BASS_BOOST_CONTROL 0x09
#define AUDIO_LOUDNESS_CONTROL 0x0A
/* Processing Unit Control Selectors: */
#define AUDIO_ENABLE_CONTROL 0x01 /* Common Selector */
#define AUDIO_MODE_SELECT_CONTROL 0x02 /* Common Selector */
/* - Up/Down-mix Control Selectors */
/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
/* AUDIO_MODE_SELECT_CONTROL 0x02 Common Selector */
/* - Dolby Prologic Control Selectors */
/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
/* AUDIO_MODE_SELECT_CONTROL 0x02 Common Selector */
/* - 3D Stereo Extender Control Selectors */
/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
#define AUDIO_SPACIOUSNESS_CONTROL 0x02
/* - Reverberation Control Selectors */
/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
#define AUDIO_REVERB_LEVEL_CONTROL 0x02
#define AUDIO_REVERB_TIME_CONTROL 0x03
#define AUDIO_REVERB_FEEDBACK_CONTROL 0x04
/* - Chorus Control Selectors */
/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
#define AUDIO_CHORUS_LEVEL_CONTROL 0x02
#define AUDIO_SHORUS_RATE_CONTROL 0x03
#define AUDIO_CHORUS_DEPTH_CONTROL 0x04
/* - Dynamic Range Compressor Control Selectors */
/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
#define AUDIO_COMPRESSION_RATE_CONTROL 0x02
#define AUDIO_MAX_AMPL_CONTROL 0x03
#define AUDIO_THRESHOLD_CONTROL 0x04
#define AUDIO_ATTACK_TIME_CONTROL 0x05
#define AUDIO_RELEASE_TIME_CONTROL 0x06
/* Extension Unit Control Selectors */
/* AUDIO_ENABLE_CONTROL 0x01 Common Selector */
/* Endpoint Control Selectors */
#define AUDIO_SAMPLING_FREQ_CONTROL 0x01
#define AUDIO_PITCH_CONTROL 0x02
/* Audio Format Specific Control Selectors */
/* MPEG Control Selectors */
#define AUDIO_MPEG_CONTROL_UNDEFINED 0x00
#define AUDIO_MPEG_DUAL_CHANNEL_CONTROL 0x01
#define AUDIO_MPEG_SECOND_STEREO_CONTROL 0x02
#define AUDIO_MPEG_MULTILINGUAL_CONTROL 0x03
#define AUDIO_MPEG_DYN_RANGE_CONTROL 0x04
#define AUDIO_MPEG_SCALING_CONTROL 0x05
#define AUDIO_MPEG_HILO_SCALING_CONTROL 0x06
/* AC-3 Control Selectors */
#define AUDIO_AC3_CONTROL_UNDEFINED 0x00
#define AUDIO_AC3_MODE_CONTROL 0x01
#define AUDIO_AC3_DYN_RANGE_CONTROL 0x02
#define AUDIO_AC3_SCALING_CONTROL 0x03
#define AUDIO_AC3_HILO_SCALING_CONTROL 0x04
/* Audio Format Types */
#define AUDIO_FORMAT_TYPE_UNDEFINED 0x00
#define AUDIO_FORMAT_TYPE_I 0x01
#define AUDIO_FORMAT_TYPE_II 0x02
#define AUDIO_FORMAT_TYPE_III 0x03
/* Audio Format Type Descriptor Sizes */
#define AUDIO_FORMAT_TYPE_I_DESC_SZ(n) 0x08+(n*3)
#define AUDIO_FORMAT_TYPE_II_DESC_SZ(n) 0x09+(n*3)
#define AUDIO_FORMAT_TYPE_III_DESC_SZ(n) 0x08+(n*3)
#define AUDIO_FORMAT_MPEG_DESC_SIZE 0x09
#define AUDIO_FORMAT_AC3_DESC_SIZE 0x0A
/* Audio Data Format Codes */
/* Audio Data Format Type I Codes */
#define AUDIO_FORMAT_TYPE_I_UNDEFINED 0x0000
#define AUDIO_FORMAT_PCM 0x0001
#define AUDIO_FORMAT_PCM8 0x0002
#define AUDIO_FORMAT_IEEE_FLOAT 0x0003
#define AUDIO_FORMAT_ALAW 0x0004
#define AUDIO_FORMAT_MULAW 0x0005
/* Audio Data Format Type II Codes */
#define AUDIO_FORMAT_TYPE_II_UNDEFINED 0x1000
#define AUDIO_FORMAT_MPEG 0x1001
#define AUDIO_FORMAT_AC3 0x1002
/* Audio Data Format Type III Codes */
#define AUDIO_FORMAT_TYPE_III_UNDEFINED 0x2000
#define AUDIO_FORMAT_IEC1937_AC3 0x2001
#define AUDIO_FORMAT_IEC1937_MPEG1_L1 0x2002
#define AUDIO_FORMAT_IEC1937_MPEG1_L2_3 0x2003
#define AUDIO_FORMAT_IEC1937_MPEG2_NOEXT 0x2003
#define AUDIO_FORMAT_IEC1937_MPEG2_EXT 0x2004
#define AUDIO_FORMAT_IEC1937_MPEG2_L1_LS 0x2005
#define AUDIO_FORMAT_IEC1937_MPEG2_L2_3 0x2006
/* Predefined Audio Channel Configuration Bits */
#define AUDIO_CHANNEL_M 0x0000 /* Mono */
#define AUDIO_CHANNEL_L 0x0001 /* Left Front */
#define AUDIO_CHANNEL_R 0x0002 /* Right Front */
#define AUDIO_CHANNEL_C 0x0004 /* Center Front */
#define AUDIO_CHANNEL_LFE 0x0008 /* Low Freq. Enhance. */
#define AUDIO_CHANNEL_LS 0x0010 /* Left Surround */
#define AUDIO_CHANNEL_RS 0x0020 /* Right Surround */
#define AUDIO_CHANNEL_LC 0x0040 /* Left of Center */
#define AUDIO_CHANNEL_RC 0x0080 /* Right of Center */
#define AUDIO_CHANNEL_S 0x0100 /* Surround */
#define AUDIO_CHANNEL_SL 0x0200 /* Side Left */
#define AUDIO_CHANNEL_SR 0x0400 /* Side Right */
#define AUDIO_CHANNEL_T 0x0800 /* Top */
/* Feature Unit Control Bits */
#define AUDIO_CONTROL_MUTE 0x0001
#define AUDIO_CONTROL_VOLUME 0x0002
#define AUDIO_CONTROL_BASS 0x0004
#define AUDIO_CONTROL_MID 0x0008
#define AUDIO_CONTROL_TREBLE 0x0010
#define AUDIO_CONTROL_GRAPHIC_EQUALIZER 0x0020
#define AUDIO_CONTROL_AUTOMATIC_GAIN 0x0040
#define AUDIO_CONTROL_DEALY 0x0080
#define AUDIO_CONTROL_BASS_BOOST 0x0100
#define AUDIO_CONTROL_LOUDNESS 0x0200
/* Processing Unit Control Bits: */
#define AUDIO_CONTROL_ENABLE 0x0001 /* Common Bit */
#define AUDIO_CONTROL_MODE_SELECT 0x0002 /* Common Bit */
/* - Up/Down-mix Control Bits */
/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
/* AUDIO_CONTROL_MODE_SELECT 0x0002 Common Bit */
/* - Dolby Prologic Control Bits */
/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
/* AUDIO_CONTROL_MODE_SELECT 0x0002 Common Bit */
/* - 3D Stereo Extender Control Bits */
/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
#define AUDIO_CONTROL_SPACIOUSNESS 0x0002
/* - Reverberation Control Bits */
/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
#define AUDIO_CONTROL_REVERB_TYPE 0x0002
#define AUDIO_CONTROL_REVERB_LEVEL 0x0004
#define AUDIO_CONTROL_REVERB_TIME 0x0008
#define AUDIO_CONTROL_REVERB_FEEDBACK 0x0010
/* - Chorus Control Bits */
/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
#define AUDIO_CONTROL_CHORUS_LEVEL 0x0002
#define AUDIO_CONTROL_SHORUS_RATE 0x0004
#define AUDIO_CONTROL_CHORUS_DEPTH 0x0008
/* - Dynamic Range Compressor Control Bits */
/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
#define AUDIO_CONTROL_COMPRESSION_RATE 0x0002
#define AUDIO_CONTROL_MAX_AMPL 0x0004
#define AUDIO_CONTROL_THRESHOLD 0x0008
#define AUDIO_CONTROL_ATTACK_TIME 0x0010
#define AUDIO_CONTROL_RELEASE_TIME 0x0020
/* Extension Unit Control Bits */
/* AUDIO_CONTROL_ENABLE 0x0001 Common Bit */
/* Endpoint Control Bits */
#define AUDIO_CONTROL_SAMPLING_FREQ 0x01
#define AUDIO_CONTROL_PITCH 0x02
#define AUDIO_MAX_PACKETS_ONLY 0x80
/* Audio Terminal Types */
/* USB Terminal Types */
#define AUDIO_TERMINAL_USB_UNDEFINED 0x0100
#define AUDIO_TERMINAL_USB_STREAMING 0x0101
#define AUDIO_TERMINAL_USB_VENDOR_SPECIFIC 0x01FF
/* Input Terminal Types */
#define AUDIO_TERMINAL_INPUT_UNDEFINED 0x0200
#define AUDIO_TERMINAL_MICROPHONE 0x0201
#define AUDIO_TERMINAL_DESKTOP_MICROPHONE 0x0202
#define AUDIO_TERMINAL_PERSONAL_MICROPHONE 0x0203
#define AUDIO_TERMINAL_OMNI_DIR_MICROPHONE 0x0204
#define AUDIO_TERMINAL_MICROPHONE_ARRAY 0x0205
#define AUDIO_TERMINAL_PROCESSING_MIC_ARRAY 0x0206
/* Output Terminal Types */
#define AUDIO_TERMINAL_OUTPUT_UNDEFINED 0x0300
#define AUDIO_TERMINAL_SPEAKER 0x0301
#define AUDIO_TERMINAL_HEADPHONES 0x0302
#define AUDIO_TERMINAL_HEAD_MOUNTED_AUDIO 0x0303
#define AUDIO_TERMINAL_DESKTOP_SPEAKER 0x0304
#define AUDIO_TERMINAL_ROOM_SPEAKER 0x0305
#define AUDIO_TERMINAL_COMMUNICATION_SPEAKER 0x0306
#define AUDIO_TERMINAL_LOW_FREQ_SPEAKER 0x0307
/* Bi-directional Terminal Types */
#define AUDIO_TERMINAL_BIDIRECTIONAL_UNDEFINED 0x0400
#define AUDIO_TERMINAL_HANDSET 0x0401
#define AUDIO_TERMINAL_HEAD_MOUNTED_HANDSET 0x0402
#define AUDIO_TERMINAL_SPEAKERPHONE 0x0403
#define AUDIO_TERMINAL_SPEAKERPHONE_ECHOSUPRESS 0x0404
#define AUDIO_TERMINAL_SPEAKERPHONE_ECHOCANCEL 0x0405
/* Telephony Terminal Types */
#define AUDIO_TERMINAL_TELEPHONY_UNDEFINED 0x0500
#define AUDIO_TERMINAL_PHONE_LINE 0x0501
#define AUDIO_TERMINAL_TELEPHONE 0x0502
#define AUDIO_TERMINAL_DOWN_LINE_PHONE 0x0503
/* External Terminal Types */
#define AUDIO_TERMINAL_EXTERNAL_UNDEFINED 0x0600
#define AUDIO_TERMINAL_ANALOG_CONNECTOR 0x0601
#define AUDIO_TERMINAL_DIGITAL_AUDIO_INTERFACE 0x0602
#define AUDIO_TERMINAL_LINE_CONNECTOR 0x0603
#define AUDIO_TERMINAL_LEGACY_AUDIO_CONNECTOR 0x0604
#define AUDIO_TERMINAL_SPDIF_INTERFACE 0x0605
#define AUDIO_TERMINAL_1394_DA_STREAM 0x0606
#define AUDIO_TERMINAL_1394_DA_STREAM_TRACK 0x0607
/* Embedded Function Terminal Types */
#define AUDIO_TERMINAL_EMBEDDED_UNDEFINED 0x0700
#define AUDIO_TERMINAL_CALIBRATION_NOISE 0x0701
#define AUDIO_TERMINAL_EQUALIZATION_NOISE 0x0702
#define AUDIO_TERMINAL_CD_PLAYER 0x0703
#define AUDIO_TERMINAL_DAT 0x0704
#define AUDIO_TERMINAL_DCC 0x0705
#define AUDIO_TERMINAL_MINI_DISK 0x0706
#define AUDIO_TERMINAL_ANALOG_TAPE 0x0707
#define AUDIO_TERMINAL_PHONOGRAPH 0x0708
#define AUDIO_TERMINAL_VCR_AUDIO 0x0709
#define AUDIO_TERMINAL_VIDEO_DISC_AUDIO 0x070A
#define AUDIO_TERMINAL_DVD_AUDIO 0x070B
#define AUDIO_TERMINAL_TV_TUNER_AUDIO 0x070C
#define AUDIO_TERMINAL_SATELLITE_RECEIVER_AUDIO 0x070D
#define AUDIO_TERMINAL_CABLE_TUNER_AUDIO 0x070E
#define AUDIO_TERMINAL_DSS_AUDIO 0x070F
#define AUDIO_TERMINAL_RADIO_RECEIVER 0x0710
#define AUDIO_TERMINAL_RADIO_TRANSMITTER 0x0711
#define AUDIO_TERMINAL_MULTI_TRACK_RECORDER 0x0712
#define AUDIO_TERMINAL_SYNTHESIZER 0x0713
#endif /* __AUDIO_H__ */

View File

@ -1,249 +0,0 @@
/***********************************************************************
* $Id:: mw_usbd_cdc.h 197 2011-06-12 20:22:41Z 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 __CDC_H
#define __CDC_H
#include "mw_usbd.h"
/*----------------------------------------------------------------------------
* Definitions based on usbcdc11.pdf (www.usb.org)
*---------------------------------------------------------------------------*/
/* Communication device class specification version 1.10 */
#define CDC_V1_10 0x0110
/* Communication interface class code */
/* (usbcdc11.pdf, 4.2, Table 15) */
#define CDC_COMMUNICATION_INTERFACE_CLASS 0x02
/* Communication interface class subclass codes */
/* (usbcdc11.pdf, 4.3, Table 16) */
#define CDC_DIRECT_LINE_CONTROL_MODEL 0x01
#define CDC_ABSTRACT_CONTROL_MODEL 0x02
#define CDC_TELEPHONE_CONTROL_MODEL 0x03
#define CDC_MULTI_CHANNEL_CONTROL_MODEL 0x04
#define CDC_CAPI_CONTROL_MODEL 0x05
#define CDC_ETHERNET_NETWORKING_CONTROL_MODEL 0x06
#define CDC_ATM_NETWORKING_CONTROL_MODEL 0x07
/* Communication interface class control protocol codes */
/* (usbcdc11.pdf, 4.4, Table 17) */
#define CDC_PROTOCOL_COMMON_AT_COMMANDS 0x01
/* Data interface class code */
/* (usbcdc11.pdf, 4.5, Table 18) */
#define CDC_DATA_INTERFACE_CLASS 0x0A
/* Data interface class protocol codes */
/* (usbcdc11.pdf, 4.7, Table 19) */
#define CDC_PROTOCOL_ISDN_BRI 0x30
#define CDC_PROTOCOL_HDLC 0x31
#define CDC_PROTOCOL_TRANSPARENT 0x32
#define CDC_PROTOCOL_Q921_MANAGEMENT 0x50
#define CDC_PROTOCOL_Q921_DATA_LINK 0x51
#define CDC_PROTOCOL_Q921_MULTIPLEXOR 0x52
#define CDC_PROTOCOL_V42 0x90
#define CDC_PROTOCOL_EURO_ISDN 0x91
#define CDC_PROTOCOL_V24_RATE_ADAPTATION 0x92
#define CDC_PROTOCOL_CAPI 0x93
#define CDC_PROTOCOL_HOST_BASED_DRIVER 0xFD
#define CDC_PROTOCOL_DESCRIBED_IN_PUFD 0xFE
/* Type values for bDescriptorType field of functional descriptors */
/* (usbcdc11.pdf, 5.2.3, Table 24) */
#define CDC_CS_INTERFACE 0x24
#define CDC_CS_ENDPOINT 0x25
/* Type values for bDescriptorSubtype field of functional descriptors */
/* (usbcdc11.pdf, 5.2.3, Table 25) */
#define CDC_HEADER 0x00
#define CDC_CALL_MANAGEMENT 0x01
#define CDC_ABSTRACT_CONTROL_MANAGEMENT 0x02
#define CDC_DIRECT_LINE_MANAGEMENT 0x03
#define CDC_TELEPHONE_RINGER 0x04
#define CDC_REPORTING_CAPABILITIES 0x05
#define CDC_UNION 0x06
#define CDC_COUNTRY_SELECTION 0x07
#define CDC_TELEPHONE_OPERATIONAL_MODES 0x08
#define CDC_USB_TERMINAL 0x09
#define CDC_NETWORK_CHANNEL 0x0A
#define CDC_PROTOCOL_UNIT 0x0B
#define CDC_EXTENSION_UNIT 0x0C
#define CDC_MULTI_CHANNEL_MANAGEMENT 0x0D
#define CDC_CAPI_CONTROL_MANAGEMENT 0x0E
#define CDC_ETHERNET_NETWORKING 0x0F
#define CDC_ATM_NETWORKING 0x10
/* CDC class-specific request codes */
/* (usbcdc11.pdf, 6.2, Table 46) */
/* see Table 45 for info about the specific requests. */
#define CDC_SEND_ENCAPSULATED_COMMAND 0x00
#define CDC_GET_ENCAPSULATED_RESPONSE 0x01
#define CDC_SET_COMM_FEATURE 0x02
#define CDC_GET_COMM_FEATURE 0x03
#define CDC_CLEAR_COMM_FEATURE 0x04
#define CDC_SET_AUX_LINE_STATE 0x10
#define CDC_SET_HOOK_STATE 0x11
#define CDC_PULSE_SETUP 0x12
#define CDC_SEND_PULSE 0x13
#define CDC_SET_PULSE_TIME 0x14
#define CDC_RING_AUX_JACK 0x15
#define CDC_SET_LINE_CODING 0x20
#define CDC_GET_LINE_CODING 0x21
#define CDC_SET_CONTROL_LINE_STATE 0x22
#define CDC_SEND_BREAK 0x23
#define CDC_SET_RINGER_PARMS 0x30
#define CDC_GET_RINGER_PARMS 0x31
#define CDC_SET_OPERATION_PARMS 0x32
#define CDC_GET_OPERATION_PARMS 0x33
#define CDC_SET_LINE_PARMS 0x34
#define CDC_GET_LINE_PARMS 0x35
#define CDC_DIAL_DIGITS 0x36
#define CDC_SET_UNIT_PARAMETER 0x37
#define CDC_GET_UNIT_PARAMETER 0x38
#define CDC_CLEAR_UNIT_PARAMETER 0x39
#define CDC_GET_PROFILE 0x3A
#define CDC_SET_ETHERNET_MULTICAST_FILTERS 0x40
#define CDC_SET_ETHERNET_PMP_FILTER 0x41
#define CDC_GET_ETHERNET_PMP_FILTER 0x42
#define CDC_SET_ETHERNET_PACKET_FILTER 0x43
#define CDC_GET_ETHERNET_STATISTIC 0x44
#define CDC_SET_ATM_DATA_FORMAT 0x50
#define CDC_GET_ATM_DEVICE_STATISTICS 0x51
#define CDC_SET_ATM_DEFAULT_VC 0x52
#define CDC_GET_ATM_VC_STATISTICS 0x53
/* Communication feature selector codes */
/* (usbcdc11.pdf, 6.2.2..6.2.4, Table 47) */
#define CDC_ABSTRACT_STATE 0x01
#define CDC_COUNTRY_SETTING 0x02
/* Feature Status returned for ABSTRACT_STATE Selector */
/* (usbcdc11.pdf, 6.2.3, Table 48) */
#define CDC_IDLE_SETTING (1 << 0)
#define CDC_DATA_MULTPLEXED_STATE (1 << 1)
/* Control signal bitmap values for the SetControlLineState request */
/* (usbcdc11.pdf, 6.2.14, Table 51) */
#define CDC_DTE_PRESENT (1 << 0)
#define CDC_ACTIVATE_CARRIER (1 << 1)
/* CDC class-specific notification codes */
/* (usbcdc11.pdf, 6.3, Table 68) */
/* see Table 67 for Info about class-specific notifications */
#define CDC_NOTIFICATION_NETWORK_CONNECTION 0x00
#define CDC_RESPONSE_AVAILABLE 0x01
#define CDC_AUX_JACK_HOOK_STATE 0x08
#define CDC_RING_DETECT 0x09
#define CDC_NOTIFICATION_SERIAL_STATE 0x20
#define CDC_CALL_STATE_CHANGE 0x28
#define CDC_LINE_STATE_CHANGE 0x29
#define CDC_CONNECTION_SPEED_CHANGE 0x2A
/* UART state bitmap values (Serial state notification). */
/* (usbcdc11.pdf, 6.3.5, Table 69) */
#define CDC_SERIAL_STATE_OVERRUN (1 << 6) /* receive data overrun error has occurred */
#define CDC_SERIAL_STATE_PARITY (1 << 5) /* parity error has occurred */
#define CDC_SERIAL_STATE_FRAMING (1 << 4) /* framing error has occurred */
#define CDC_SERIAL_STATE_RING (1 << 3) /* state of ring signal detection */
#define CDC_SERIAL_STATE_BREAK (1 << 2) /* state of break detection */
#define CDC_SERIAL_STATE_TX_CARRIER (1 << 1) /* state of transmission carrier */
#define CDC_SERIAL_STATE_RX_CARRIER (1 << 0) /* state of receiver carrier */
/*----------------------------------------------------------------------------
* Structures based on usbcdc11.pdf (www.usb.org)
*---------------------------------------------------------------------------*/
/* Header functional descriptor */
/* (usbcdc11.pdf, 5.2.3.1) */
/* This header must precede any list of class-specific descriptors. */
PRE_PACK struct POST_PACK _CDC_HEADER_DESCRIPTOR{
uint8_t bFunctionLength; /* size of this descriptor in bytes */
uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */
uint8_t bDescriptorSubtype; /* Header functional descriptor subtype */
uint16_t bcdCDC; /* USB CDC specification release version */
};
typedef struct _CDC_HEADER_DESCRIPTOR CDC_HEADER_DESCRIPTOR;
/* Call management functional descriptor */
/* (usbcdc11.pdf, 5.2.3.2) */
/* Describes the processing of calls for the communication class interface. */
PRE_PACK struct POST_PACK _CDC_CALL_MANAGEMENT_DESCRIPTOR {
uint8_t bFunctionLength; /* size of this descriptor in bytes */
uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */
uint8_t bDescriptorSubtype; /* call management functional descriptor subtype */
uint8_t bmCapabilities; /* capabilities that this configuration supports */
uint8_t bDataInterface; /* interface number of the data class interface used for call management (optional) */
};
typedef struct _CDC_CALL_MANAGEMENT_DESCRIPTOR CDC_CALL_MANAGEMENT_DESCRIPTOR;
/* Abstract control management functional descriptor */
/* (usbcdc11.pdf, 5.2.3.3) */
/* Describes the command supported by the communication interface class with the Abstract Control Model subclass code. */
PRE_PACK struct POST_PACK _CDC_ABSTRACT_CONTROL_MANAGEMENT_DESCRIPTOR {
uint8_t bFunctionLength; /* size of this descriptor in bytes */
uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */
uint8_t bDescriptorSubtype; /* abstract control management functional descriptor subtype */
uint8_t bmCapabilities; /* capabilities supported by this configuration */
};
typedef struct _CDC_ABSTRACT_CONTROL_MANAGEMENT_DESCRIPTOR CDC_ABSTRACT_CONTROL_MANAGEMENT_DESCRIPTOR;
/* Union functional descriptors */
/* (usbcdc11.pdf, 5.2.3.8) */
/* Describes the relationship between a group of interfaces that can be considered to form a functional unit. */
PRE_PACK struct POST_PACK _CDC_UNION_DESCRIPTOR {
uint8_t bFunctionLength; /* size of this descriptor in bytes */
uint8_t bDescriptorType; /* CS_INTERFACE descriptor type */
uint8_t bDescriptorSubtype; /* union functional descriptor subtype */
uint8_t bMasterInterface; /* interface number designated as master */
};
typedef struct _CDC_UNION_DESCRIPTOR CDC_UNION_DESCRIPTOR;
/* Union functional descriptors with one slave interface */
/* (usbcdc11.pdf, 5.2.3.8) */
PRE_PACK struct POST_PACK _CDC_UNION_1SLAVE_DESCRIPTOR {
CDC_UNION_DESCRIPTOR sUnion; /* Union functional descriptor */
uint8_t bSlaveInterfaces[1]; /* Slave interface 0 */
};
typedef struct _CDC_UNION_1SLAVE_DESCRIPTOR CDC_UNION_1SLAVE_DESCRIPTOR;
/* Line coding structure */
/* Format of the data returned when a GetLineCoding request is received */
/* (usbcdc11.pdf, 6.2.13) */
PRE_PACK struct POST_PACK _CDC_LINE_CODING {
uint32_t dwDTERate; /* Data terminal rate in bits per second */
uint8_t bCharFormat; /* Number of stop bits */
uint8_t bParityType; /* Parity bit type */
uint8_t bDataBits; /* Number of data bits */
};
typedef struct _CDC_LINE_CODING CDC_LINE_CODING;
/* Notification header */
/* Data sent on the notification endpoint must follow this header. */
/* see USB_SETUP_PACKET in file usb.h */
typedef USB_SETUP_PACKET CDC_NOTIFICATION_HEADER;
#endif /* __CDC_H */

View File

@ -1,342 +0,0 @@
/***********************************************************************
* $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__ */

View File

@ -1,574 +0,0 @@
/***********************************************************************
* $Id:: mw_usbd_core.h 202 2011-06-12 21:50:01Z usb06052 $
*
* Project: USB device ROM Stack
*
* Description:
* USB core controller structure defnitions and function prototypes.
*
***********************************************************************
* 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 __MW_USBD_CORE_H__
#define __MW_USBD_CORE_H__
#include "error.h"
#include "mw_usbd.h"
/** \file
* \brief ROM API for USB device stack.
*
* Definition of functions exported by core layer of ROM based USB device stack.
*
*/
/** \ingroup Group_USBD
* @defgroup USBD_Core USB Core Layer
* \section Sec_CoreModDescription Module Description
* The USB Core Layer implements the device abstraction defined in the <em> Universal Serial Bus Specification, </em>
* for applications to interact with the USB device interface on the device. The software in this layer responds to
* standard requests and returns standard descriptors. In current stack the Init() routine part of
* \ref USBD_HW_API_T structure initializes both hardware layer and core layer.
*/
/* function pointer types */
/** \ingroup USBD_Core
* \typedef USB_CB_T
* \brief USB device stack's event callback function type.
*
* The USB device stack exposes several event triggers through callback to application layer. The
* application layer can register methods to be called when such USB event happens.
*
* \param[in] hUsb Handle to the USB device stack.
* \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 Other error conditions.
*
*/
typedef ErrorCode_t (*USB_CB_T) (USBD_HANDLE_T hUsb);
/** \ingroup USBD_Core
* \typedef USB_PARAM_CB_T
* \brief USB device stack's event callback function type.
*
* The USB device stack exposes several event triggers through callback to application layer. The
* application layer can register methods to be called when such USB event happens.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] param1 Extra information related to the event.
* \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.
*
*/
typedef ErrorCode_t (*USB_PARAM_CB_T) (USBD_HANDLE_T hUsb, uint32_t param1);
/** \ingroup USBD_Core
* \typedef USB_EP_HANDLER_T
* \brief USBD setup request and endpoint event handler type.
*
* The application layer should define the custom class's EP0 handler with function signature.
* The stack calls all the registered class handlers on any EP0 event before going through default
* handling of the event. This gives the class handlers to implement class specific request handlers
* and also to override the default stack handling for a particular event targeted to the interface.
* If an event is not handled by the callback the function should return ERR_USBD_UNHANDLED. For all
* other return codes the stack assumes that callback has taken care of the event and hence will not
* process the event any further and issues a STALL condition on EP0 indicating error to the host.
* \n
* For endpoint interrupt handler the return value is ignored by the stack.
* \n
* \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.
*
*/
typedef ErrorCode_t (*USB_EP_HANDLER_T)(USBD_HANDLE_T hUsb, void* data, uint32_t event);
/** \ingroup USBD_Core
* \brief USB descriptors data structure.
* \ingroup USBD_Core
*
* \details This structure is used as part of USB device stack initialisation
* parameter structure \ref USBD_API_INIT_PARAM_T. This structure contains
* pointers to various descriptor arrays needed by the stack. These descriptors
* are reported to USB host as part of enumerations process.
*
* \note All descriptor pointers assigned in this structure should be on 4 byte
* aligned address boundary.
*/
typedef struct _USB_CORE_DESCS_T
{
uint8_t *device_desc; /**< Pointer to USB device descriptor */
uint8_t *string_desc; /**< Pointer to array of USB string descriptors */
uint8_t *full_speed_desc; /**< Pointer to USB device configuration descriptor
* when device is operating in full speed mode.
*/
uint8_t *high_speed_desc; /**< Pointer to USB device configuration descriptor
* when device is operating in high speed mode. For
* full-speed only implementation this pointer should
* be same as full_speed_desc.
*/
uint8_t *device_qualifier; /**< Pointer to USB device qualifier descriptor. For
* full-speed only implementation this pointer should
* be set to null (0).
*/
} USB_CORE_DESCS_T;
/** \brief USB device stack initilization parameter data structure.
* \ingroup USBD_Core
*
* \details This data structure is used to pass initialization parameters to the
* USB device stack's init function.
*
*/
typedef struct USBD_API_INIT_PARAM
{
uint32_t usb_reg_base; /**< USB device controller's base register address. */
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 2048 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_HW_API::GetMemSize() routine.*/
uint8_t max_num_ep; /**< max number of endpoints supported by the USB device
controller instance (specified by \em usb_reg_base field)
to which this instance of stack is attached.
*/
uint8_t pad0[3];
/* USB Device Events Callback Functions */
/** Event for USB interface reset. This event fires when the USB host requests that the device
* reset its interface. This event fires after the control endpoint has been automatically
* configured by the library.
* \n
* \note This event is called from USB_ISR context and hence is time-critical. Having delays in this
* callback will prevent the device from enumerating correctly or operate properly.
*
*/
USB_CB_T USB_Reset_Event;
/** Event for USB suspend. This event fires when the USB host suspends the device by halting its
* transmission of Start Of Frame pulses to the device. This is generally hooked in order to move
* the device over to a low power state until the host wakes up the device.
* \n
* \note This event is called from USB_ISR context and hence is time-critical. Having delays in this
* callback will cause other system issues.
*/
USB_CB_T USB_Suspend_Event;
/** Event for USB wake up or resume. This event fires when a the USB device interface is suspended
* and the host wakes up the device by supplying Start Of Frame pulses. This is generally
* hooked to pull the user application out of a low power state and back into normal operating
* mode.
* \n
* \note This event is called from USB_ISR context and hence is time-critical. Having delays in this
* callback will cause other system issues.
*
*/
USB_CB_T USB_Resume_Event;
/** Reserved parameter should be set to zero. */
USB_CB_T reserved_sbz;
/** Event for USB Start Of Frame detection, when enabled. This event fires at the start of each USB
* frame, once per millisecond in full-speed mode or once per 125 microseconds in high-speed mode,
* and is synchronized to the USB bus.
*
* This event is time-critical; it is run once per millisecond (full-speed mode) and thus long handlers
* will significantly degrade device performance. This event should only be enabled when needed to
* reduce device wake-ups.
*
* \note This event is not normally active - it must be manually enabled and disabled via the USB interrupt
* register.
* \n\n
*/
USB_CB_T USB_SOF_Event;
/** Event for remote wakeup configururation, when enabled. This event fires when the USB host
* request the device to configure itself for remote wake-up capability. The USB host sends
* this request to device which report remote wakeup capable in their device descriptors,
* before going to low-power state. The application layer should implement this callback if
* they have any special on board circuit to trigerr remote wake up event. Also application
* can use this callback to differntiate the following SUSPEND event is caused by cable plug-out
* or host SUSPEND request. The device can wakeup host only after reciving this callback and
* remote wakeup feature is enabled by host. To signal remote wakeup the device has to generate
* resume signaling on bus by calling usapi.hw->WakeUp() routine.
*
* \n\n
* \param[in] hUsb Handle to the USB device stack.
* \param[in] param1 When 0 - Clear the wakeup configuration, 1 - Enable the wake-up configuration.
* \return The call back should return \ref ErrorCode_t type to indicate success or error condition.
*/
USB_PARAM_CB_T USB_WakeUpCfg;
/** Reserved parameter should be set to zero. */
USB_PARAM_CB_T USB_Power_Event;
/** Event for error condition. This event fires when USB device controller detect
* an error condition in the system.
*
* \n\n
* \param[in] hUsb Handle to the USB device stack.
* \param[in] param1 USB device interrupt status register.
* \return The call back should return \ref ErrorCode_t type to indicate success or error condition.
*/
USB_PARAM_CB_T USB_Error_Event;
/* USB Core Events Callback Functions */
/** Event for USB configuration number changed. This event fires when a the USB host changes the
* selected configuration number. On receiving configuration change request from host, the stack
* enables/configures the endpoints needed by the new configuration before calling this callback
* function.
* \n
* \note This event is called from USB_ISR context and hence is time-critical. Having delays in this
* callback will prevent the device from enumerating correctly or operate properly.
*
*/
USB_CB_T USB_Configure_Event;
/** Event for USB interface setting changed. This event fires when a the USB host changes the
* interface setting to one of alternate interface settings. On receiving interface change
* request from host, the stack enables/configures the endpoints needed by the new alternate
* interface setting before calling this callback function.
* \n
* \note This event is called from USB_ISR context and hence is time-critical. Having delays in this
* callback will prevent the device from enumerating correctly or operate properly.
*
*/
USB_CB_T USB_Interface_Event;
/** Event for USB feature changed. This event fires when a the USB host send set/clear feature
* request. The stack handles this request for USB_FEATURE_REMOTE_WAKEUP, USB_FEATURE_TEST_MODE
* and USB_FEATURE_ENDPOINT_STALL features only. On receiving feature request from host, the
* stack handle the request appropriately and then calls this callback function.
* \n
* \note This event is called from USB_ISR context and hence is time-critical. Having delays in this
* callback will prevent the device from enumerating correctly or operate properly.
*
*/
USB_CB_T USB_Feature_Event;
/* cache and mmu translation functions */
/** Reserved parameter for future use. should be set to zero. */
uint32_t (* virt_to_phys)(void* vaddr);
/** Reserved parameter for future use. should be set to zero. */
void (* cache_flush)(uint32_t* start_adr, uint32_t* end_adr);
} USBD_API_INIT_PARAM_T;
/** \brief USBD stack Core API functions structure.
* \ingroup USBD_Core
*
* \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_CORE_API
{
/** \fn ErrorCode_t RegisterClassHandler(USBD_HANDLE_T hUsb, USB_EP_HANDLER_T pfn, void* data)
* Function to register class specific EP0 event handler with USB device stack.
*
* The application layer uses this function when it has to register the custom class's EP0 handler.
* The stack calls all the registered class handlers on any EP0 event before going through default
* handling of the event. This gives the class handlers to implement class specific request handlers
* and also to override the default stack handling for a particular event targeted to the interface.
* Check USB_EP_HANDLER_T for more details on how the callback function should be implemented. Also
* application layer could use this function to register EP0 handler which responds to vendor specific
* requests.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] pfn Class specific EP0 handler function.
* \param[in] data Pointer to the data which will be passed when callback function is called by the stack.
* \return Returns \ref ErrorCode_t type to indicate success or error condition.
* \retval LPC_OK On success
* \retval ERR_USBD_TOO_MANY_CLASS_HDLR(0x0004000c) The number of class handlers registered is
greater than the number of handlers allowed by the stack.
*
*/
ErrorCode_t (*RegisterClassHandler)(USBD_HANDLE_T hUsb, USB_EP_HANDLER_T pfn, void* data);
/** \fn ErrorCode_t RegisterEpHandler(USBD_HANDLE_T hUsb, uint32_t ep_index, USB_EP_HANDLER_T pfn, void* data)
* Function to register interrupt/event handler for the requested endpoint with USB device stack.
*
* The application layer uses this function to register the custom class's EP0 handler.
* The stack calls all the registered class handlers on any EP0 event before going through default
* handling of the event. This gives the class handlers to implement class specific request handlers
* and also to override the default stack handling for a particular event targeted to the interface.
* Check USB_EP_HANDLER_T for more details on how the callback function should be implemented.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] ep_index Class specific EP0 handler function.
* \param[in] pfn Class specific EP0 handler function.
* \param[in] data Pointer to the data which will be passed when callback function is called by the stack.
* \return Returns \ref ErrorCode_t type to indicate success or error condition.
* \retval LPC_OK On success
* \retval ERR_USBD_TOO_MANY_CLASS_HDLR(0x0004000c) Too many endpoint handlers.
*
*/
ErrorCode_t (*RegisterEpHandler)(USBD_HANDLE_T hUsb, uint32_t ep_index, USB_EP_HANDLER_T pfn, void* data);
/** \fn void SetupStage(USBD_HANDLE_T hUsb)
* Function to set EP0 state machine in setup state.
*
* This function is called by USB stack and the application layer to
* set the EP0 state machine in setup state. This function will read
* the setup packet received from USB host into stack's buffer.
* \n
* \note This interface is provided to users to invoke this function in other
* scenarios which are not handle by current stack. In most user applications
* this function is not called directly.Also this function can be used by
* users who are selectively modifying the USB device stack's standard handlers
* through callback interface exposed by the stack.
*
* \param[in] hUsb Handle to the USB device stack.
* \return Nothing.
*/
void (*SetupStage )(USBD_HANDLE_T hUsb);
/** \fn void DataInStage(USBD_HANDLE_T hUsb)
* Function to set EP0 state machine in data_in state.
*
* This function is called by USB stack and the application layer to
* set the EP0 state machine in data_in state. This function will write
* the data present in EP0Data buffer to EP0 FIFO for tranmission to host.
* \n
* \note This interface is provided to users to invoke this function in other
* scenarios which are not handle by current stack. In most user applications
* this function is not called directly.Also this function can be used by
* users who are selectively modifying the USB device stack's standard handlers
* through callback interface exposed by the stack.
*
* \param[in] hUsb Handle to the USB device stack.
* \return Nothing.
*/
void (*DataInStage)(USBD_HANDLE_T hUsb);
/** \fn void DataOutStage(USBD_HANDLE_T hUsb)
* Function to set EP0 state machine in data_out state.
*
* This function is called by USB stack and the application layer to
* set the EP0 state machine in data_out state. This function will read
* the control data (EP0 out packets) received from USB host into EP0Data buffer.
* \n
* \note This interface is provided to users to invoke this function in other
* scenarios which are not handle by current stack. In most user applications
* this function is not called directly.Also this function can be used by
* users who are selectively modifying the USB device stack's standard handlers
* through callback interface exposed by the stack.
*
* \param[in] hUsb Handle to the USB device stack.
* \return Nothing.
*/
void (*DataOutStage)(USBD_HANDLE_T hUsb);
/** \fn void StatusInStage(USBD_HANDLE_T hUsb)
* Function to set EP0 state machine in status_in state.
*
* This function is called by USB stack and the application layer to
* set the EP0 state machine in status_in state. This function will send
* zero length IN packet on EP0 to host, indicating positive status.
* \n
* \note This interface is provided to users to invoke this function in other
* scenarios which are not handle by current stack. In most user applications
* this function is not called directly.Also this function can be used by
* users who are selectively modifying the USB device stack's standard handlers
* through callback interface exposed by the stack.
*
* \param[in] hUsb Handle to the USB device stack.
* \return Nothing.
*/
void (*StatusInStage)(USBD_HANDLE_T hUsb);
/** \fn void StatusOutStage(USBD_HANDLE_T hUsb)
* Function to set EP0 state machine in status_out state.
*
* This function is called by USB stack and the application layer to
* set the EP0 state machine in status_out state. This function will read
* the zero length OUT packet received from USB host on EP0.
* \n
* \note This interface is provided to users to invoke this function in other
* scenarios which are not handle by current stack. In most user applications
* this function is not called directly.Also this function can be used by
* users who are selectively modifying the USB device stack's standard handlers
* through callback interface exposed by the stack.
*
* \param[in] hUsb Handle to the USB device stack.
* \return Nothing.
*/
void (*StatusOutStage)(USBD_HANDLE_T hUsb);
/** \fn void StallEp0(USBD_HANDLE_T hUsb)
* Function to set EP0 state machine in stall state.
*
* This function is called by USB stack and the application layer to
* generate STALL signalling on EP0 endpoint. This function will also
* reset the EP0Data buffer.
* \n
* \note This interface is provided to users to invoke this function in other
* scenarios which are not handle by current stack. In most user applications
* this function is not called directly.Also this function can be used by
* users who are selectively modifying the USB device stack's standard handlers
* through callback interface exposed by the stack.
*
* \param[in] hUsb Handle to the USB device stack.
* \return Nothing.
*/
void (*StallEp0)(USBD_HANDLE_T hUsb);
} USBD_CORE_API_T;
/*-----------------------------------------------------------------------------
* Private functions & structures prototypes
*-----------------------------------------------------------------------------*/
/** @cond ADVANCED_API */
/* forward declaration */
struct _USB_CORE_CTRL_T;
typedef struct _USB_CORE_CTRL_T USB_CORE_CTRL_T;
/* USB device Speed status defines */
#define USB_FULL_SPEED 0
#define USB_HIGH_SPEED 1
/* USB Endpoint Data Structure */
typedef struct _USB_EP_DATA
{
uint8_t *pData;
uint16_t Count;
uint16_t pad0;
} USB_EP_DATA;
/* USB core controller data structure */
struct _USB_CORE_CTRL_T
{
/* overridable function pointers ~ c++ style virtual functions*/
USB_CB_T USB_EvtSetupHandler;
USB_CB_T USB_EvtOutHandler;
USB_PARAM_CB_T USB_ReqVendor;
USB_CB_T USB_ReqGetStatus;
USB_CB_T USB_ReqGetDescriptor;
USB_CB_T USB_ReqGetConfiguration;
USB_CB_T USB_ReqSetConfiguration;
USB_CB_T USB_ReqGetInterface;
USB_CB_T USB_ReqSetInterface;
USB_PARAM_CB_T USB_ReqSetClrFeature;
/* USB Device Events Callback Functions */
USB_CB_T USB_Reset_Event;
USB_CB_T USB_Suspend_Event;
USB_CB_T USB_Resume_Event;
USB_CB_T USB_SOF_Event;
USB_PARAM_CB_T USB_Power_Event;
USB_PARAM_CB_T USB_Error_Event;
USB_PARAM_CB_T USB_WakeUpCfg;
/* USB Core Events Callback Functions */
USB_CB_T USB_Configure_Event;
USB_CB_T USB_Interface_Event;
USB_CB_T USB_Feature_Event;
/* cache and mmu translation functions */
uint32_t (* virt_to_phys)(void* vaddr);
void (* cache_flush)(uint32_t* start_adr, uint32_t* end_adr);
/* event handlers for endpoints. */
USB_EP_HANDLER_T ep_event_hdlr[2 * USB_MAX_EP_NUM];
void* ep_hdlr_data[2 * USB_MAX_EP_NUM];
/* USB class handlers */
USB_EP_HANDLER_T ep0_hdlr_cb[USB_MAX_IF_NUM];
void* ep0_cb_data[USB_MAX_IF_NUM];
uint8_t num_ep0_hdlrs;
/* USB Core data Variables */
uint8_t max_num_ep; /* max number of endpoints supported by the HW */
uint8_t device_speed;
uint8_t num_interfaces;
uint8_t device_addr;
uint8_t config_value;
uint16_t device_status;
uint8_t *device_desc;
uint8_t *string_desc;
uint8_t *full_speed_desc;
uint8_t *high_speed_desc;
uint8_t *device_qualifier;
uint32_t ep_mask;
uint32_t ep_halt;
uint32_t ep_stall;
uint8_t alt_setting[USB_MAX_IF_NUM];
/* HW driver data pointer */
void* hw_data;
/* USB Endpoint 0 Data Info */
USB_EP_DATA EP0Data;
/* USB Endpoint 0 Buffer */
//ALIGNED(4)
uint8_t EP0Buf[64];
/* USB Setup Packet */
//ALIGNED(4)
USB_SETUP_PACKET SetupPacket;
};
/* USB Core Functions */
extern void mwUSB_InitCore(USB_CORE_CTRL_T* pCtrl, USB_CORE_DESCS_T* pdescr, USBD_API_INIT_PARAM_T* param);
extern void mwUSB_ResetCore(USBD_HANDLE_T hUsb);
/* inline functions */
static __inline void USB_SetSpeedMode(USB_CORE_CTRL_T* pCtrl, uint8_t mode)
{
pCtrl->device_speed = mode;
}
/** @cond DIRECT_API */
/* midleware API */
extern ErrorCode_t mwUSB_RegisterClassHandler(USBD_HANDLE_T hUsb, USB_EP_HANDLER_T pfn, void* data);
extern ErrorCode_t mwUSB_RegisterEpHandler(USBD_HANDLE_T hUsb, uint32_t ep_index, USB_EP_HANDLER_T pfn, void* data);
extern void mwUSB_SetupStage (USBD_HANDLE_T hUsb);
extern void mwUSB_DataInStage(USBD_HANDLE_T hUsb);
extern void mwUSB_DataOutStage(USBD_HANDLE_T hUsb);
extern void mwUSB_StatusInStage(USBD_HANDLE_T hUsb);
extern void mwUSB_StatusOutStage(USBD_HANDLE_T hUsb);
extern void mwUSB_StallEp0(USBD_HANDLE_T hUsb);
extern ErrorCode_t mwUSB_RegisterClassHandler(USBD_HANDLE_T hUsb, USB_EP_HANDLER_T pfn, void* data);
extern ErrorCode_t mwUSB_RegisterEpHandler(USBD_HANDLE_T hUsb, uint32_t ep_index, USB_EP_HANDLER_T pfn, void* data);
extern void mwUSB_SetupStage (USBD_HANDLE_T hUsb);
extern void mwUSB_DataInStage(USBD_HANDLE_T hUsb);
extern void mwUSB_DataOutStage(USBD_HANDLE_T hUsb);
extern void mwUSB_StatusInStage(USBD_HANDLE_T hUsb);
extern void mwUSB_StatusOutStage(USBD_HANDLE_T hUsb);
extern void mwUSB_StallEp0(USBD_HANDLE_T hUsb);
/** @endcond */
/** @endcond */
#endif /* __MW_USBD_CORE_H__ */

View File

@ -1,48 +0,0 @@
/***********************************************************************
* $Id:: mw_usbd_desc.h 197 2011-06-12 20:22:41Z usb06052 $
*
* Project: USB device ROM Stack
*
* Description:
* USB Descriptors 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 __USBDESC_H__
#define __USBDESC_H__
#include "mw_usbd.h"
#define WBVAL(x) ((x) & 0xFF),(((x) >> 8) & 0xFF)
#define B3VAL(x) ((x) & 0xFF),(((x) >> 8) & 0xFF),(((x) >> 16) & 0xFF)
#define USB_DEVICE_DESC_SIZE (sizeof(USB_DEVICE_DESCRIPTOR))
#define USB_CONFIGUARTION_DESC_SIZE (sizeof(USB_CONFIGURATION_DESCRIPTOR))
#define USB_INTERFACE_DESC_SIZE (sizeof(USB_INTERFACE_DESCRIPTOR))
#define USB_ENDPOINT_DESC_SIZE (sizeof(USB_ENDPOINT_DESCRIPTOR))
#define USB_DEVICE_QUALI_SIZE (sizeof(USB_DEVICE_QUALIFIER_DESCRIPTOR))
#define USB_OTHER_SPEED_CONF_SIZE (sizeof(USB_OTHER_SPEED_CONFIGURATION))
#define HID_DESC_SIZE (sizeof(HID_DESCRIPTOR))
#define HID_REPORT_DESC_SIZE (sizeof(HID_ReportDescriptor))
extern const uint8_t HID_ReportDescriptor[];
extern const uint16_t HID_ReportDescSize;
extern const uint16_t HID_DescOffset;
#endif /* __USBDESC_H__ */

View File

@ -1,120 +0,0 @@
/***********************************************************************
* $Id:: mw_usbd_dfu.h 216 2011-07-13 21:52:14Z usb06052 $
*
* Project: USB device ROM Stack
*
* Description:
* Device Firmware Upgrade (DFU) module.
*
***********************************************************************
* 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 __MW_USBD_DFU_H__
#define __MW_USBD_DFU_H__
#include "mw_usbd.h"
/** \file
* \brief Device Firmware Upgrade (DFU) calss descriptors.
*
* Definition of DFU class descriptors and their bit defines.
*
*/
/**
* If USB device is only DFU capable, DFU Interface number is always 0.
* if USB device is (DFU + Other Class (Audio/Mass Storage/HID), DFU
* Interface number should also be 0 in this implementation.
*/
#define USB_DFU_IF_NUM 0x0
#define USB_DFU_DESCRIPTOR_TYPE 0x21
#define USB_DFU_DESCRIPTOR_SIZE 9
#define USB_DFU_SUBCLASS 0x01
/* DFU class-specific requests (Section 3, DFU Rev 1.1) */
#define USB_REQ_DFU_DETACH 0x00
#define USB_REQ_DFU_DNLOAD 0x01
#define USB_REQ_DFU_UPLOAD 0x02
#define USB_REQ_DFU_GETSTATUS 0x03
#define USB_REQ_DFU_CLRSTATUS 0x04
#define USB_REQ_DFU_GETSTATE 0x05
#define USB_REQ_DFU_ABORT 0x06
#define DFU_STATUS_OK 0x00
#define DFU_STATUS_errTARGET 0x01
#define DFU_STATUS_errFILE 0x02
#define DFU_STATUS_errWRITE 0x03
#define DFU_STATUS_errERASE 0x04
#define DFU_STATUS_errCHECK_ERASED 0x05
#define DFU_STATUS_errPROG 0x06
#define DFU_STATUS_errVERIFY 0x07
#define DFU_STATUS_errADDRESS 0x08
#define DFU_STATUS_errNOTDONE 0x09
#define DFU_STATUS_errFIRMWARE 0x0a
#define DFU_STATUS_errVENDOR 0x0b
#define DFU_STATUS_errUSBR 0x0c
#define DFU_STATUS_errPOR 0x0d
#define DFU_STATUS_errUNKNOWN 0x0e
#define DFU_STATUS_errSTALLEDPKT 0x0f
enum dfu_state {
DFU_STATE_appIDLE = 0,
DFU_STATE_appDETACH = 1,
DFU_STATE_dfuIDLE = 2,
DFU_STATE_dfuDNLOAD_SYNC = 3,
DFU_STATE_dfuDNBUSY = 4,
DFU_STATE_dfuDNLOAD_IDLE = 5,
DFU_STATE_dfuMANIFEST_SYNC = 6,
DFU_STATE_dfuMANIFEST = 7,
DFU_STATE_dfuMANIFEST_WAIT_RST= 8,
DFU_STATE_dfuUPLOAD_IDLE = 9,
DFU_STATE_dfuERROR = 10
};
#define DFU_EP0_NONE 0
#define DFU_EP0_UNHANDLED 1
#define DFU_EP0_STALL 2
#define DFU_EP0_ZLP 3
#define DFU_EP0_DATA 4
#define USB_DFU_CAN_DOWNLOAD (1 << 0)
#define USB_DFU_CAN_UPLOAD (1 << 1)
#define USB_DFU_MANIFEST_TOL (1 << 2)
#define USB_DFU_WILL_DETACH (1 << 3)
PRE_PACK struct POST_PACK _USB_DFU_FUNC_DESCRIPTOR {
uint8_t bLength;
uint8_t bDescriptorType;
uint8_t bmAttributes;
uint16_t wDetachTimeOut;
uint16_t wTransferSize;
uint16_t bcdDFUVersion;
};
typedef struct _USB_DFU_FUNC_DESCRIPTOR USB_DFU_FUNC_DESCRIPTOR;
PRE_PACK struct POST_PACK _DFU_STATUS {
uint8_t bStatus;
uint8_t bwPollTimeout[3];
uint8_t bState;
uint8_t iString;
};
typedef struct _DFU_STATUS DFU_STATUS_T;
#define DFU_FUNC_DESC_SIZE sizeof(USB_DFU_FUNC_DESCRIPTOR)
#define DFU_GET_STATUS_SIZE 0x6
#endif /* __MW_USBD_DFU_H__ */

View File

@ -1,264 +0,0 @@
/***********************************************************************
* $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__ */

View File

@ -1,429 +0,0 @@
/***********************************************************************
* $Id:: mw_usbd_hid.h 202 2011-06-12 21:50:01Z usb06052 $
*
* Project: USB device ROM Stack
*
* Description:
* HID 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 __HID_H__
#define __HID_H__
#include "mw_usbd.h"
/** \file
* \brief Common definitions and declarations for the library USB HID Class driver.
*
* Common definitions and declarations for the library USB HID Class driver.
* \addtogroup USBD_HID
* @{
*/
/** HID Subclass Codes
* @{
*/
/** Descriptor Subclass value indicating that the device or interface does not implement a HID boot protocol. */
#define HID_SUBCLASS_NONE 0x00
/** Descriptor Subclass value indicating that the device or interface implements a HID boot protocol. */
#define HID_SUBCLASS_BOOT 0x01
/** @} */
/** HID Protocol Codes
* @{
*/
/** Descriptor Protocol value indicating that the device or interface does not belong to a HID boot protocol. */
#define HID_PROTOCOL_NONE 0x00
/** Descriptor Protocol value indicating that the device or interface belongs to the Keyboard HID boot protocol. */
#define HID_PROTOCOL_KEYBOARD 0x01
/** Descriptor Protocol value indicating that the device or interface belongs to the Mouse HID boot protocol. */
#define HID_PROTOCOL_MOUSE 0x02
/** @} */
/** Descriptor Types
* @{
*/
/** Descriptor header type value, to indicate a HID class HID descriptor. */
#define HID_HID_DESCRIPTOR_TYPE 0x21
/** Descriptor header type value, to indicate a HID class HID report descriptor. */
#define HID_REPORT_DESCRIPTOR_TYPE 0x22
/** Descriptor header type value, to indicate a HID class HID Physical descriptor. */
#define HID_PHYSICAL_DESCRIPTOR_TYPE 0x23
/** @} */
/** \brief HID class-specific HID Descriptor.
*
* Type define for the HID class-specific HID descriptor, to describe the HID device's specifications. Refer to the HID
* specification for details on the structure elements.
*
*/
PRE_PACK struct POST_PACK _HID_DESCRIPTOR {
uint8_t bLength; /**< Size of the descriptor, in bytes. */
uint8_t bDescriptorType; /**< Type of HID descriptor. */
uint16_t bcdHID; /**< BCD encoded version that the HID descriptor and device complies to. */
uint8_t bCountryCode; /**< Country code of the localized device, or zero if universal. */
uint8_t bNumDescriptors; /**< Total number of HID report descriptors for the interface. */
PRE_PACK struct POST_PACK _HID_DESCRIPTOR_LIST {
uint8_t bDescriptorType; /**< Type of HID report. */
uint16_t wDescriptorLength; /**< Length of the associated HID report descriptor, in bytes. */
} DescriptorList[1]; /**< Array of one or more descriptors */
} ;
/** HID class-specific HID Descriptor. */
typedef struct _HID_DESCRIPTOR HID_DESCRIPTOR;
/** HID Request Codes
* @{
*/
#define HID_REQUEST_GET_REPORT 0x01
#define HID_REQUEST_GET_IDLE 0x02
#define HID_REQUEST_GET_PROTOCOL 0x03
#define HID_REQUEST_SET_REPORT 0x09
#define HID_REQUEST_SET_IDLE 0x0A
#define HID_REQUEST_SET_PROTOCOL 0x0B
/** @} */
/** HID Report Types
* @{
*/
#define HID_REPORT_INPUT 0x01
#define HID_REPORT_OUTPUT 0x02
#define HID_REPORT_FEATURE 0x03
/** @} */
/** Usage Pages
* @{
*/
#define HID_USAGE_PAGE_UNDEFINED 0x00
#define HID_USAGE_PAGE_GENERIC 0x01
#define HID_USAGE_PAGE_SIMULATION 0x02
#define HID_USAGE_PAGE_VR 0x03
#define HID_USAGE_PAGE_SPORT 0x04
#define HID_USAGE_PAGE_GAME 0x05
#define HID_USAGE_PAGE_DEV_CONTROLS 0x06
#define HID_USAGE_PAGE_KEYBOARD 0x07
#define HID_USAGE_PAGE_LED 0x08
#define HID_USAGE_PAGE_BUTTON 0x09
#define HID_USAGE_PAGE_ORDINAL 0x0A
#define HID_USAGE_PAGE_TELEPHONY 0x0B
#define HID_USAGE_PAGE_CONSUMER 0x0C
#define HID_USAGE_PAGE_DIGITIZER 0x0D
#define HID_USAGE_PAGE_UNICODE 0x10
#define HID_USAGE_PAGE_ALPHANUMERIC 0x14
/** @} */
/** Generic Desktop Page (0x01)
* @{
*/
#define HID_USAGE_GENERIC_POINTER 0x01
#define HID_USAGE_GENERIC_MOUSE 0x02
#define HID_USAGE_GENERIC_JOYSTICK 0x04
#define HID_USAGE_GENERIC_GAMEPAD 0x05
#define HID_USAGE_GENERIC_KEYBOARD 0x06
#define HID_USAGE_GENERIC_KEYPAD 0x07
#define HID_USAGE_GENERIC_X 0x30
#define HID_USAGE_GENERIC_Y 0x31
#define HID_USAGE_GENERIC_Z 0x32
#define HID_USAGE_GENERIC_RX 0x33
#define HID_USAGE_GENERIC_RY 0x34
#define HID_USAGE_GENERIC_RZ 0x35
#define HID_USAGE_GENERIC_SLIDER 0x36
#define HID_USAGE_GENERIC_DIAL 0x37
#define HID_USAGE_GENERIC_WHEEL 0x38
#define HID_USAGE_GENERIC_HATSWITCH 0x39
#define HID_USAGE_GENERIC_COUNTED_BUFFER 0x3A
#define HID_USAGE_GENERIC_BYTE_COUNT 0x3B
#define HID_USAGE_GENERIC_MOTION_WAKEUP 0x3C
#define HID_USAGE_GENERIC_VX 0x40
#define HID_USAGE_GENERIC_VY 0x41
#define HID_USAGE_GENERIC_VZ 0x42
#define HID_USAGE_GENERIC_VBRX 0x43
#define HID_USAGE_GENERIC_VBRY 0x44
#define HID_USAGE_GENERIC_VBRZ 0x45
#define HID_USAGE_GENERIC_VNO 0x46
#define HID_USAGE_GENERIC_SYSTEM_CTL 0x80
#define HID_USAGE_GENERIC_SYSCTL_POWER 0x81
#define HID_USAGE_GENERIC_SYSCTL_SLEEP 0x82
#define HID_USAGE_GENERIC_SYSCTL_WAKE 0x83
#define HID_USAGE_GENERIC_SYSCTL_CONTEXT_MENU 0x84
#define HID_USAGE_GENERIC_SYSCTL_MAIN_MENU 0x85
#define HID_USAGE_GENERIC_SYSCTL_APP_MENU 0x86
#define HID_USAGE_GENERIC_SYSCTL_HELP_MENU 0x87
#define HID_USAGE_GENERIC_SYSCTL_MENU_EXIT 0x88
#define HID_USAGE_GENERIC_SYSCTL_MENU_SELECT 0x89
#define HID_USAGE_GENERIC_SYSCTL_MENU_RIGHT 0x8A
#define HID_USAGE_GENERIC_SYSCTL_MENU_LEFT 0x8B
#define HID_USAGE_GENERIC_SYSCTL_MENU_UP 0x8C
#define HID_USAGE_GENERIC_SYSCTL_MENU_DOWN 0x8D
/** @} */
/** Simulation Controls Page (0x02)
* @{
*/
#define HID_USAGE_SIMULATION_RUDDER 0xBA
#define HID_USAGE_SIMULATION_THROTTLE 0xBB
/** @} */
/* Virtual Reality Controls Page (0x03) */
/* ... */
/* Sport Controls Page (0x04) */
/* ... */
/* Game Controls Page (0x05) */
/* ... */
/* Generic Device Controls Page (0x06) */
/* ... */
/** Keyboard/Keypad Page (0x07)
* @{
*/
/** Error "keys" */
#define HID_USAGE_KEYBOARD_NOEVENT 0x00
#define HID_USAGE_KEYBOARD_ROLLOVER 0x01
#define HID_USAGE_KEYBOARD_POSTFAIL 0x02
#define HID_USAGE_KEYBOARD_UNDEFINED 0x03
/** Letters */
#define HID_USAGE_KEYBOARD_aA 0x04
#define HID_USAGE_KEYBOARD_zZ 0x1D
/** Numbers */
#define HID_USAGE_KEYBOARD_ONE 0x1E
#define HID_USAGE_KEYBOARD_ZERO 0x27
#define HID_USAGE_KEYBOARD_RETURN 0x28
#define HID_USAGE_KEYBOARD_ESCAPE 0x29
#define HID_USAGE_KEYBOARD_DELETE 0x2A
/** Funtion keys */
#define HID_USAGE_KEYBOARD_F1 0x3A
#define HID_USAGE_KEYBOARD_F12 0x45
#define HID_USAGE_KEYBOARD_PRINT_SCREEN 0x46
/** Modifier Keys */
#define HID_USAGE_KEYBOARD_LCTRL 0xE0
#define HID_USAGE_KEYBOARD_LSHFT 0xE1
#define HID_USAGE_KEYBOARD_LALT 0xE2
#define HID_USAGE_KEYBOARD_LGUI 0xE3
#define HID_USAGE_KEYBOARD_RCTRL 0xE4
#define HID_USAGE_KEYBOARD_RSHFT 0xE5
#define HID_USAGE_KEYBOARD_RALT 0xE6
#define HID_USAGE_KEYBOARD_RGUI 0xE7
#define HID_USAGE_KEYBOARD_SCROLL_LOCK 0x47
#define HID_USAGE_KEYBOARD_NUM_LOCK 0x53
#define HID_USAGE_KEYBOARD_CAPS_LOCK 0x39
/** @} */
/* ... */
/** LED Page (0x08)
* @{
*/
#define HID_USAGE_LED_NUM_LOCK 0x01
#define HID_USAGE_LED_CAPS_LOCK 0x02
#define HID_USAGE_LED_SCROLL_LOCK 0x03
#define HID_USAGE_LED_COMPOSE 0x04
#define HID_USAGE_LED_KANA 0x05
#define HID_USAGE_LED_POWER 0x06
#define HID_USAGE_LED_SHIFT 0x07
#define HID_USAGE_LED_DO_NOT_DISTURB 0x08
#define HID_USAGE_LED_MUTE 0x09
#define HID_USAGE_LED_TONE_ENABLE 0x0A
#define HID_USAGE_LED_HIGH_CUT_FILTER 0x0B
#define HID_USAGE_LED_LOW_CUT_FILTER 0x0C
#define HID_USAGE_LED_EQUALIZER_ENABLE 0x0D
#define HID_USAGE_LED_SOUND_FIELD_ON 0x0E
#define HID_USAGE_LED_SURROUND_FIELD_ON 0x0F
#define HID_USAGE_LED_REPEAT 0x10
#define HID_USAGE_LED_STEREO 0x11
#define HID_USAGE_LED_SAMPLING_RATE_DETECT 0x12
#define HID_USAGE_LED_SPINNING 0x13
#define HID_USAGE_LED_CAV 0x14
#define HID_USAGE_LED_CLV 0x15
#define HID_USAGE_LED_RECORDING_FORMAT_DET 0x16
#define HID_USAGE_LED_OFF_HOOK 0x17
#define HID_USAGE_LED_RING 0x18
#define HID_USAGE_LED_MESSAGE_WAITING 0x19
#define HID_USAGE_LED_DATA_MODE 0x1A
#define HID_USAGE_LED_BATTERY_OPERATION 0x1B
#define HID_USAGE_LED_BATTERY_OK 0x1C
#define HID_USAGE_LED_BATTERY_LOW 0x1D
#define HID_USAGE_LED_SPEAKER 0x1E
#define HID_USAGE_LED_HEAD_SET 0x1F
#define HID_USAGE_LED_HOLD 0x20
#define HID_USAGE_LED_MICROPHONE 0x21
#define HID_USAGE_LED_COVERAGE 0x22
#define HID_USAGE_LED_NIGHT_MODE 0x23
#define HID_USAGE_LED_SEND_CALLS 0x24
#define HID_USAGE_LED_CALL_PICKUP 0x25
#define HID_USAGE_LED_CONFERENCE 0x26
#define HID_USAGE_LED_STAND_BY 0x27
#define HID_USAGE_LED_CAMERA_ON 0x28
#define HID_USAGE_LED_CAMERA_OFF 0x29
#define HID_USAGE_LED_ON_LINE 0x2A
#define HID_USAGE_LED_OFF_LINE 0x2B
#define HID_USAGE_LED_BUSY 0x2C
#define HID_USAGE_LED_READY 0x2D
#define HID_USAGE_LED_PAPER_OUT 0x2E
#define HID_USAGE_LED_PAPER_JAM 0x2F
#define HID_USAGE_LED_REMOTE 0x30
#define HID_USAGE_LED_FORWARD 0x31
#define HID_USAGE_LED_REVERSE 0x32
#define HID_USAGE_LED_STOP 0x33
#define HID_USAGE_LED_REWIND 0x34
#define HID_USAGE_LED_FAST_FORWARD 0x35
#define HID_USAGE_LED_PLAY 0x36
#define HID_USAGE_LED_PAUSE 0x37
#define HID_USAGE_LED_RECORD 0x38
#define HID_USAGE_LED_ERROR 0x39
#define HID_USAGE_LED_SELECTED_INDICATOR 0x3A
#define HID_USAGE_LED_IN_USE_INDICATOR 0x3B
#define HID_USAGE_LED_MULTI_MODE_INDICATOR 0x3C
#define HID_USAGE_LED_INDICATOR_ON 0x3D
#define HID_USAGE_LED_INDICATOR_FLASH 0x3E
#define HID_USAGE_LED_INDICATOR_SLOW_BLINK 0x3F
#define HID_USAGE_LED_INDICATOR_FAST_BLINK 0x40
#define HID_USAGE_LED_INDICATOR_OFF 0x41
#define HID_USAGE_LED_FLASH_ON_TIME 0x42
#define HID_USAGE_LED_SLOW_BLINK_ON_TIME 0x43
#define HID_USAGE_LED_SLOW_BLINK_OFF_TIME 0x44
#define HID_USAGE_LED_FAST_BLINK_ON_TIME 0x45
#define HID_USAGE_LED_FAST_BLINK_OFF_TIME 0x46
#define HID_USAGE_LED_INDICATOR_COLOR 0x47
#define HID_USAGE_LED_RED 0x48
#define HID_USAGE_LED_GREEN 0x49
#define HID_USAGE_LED_AMBER 0x4A
#define HID_USAGE_LED_GENERIC_INDICATOR 0x4B
/** @} */
/* Button Page (0x09)
*/
/* There is no need to label these usages. */
/* Ordinal Page (0x0A)
*/
/* There is no need to label these usages. */
/** Telephony Device Page (0x0B)
* @{
*/
#define HID_USAGE_TELEPHONY_PHONE 0x01
#define HID_USAGE_TELEPHONY_ANSWERING_MACHINE 0x02
#define HID_USAGE_TELEPHONY_MESSAGE_CONTROLS 0x03
#define HID_USAGE_TELEPHONY_HANDSET 0x04
#define HID_USAGE_TELEPHONY_HEADSET 0x05
#define HID_USAGE_TELEPHONY_KEYPAD 0x06
#define HID_USAGE_TELEPHONY_PROGRAMMABLE_BUTTON 0x07
/** @} */
/* ... */
/** Consumer Page (0x0C)
* @{
*/
#define HID_USAGE_CONSUMER_CONTROL 0x01
#define HID_USAGE_CONSUMER_FAST_FORWARD 0xB3
#define HID_USAGE_CONSUMER_REWIND 0xB4
#define HID_USAGE_CONSUMER_PLAY_PAUSE 0xCD
#define HID_USAGE_CONSUMER_VOLUME_INCREMENT 0xE9
#define HID_USAGE_CONSUMER_VOLUME_DECREMENT 0xEA
/** @} */
/* ... */
/* and others ... */
/** HID Report Item Macros
* @{
*/
/** Main Items */
#define HID_Input(x) 0x81,x
#define HID_Output(x) 0x91,x
#define HID_Feature(x) 0xB1,x
#define HID_Collection(x) 0xA1,x
#define HID_EndCollection 0xC0
/** Data (Input, Output, Feature) */
#define HID_Data 0<<0
#define HID_Constant 1<<0
#define HID_Array 0<<1
#define HID_Variable 1<<1
#define HID_Absolute 0<<2
#define HID_Relative 1<<2
#define HID_NoWrap 0<<3
#define HID_Wrap 1<<3
#define HID_Linear 0<<4
#define HID_NonLinear 1<<4
#define HID_PreferredState 0<<5
#define HID_NoPreferred 1<<5
#define HID_NoNullPosition 0<<6
#define HID_NullState 1<<6
#define HID_NonVolatile 0<<7
#define HID_Volatile 1<<7
/** Collection Data */
#define HID_Physical 0x00
#define HID_Application 0x01
#define HID_Logical 0x02
#define HID_Report 0x03
#define HID_NamedArray 0x04
#define HID_UsageSwitch 0x05
#define HID_UsageModifier 0x06
/** Global Items */
#define HID_UsagePage(x) 0x05,x
#define HID_UsagePageVendor(x) 0x06,x,0xFF
#define HID_LogicalMin(x) 0x15,x
#define HID_LogicalMinS(x) 0x16,(x&0xFF),((x>>8)&0xFF)
#define HID_LogicalMinL(x) 0x17,(x&0xFF),((x>>8)&0xFF),((x>>16)&0xFF),((x>>24)&0xFF)
#define HID_LogicalMax(x) 0x25,x
#define HID_LogicalMaxS(x) 0x26,(x&0xFF),((x>>8)&0xFF)
#define HID_LogicalMaxL(x) 0x27,(x&0xFF),((x>>8)&0xFF),((x>>16)&0xFF),((x>>24)&0xFF)
#define HID_PhysicalMin(x) 0x35,x
#define HID_PhysicalMinS(x) 0x36,(x&0xFF),((x>>8)&0xFF)
#define HID_PhysicalMinL(x) 0x37,(x&0xFF),((x>>8)&0xFF),((x>>16)&0xFF),((x>>24)&0xFF)
#define HID_PhysicalMax(x) 0x45,x
#define HID_PhysicalMaxS(x) 0x46,(x&0xFF),((x>>8)&0xFF)
#define HID_PhysicalMaxL(x) 0x47,(x&0xFF),((x>>8)&0xFF),((x>>16)&0xFF),((x>>24)&0xFF)
#define HID_UnitExponent(x) 0x55,x
#define HID_Unit(x) 0x65,x
#define HID_UnitS(x) 0x66,(x&0xFF),((x>>8)&0xFF)
#define HID_UnitL(x) 0x67,(x&0xFF),((x>>8)&0xFF),((x>>16)&0xFF),((x>>24)&0xFF)
#define HID_ReportSize(x) 0x75,x
#define HID_ReportID(x) 0x85,x
#define HID_ReportCount(x) 0x95,x
#define HID_Push 0xA0
#define HID_Pop 0xB0
/** Local Items */
#define HID_Usage(x) 0x09,x
#define HID_UsageMin(x) 0x19,x
#define HID_UsageMax(x) 0x29,x
/** @} */
/** @} */
#endif /* __HID_H__ */

View File

@ -1,421 +0,0 @@
/***********************************************************************
* $Id:: mw_usbd_hiduser.h 202 2011-06-12 21:50:01Z usb06052 $
*
* Project: USB device ROM Stack
*
* Description:
* HID 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 __HIDUSER_H__
#define __HIDUSER_H__
#include "mw_usbd.h"
//#include "mw_usbd_hid.h"
#include "mw_usbd_core.h"
/** \file
* \brief Human Interface Device (HID) API structures and function prototypes.
*
* Definition of functions exported by ROM based HID function driver.
*
*/
/** \ingroup Group_USBD
* @defgroup USBD_HID HID Class Function Driver
* \section Sec_HIDModDescription Module Description
* HID Class Function Driver module. This module contains an internal implementation of the USB HID Class.
* User applications can use this class driver instead of implementing the HID class manually
* via the low-level HW and 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 HID Class.
*/
/** \brief HID report descriptor data structure.
* \ingroup USBD_HID
*
* \details This structure is used as part of HID function driver initialization
* parameter structure \ref USBD_HID_INIT_PARAM. This structure contains
* details of a report type supported by the application. An application
* can support multiple report types as a single HID device. The application
* should define this report type data struture per report it supports and
* the array of reoprt types to USBD_HID_API::init() through \ref USBD_HID_INIT_PARAM
* structure.
*
* \note All descriptor pointers assigned in this structure should be on 4 byte
* aligned address boundary.
*
*/
typedef struct _HID_REPORT_T {
uint16_t len; /**< Size of the report descriptor in bytes. */
uint8_t idle_time; /**< This value is used by stack to respond to Set_Idle &
GET_Idle requests for the specified report ID. The value
of this field specified the rate at which duplicate reports
are generated for the specified Report ID. For example, a
device with two input reports could specify an idle rate of
20 milliseconds for report ID 1 and 500 milliseconds for
report ID 2.
*/
uint8_t __pad; /**< Padding space. */
uint8_t* desc; /**< Report descriptor. */
} USB_HID_REPORT_T;
/** \brief USB descriptors data structure.
* \ingroup USBD_HID
*
* \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_HID_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_HID_API::GetMemSize() routine.*/
/* HID paramas */
uint8_t max_reports; /**< Number of HID reports supported by this instance
of HID class driver.
*/
uint8_t pad[3];
uint8_t* intf_desc; /**< Pointer to the HID interface descriptor within the
descriptor array (\em high_speed_desc) passed to Init()
through \ref USB_CORE_DESCS_T structure.
*/
USB_HID_REPORT_T* report_data; /**< Pointer to an array of HID report descriptor
data structure (\ref USB_HID_REPORT_T). The number
of elements in the array should be same a \em max_reports
value. The stack uses this array to respond to
requests recieved for various HID report descriptor
information. \note This array should be of global scope.
*/
/* user defined functions */
/* required functions */
/**
* HID get report callback function.
*
* This function is provided by the application software. This function gets called
* when host sends a HID_REQUEST_GET_REPORT request. The setup packet data (\em pSetup)
* is passed to the callback so that application can extract the report ID, report
* type and other information need to generate the report. \note HID reports are sent
* via interrupt IN endpoint also. This function is called only when report request
* is received on control endpoint. Application should implement \em HID_EpIn_Hdlr to
* send reports to host via interrupt IN endpoint.
*
*
* \param[in] hHid Handle to HID function driver.
* \param[in] pSetup Pointer to setup packet recived from host.
* \param[in, out] pBuffer Pointer to a pointer of data buffer containing report 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 (*HID_GetReport)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuffer, uint16_t* length);
/**
* HID set report callback function.
*
* This function is provided by the application software. This function gets called
* when host sends a HID_REQUEST_SET_REPORT request. The setup packet data (\em pSetup)
* is passed to the callback so that application can extract the report ID, report
* type and other information need to modify the report. An application might choose
* to ignore input Set_Report requests as meaningless. Alternatively these reports
* could be used to reset the origin of a control (that is, current position should
* report zero).
*
* \param[in] hHid Handle to HID function driver.
* \param[in] pSetup Pointer to setup packet recived from host.
* \param[in, out] pBuffer Pointer to a pointer of data buffer containing report 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 (*HID_SetReport)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuffer, uint16_t length);
/* optional functions */
/**
* Optional callback function to handle HID_GetPhysDesc request.
*
* The application software could provide this callback HID_GetPhysDesc handler to
* handle get physical descriptor requests sent by the host. When host requests
* Physical Descriptor set 0, application should return a special descriptor
* identifying the number of descriptor sets and their sizes. A Get_Descriptor
* request with the Physical Index equal to 1 should return the first Physical
* Descriptor set. A device could possibly have alternate uses for its items.
* These can be enumerated by issuing subsequent Get_Descriptor requests while
* incrementing the Descriptor Index. A device should return the last descriptor
* set to requests with an index greater than the last number defined in the HID
* descriptor.
* \note Applications which don't have physical descriptor should set this data member
* to zero before calling the USBD_HID_API::Init().
* \n
*
* \param[in] hHid Handle to HID function driver.
* \param[in] pSetup Pointer to setup packet recived from host.
* \param[in] pBuf Pointer to a pointer of data buffer containing physical descriptor
* data. If the physical descriptor is in USB accessable memory area
* application could just update the pointer or else it should copy
* the descriptor to the address pointed by this pointer.
* \param[in] length Amount of data copied to destination buffer or descriptor length.
* \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 (*HID_GetPhysDesc)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuf, uint16_t* length);
/**
* Optional callback function to handle HID_REQUEST_SET_IDLE request.
*
* The application software could provide this callback to handle HID_REQUEST_SET_IDLE
* requests sent by the host. This callback is provided to applications to adjust
* timers associated with various reports, which are sent to host over interrupt
* endpoint. The setup packet data (\em pSetup) is passed to the callback so that
* application can extract the report ID, report type and other information need
* to modify the report's idle time.
* \note Applications which don't send reports on Interrupt endpoint or don't
* have idle time between reports should set this data member to zero before
* calling the USBD_HID_API::Init().
* \n
*
* \param[in] hHid Handle to HID function driver.
* \param[in] pSetup Pointer to setup packet recived from host.
* \param[in] idleTime Idle time to be set for the specified report.
* \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 (*HID_SetIdle)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t idleTime);
/**
* Optional callback function to handle HID_REQUEST_SET_PROTOCOL request.
*
* The application software could provide this callback to handle HID_REQUEST_SET_PROTOCOL
* requests sent by the host. This callback is provided to applications to adjust
* modes of their code between boot mode and report mode.
* \note Applications which don't support protocol modes should set this data member
* to zero before calling the USBD_HID_API::Init().
* \n
*
* \param[in] hHid Handle to HID function driver.
* \param[in] pSetup Pointer to setup packet recived from host.
* \param[in] protocol Protocol mode.
* 0 = Boot Protocol
* 1 = Report Protocol
* \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 (*HID_SetProtocol)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t protocol);
/**
* Optional Interrupt IN endpoint event handler.
*
* The application software could provide Interrupt IN endpoint event handler.
* Application which send reports to host on interrupt endpoint should provide
* an endpoint event handler through this data member. This data memeber is
* ignored if the interface descriptor \em intf_desc doesn't have any IN interrupt
* endpoint descriptor associated.
* \n
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] data Handle to HID function driver.
* \param[in] event Type of endpoint event. See \ref USBD_EVENT_T for more details.
* \return The call back should return \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 (*HID_EpIn_Hdlr) (USBD_HANDLE_T hUsb, void* data, uint32_t event);
/**
* Optional Interrupt OUT endpoint event handler.
*
* The application software could provide Interrupt OUT endpoint event handler.
* Application which recieves reports from host on interrupt endpoint should provide
* an endpoint event handler through this data member. This data memeber is
* ignored if the interface descriptor \em intf_desc doesn't have any OUT interrupt
* endpoint descriptor associated.
* \n
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] data Handle to HID function driver.
* \param[in] event Type of endpoint event. See \ref USBD_EVENT_T for more details.
* \return The call back should return \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 (*HID_EpOut_Hdlr) (USBD_HANDLE_T hUsb, void* data, uint32_t event);
/* user overridable function */
/**
* Optional user overridable function to replace the default HID_GetReportDesc handler.
*
* The application software could override the default HID_GetReportDesc 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_HID_API::Init() and also provide report data array
* \em report_data field.
* \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 (*HID_GetReportDesc)(USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuf, uint16_t* length);
/**
* Optional user overridable function to replace the default HID 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_HID_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 (*HID_Ep0_Hdlr) (USBD_HANDLE_T hUsb, void* data, uint32_t event);
} USBD_HID_INIT_PARAM_T;
/** \brief HID class API functions structure.
* \ingroup USBD_HID
*
* This structure contains pointers to all the function exposed by HID function driver module.
*
*/
typedef struct USBD_HID_API
{
/** \fn uint32_t GetMemSize(USBD_HID_INIT_PARAM_T* param)
* Function to determine the memory required by the HID function driver module.
*
* This function is called by application layer before calling pUsbApi->hid->Init(), to allocate memory used
* by HID 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 HID function driver module initialization parameters.
* \return Returns the required memory size in bytes.
*/
uint32_t (*GetMemSize)(USBD_HID_INIT_PARAM_T* param);
/** \fn ErrorCode_t init(USBD_HANDLE_T hUsb, USBD_HID_INIT_PARAM_T* param)
* Function to initialize HID function driver module.
*
* This function is called by application layer to initialize HID function driver
* module. On successful initialization the function returns a handle to HID
* function driver module in passed param structure.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in, out] param Structure containing HID 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 HID_GetReport() or HID_SetReport()
* callback are not defined.
* \retval ERR_USBD_BAD_DESC HID_HID_DESCRIPTOR_TYPE is not defined
* immediately after interface descriptor.
* \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_HID_INIT_PARAM_T* param);
} USBD_HID_API_T;
/*-----------------------------------------------------------------------------
* Private functions & structures prototypes
*-----------------------------------------------------------------------------*/
/** @cond ADVANCED_API */
typedef struct _HID_CTRL_T {
/* pointer to controller */
USB_CORE_CTRL_T* pUsbCtrl;
/* descriptor pointers */
uint8_t* hid_desc;
USB_HID_REPORT_T* report_data;
uint8_t protocol;
uint8_t if_num; /* interface number */
uint8_t epin_adr; /* IN interrupt endpoint */
uint8_t epout_adr; /* OUT interrupt endpoint */
/* user defined functions */
ErrorCode_t (*HID_GetReport)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuffer, uint16_t* length);
ErrorCode_t (*HID_SetReport)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuffer, uint16_t length);
ErrorCode_t (*HID_GetPhysDesc)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuf, uint16_t* length);
ErrorCode_t (*HID_SetIdle)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t idleTime);
ErrorCode_t (*HID_SetProtocol)( USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t protocol);
/* virtual overridable functions */
ErrorCode_t (*HID_GetReportDesc)(USBD_HANDLE_T hHid, USB_SETUP_PACKET* pSetup, uint8_t** pBuf, uint16_t* length);
}USB_HID_CTRL_T;
/** @cond DIRECT_API */
extern uint32_t mwHID_GetMemSize(USBD_HID_INIT_PARAM_T* param);
extern ErrorCode_t mwHID_init(USBD_HANDLE_T hUsb, USBD_HID_INIT_PARAM_T* param);
/** @endcond */
/** @endcond */
#endif /* __HIDUSER_H__ */

View File

@ -1,456 +0,0 @@
/***********************************************************************
* $Id:: mw_usbd_hw.h 202 2011-06-12 21:50:01Z usb06052 $
*
* Project: USB device ROM Stack
*
* Description:
* USB Hardware Function prototypes.
*
***********************************************************************
* 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 __USBHW_H__
#define __USBHW_H__
#include "error.h"
#include "mw_usbd.h"
#include "mw_usbd_core.h"
/** \file
* \brief USB Hardware Function prototypes.
*
* Definition of functions exported by ROM based Device Controller Driver (DCD).
*
*/
/** \ingroup Group_USBD
* @defgroup USBD_HW USB Device Controller Driver
* \section Sec_HWModDescription Module Description
* The Device Controller Driver Layer implements the routines to deal directly with the hardware.
*/
/** \ingroup USBD_HW
* USB Endpoint/class handler Callback Events.
*
*/
enum USBD_EVENT_T {
USB_EVT_SETUP =1, /**< 1 Setup Packet received */
USB_EVT_OUT, /**< 2 OUT Packet received */
USB_EVT_IN, /**< 3 IN Packet sent */
USB_EVT_OUT_NAK, /**< 4 OUT Packet - Not Acknowledged */
USB_EVT_IN_NAK, /**< 5 IN Packet - Not Acknowledged */
USB_EVT_OUT_STALL, /**< 6 OUT Packet - Stalled */
USB_EVT_IN_STALL, /**< 7 IN Packet - Stalled */
USB_EVT_OUT_DMA_EOT, /**< 8 DMA OUT EP - End of Transfer */
USB_EVT_IN_DMA_EOT, /**< 9 DMA IN EP - End of Transfer */
USB_EVT_OUT_DMA_NDR, /**< 10 DMA OUT EP - New Descriptor Request */
USB_EVT_IN_DMA_NDR, /**< 11 DMA IN EP - New Descriptor Request */
USB_EVT_OUT_DMA_ERR, /**< 12 DMA OUT EP - Error */
USB_EVT_IN_DMA_ERR, /**< 13 DMA IN EP - Error */
USB_EVT_RESET, /**< 14 Reset event recieved */
USB_EVT_SOF, /**< 15 Start of Frame event */
USB_EVT_DEV_STATE, /**< 16 Device status events */
USB_EVT_DEV_ERROR /**< 17 Device error events */
};
/**
* \brief Hardware API functions structure.
* \ingroup USBD_HW
*
* This module exposes functions which interact directly with USB device controller hardware.
*
*/
typedef struct USBD_HW_API
{
/** \fn uint32_t GetMemSize(USBD_API_INIT_PARAM_T* param)
* Function to determine the memory required by the USB device stack's DCD and core layers.
*
* This fuction is called by application layer before calling pUsbApi->hw->Init(), to allocate memory used
* by DCD and core layers. 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 USB device stack initialization parameters.
* \return Returns the required memory size in bytes.
*/
uint32_t (*GetMemSize)(USBD_API_INIT_PARAM_T* param);
/** \fn ErrorCode_t Init(USBD_HANDLE_T* phUsb, USB_CORE_DESCS_T* pDesc, USBD_API_INIT_PARAM_T* param)
* Function to initialize USB device stack's DCD and core layers.
*
* This function is called by application layer to initialize USB hardware and core layers.
* On successful initialization the function returns a handle to USB device stack which should
* be passed to the rest of the functions.
*
* \param[in,out] phUsb Pointer to the USB device stack handle of type USBD_HANDLE_T.
* \param[in] param Structure containing USB device stack initialization parameters.
* \return Returns \ref ErrorCode_t type to indicate success or error condition.
* \retval LPC_OK(0) On success
* \retval ERR_USBD_BAD_MEM_BUF(0x0004000b) When insufficient memory buffer is passed or memory
* is not aligned on 2048 boundary.
*/
ErrorCode_t (*Init)(USBD_HANDLE_T* phUsb, USB_CORE_DESCS_T* pDesc, USBD_API_INIT_PARAM_T* param);
/** \fn void Connect(USBD_HANDLE_T hUsb, uint32_t con)
* Function to make USB device visible/invisible on the USB bus.
*
* This function is called after the USB initialization. This function uses the soft connect
* feature to make the device visible on the USB bus. This function is called only after the
* application is ready to handle the USB data. The enumeration process is started by the
* host after the device detection. The driver handles the enumeration process according to
* the USB descriptors passed in the USB initialization function.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] con States whether to connect (1) or to disconnect (0).
* \return Nothing.
*/
void (*Connect)(USBD_HANDLE_T hUsb, uint32_t con);
/** \fn void ISR(USBD_HANDLE_T hUsb)
* Function to USB device controller interrupt events.
*
* When the user application is active the interrupt handlers are mapped in the user flash
* space. The user application must provide an interrupt handler for the USB interrupt and
* call this function in the interrupt handler routine. The driver interrupt handler takes
* appropriate action according to the data received on the USB bus.
*
* \param[in] hUsb Handle to the USB device stack.
* \return Nothing.
*/
void (*ISR)(USBD_HANDLE_T hUsb);
/** \fn void Reset(USBD_HANDLE_T hUsb)
* Function to Reset USB device stack and hardware controller.
*
* Reset USB device stack and hardware controller. Disables all endpoints except EP0.
* Clears all pending interrupts and resets endpoint transfer queues.
* This function is called internally by pUsbApi->hw->init() and from reset event.
*
* \param[in] hUsb Handle to the USB device stack.
* \return Nothing.
*/
void (*Reset)(USBD_HANDLE_T hUsb);
/** \fn void ForceFullSpeed(USBD_HANDLE_T hUsb, uint32_t cfg)
* Function to force high speed USB device to operate in full speed mode.
*
* This function is useful for testing the behaviour of current device when connected
* to a full speed only hosts.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] cfg When 1 - set force full-speed or
* 0 - clear force full-speed.
* \return Nothing.
*/
void (*ForceFullSpeed )(USBD_HANDLE_T hUsb, uint32_t cfg);
/** \fn void WakeUpCfg(USBD_HANDLE_T hUsb, uint32_t cfg)
* Function to configure USB device controller to wakeup host on remote events.
*
* This function is called by application layer to configure the USB device controller
* to wakeup on remote events. It is recommended to call this function from users's
* USB_WakeUpCfg() callback routine registered with stack.
* \note User's USB_WakeUpCfg() is registered with stack by setting the USB_WakeUpCfg member
* of USBD_API_INIT_PARAM_T structure before calling pUsbApi->hw->Init() routine.
* Certain USB device controllers needed to keep some clocks always on to generate
* resume signaling through pUsbApi->hw->WakeUp(). This hook is provided to support
* such controllers. In most controllers cases this is an empty routine.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] cfg When 1 - Configure controller to wake on remote events or
* 0 - Configure controller not to wake on remote events.
* \return Nothing.
*/
void (*WakeUpCfg)(USBD_HANDLE_T hUsb, uint32_t cfg);
/** \fn void SetAddress(USBD_HANDLE_T hUsb, uint32_t adr)
* Function to set USB address assigned by host in device controller hardware.
*
* This function is called automatically when USB_REQUEST_SET_ADDRESS request is received
* by the stack from USB host.
* This interface is provided to users to invoke this function in other scenarios which are not
* handle by current stack. In most user applications this function is not called directly.
* Also this function can be used by users who are selectively modifying the USB device stack's
* standard handlers through callback interface exposed by the stack.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] adr USB bus Address to which the device controller should respond. Usually
* assigned by the USB host.
* \return Nothing.
*/
void (*SetAddress)(USBD_HANDLE_T hUsb, uint32_t adr);
/** \fn void Configure(USBD_HANDLE_T hUsb, uint32_t cfg)
* Function to configure device controller hardware with selected configuration.
*
* This function is called automatically when USB_REQUEST_SET_CONFIGURATION request is received
* by the stack from USB host.
* This interface is provided to users to invoke this function in other scenarios which are not
* handle by current stack. In most user applications this function is not called directly.
* Also this function can be used by users who are selectively modifying the USB device stack's
* standard handlers through callback interface exposed by the stack.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] cfg Configuration index.
* \return Nothing.
*/
void (*Configure)(USBD_HANDLE_T hUsb, uint32_t cfg);
/** \fn void ConfigEP(USBD_HANDLE_T hUsb, USB_ENDPOINT_DESCRIPTOR *pEPD)
* Function to configure USB Endpoint according to descriptor.
*
* This function is called automatically when USB_REQUEST_SET_CONFIGURATION request is received
* by the stack from USB host. All the endpoints associated with the selected configuration
* are configured.
* This interface is provided to users to invoke this function in other scenarios which are not
* handle by current stack. In most user applications this function is not called directly.
* Also this function can be used by users who are selectively modifying the USB device stack's
* standard handlers through callback interface exposed by the stack.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] pEPD Endpoint descriptor structure defined in USB 2.0 specification.
* \return Nothing.
*/
void (*ConfigEP)(USBD_HANDLE_T hUsb, USB_ENDPOINT_DESCRIPTOR *pEPD);
/** \fn void DirCtrlEP(USBD_HANDLE_T hUsb, uint32_t dir)
* Function to set firection for USB control endpoint EP0.
*
* This function is called automatically by the stack on need bassis.
* This interface is provided to users to invoke this function in other scenarios which are not
* handle by current stack. In most user applications this function is not called directly.
* Also this function can be used by users who are selectively modifying the USB device stack's
* standard handlers through callback interface exposed by the stack.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] cfg When 1 - Set EP0 in IN transfer mode
* 0 - Set EP0 in OUT transfer mode
* \return Nothing.
*/
void (*DirCtrlEP)(USBD_HANDLE_T hUsb, uint32_t dir);
/** \fn void EnableEP(USBD_HANDLE_T hUsb, uint32_t EPNum)
* Function to enable selected USB endpoint.
*
* This function enables interrupts on selected endpoint.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] EPNum Endpoint number as per USB specification.
* ie. An EP1_IN is represented by 0x81 number.
* \return Nothing.
*/
void (*EnableEP)(USBD_HANDLE_T hUsb, uint32_t EPNum);
/** \fn void DisableEP(USBD_HANDLE_T hUsb, uint32_t EPNum)
* Function to disable selected USB endpoint.
*
* This function disables interrupts on selected endpoint.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] EPNum Endpoint number as per USB specification.
* ie. An EP1_IN is represented by 0x81 number.
* \return Nothing.
*/
void (*DisableEP)(USBD_HANDLE_T hUsb, uint32_t EPNum);
/** \fn void ResetEP(USBD_HANDLE_T hUsb, uint32_t EPNum)
* Function to reset selected USB endpoint.
*
* This function flushes the endpoint buffers and resets data toggle logic.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] EPNum Endpoint number as per USB specification.
* ie. An EP1_IN is represented by 0x81 number.
* \return Nothing.
*/
void (*ResetEP)(USBD_HANDLE_T hUsb, uint32_t EPNum);
/** \fn void SetStallEP(USBD_HANDLE_T hUsb, uint32_t EPNum)
* Function to STALL selected USB endpoint.
*
* Generates STALL signalling for requested endpoint.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] EPNum Endpoint number as per USB specification.
* ie. An EP1_IN is represented by 0x81 number.
* \return Nothing.
*/
void (*SetStallEP)(USBD_HANDLE_T hUsb, uint32_t EPNum);
/** \fn void ClrStallEP(USBD_HANDLE_T hUsb, uint32_t EPNum)
* Function to clear STALL state for the requested endpoint.
*
* This function clears STALL state for the requested endpoint.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] EPNum Endpoint number as per USB specification.
* ie. An EP1_IN is represented by 0x81 number.
* \return Nothing.
*/
void (*ClrStallEP)(USBD_HANDLE_T hUsb, uint32_t EPNum);
/** \fn ErrorCode_t SetTestMode(USBD_HANDLE_T hUsb, uint8_t mode)
* Function to set high speed USB device controller in requested test mode.
*
* USB-IF requires the high speed device to be put in various test modes
* for electrical testing. This USB device stack calls this function whenever
* it receives USB_REQUEST_CLEAR_FEATURE request for USB_FEATURE_TEST_MODE.
* Users can put the device in test mode by directly calling this function.
* Returns ERR_USBD_INVALID_REQ when device controller is full-speed only.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] mode Test mode defined in USB 2.0 electrical testing specification.
* \return Returns \ref ErrorCode_t type to indicate success or error condition.
* \retval LPC_OK(0) - On success
* \retval ERR_USBD_INVALID_REQ(0x00040001) - Invalid test mode or
* Device controller is full-speed only.
*/
ErrorCode_t (*SetTestMode)(USBD_HANDLE_T hUsb, uint8_t mode);
/** \fn uint32_t ReadEP(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData)
* Function to read data received on the requested endpoint.
*
* This function is called by USB stack and the application layer to read the data
* received on the requested endpoint.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] EPNum Endpoint number as per USB specification.
* ie. An EP1_IN is represented by 0x81 number.
* \param[in,out] pData Pointer to the data buffer where data is to be copied.
* \return Returns the number of bytes copied to the buffer.
*/
uint32_t (*ReadEP)(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData);
/** \fn uint32_t ReadReqEP(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData, uint32_t len)
* Function to queue read request on the specified endpoint.
*
* This function is called by USB stack and the application layer to queue a read request
* on the specified endpoint.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] EPNum Endpoint number as per USB specification.
* ie. An EP1_IN is represented by 0x81 number.
* \param[in,out] pData Pointer to the data buffer where data is to be copied. This buffer
* address should be accessible by USB DMA master.
* \param[in] len Length of the buffer passed.
* \return Returns the length of the requested buffer.
*/
uint32_t (*ReadReqEP)(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData, uint32_t len);
/** \fn uint32_t ReadSetupPkt(USBD_HANDLE_T hUsb, uint32_t EPNum, uint32_t *pData)
* Function to read setup packet data received on the requested endpoint.
*
* This function is called by USB stack and the application layer to read setup packet data
* received on the requested endpoint.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] EPNum Endpoint number as per USB specification.
* ie. An EP0_IN is represented by 0x80 number.
* \param[in,out] pData Pointer to the data buffer where data is to be copied.
* \return Returns the number of bytes copied to the buffer.
*/
uint32_t (*ReadSetupPkt)(USBD_HANDLE_T hUsb, uint32_t EPNum, uint32_t *pData);
/** \fn uint32_t WriteEP(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData, uint32_t cnt)
* Function to write data to be sent on the requested endpoint.
*
* This function is called by USB stack and the application layer to send data
* on the requested endpoint.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] EPNum Endpoint number as per USB specification.
* ie. An EP1_IN is represented by 0x81 number.
* \param[in] pData Pointer to the data buffer from where data is to be copied.
* \param[in] cnt Number of bytes to write.
* \return Returns the number of bytes written.
*/
uint32_t (*WriteEP)(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData, uint32_t cnt);
/** \fn void WakeUp(USBD_HANDLE_T hUsb)
* Function to generate resume signaling on bus for remote host wakeup.
*
* This function is called by application layer to remotely wakeup host controller
* when system is in suspend state. Application should indicate this remote wakeup
* capability by setting USB_CONFIG_REMOTE_WAKEUP in bmAttributes of Configuration
* Descriptor. Also this routine will generate resume signalling only if host
* enables USB_FEATURE_REMOTE_WAKEUP by sending SET_FEATURE request before suspending
* the bus.
*
* \param[in] hUsb Handle to the USB device stack.
* \return Nothing.
*/
void (*WakeUp)(USBD_HANDLE_T hUsb);
/** \fn void EnableEP(USBD_HANDLE_T hUsb, uint32_t EPNum)
* Function to enable/disable selected USB event.
*
* This function enables interrupts on selected endpoint.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in] EPNum Endpoint number corresponding to the eventas per USB specification.
* ie. An EP1_IN is represented by 0x81 number. For device events
* set this param to 0x0.
* \param[in] event Type of endpoint event. See \ref USBD_EVENT_T for more details.
* \param[in] enable 1 - enable event, 0 - disable event.
* \return Returns \ref ErrorCode_t type to indicate success or error condition.
* \retval LPC_OK(0) - On success
* \retval ERR_USBD_INVALID_REQ(0x00040001) - Invalid event type.
*/
ErrorCode_t (*EnableEvent)(USBD_HANDLE_T hUsb, uint32_t EPNum, uint32_t event_type,
uint32_t enable);
} USBD_HW_API_T;
/*-----------------------------------------------------------------------------
* Private functions & structures prototypes used by stack internally
*-----------------------------------------------------------------------------*/
/** @cond DIRECT_API */
/* Driver functions */
uint32_t hwUSB_GetMemSize(USBD_API_INIT_PARAM_T* param);
ErrorCode_t hwUSB_Init(USBD_HANDLE_T* phUsb, USB_CORE_DESCS_T* pDesc, USBD_API_INIT_PARAM_T* param);
void hwUSB_Connect(USBD_HANDLE_T hUsb, uint32_t con);
void hwUSB_ISR(USBD_HANDLE_T hUsb);
/* USB Hardware Functions */
extern void hwUSB_Reset(USBD_HANDLE_T hUsb);
extern void hwUSB_ForceFullSpeed (USBD_HANDLE_T hUsb, uint32_t con);
extern void hwUSB_WakeUpCfg(USBD_HANDLE_T hUsb, uint32_t cfg);
extern void hwUSB_SetAddress(USBD_HANDLE_T hUsb, uint32_t adr);
extern void hwUSB_Configure(USBD_HANDLE_T hUsb, uint32_t cfg);
extern void hwUSB_ConfigEP(USBD_HANDLE_T hUsb, USB_ENDPOINT_DESCRIPTOR *pEPD);
extern void hwUSB_DirCtrlEP(USBD_HANDLE_T hUsb, uint32_t dir);
extern void hwUSB_EnableEP(USBD_HANDLE_T hUsb, uint32_t EPNum);
extern void hwUSB_DisableEP(USBD_HANDLE_T hUsb, uint32_t EPNum);
extern void hwUSB_ResetEP(USBD_HANDLE_T hUsb, uint32_t EPNum);
extern void hwUSB_SetStallEP(USBD_HANDLE_T hUsb, uint32_t EPNum);
extern void hwUSB_ClrStallEP(USBD_HANDLE_T hUsb, uint32_t EPNum);
extern ErrorCode_t hwUSB_SetTestMode(USBD_HANDLE_T hUsb, uint8_t mode); /* for FS only devices return ERR_USBD_INVALID_REQ */
extern uint32_t hwUSB_ReadEP(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData);
extern uint32_t hwUSB_ReadReqEP(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData, uint32_t len);
extern uint32_t hwUSB_ReadSetupPkt(USBD_HANDLE_T hUsb, uint32_t, uint32_t *);
extern uint32_t hwUSB_WriteEP(USBD_HANDLE_T hUsb, uint32_t EPNum, uint8_t *pData, uint32_t cnt);
/* generate resume signalling on the bus */
extern void hwUSB_WakeUp(USBD_HANDLE_T hUsb);
extern ErrorCode_t hwUSB_EnableEvent(USBD_HANDLE_T hUsb, uint32_t EPNum, uint32_t event_type, uint32_t enable);
/* TODO implement following routines
- function to program TD and queue them to ep Qh
*/
/** @endcond */
#endif /* __USBHW_H__ */

View File

@ -1,119 +0,0 @@
/***********************************************************************
* $Id:: mw_usbd_msc.h 197 2011-06-12 20:22:41Z usb06052 $
*
* Project: USB device ROM Stack
*
* Description:
* Mass Storage Class 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 __MSC_H__
#define __MSC_H__
#include "mw_usbd.h"
/** \file
* \brief Mass Storage calss (MSC) descriptors.
*
* Definition of MSC class descriptors and their bit defines.
*
*/
/* MSC Subclass Codes */
#define MSC_SUBCLASS_RBC 0x01
#define MSC_SUBCLASS_SFF8020I_MMC2 0x02
#define MSC_SUBCLASS_QIC157 0x03
#define MSC_SUBCLASS_UFI 0x04
#define MSC_SUBCLASS_SFF8070I 0x05
#define MSC_SUBCLASS_SCSI 0x06
/* MSC Protocol Codes */
#define MSC_PROTOCOL_CBI_INT 0x00
#define MSC_PROTOCOL_CBI_NOINT 0x01
#define MSC_PROTOCOL_BULK_ONLY 0x50
/* MSC Request Codes */
#define MSC_REQUEST_RESET 0xFF
#define MSC_REQUEST_GET_MAX_LUN 0xFE
/* MSC Bulk-only Stage */
#define MSC_BS_CBW 0 /* Command Block Wrapper */
#define MSC_BS_DATA_OUT 1 /* Data Out Phase */
#define MSC_BS_DATA_IN 2 /* Data In Phase */
#define MSC_BS_DATA_IN_LAST 3 /* Data In Last Phase */
#define MSC_BS_DATA_IN_LAST_STALL 4 /* Data In Last Phase with Stall */
#define MSC_BS_CSW 5 /* Command Status Wrapper */
#define MSC_BS_ERROR 6 /* Error */
/* Bulk-only Command Block Wrapper */
PRE_PACK struct POST_PACK _MSC_CBW
{
uint32_t dSignature;
uint32_t dTag;
uint32_t dDataLength;
uint8_t bmFlags;
uint8_t bLUN;
uint8_t bCBLength;
uint8_t CB[16];
} ;
typedef struct _MSC_CBW MSC_CBW;
/* Bulk-only Command Status Wrapper */
PRE_PACK struct POST_PACK _MSC_CSW
{
uint32_t dSignature;
uint32_t dTag;
uint32_t dDataResidue;
uint8_t bStatus;
} ;
typedef struct _MSC_CSW MSC_CSW;
#define MSC_CBW_Signature 0x43425355
#define MSC_CSW_Signature 0x53425355
/* CSW Status Definitions */
#define CSW_CMD_PASSED 0x00
#define CSW_CMD_FAILED 0x01
#define CSW_PHASE_ERROR 0x02
/* SCSI Commands */
#define SCSI_TEST_UNIT_READY 0x00
#define SCSI_REQUEST_SENSE 0x03
#define SCSI_FORMAT_UNIT 0x04
#define SCSI_INQUIRY 0x12
#define SCSI_MODE_SELECT6 0x15
#define SCSI_MODE_SENSE6 0x1A
#define SCSI_START_STOP_UNIT 0x1B
#define SCSI_MEDIA_REMOVAL 0x1E
#define SCSI_READ_FORMAT_CAPACITIES 0x23
#define SCSI_READ_CAPACITY 0x25
#define SCSI_READ10 0x28
#define SCSI_WRITE10 0x2A
#define SCSI_VERIFY10 0x2F
#define SCSI_READ12 0xA8
#define SCSI_WRITE12 0xAA
#define SCSI_MODE_SELECT10 0x55
#define SCSI_MODE_SENSE10 0x5A
#endif /* __MSC_H__ */

View File

@ -1,267 +0,0 @@
/***********************************************************************
* $Id:: mw_usbd_mscuser.h 202 2011-06-12 21:50:01Z usb06052 $
*
* Project: USB device ROM Stack
*
* Description:
* Mass Storage 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 __MSCUSER_H__
#define __MSCUSER_H__
#include "error.h"
#include "mw_usbd.h"
#include "mw_usbd_msc.h"
#include "mw_usbd_core.h"
#include "tusb_option.h"
/** \file
* \brief Mass Storage Class (MSC) API structures and function prototypes.
*
* Definition of functions exported by ROM based MSC function driver.
*
*/
/** \ingroup Group_USBD
* @defgroup USBD_MSC Mass Storage Class (MSC) Function Driver
* \section Sec_MSCModDescription Module Description
* MSC Class Function Driver module. This module contains an internal implementation of the USB MSC Class.
* User applications can use this class driver instead of implementing the MSC 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 MSC Class.
*/
/** \brief Mass Storage class function driver initilization parameter data structure.
* \ingroup USBD_MSC
*
* \details This data structure is used to pass initialization parameters to the
* Mass Storage class function driver's init function.
*
*/
typedef struct USBD_MSC_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_MSC_API::GetMemSize() routine.*/
/* mass storage paramas */
uint8_t* InquiryStr; /**< Pointer to the 28 character string. This string is
sent in response to the SCSI Inquiry command. \note The data
pointed by the pointer should be of global scope.
*/
uint32_t BlockCount; /**< Number of blocks present in the mass storage device */
uint32_t BlockSize; /**< Block size in number of bytes */
uint32_t MemorySize; /**< Memory size in number of bytes */
/** Pointer to the 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* intf_desc;
/* user defined functions */
/**
* MSC Write callback function.
*
* This function is provided by the application software. This function gets called
* when host sends a write command.
*
* \param[in] offset 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[in] length Number of bytes to be written.
* \return Nothing.
*
*/
void (*MSC_Write)( uint32_t offset, uint8_t** src, uint32_t length);
/**
* MSC Read callback function.
*
* This function is provided by the application software. This function gets called
* when host sends a read command.
*
* \param[in] offset Source start address.
* \param[in, out] dst Pointer to a pointer to the source of data. The MSC function drivers
* implemented in stack are written with zero-copy model. Meaning the stack doesn't make an
* extra copy of buffer before writing/reading data from USB hardware FIFO. Hence the
* parameter is pointer to a pointer containing address buffer (<em>uint8_t** dst</em>).
* So that the user application can update the buffer pointer instead of copying data to
* address pointed by the parameter. /note The updated buffer address should be accessable
* by USB DMA master. If user doesn't want to use zero-copy model, then the user should copy
* data to the address pointed by the passed buffer pointer parameter and shouldn't change
* the address value. See \ref USBD_ZeroCopy for more details on zero-copy concept.
* \param[in] length Number of bytes to be read.
* \return Nothing.
*
*/
void (*MSC_Read)( uint32_t offset, uint8_t** dst, uint32_t length);
/**
* MSC Verify callback function.
*
* This function is provided by the application software. This function gets called
* when host sends a verify command. The callback function should compare the buffer
* with the destination memory at the requested offset and
*
* \param[in] offset Destination start address.
* \param[in] buf Buffer containing the data sent by the host.
* \param[in] length Number of bytes to verify.
* \return Returns \ref ErrorCode_t type to indicate success or error condition.
* \retval LPC_OK If data in the buffer matches the data at destination
* \retval ERR_FAILED Atleast one byte is different.
*
*/
ErrorCode_t (*MSC_Verify)( uint32_t offset, uint8_t buf[], uint32_t length);
/**
* Optional callback function to optimize MSC_Write buffer transfer.
*
* This function is provided by the application software. This function gets called
* when host sends SCSI_WRITE10/SCSI_WRITE12 command. The callback function should
* update the \em buff_adr pointer so that the stack transfers the data directly
* to the target buffer. /note The updated buffer address should be accessable
* by USB DMA master. If user doesn't want to use zero-copy model, then the user
* should not update the buffer pointer. See \ref USBD_ZeroCopy for more details
* on zero-copy concept.
*
* \param[in] offset Destination start address.
* \param[in,out] buf Buffer containing the data sent by the host.
* \param[in] length Number of bytes to write.
* \return Nothing.
*
*/
void (*MSC_GetWriteBuf)( uint32_t offset, uint8_t** buff_adr, uint32_t length);
/**
* Optional user overridable function to replace the default MSC 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_MSC_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 (*MSC_Ep0_Hdlr) (USBD_HANDLE_T hUsb, void* data, uint32_t event);
} USBD_MSC_INIT_PARAM_T;
/** \brief MSC class API functions structure.
* \ingroup USBD_MSC
*
* This module exposes functions which interact directly with USB device controller hardware.
*
*/
typedef struct USBD_MSC_API
{
/** \fn uint32_t GetMemSize(USBD_MSC_INIT_PARAM_T* param)
* Function to determine the memory required by the MSC function driver module.
*
* This function is called by application layer before calling pUsbApi->msc->Init(), to allocate memory used
* by MSC 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 MSC function driver module initialization parameters.
* \return Returns the required memory size in bytes.
*/
uint32_t (*GetMemSize)(USBD_MSC_INIT_PARAM_T* param);
/** \fn ErrorCode_t init(USBD_HANDLE_T hUsb, USBD_MSC_INIT_PARAM_T* param)
* Function to initialize MSC function driver module.
*
* This fuction is called by application layer to initialize MSC function driver module.
*
* \param[in] hUsb Handle to the USB device stack.
* \param[in, out] param Structure containing MSC 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 MSC_Write() or MSC_Read() or
* MSC_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_MSC_INIT_PARAM_T* param);
} USBD_MSC_API_T;
/*-----------------------------------------------------------------------------
* Private functions & structures prototypes
*-----------------------------------------------------------------------------*/
/** @cond ADVANCED_API */
typedef struct _MSC_CTRL_T
{
/* If it's a USB HS, the max packet is 512, if it's USB FS,
the max packet is 64. Use 512 for both HS and FS. */
/*ALIGNED(4)*/ uint8_t BulkBuf[USB_HS_MAX_BULK_PACKET]; /* Bulk In/Out Buffer */
/*ALIGNED(4)*/MSC_CBW CBW; /* Command Block Wrapper */
/*ALIGNED(4)*/MSC_CSW CSW; /* Command Status Wrapper */
USB_CORE_CTRL_T* pUsbCtrl;
uint32_t Offset; /* R/W Offset */
uint32_t Length; /* R/W Length */
uint32_t BulkLen; /* Bulk In/Out Length */
uint8_t* rx_buf;
uint8_t BulkStage; /* Bulk Stage */
uint8_t if_num; /* interface number */
uint8_t epin_num; /* BULK IN endpoint number */
uint8_t epout_num; /* BULK OUT endpoint number */
uint32_t MemOK; /* Memory OK */
uint8_t* InquiryStr;
uint32_t BlockCount;
uint32_t BlockSize;
uint32_t MemorySize;
/* user defined functions */
void (*MSC_Write)( uint32_t offset, uint8_t** src, uint32_t length);
void (*MSC_Read)( uint32_t offset, uint8_t** dst, uint32_t length);
ErrorCode_t (*MSC_Verify)( uint32_t offset, uint8_t src[], uint32_t length);
/* optional call back for MSC_Write optimization */
void (*MSC_GetWriteBuf)( uint32_t offset, uint8_t** buff_adr, uint32_t length);
}USB_MSC_CTRL_T;
/** @cond DIRECT_API */
extern uint32_t mwMSC_GetMemSize(USBD_MSC_INIT_PARAM_T* param);
extern ErrorCode_t mwMSC_init(USBD_HANDLE_T hUsb, USBD_MSC_INIT_PARAM_T* param);
/** @endcond */
/** @endcond */
#endif /* __MSCUSER_H__ */

View File

@ -1,92 +0,0 @@
/***********************************************************************
* $Id:: mw_usbd_rom_api.h 197 2011-06-12 20:22:41Z usb06052 $
*
* Project: USB device ROM Stack
*
* Description:
* ROM API 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 __MW_USBD_ROM_API_H
#define __MW_USBD_ROM_API_H
/** \file
* \brief ROM API for USB device stack.
*
* Definition of functions exported by ROM based USB device stack.
*
*/
#include "error.h"
#include "mw_usbd.h"
#include "mw_usbd_hw.h"
#include "mw_usbd_desc.h"
#include "mw_usbd_core.h"
#include "mw_usbd_mscuser.h"
#include "mw_usbd_dfuuser.h"
#include "mw_usbd_hiduser.h"
#include "mw_usbd_cdcuser.h"
/** \brief Main USBD API functions structure.
* \ingroup Group_USBD
*
* This structure contains pointer to various USB Device stack's sub-module
* function tables. This structure is used as main entry point to access
* various methods (grouped in sub-modules) exposed by ROM based USB device
* stack.
*
*/
typedef struct USBD_API
{
const USBD_HW_API_T* hw; /**< Pointer to function table which exposes functions
which interact directly with USB device stack's core
layer.*/
const USBD_CORE_API_T* core; /**< Pointer to function table which exposes functions
which interact directly with USB device controller
hardware.*/
const USBD_MSC_API_T* msc; /**< Pointer to function table which exposes functions
provided by MSC function driver module.
*/
const USBD_DFU_API_T* dfu; /**< Pointer to function table which exposes functions
provided by DFU function driver module.
*/
const USBD_HID_API_T* hid; /**< Pointer to function table which exposes functions
provided by HID function driver module.
*/
const USBD_CDC_API_T* cdc; /**< Pointer to function table which exposes functions
provided by CDC-ACM function driver module.
*/
const uint32_t* reserved6; /**< Reserved for future function driver module.
*/
const uint32_t version; /**< Version identifier of USB ROM stack. The version is
defined as 0x0CHDMhCC where each nibble represnts version
number of the corresponding component.
CC - 7:0 - 8bit core version number
h - 11:8 - 4bit hardware interface version number
M - 15:12 - 4bit MSC class module version number
D - 19:16 - 4bit DFU class module version number
H - 23:20 - 4bit HID class module version number
C - 27:24 - 4bit CDC class module version number
H - 31:28 - 4bit reserved
*/
} USBD_API_T;
extern const USBD_API_T usb_api;
#endif /*__MW_USBD_ROM_API_H*/

View File

@ -55,21 +55,38 @@
usbd_device_info_t usbd_devices[CONTROLLER_DEVICE_NUMBER];
// TODO fix/compress number of class driver
static device_class_driver_t const usbd_class_drivers[TUSB_CLASS_MAPPED_INDEX_START] =
static usbd_class_driver_t const usbd_class_drivers[TUSB_CLASS_MAPPED_INDEX_START] =
{
#if DEVICE_CLASS_HID
[TUSB_CLASS_HID] = {
[TUSB_CLASS_HID] =
{
.init = hidd_init,
.open = hidd_open,
.control_request = hidd_control_request,
.isr = hidd_isr
.isr = hidd_isr,
.bus_reset = hidd_bus_reset
},
#endif
#if TUSB_CFG_DEVICE_MSC
[TUSB_CLASS_MSC] = {
[TUSB_CLASS_MSC] =
{
.init = mscd_init,
.open = mscd_open,
.control_request = mscd_control_request,
.isr = mscd_isr
.isr = mscd_isr,
.bus_reset = mscd_bus_reset
},
#endif
#if TUSB_CFG_DEVICE_CDC
[TUSB_CLASS_CDC] =
{
.init = cdcd_init,
.open = cdcd_open,
.control_request = cdcd_control_request,
.isr = cdcd_isr,
.bus_reset = cdcd_bus_reset
},
#endif
@ -94,6 +111,14 @@ bool tusbd_is_configured(uint8_t coreid)
void usbd_bus_reset(uint32_t coreid)
{
memclr_(&usbd_devices[coreid], sizeof(usbd_device_info_t));
for (tusb_std_class_code_t class_code = TUSB_CLASS_AUDIO; class_code <= TUSB_CLASS_AUDIO_VIDEO; class_code++)
{
if ( usbd_class_drivers[class_code].bus_reset )
{
usbd_class_drivers[class_code].bus_reset( coreid );
}
}
}
tusb_error_t usbd_init (void)
@ -102,6 +127,14 @@ tusb_error_t usbd_init (void)
ASSERT_STATUS ( dcd_init() );
for (tusb_std_class_code_t class_code = TUSB_CLASS_AUDIO; class_code <= TUSB_CLASS_AUDIO_VIDEO; class_code++)
{
if ( usbd_class_drivers[class_code].init )
{
usbd_class_drivers[class_code].init();
}
}
return TUSB_ERROR_NONE;
}
@ -189,9 +222,8 @@ void usbd_setup_received_isr(uint8_t coreid, tusb_control_request_t * p_request)
if (p_request->bmRequestType_bit.type != TUSB_REQUEST_TYPE_STANDARD)
{
error = TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT;
break;
}
}else
{
switch ( p_request->bRequest )
{
case TUSB_REQUEST_GET_DESCRIPTOR:
@ -213,6 +245,7 @@ void usbd_setup_received_isr(uint8_t coreid, tusb_control_request_t * p_request)
default: error = TUSB_ERROR_DCD_CONTROL_REQUEST_NOT_SUPPORT; break;
}
}
break;
//------------- Class/Interface Specific Reqequest -------------//
@ -253,7 +286,7 @@ void usbd_setup_received_isr(uint8_t coreid, tusb_control_request_t * p_request)
if(TUSB_ERROR_NONE != error)
{ // Response with Protocol Stall if request is not supported
dcd_pipe_control_stall(coreid);
// ASSERT(error == TUSB_ERROR_NONE, VOID_RETURN);
ASSERT(error == TUSB_ERROR_NONE, VOID_RETURN);
}
}
@ -286,23 +319,6 @@ void usbd_xfer_isr(endpoint_handle_t edpt_hdl, tusb_event_t event, uint32_t xfer
}
}
//void usbd_isr(uint8_t coreid, tusb_event_t event)
//{
// switch(event)
// {
// case TUSB_EVENT_BUS_RESET:
// usbd_bus_reset(coreid);
// break;
//
// case TUSB_EVENT_SETUP_RECEIVED:
// usbd_setup_received(coreid);
// break;
//
// default:
// ASSERT(false, (void) 0);
// break;
// }
//}
//--------------------------------------------------------------------+
// HELPER

View File

@ -63,11 +63,12 @@
// MACRO CONSTANT TYPEDEF
//--------------------------------------------------------------------+
typedef struct {
void (* const init) (void);
tusb_error_t (* const open)(uint8_t, tusb_descriptor_interface_t const *, uint16_t*);
tusb_error_t (* const control_request) (uint8_t, tusb_control_request_t const *);
void (* const isr) (endpoint_handle_t, tusb_event_t, uint32_t);
// void (* const close) (uint8_t);
} device_class_driver_t;
void (* const bus_reset) (uint8_t);
} usbd_class_driver_t;
//--------------------------------------------------------------------+
// INTERNAL OBJECT & FUNCTION DECLARATION

View File

@ -72,6 +72,8 @@ static tusb_error_t hal_controller_reset(uint8_t coreid)
tusb_error_t hal_init(void)
{
LPC_CREG->CREG0 &= ~(1<<5); /* Turn on the phy */
//------------- USB0 -------------//
#if TUSB_CFG_CONTROLLER_0_MODE
CGU_EnableEntity(CGU_CLKSRC_PLL0, DISABLE); /* Disable PLL first */
@ -79,6 +81,7 @@ tusb_error_t hal_init(void)
CGU_EntityConnect(CGU_CLKSRC_XTAL_OSC, CGU_CLKSRC_PLL0);
CGU_EnableEntity(CGU_CLKSRC_PLL0, ENABLE); /* Enable PLL after all setting is done */
// reset controller & set role
ASSERT_STATUS( hal_controller_reset(0) );
@ -118,8 +121,6 @@ tusb_error_t hal_init(void)
hal_interrupt_enable(1);
#endif
LPC_CREG->CREG0 &= ~(1<<5); /* Turn on the phy */
return TUSB_ERROR_NONE;
}

View File

@ -75,5 +75,9 @@ void tusb_task_runner(void)
#if MODE_HOST_SUPPORTED
usbh_enumeration_task(NULL);
#endif
#if MODE_DEVICE_SUPPORTED
#endif
}
#endif

View File

@ -87,7 +87,7 @@
#endif
#if TUSB_CFG_DEVICE_CDC
#include "class/cdc.h"
#include "class/cdc_device.h"
#endif
#if TUSB_CFG_DEVICE_MSC

View File

@ -177,23 +177,6 @@
#endif // MODE_DEVICE_SUPPORTED
#define USB_FS_MAX_BULK_PACKET 64
#define USB_HS_MAX_BULK_PACKET USB_FS_MAX_BULK_PACKET /* Full speed device only */
/* HID In/Out Endpoint Address */
#define HID_KEYBOARD_EP_IN ENDPOINT_IN_LOGICAL_TO_PHYSICAL(1)
#define HID_MOUSE_EP_IN ENDPOINT_IN_LOGICAL_TO_PHYSICAL(4)
/* CDC Endpoint Address */
#define CDC_NOTIFICATION_EP ENDPOINT_IN_LOGICAL_TO_PHYSICAL(2)
#define CDC_DATA_EP_OUT ENDPOINT_OUT_LOGICAL_TO_PHYSICAL(3)
#define CDC_DATA_EP_IN ENDPOINT_IN_LOGICAL_TO_PHYSICAL(3)
#define CDC_NOTIFICATION_EP_MAXPACKETSIZE 8
#define CDC_DATA_EP_MAXPACKET_SIZE 16
#endif /* _TUSB_TUSB_OPTION_H_ */
/** @} */