moved usbcdc to own lib
This commit is contained in:
parent
d473eef054
commit
5697926358
|
@ -16,6 +16,7 @@ LIBS += applications/libapp.a
|
||||||
LIBS += filesystem/libfat.a
|
LIBS += filesystem/libfat.a
|
||||||
LIBS += usb/libusb.a
|
LIBS += usb/libusb.a
|
||||||
LIBS += funk/libfunk.a
|
LIBS += funk/libfunk.a
|
||||||
|
LIBS += usbcdc/libusbcdc.a
|
||||||
|
|
||||||
##########################################################################
|
##########################################################################
|
||||||
# GNU GCC compiler flags
|
# GNU GCC compiler flags
|
||||||
|
@ -35,6 +36,7 @@ OBJS += $(TARGET)_handlers.o LPC1xxx_startup.o
|
||||||
LDLIBS = -lm
|
LDLIBS = -lm
|
||||||
LDLIBS += -Lapplications -lapp
|
LDLIBS += -Lapplications -lapp
|
||||||
LDLIBS += -Lfunk -lfunk
|
LDLIBS += -Lfunk -lfunk
|
||||||
|
LDLIBS += -Lusbcdc -lusbcdc
|
||||||
LDLIBS += -Llcd -llcd
|
LDLIBS += -Llcd -llcd
|
||||||
LDLIBS += -Lusb -lusb
|
LDLIBS += -Lusb -lusb
|
||||||
LDLIBS += -Lfilesystem -lfat
|
LDLIBS += -Lfilesystem -lfat
|
||||||
|
|
|
@ -24,12 +24,6 @@ OBJS += timer16/timer16.o
|
||||||
OBJS += timer32/timer32.o
|
OBJS += timer32/timer32.o
|
||||||
#OBJS += uart/uart.o
|
#OBJS += uart/uart.o
|
||||||
#OBJS += uart/uart_buf.o
|
#OBJS += uart/uart_buf.o
|
||||||
#OBJS += usbcdc/cdcuser.o
|
|
||||||
#OBJS += usbcdc/cdc_buf.o
|
|
||||||
#OBJS += usbcdc/usbcore.o
|
|
||||||
#OBJS += usbcdc/usbdesc.o
|
|
||||||
#OBJS += usbcdc/usbhw.o
|
|
||||||
#OBJS += usbcdc/usbuser.o
|
|
||||||
OBJS += wdt/wdt.o
|
OBJS += wdt/wdt.o
|
||||||
|
|
||||||
##########################################################################
|
##########################################################################
|
||||||
|
|
|
@ -0,0 +1,27 @@
|
||||||
|
##########################################################################
|
||||||
|
# User configuration and firmware specific object files
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
OBJS =
|
||||||
|
OBJS += cdcuser.o
|
||||||
|
OBJS += cdc_buf.o
|
||||||
|
OBJS += usbcore.o
|
||||||
|
OBJS += usbdesc.o
|
||||||
|
OBJS += usbhw.o
|
||||||
|
OBJS += usbuser.o
|
||||||
|
|
||||||
|
LIBNAME=usbcdc
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
# GNU GCC compiler flags
|
||||||
|
##########################################################################
|
||||||
|
ROOT_PATH?= ..
|
||||||
|
INCLUDE_PATHS = -I$(ROOT_PATH) -I../core -I.
|
||||||
|
|
||||||
|
include $(ROOT_PATH)/Makefile.inc
|
||||||
|
|
||||||
|
##########################################################################
|
||||||
|
# Actual work
|
||||||
|
##########################################################################
|
||||||
|
|
||||||
|
include $(ROOT_PATH)/Makefile.util
|
|
@ -0,0 +1,236 @@
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* U S B - K e r n e l
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* Name: CDC.h
|
||||||
|
* Purpose: USB Communication Device Class Definitions
|
||||||
|
* Version: V1.00
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* This software is supplied "AS IS" without any warranties, express,
|
||||||
|
* implied or statutory, including but not limited to the implied
|
||||||
|
* warranties of fitness for purpose, satisfactory quality and
|
||||||
|
* noninfringement. Keil extends you a royalty-free right to reproduce
|
||||||
|
* and distribute executable files created using this software for use
|
||||||
|
* on NXP Semiconductors LPC microcontroller devices only. Nothing else
|
||||||
|
* gives you the right to use this software.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009 Keil - An ARM Company. All rights reserved.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __CDC_H
|
||||||
|
#define __CDC_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.
|
||||||
|
typedef struct _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
|
||||||
|
} __attribute__((packed)) CDC_HEADER_DESCRIPTOR;
|
||||||
|
|
||||||
|
//Call management functional descriptor
|
||||||
|
// (usbcdc11.pdf, 5.2.3.2)
|
||||||
|
// Describes the processing of calls for the communication class interface.
|
||||||
|
typedef struct _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)
|
||||||
|
} __attribute__((packed)) 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.
|
||||||
|
typedef struct _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
|
||||||
|
} __attribute__((packed)) 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.
|
||||||
|
typedef struct _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
|
||||||
|
} __attribute__((packed)) CDC_UNION_DESCRIPTOR;
|
||||||
|
|
||||||
|
// Union functional descriptors with one slave interface
|
||||||
|
// (usbcdc11.pdf, 5.2.3.8)
|
||||||
|
typedef struct _CDC_UNION_1SLAVE_DESCRIPTOR {
|
||||||
|
CDC_UNION_DESCRIPTOR sUnion; // Union functional descriptor
|
||||||
|
uint8_t bSlaveInterfaces[1]; // Slave interface 0
|
||||||
|
} __attribute__((packed)) CDC_UNION_1SLAVE_DESCRIPTOR;
|
||||||
|
|
||||||
|
// Line coding structure
|
||||||
|
// Format of the data returned when a GetLineCoding request is received
|
||||||
|
// (usbcdc11.pdf, 6.2.13)
|
||||||
|
typedef struct _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
|
||||||
|
} __attribute__((packed)) 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 */
|
||||||
|
|
|
@ -0,0 +1,161 @@
|
||||||
|
/*******************************************************************
|
||||||
|
Copyright (C) 2009 FreakLabs
|
||||||
|
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 the copyright holder 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 THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``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 INSTITUTE OR CONTRIBUTORS 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.
|
||||||
|
|
||||||
|
Originally written by Christopher Wang aka Akiba.
|
||||||
|
Please post support questions to the FreakLabs forum.
|
||||||
|
*******************************************************************/
|
||||||
|
|
||||||
|
/**************************************************************************/
|
||||||
|
/*!
|
||||||
|
@file cdc_buf.c
|
||||||
|
@author Christopher Wang (Freaklabs)
|
||||||
|
Modified by: K. Townsend (microBuilder.eu)
|
||||||
|
@date 19 May 2010
|
||||||
|
|
||||||
|
Original code taken from the FreakUSB Open Source USB Device Stack
|
||||||
|
http://freaklabs.org/index.php/FreakUSB-Open-Source-USB-Device-Stack.html
|
||||||
|
|
||||||
|
If it works well, you can thank Akiba at Freaklabs. If it fails
|
||||||
|
miserably, you can blame me (since parts of it it were rather
|
||||||
|
ungraciously modified). :-)
|
||||||
|
|
||||||
|
*/
|
||||||
|
/**************************************************************************/
|
||||||
|
|
||||||
|
#include "cdc_buf.h"
|
||||||
|
|
||||||
|
static cdc_buffer_t cdcfifo;
|
||||||
|
|
||||||
|
/**************************************************************************/
|
||||||
|
/*!
|
||||||
|
Gets a pointer to the fifo buffer
|
||||||
|
*/
|
||||||
|
/**************************************************************************/
|
||||||
|
cdc_buffer_t *cdcGetBuffer()
|
||||||
|
{
|
||||||
|
return &cdcfifo;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************************************/
|
||||||
|
/*!
|
||||||
|
Initialises the RX FIFO buffer
|
||||||
|
*/
|
||||||
|
/**************************************************************************/
|
||||||
|
void cdcBufferInit()
|
||||||
|
{
|
||||||
|
cdcfifo.len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************************************/
|
||||||
|
/*!
|
||||||
|
Read one byte out of the RX buffer. This function will return the byte
|
||||||
|
located at the array index of the read pointer, and then increment the
|
||||||
|
read pointer index. If the read pointer exceeds the maximum buffer
|
||||||
|
size, it will roll over to zero.
|
||||||
|
*/
|
||||||
|
/**************************************************************************/
|
||||||
|
uint8_t cdcBufferRead()
|
||||||
|
{
|
||||||
|
uint8_t data;
|
||||||
|
|
||||||
|
data = cdcfifo.buf[cdcfifo.rd_ptr];
|
||||||
|
cdcfifo.rd_ptr = (cdcfifo.rd_ptr + 1) % CFG_USBCDC_BUFFERSIZE;
|
||||||
|
cdcfifo.len--;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************************************/
|
||||||
|
/*!
|
||||||
|
Reads x bytes from cdc buffer
|
||||||
|
*/
|
||||||
|
/**************************************************************************/
|
||||||
|
uint32_t cdcBufferReadLen(uint8_t* buf, uint32_t len)
|
||||||
|
{
|
||||||
|
uint32_t counter, actual;
|
||||||
|
counter = actual = 0;
|
||||||
|
|
||||||
|
while(counter != len)
|
||||||
|
{
|
||||||
|
// Make sure we don't exceed buffer limits
|
||||||
|
if (cdcfifo.len > 0)
|
||||||
|
{
|
||||||
|
buf[counter] = cdcBufferRead();
|
||||||
|
actual++;
|
||||||
|
counter++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return actual;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return actual;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************************************/
|
||||||
|
/*!
|
||||||
|
Write one byte into the RX buffer. This function will write one
|
||||||
|
byte into the array index specified by the write pointer and increment
|
||||||
|
the write index. If the write index exceeds the max buffer size, then it
|
||||||
|
will roll over to zero.
|
||||||
|
*/
|
||||||
|
/**************************************************************************/
|
||||||
|
void cdcBufferWrite(uint8_t data)
|
||||||
|
{
|
||||||
|
cdcfifo.buf[cdcfifo.wr_ptr] = data;
|
||||||
|
cdcfifo.wr_ptr = (cdcfifo.wr_ptr + 1) % CFG_USBCDC_BUFFERSIZE;
|
||||||
|
cdcfifo.len++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************************************/
|
||||||
|
/*!
|
||||||
|
Clear the fifo read and write pointers and set the length to zero.
|
||||||
|
*/
|
||||||
|
/**************************************************************************/
|
||||||
|
void cdcBufferClearFIFO()
|
||||||
|
{
|
||||||
|
cdcfifo.rd_ptr = 0;
|
||||||
|
cdcfifo.wr_ptr = 0;
|
||||||
|
cdcfifo.len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**************************************************************************/
|
||||||
|
/*!
|
||||||
|
Check whether there is any data pending on the RX buffer.
|
||||||
|
*/
|
||||||
|
/**************************************************************************/
|
||||||
|
uint8_t cdcBufferDataPending()
|
||||||
|
{
|
||||||
|
if (cdcfifo.len != 0)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* Name: cdc_buf.h
|
||||||
|
* Purpose: usb cdc buffer handling
|
||||||
|
* Version: V1.00
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __CDC_BUF_H__
|
||||||
|
#define __CDC_BUF_H__
|
||||||
|
|
||||||
|
#include "projectconfig.h"
|
||||||
|
|
||||||
|
// Buffer used for circular fifo
|
||||||
|
typedef struct _cdc_buffer_t
|
||||||
|
{
|
||||||
|
volatile uint8_t len;
|
||||||
|
volatile uint8_t wr_ptr;
|
||||||
|
volatile uint8_t rd_ptr;
|
||||||
|
uint8_t buf[CFG_USBCDC_BUFFERSIZE];
|
||||||
|
} cdc_buffer_t;
|
||||||
|
|
||||||
|
cdc_buffer_t * cdcGetBuffer();
|
||||||
|
void cdcBufferInit();
|
||||||
|
uint8_t cdcBufferRead();
|
||||||
|
uint32_t cdcBufferReadLen(uint8_t* buf, uint32_t len);
|
||||||
|
void cdcBufferWrite(uint8_t data);
|
||||||
|
void cdcBufferClearFIFO();
|
||||||
|
uint8_t cdcBufferDataPending();
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,351 @@
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* U S B - K e r n e l
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* Name: cdcuser.c
|
||||||
|
* Purpose: USB Communication Device Class User module
|
||||||
|
* Version: V1.10
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* This software is supplied "AS IS" without any warranties, express,
|
||||||
|
* implied or statutory, including but not limited to the implied
|
||||||
|
* warranties of fitness for purpose, satisfactory quality and
|
||||||
|
* noninfringement. Keil extends you a royalty-free right to reproduce
|
||||||
|
* and distribute executable files created using this software for use
|
||||||
|
* on NXP Semiconductors LPC microcontroller devices only. Nothing else
|
||||||
|
* gives you the right to use this software.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009 Keil - An ARM Company. All rights reserved.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "projectconfig.h"
|
||||||
|
|
||||||
|
#include "usb.h"
|
||||||
|
#include "usbhw.h"
|
||||||
|
#include "usbcfg.h"
|
||||||
|
#include "usbcore.h"
|
||||||
|
#include "cdc.h"
|
||||||
|
#include "cdcuser.h"
|
||||||
|
#include "cdc_buf.h"
|
||||||
|
|
||||||
|
// unsigned char BulkBufIn [64]; // Buffer to store USB IN packet
|
||||||
|
unsigned char BulkBufOut [64]; // Buffer to store USB OUT packet
|
||||||
|
unsigned char NotificationBuf [10];
|
||||||
|
|
||||||
|
CDC_LINE_CODING CDC_LineCoding = {CFG_USBCDC_BAUDRATE, 0, 0, 8};
|
||||||
|
unsigned short CDC_SerialState = 0x0000;
|
||||||
|
unsigned short CDC_DepInEmpty = 1; // Data IN EP is empty
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
We need a buffer for incoming data on USB port because USB receives
|
||||||
|
much faster than UART transmits
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
/* Buffer masks */
|
||||||
|
#define CDC_BUF_SIZE (64) // Output buffer in bytes (power 2)
|
||||||
|
// large enough for file transfer
|
||||||
|
#define CDC_BUF_MASK (CDC_BUF_SIZE-1ul)
|
||||||
|
|
||||||
|
/* Buffer read / write macros */
|
||||||
|
#define CDC_BUF_RESET(cdcBuf) (cdcBuf.rdIdx = cdcBuf.wrIdx = 0)
|
||||||
|
#define CDC_BUF_WR(cdcBuf, dataIn) (cdcBuf.data[CDC_BUF_MASK & cdcBuf.wrIdx++] = (dataIn))
|
||||||
|
#define CDC_BUF_RD(cdcBuf) (cdcBuf.data[CDC_BUF_MASK & cdcBuf.rdIdx++])
|
||||||
|
#define CDC_BUF_EMPTY(cdcBuf) (cdcBuf.rdIdx == cdcBuf.wrIdx)
|
||||||
|
#define CDC_BUF_FULL(cdcBuf) (cdcBuf.rdIdx == cdcBuf.wrIdx+1)
|
||||||
|
#define CDC_BUF_COUNT(cdcBuf) (CDC_BUF_MASK & (cdcBuf.wrIdx - cdcBuf.rdIdx))
|
||||||
|
|
||||||
|
|
||||||
|
// CDC output buffer
|
||||||
|
typedef struct __CDC_BUF_T
|
||||||
|
{
|
||||||
|
unsigned char data[CDC_BUF_SIZE];
|
||||||
|
volatile unsigned int wrIdx;
|
||||||
|
volatile unsigned int rdIdx;
|
||||||
|
} CDC_BUF_T;
|
||||||
|
|
||||||
|
CDC_BUF_T CDC_OutBuf; // buffer for all CDC Out data
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
read data from CDC_OutBuf
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
int CDC_RdOutBuf (char *buffer, const int *length)
|
||||||
|
{
|
||||||
|
int bytesToRead, bytesRead;
|
||||||
|
|
||||||
|
/* Read *length bytes, block if *bytes are not avaialable */
|
||||||
|
bytesToRead = *length;
|
||||||
|
bytesToRead = (bytesToRead < (*length)) ? bytesToRead : (*length);
|
||||||
|
bytesRead = bytesToRead;
|
||||||
|
|
||||||
|
|
||||||
|
// ... add code to check for underrun
|
||||||
|
|
||||||
|
while (bytesToRead--) {
|
||||||
|
*buffer++ = CDC_BUF_RD(CDC_OutBuf);
|
||||||
|
}
|
||||||
|
return (bytesRead);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
write data to CDC_OutBuf
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
int CDC_WrOutBuf (const char *buffer, int *length)
|
||||||
|
{
|
||||||
|
int bytesToWrite, bytesWritten;
|
||||||
|
|
||||||
|
// Write *length bytes
|
||||||
|
bytesToWrite = *length;
|
||||||
|
bytesWritten = bytesToWrite;
|
||||||
|
|
||||||
|
|
||||||
|
// ... add code to check for overwrite
|
||||||
|
|
||||||
|
while (bytesToWrite) {
|
||||||
|
CDC_BUF_WR(CDC_OutBuf, *buffer++); // Copy Data to buffer
|
||||||
|
bytesToWrite--;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (bytesWritten);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
check if character(s) are available at CDC_OutBuf
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
int CDC_OutBufAvailChar (int *availChar)
|
||||||
|
{
|
||||||
|
*availChar = CDC_BUF_COUNT(CDC_OutBuf);
|
||||||
|
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
/* end Buffer handling */
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
CDC Initialisation
|
||||||
|
Initializes the data structures and serial port
|
||||||
|
Parameters: None
|
||||||
|
Return Value: None
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void CDC_Init (void)
|
||||||
|
{
|
||||||
|
CDC_DepInEmpty = 1;
|
||||||
|
CDC_SerialState = CDC_GetSerialState();
|
||||||
|
|
||||||
|
CDC_BUF_RESET(CDC_OutBuf);
|
||||||
|
|
||||||
|
// Initialise the CDC buffer. This is required to buffer outgoing
|
||||||
|
// data (MCU to PC) since data can only be sent 64 bytes per frame
|
||||||
|
// with at least 1ms between frames. To see how the buffer is used,
|
||||||
|
// see 'puts' in systeminit.c
|
||||||
|
cdcBufferInit();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
CDC SendEncapsulatedCommand Request Callback
|
||||||
|
Called automatically on CDC SEND_ENCAPSULATED_COMMAND Request
|
||||||
|
Parameters: None (global SetupPacket and EP0Buf)
|
||||||
|
Return Value: TRUE - Success, FALSE - Error
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
uint32_t CDC_SendEncapsulatedCommand (void)
|
||||||
|
{
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
CDC GetEncapsulatedResponse Request Callback
|
||||||
|
Called automatically on CDC Get_ENCAPSULATED_RESPONSE Request
|
||||||
|
Parameters: None (global SetupPacket and EP0Buf)
|
||||||
|
Return Value: TRUE - Success, FALSE - Error
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
uint32_t CDC_GetEncapsulatedResponse (void)
|
||||||
|
{
|
||||||
|
/* ... add code to handle request */
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
CDC SetCommFeature Request Callback
|
||||||
|
Called automatically on CDC Set_COMM_FATURE Request
|
||||||
|
Parameters: FeatureSelector
|
||||||
|
Return Value: TRUE - Success, FALSE - Error
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
uint32_t CDC_SetCommFeature (unsigned short wFeatureSelector)
|
||||||
|
{
|
||||||
|
/* ... add code to handle request */
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
CDC GetCommFeature Request Callback
|
||||||
|
Called automatically on CDC Get_COMM_FATURE Request
|
||||||
|
Parameters: FeatureSelector
|
||||||
|
Return Value: TRUE - Success, FALSE - Error
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
uint32_t CDC_GetCommFeature (unsigned short wFeatureSelector)
|
||||||
|
{
|
||||||
|
/* ... add code to handle request */
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
CDC ClearCommFeature Request Callback
|
||||||
|
Called automatically on CDC CLEAR_COMM_FATURE Request
|
||||||
|
Parameters: FeatureSelector
|
||||||
|
Return Value: TRUE - Success, FALSE - Error
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
uint32_t CDC_ClearCommFeature (unsigned short wFeatureSelector)
|
||||||
|
{
|
||||||
|
/* ... add code to handle request */
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
CDC SetLineCoding Request Callback
|
||||||
|
Called automatically on CDC SET_LINE_CODING Request
|
||||||
|
Parameters: none (global SetupPacket and EP0Buf)
|
||||||
|
Return Value: TRUE - Success, FALSE - Error
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
uint32_t CDC_SetLineCoding (void)
|
||||||
|
{
|
||||||
|
CDC_LineCoding.dwDTERate = (EP0Buf[0] << 0)
|
||||||
|
| (EP0Buf[1] << 8)
|
||||||
|
| (EP0Buf[2] << 16)
|
||||||
|
| (EP0Buf[3] << 24);
|
||||||
|
CDC_LineCoding.bCharFormat = EP0Buf[4];
|
||||||
|
CDC_LineCoding.bParityType = EP0Buf[5];
|
||||||
|
CDC_LineCoding.bDataBits = EP0Buf[6];
|
||||||
|
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
CDC GetLineCoding Request Callback
|
||||||
|
Called automatically on CDC GET_LINE_CODING Request
|
||||||
|
Parameters: None (global SetupPacket and EP0Buf)
|
||||||
|
Return Value: TRUE - Success, FALSE - Error
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
uint32_t CDC_GetLineCoding (void)
|
||||||
|
{
|
||||||
|
EP0Buf[0] = (CDC_LineCoding.dwDTERate >> 0) & 0xFF;
|
||||||
|
EP0Buf[1] = (CDC_LineCoding.dwDTERate >> 8) & 0xFF;
|
||||||
|
EP0Buf[2] = (CDC_LineCoding.dwDTERate >> 16) & 0xFF;
|
||||||
|
EP0Buf[3] = (CDC_LineCoding.dwDTERate >> 24) & 0xFF;
|
||||||
|
EP0Buf[4] = CDC_LineCoding.bCharFormat;
|
||||||
|
EP0Buf[5] = CDC_LineCoding.bParityType;
|
||||||
|
EP0Buf[6] = CDC_LineCoding.bDataBits;
|
||||||
|
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
CDC SetControlLineState Request Callback
|
||||||
|
Called automatically on CDC SET_CONTROL_LINE_STATE Request
|
||||||
|
Parameters: ControlSignalBitmap
|
||||||
|
Return Value: TRUE - Success, FALSE - Error
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
uint32_t CDC_SetControlLineState (unsigned short wControlSignalBitmap) {
|
||||||
|
|
||||||
|
/* ... add code to handle request */
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
CDC SendBreak Request Callback
|
||||||
|
Called automatically on CDC Set_COMM_FATURE Request
|
||||||
|
Parameters: 0xFFFF start of Break
|
||||||
|
0x0000 stop of Break
|
||||||
|
0x#### Duration of Break
|
||||||
|
Return Value: TRUE - Success, FALSE - Error
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
uint32_t CDC_SendBreak (unsigned short wDurationOfBreak) {
|
||||||
|
|
||||||
|
/* ... add code to handle request */
|
||||||
|
return (TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
CDC_BulkIn call on DataIn Request
|
||||||
|
Parameters: none
|
||||||
|
Return Value: none
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void CDC_BulkIn(void)
|
||||||
|
{
|
||||||
|
// int numBytesRead, numBytesAvail;
|
||||||
|
//
|
||||||
|
// // ToDo: Modify BulkIn to send incoming data to USB
|
||||||
|
//
|
||||||
|
// ser_AvailChar (&numBytesAvail);
|
||||||
|
//
|
||||||
|
// // ... add code to check for overwrite
|
||||||
|
//
|
||||||
|
// numBytesRead = ser_Read ((char *)&BulkBufIn[0], &numBytesAvail);
|
||||||
|
//
|
||||||
|
// // send over USB
|
||||||
|
// if (numBytesRead > 0) {
|
||||||
|
// USB_WriteEP (CDC_DEP_IN, &BulkBufIn[0], numBytesRead);
|
||||||
|
// }
|
||||||
|
// else {
|
||||||
|
// CDC_DepInEmpty = 1;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
CDC_BulkOut call on DataOut Request
|
||||||
|
Parameters: none
|
||||||
|
Return Value: none
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void CDC_BulkOut(void)
|
||||||
|
{
|
||||||
|
int numBytesRead;
|
||||||
|
|
||||||
|
// get data from USB into intermediate buffer
|
||||||
|
numBytesRead = USB_ReadEP(CDC_DEP_OUT, &BulkBufOut[0]);
|
||||||
|
|
||||||
|
// ... add code to check for overwrite
|
||||||
|
|
||||||
|
// store data in a buffer to transmit it over serial interface
|
||||||
|
CDC_WrOutBuf ((char *)&BulkBufOut[0], &numBytesRead);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
Get the SERIAL_STATE as defined in usbcdc11.pdf, 6.3.5, Table 69.
|
||||||
|
Parameters: none
|
||||||
|
Return Value: SerialState as defined in usbcdc11.pdf
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
unsigned short CDC_GetSerialState (void)
|
||||||
|
{
|
||||||
|
CDC_SerialState = 0;
|
||||||
|
|
||||||
|
return (CDC_SerialState);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
Send the SERIAL_STATE notification as defined in usbcdc11.pdf, 6.3.5.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
void CDC_NotificationIn (void)
|
||||||
|
{
|
||||||
|
NotificationBuf[0] = 0xA1; // bmRequestType
|
||||||
|
NotificationBuf[1] = CDC_NOTIFICATION_SERIAL_STATE; // bNotification (SERIAL_STATE)
|
||||||
|
NotificationBuf[2] = 0x00; // wValue
|
||||||
|
NotificationBuf[3] = 0x00;
|
||||||
|
NotificationBuf[4] = 0x00; // wIndex (Interface #, LSB first)
|
||||||
|
NotificationBuf[5] = 0x00;
|
||||||
|
NotificationBuf[6] = 0x02; // wLength (Data length = 2 bytes, LSB first)
|
||||||
|
NotificationBuf[7] = 0x00;
|
||||||
|
NotificationBuf[8] = (CDC_SerialState >> 0) & 0xFF; // UART State Bitmap (16bits, LSB first)
|
||||||
|
NotificationBuf[9] = (CDC_SerialState >> 8) & 0xFF;
|
||||||
|
|
||||||
|
USB_WriteEP (CDC_CEP_IN, &NotificationBuf[0], 10); // send notification
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* U S B - K e r n e l
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* Name: cdcuser.h
|
||||||
|
* Purpose: USB Communication Device Class User module Definitions
|
||||||
|
* Version: V1.10
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* This software is supplied "AS IS" without any warranties, express,
|
||||||
|
* implied or statutory, including but not limited to the implied
|
||||||
|
* warranties of fitness for purpose, satisfactory quality and
|
||||||
|
* noninfringement. Keil extends you a royalty-free right to reproduce
|
||||||
|
* and distribute executable files created using this software for use
|
||||||
|
* on NXP Semiconductors LPC microcontroller devices only. Nothing else
|
||||||
|
* gives you the right to use this software.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009 Keil - An ARM Company. All rights reserved.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __CDCUSER_H__
|
||||||
|
#define __CDCUSER_H__
|
||||||
|
|
||||||
|
/* CDC buffer handling */
|
||||||
|
extern int CDC_RdOutBuf (char *buffer, const int *length);
|
||||||
|
extern int CDC_WrOutBuf (const char *buffer, int *length);
|
||||||
|
extern int CDC_OutBufAvailChar (int *availChar);
|
||||||
|
|
||||||
|
|
||||||
|
/* CDC Data In/Out Endpoint Address */
|
||||||
|
#define CDC_DEP_IN 0x83
|
||||||
|
#define CDC_DEP_OUT 0x03
|
||||||
|
|
||||||
|
/* CDC Communication In Endpoint Address */
|
||||||
|
#define CDC_CEP_IN 0x81
|
||||||
|
|
||||||
|
/* CDC Requests Callback Functions */
|
||||||
|
extern uint32_t CDC_SendEncapsulatedCommand (void);
|
||||||
|
extern uint32_t CDC_GetEncapsulatedResponse (void);
|
||||||
|
extern uint32_t CDC_SetCommFeature (unsigned short wFeatureSelector);
|
||||||
|
extern uint32_t CDC_GetCommFeature (unsigned short wFeatureSelector);
|
||||||
|
extern uint32_t CDC_ClearCommFeature (unsigned short wFeatureSelector);
|
||||||
|
extern uint32_t CDC_GetLineCoding (void);
|
||||||
|
extern uint32_t CDC_SetLineCoding (void);
|
||||||
|
extern uint32_t CDC_SetControlLineState (unsigned short wControlSignalBitmap);
|
||||||
|
extern uint32_t CDC_SendBreak (unsigned short wDurationOfBreak);
|
||||||
|
|
||||||
|
/* CDC Bulk Callback Functions */
|
||||||
|
extern void CDC_BulkIn (void);
|
||||||
|
extern void CDC_BulkOut (void);
|
||||||
|
|
||||||
|
/* CDC Notification Callback Function */
|
||||||
|
extern void CDC_NotificationIn (void);
|
||||||
|
|
||||||
|
/* CDC Initialization Function */
|
||||||
|
extern void CDC_Init (void);
|
||||||
|
|
||||||
|
/* CDC prepare the SERAIAL_STATE */
|
||||||
|
extern unsigned short CDC_GetSerialState (void);
|
||||||
|
|
||||||
|
/* flow control */
|
||||||
|
extern unsigned short CDC_DepInEmpty; // DataEndPoint IN empty
|
||||||
|
|
||||||
|
#endif /* __CDCUSER_H__ */
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
/*****************************************************************************
|
||||||
|
* config.h: config file for usbcdc example for NXP LPC13xx Family
|
||||||
|
* Microprocessors
|
||||||
|
*
|
||||||
|
* Copyright(C) 2008, NXP Semiconductor
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* History
|
||||||
|
* 2008.07.19 ver 1.00 Preliminary version, first Release
|
||||||
|
*
|
||||||
|
******************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Overview:
|
||||||
|
This example shows how to use the USB driver to implement a CDC class USB peripheral.
|
||||||
|
To run this example, you must attach a USB cable to the board. See
|
||||||
|
the "Getting Started Guide" appendix for details.
|
||||||
|
|
||||||
|
How to use:
|
||||||
|
Click the debug toolbar button.
|
||||||
|
Click the go button.
|
||||||
|
Plug the LPCXpresso's target side into a PC using a USB cable retrofit
|
||||||
|
or a 3rd party base board.
|
||||||
|
|
||||||
|
* You should be able to see a new COM port on your PC.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "projectconfig.h"
|
||||||
|
|
||||||
|
#define USB_VENDOR_ID CFG_USB_VID // Vendor ID
|
||||||
|
#define USB_PROD_ID CFG_USB_PID // Product ID
|
||||||
|
#define USB_DEVICE 0x0100 // Device ID
|
||||||
|
|
||||||
|
#define LED_PORT 0 // Port for led
|
||||||
|
#define LED_BIT 7 // Bit on port for led
|
||||||
|
|
||||||
|
|
||||||
|
/*********************************************************************************
|
||||||
|
** End Of File
|
||||||
|
*********************************************************************************/
|
|
@ -0,0 +1,228 @@
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* U S B - K e r n e l
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* Name: usb.h
|
||||||
|
* Purpose: USB Definitions
|
||||||
|
* Version: V1.20
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* This software is supplied "AS IS" without any warranties, express,
|
||||||
|
* implied or statutory, including but not limited to the implied
|
||||||
|
* warranties of fitness for purpose, satisfactory quality and
|
||||||
|
* noninfringement. Keil extends you a royalty-free right to reproduce
|
||||||
|
* and distribute executable files created using this software for use
|
||||||
|
* on NXP Semiconductors LPC microcontroller devices only. Nothing else
|
||||||
|
* gives you the right to use this software.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009 Keil - An ARM Company. All rights reserved.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __USB_H__
|
||||||
|
#define __USB_H__
|
||||||
|
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
uint16_t W;
|
||||||
|
struct {
|
||||||
|
uint8_t L;
|
||||||
|
uint8_t H;
|
||||||
|
} __attribute__((packed)) WB;
|
||||||
|
} __attribute__((packed)) WORD_BYTE;
|
||||||
|
|
||||||
|
|
||||||
|
/* bmRequestType.Dir */
|
||||||
|
#define REQUEST_HOST_TO_DEVICE 0
|
||||||
|
#define REQUEST_DEVICE_TO_HOST 1
|
||||||
|
|
||||||
|
/* bmRequestType.Type */
|
||||||
|
#define REQUEST_STANDARD 0
|
||||||
|
#define REQUEST_CLASS 1
|
||||||
|
#define REQUEST_VENDOR 2
|
||||||
|
#define REQUEST_RESERVED 3
|
||||||
|
|
||||||
|
/* bmRequestType.Recipient */
|
||||||
|
#define REQUEST_TO_DEVICE 0
|
||||||
|
#define REQUEST_TO_INTERFACE 1
|
||||||
|
#define REQUEST_TO_ENDPOINT 2
|
||||||
|
#define REQUEST_TO_OTHER 3
|
||||||
|
|
||||||
|
/* bmRequestType Definition */
|
||||||
|
typedef union _REQUEST_TYPE {
|
||||||
|
struct _BM {
|
||||||
|
uint8_t Recipient : 5;
|
||||||
|
uint8_t Type : 2;
|
||||||
|
uint8_t Dir : 1;
|
||||||
|
} __attribute__((packed)) BM;
|
||||||
|
uint8_t B;
|
||||||
|
} __attribute__((packed)) REQUEST_TYPE;
|
||||||
|
|
||||||
|
/* USB Standard Request Codes */
|
||||||
|
#define USB_REQUEST_GET_STATUS 0
|
||||||
|
#define USB_REQUEST_CLEAR_FEATURE 1
|
||||||
|
#define USB_REQUEST_SET_FEATURE 3
|
||||||
|
#define USB_REQUEST_SET_ADDRESS 5
|
||||||
|
#define USB_REQUEST_GET_DESCRIPTOR 6
|
||||||
|
#define USB_REQUEST_SET_DESCRIPTOR 7
|
||||||
|
#define USB_REQUEST_GET_CONFIGURATION 8
|
||||||
|
#define USB_REQUEST_SET_CONFIGURATION 9
|
||||||
|
#define USB_REQUEST_GET_INTERFACE 10
|
||||||
|
#define USB_REQUEST_SET_INTERFACE 11
|
||||||
|
#define USB_REQUEST_SYNC_FRAME 12
|
||||||
|
|
||||||
|
/* USB GET_STATUS Bit Values */
|
||||||
|
#define USB_GETSTATUS_SELF_POWERED 0x01
|
||||||
|
#define USB_GETSTATUS_REMOTE_WAKEUP 0x02
|
||||||
|
#define USB_GETSTATUS_ENDPOINT_STALL 0x01
|
||||||
|
|
||||||
|
/* USB Standard Feature selectors */
|
||||||
|
#define USB_FEATURE_ENDPOINT_STALL 0
|
||||||
|
#define USB_FEATURE_REMOTE_WAKEUP 1
|
||||||
|
|
||||||
|
/* USB Default Control Pipe Setup Packet */
|
||||||
|
typedef struct _USB_SETUP_PACKET {
|
||||||
|
REQUEST_TYPE bmRequestType;
|
||||||
|
uint8_t bRequest;
|
||||||
|
WORD_BYTE wValue;
|
||||||
|
WORD_BYTE wIndex;
|
||||||
|
uint16_t wLength;
|
||||||
|
} __attribute__((packed)) USB_SETUP_PACKET;
|
||||||
|
|
||||||
|
|
||||||
|
/* USB Descriptor Types */
|
||||||
|
#define USB_DEVICE_DESCRIPTOR_TYPE 1
|
||||||
|
#define USB_CONFIGURATION_DESCRIPTOR_TYPE 2
|
||||||
|
#define USB_STRING_DESCRIPTOR_TYPE 3
|
||||||
|
#define USB_INTERFACE_DESCRIPTOR_TYPE 4
|
||||||
|
#define USB_ENDPOINT_DESCRIPTOR_TYPE 5
|
||||||
|
#define USB_DEVICE_QUALIFIER_DESCRIPTOR_TYPE 6
|
||||||
|
#define USB_OTHER_SPEED_CONFIG_DESCRIPTOR_TYPE 7
|
||||||
|
#define USB_INTERFACE_POWER_DESCRIPTOR_TYPE 8
|
||||||
|
#define USB_OTG_DESCRIPTOR_TYPE 9
|
||||||
|
#define USB_DEBUG_DESCRIPTOR_TYPE 10
|
||||||
|
#define USB_INTERFACE_ASSOCIATION_DESCRIPTOR_TYPE 11
|
||||||
|
|
||||||
|
/* USB Device Classes */
|
||||||
|
#define USB_DEVICE_CLASS_RESERVED 0x00
|
||||||
|
#define USB_DEVICE_CLASS_AUDIO 0x01
|
||||||
|
#define USB_DEVICE_CLASS_COMMUNICATIONS 0x02
|
||||||
|
#define USB_DEVICE_CLASS_HUMAN_INTERFACE 0x03
|
||||||
|
#define USB_DEVICE_CLASS_MONITOR 0x04
|
||||||
|
#define USB_DEVICE_CLASS_PHYSICAL_INTERFACE 0x05
|
||||||
|
#define USB_DEVICE_CLASS_POWER 0x06
|
||||||
|
#define USB_DEVICE_CLASS_PRINTER 0x07
|
||||||
|
#define USB_DEVICE_CLASS_STORAGE 0x08
|
||||||
|
#define USB_DEVICE_CLASS_HUB 0x09
|
||||||
|
#define USB_DEVICE_CLASS_MISCELLANEOUS 0xEF
|
||||||
|
#define USB_DEVICE_CLASS_VENDOR_SPECIFIC 0xFF
|
||||||
|
|
||||||
|
/* bmAttributes in Configuration Descriptor */
|
||||||
|
#define USB_CONFIG_POWERED_MASK 0x40
|
||||||
|
#define USB_CONFIG_BUS_POWERED 0x80
|
||||||
|
#define USB_CONFIG_SELF_POWERED 0xC0
|
||||||
|
#define USB_CONFIG_REMOTE_WAKEUP 0x20
|
||||||
|
|
||||||
|
/* bMaxPower in Configuration Descriptor */
|
||||||
|
#define USB_CONFIG_POWER_MA(mA) ((mA)/2)
|
||||||
|
|
||||||
|
/* bEndpointAddress in Endpoint Descriptor */
|
||||||
|
#define USB_ENDPOINT_DIRECTION_MASK 0x80
|
||||||
|
#define USB_ENDPOINT_OUT(addr) ((addr) | 0x00)
|
||||||
|
#define USB_ENDPOINT_IN(addr) ((addr) | 0x80)
|
||||||
|
|
||||||
|
/* bmAttributes in Endpoint Descriptor */
|
||||||
|
#define USB_ENDPOINT_TYPE_MASK 0x03
|
||||||
|
#define USB_ENDPOINT_TYPE_CONTROL 0x00
|
||||||
|
#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01
|
||||||
|
#define USB_ENDPOINT_TYPE_BULK 0x02
|
||||||
|
#define USB_ENDPOINT_TYPE_INTERRUPT 0x03
|
||||||
|
#define USB_ENDPOINT_SYNC_MASK 0x0C
|
||||||
|
#define USB_ENDPOINT_SYNC_NO_SYNCHRONIZATION 0x00
|
||||||
|
#define USB_ENDPOINT_SYNC_ASYNCHRONOUS 0x04
|
||||||
|
#define USB_ENDPOINT_SYNC_ADAPTIVE 0x08
|
||||||
|
#define USB_ENDPOINT_SYNC_SYNCHRONOUS 0x0C
|
||||||
|
#define USB_ENDPOINT_USAGE_MASK 0x30
|
||||||
|
#define USB_ENDPOINT_USAGE_DATA 0x00
|
||||||
|
#define USB_ENDPOINT_USAGE_FEEDBACK 0x10
|
||||||
|
#define USB_ENDPOINT_USAGE_IMPLICIT_FEEDBACK 0x20
|
||||||
|
#define USB_ENDPOINT_USAGE_RESERVED 0x30
|
||||||
|
|
||||||
|
/* USB Standard Device Descriptor */
|
||||||
|
typedef struct _USB_DEVICE_DESCRIPTOR {
|
||||||
|
uint8_t bLength;
|
||||||
|
uint8_t bDescriptorType;
|
||||||
|
uint16_t bcdUSB;
|
||||||
|
uint8_t bDeviceClass;
|
||||||
|
uint8_t bDeviceSubClass;
|
||||||
|
uint8_t bDeviceProtocol;
|
||||||
|
uint8_t bMaxPacketSize0;
|
||||||
|
uint16_t idVendor;
|
||||||
|
uint16_t idProduct;
|
||||||
|
uint16_t bcdDevice;
|
||||||
|
uint8_t iManufacturer;
|
||||||
|
uint8_t iProduct;
|
||||||
|
uint8_t iSerialNumber;
|
||||||
|
uint8_t bNumConfigurations;
|
||||||
|
} __attribute__((packed)) USB_DEVICE_DESCRIPTOR;
|
||||||
|
|
||||||
|
/* USB 2.0 Device Qualifier Descriptor */
|
||||||
|
typedef struct _USB_DEVICE_QUALIFIER_DESCRIPTOR {
|
||||||
|
uint8_t bLength;
|
||||||
|
uint8_t bDescriptorType;
|
||||||
|
uint16_t bcdUSB;
|
||||||
|
uint8_t bDeviceClass;
|
||||||
|
uint8_t bDeviceSubClass;
|
||||||
|
uint8_t bDeviceProtocol;
|
||||||
|
uint8_t bMaxPacketSize0;
|
||||||
|
uint8_t bNumConfigurations;
|
||||||
|
uint8_t bReserved;
|
||||||
|
} __attribute__((packed)) USB_DEVICE_QUALIFIER_DESCRIPTOR;
|
||||||
|
|
||||||
|
/* USB Standard Configuration Descriptor */
|
||||||
|
typedef struct _USB_CONFIGURATION_DESCRIPTOR {
|
||||||
|
uint8_t bLength;
|
||||||
|
uint8_t bDescriptorType;
|
||||||
|
uint16_t wTotalLength;
|
||||||
|
uint8_t bNumInterfaces;
|
||||||
|
uint8_t bConfigurationValue;
|
||||||
|
uint8_t iConfiguration;
|
||||||
|
uint8_t bmAttributes;
|
||||||
|
uint8_t bMaxPower;
|
||||||
|
} __attribute__((packed)) USB_CONFIGURATION_DESCRIPTOR;
|
||||||
|
|
||||||
|
/* USB Standard Interface Descriptor */
|
||||||
|
typedef struct _USB_INTERFACE_DESCRIPTOR {
|
||||||
|
uint8_t bLength;
|
||||||
|
uint8_t bDescriptorType;
|
||||||
|
uint8_t bInterfaceNumber;
|
||||||
|
uint8_t bAlternateSetting;
|
||||||
|
uint8_t bNumEndpoints;
|
||||||
|
uint8_t bInterfaceClass;
|
||||||
|
uint8_t bInterfaceSubClass;
|
||||||
|
uint8_t bInterfaceProtocol;
|
||||||
|
uint8_t iInterface;
|
||||||
|
} __attribute__((packed)) USB_INTERFACE_DESCRIPTOR;
|
||||||
|
|
||||||
|
/* USB Standard Endpoint Descriptor */
|
||||||
|
typedef struct _USB_ENDPOINT_DESCRIPTOR {
|
||||||
|
uint8_t bLength;
|
||||||
|
uint8_t bDescriptorType;
|
||||||
|
uint8_t bEndpointAddress;
|
||||||
|
uint8_t bmAttributes;
|
||||||
|
uint16_t wMaxPacketSize;
|
||||||
|
uint8_t bInterval;
|
||||||
|
} __attribute__((packed)) USB_ENDPOINT_DESCRIPTOR;
|
||||||
|
|
||||||
|
/* USB String Descriptor */
|
||||||
|
typedef struct _USB_STRING_DESCRIPTOR {
|
||||||
|
uint8_t bLength;
|
||||||
|
uint8_t bDescriptorType;
|
||||||
|
uint16_t bString/*[]*/;
|
||||||
|
} __attribute__((packed)) USB_STRING_DESCRIPTOR;
|
||||||
|
|
||||||
|
/* USB Common Descriptor */
|
||||||
|
typedef struct _USB_COMMON_DESCRIPTOR {
|
||||||
|
uint8_t bLength;
|
||||||
|
uint8_t bDescriptorType;
|
||||||
|
} __attribute__((packed)) USB_COMMON_DESCRIPTOR;
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __USB_H__ */
|
|
@ -0,0 +1,157 @@
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* U S B - K e r n e l
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* Name: usbcfg.h
|
||||||
|
* Purpose: USB Custom Configuration
|
||||||
|
* Version: V1.20
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* This software is supplied "AS IS" without any warranties, express,
|
||||||
|
* implied or statutory, including but not limited to the implied
|
||||||
|
* warranties of fitness for purpose, satisfactory quality and
|
||||||
|
* noninfringement. Keil extends you a royalty-free right to reproduce
|
||||||
|
* and distribute executable files created using this software for use
|
||||||
|
* on NXP Semiconductors LPC microcontroller devices only. Nothing else
|
||||||
|
* gives you the right to use this software.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009 Keil - An ARM Company. All rights reserved.
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* History:
|
||||||
|
* V1.20 Added vendor specific support
|
||||||
|
* V1.00 Initial Version
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __USBCFG_H__
|
||||||
|
#define __USBCFG_H__
|
||||||
|
|
||||||
|
|
||||||
|
//*** <<< Use Configuration Wizard in Context Menu >>> ***
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
// <h> USB Configuration
|
||||||
|
// <o0> USB Power
|
||||||
|
// <i> Default Power Setting
|
||||||
|
// <0=> Bus-powered
|
||||||
|
// <1=> Self-powered
|
||||||
|
// <o1> Max Number of Interfaces <1-256>
|
||||||
|
// <o2> Max Number of Endpoints <1-32>
|
||||||
|
// <o3> Max Endpoint 0 Packet Size
|
||||||
|
// <8=> 8 Bytes <16=> 16 Bytes <32=> 32 Bytes <64=> 64 Bytes
|
||||||
|
// <e4> DMA Transfer
|
||||||
|
// <i> Use DMA for selected Endpoints
|
||||||
|
// <o5.0> Endpoint 0 Out
|
||||||
|
// <o5.1> Endpoint 0 In
|
||||||
|
// <o5.2> Endpoint 1 Out
|
||||||
|
// <o5.3> Endpoint 1 In
|
||||||
|
// <o5.4> Endpoint 2 Out
|
||||||
|
// <o5.5> Endpoint 2 In
|
||||||
|
// <o5.6> Endpoint 3 Out
|
||||||
|
// <o5.7> Endpoint 3 In
|
||||||
|
// <o5.8> Endpoint 4 Out
|
||||||
|
// <o5.9> Endpoint 4 In
|
||||||
|
// </e>
|
||||||
|
// </h>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define USB_POWER 0
|
||||||
|
#define USB_IF_NUM 1
|
||||||
|
#define USB_LOGIC_EP_NUM 5
|
||||||
|
#define USB_EP_NUM 10
|
||||||
|
#define USB_MAX_PACKET0 64
|
||||||
|
|
||||||
|
/*
|
||||||
|
// <h> USB Event Handlers
|
||||||
|
// <h> Device Events
|
||||||
|
// <o0.0> Power Event
|
||||||
|
// <o1.0> Reset Event
|
||||||
|
// <o2.0> Suspend Event
|
||||||
|
// <o3.0> Resume Event
|
||||||
|
// <o4.0> Remote Wakeup Event
|
||||||
|
// <o5.0> Start of Frame Event
|
||||||
|
// <o6.0> Error Event
|
||||||
|
// </h>
|
||||||
|
// <h> Endpoint Events
|
||||||
|
// <o7.0> Endpoint 0 Event
|
||||||
|
// <o7.1> Endpoint 1 Event
|
||||||
|
// <o7.2> Endpoint 2 Event
|
||||||
|
// <o7.3> Endpoint 3 Event
|
||||||
|
// <o7.4> Endpoint 4 Event
|
||||||
|
// <o7.5> Endpoint 5 Event
|
||||||
|
// <o7.6> Endpoint 6 Event
|
||||||
|
// <o7.7> Endpoint 7 Event
|
||||||
|
// <o7.8> Endpoint 8 Event
|
||||||
|
// <o7.9> Endpoint 9 Event
|
||||||
|
// <o7.10> Endpoint 10 Event
|
||||||
|
// <o7.11> Endpoint 11 Event
|
||||||
|
// <o7.12> Endpoint 12 Event
|
||||||
|
// <o7.13> Endpoint 13 Event
|
||||||
|
// <o7.14> Endpoint 14 Event
|
||||||
|
// <o7.15> Endpoint 15 Event
|
||||||
|
// </h>
|
||||||
|
// <h> USB Core Events
|
||||||
|
// <o8.0> Set Configuration Event
|
||||||
|
// <o9.0> Set Interface Event
|
||||||
|
// <o10.0> Set/Clear Feature Event
|
||||||
|
// </h>
|
||||||
|
// </h>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define USB_POWER_EVENT 0
|
||||||
|
#define USB_RESET_EVENT 1
|
||||||
|
#define USB_SUSPEND_EVENT 1
|
||||||
|
#define USB_RESUME_EVENT 1
|
||||||
|
#define USB_WAKEUP_EVENT 0
|
||||||
|
#define USB_SOF_EVENT 1
|
||||||
|
#define USB_ERROR_EVENT 0
|
||||||
|
#define USB_EP_EVENT 0x000B
|
||||||
|
#define USB_CONFIGURE_EVENT 1
|
||||||
|
#define USB_INTERFACE_EVENT 0
|
||||||
|
#define USB_FEATURE_EVENT 0
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
// <e0> USB Class Support
|
||||||
|
// <i> enables USB Class specific Requests
|
||||||
|
// <e1> Human Interface Device (HID)
|
||||||
|
// <o2> Interface Number <0-255>
|
||||||
|
// </e>
|
||||||
|
// <e3> Mass Storage
|
||||||
|
// <o4> Interface Number <0-255>
|
||||||
|
// </e>
|
||||||
|
// <e5> Audio Device
|
||||||
|
// <o6> Control Interface Number <0-255>
|
||||||
|
// <o7> Streaming Interface 1 Number <0-255>
|
||||||
|
// <o8> Streaming Interface 2 Number <0-255>
|
||||||
|
// </e>
|
||||||
|
// <e9> Communication Device
|
||||||
|
// <o10> Control Interface Number <0-255>
|
||||||
|
// <o11> Bulk Interface Number <0-255>
|
||||||
|
// <o12> Max Communication Device Buffer Size
|
||||||
|
// <8=> 8 Bytes <16=> 16 Bytes <32=> 32 Bytes <64=> 64 Bytes
|
||||||
|
// </e>
|
||||||
|
// </e>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define USB_CLASS 1
|
||||||
|
#define USB_HID 0
|
||||||
|
#define USB_HID_IF_NUM 0
|
||||||
|
#define USB_MSC 0
|
||||||
|
#define USB_MSC_IF_NUM 0
|
||||||
|
#define USB_AUDIO 0
|
||||||
|
#define USB_ADC_CIF_NUM 0
|
||||||
|
#define USB_ADC_SIF1_NUM 1
|
||||||
|
#define USB_ADC_SIF2_NUM 2
|
||||||
|
#define USB_CDC 1
|
||||||
|
#define USB_CDC_CIF_NUM 0
|
||||||
|
#define USB_CDC_DIF_NUM 1
|
||||||
|
#define USB_CDC_BUFSIZE CFG_USBCDC_BUFSIZE
|
||||||
|
|
||||||
|
/*
|
||||||
|
// <e0> USB Vendor Support
|
||||||
|
// <i> enables USB Vendor specific Requests
|
||||||
|
// </e>
|
||||||
|
*/
|
||||||
|
#define USB_VENDOR 0
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __USBCFG_H__ */
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,88 @@
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* U S B - K e r n e l
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* Name: usbcore.h
|
||||||
|
* Purpose: USB Core Definitions
|
||||||
|
* Version: V1.20
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* This software is supplied "AS IS" without any warranties, express,
|
||||||
|
* implied or statutory, including but not limited to the implied
|
||||||
|
* warranties of fitness for purpose, satisfactory quality and
|
||||||
|
* noninfringement. Keil extends you a royalty-free right to reproduce
|
||||||
|
* and distribute executable files created using this software for use
|
||||||
|
* on NXP Semiconductors LPC microcontroller devices only. Nothing else
|
||||||
|
* gives you the right to use this software.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009 Keil - An ARM Company. All rights reserved.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __USBCORE_H__
|
||||||
|
#define __USBCORE_H__
|
||||||
|
|
||||||
|
#include "usbcfg.h"
|
||||||
|
|
||||||
|
/* USB Endpoint Data Structure */
|
||||||
|
typedef struct _USB_EP_DATA {
|
||||||
|
uint8_t *pData;
|
||||||
|
uint16_t Count;
|
||||||
|
} USB_EP_DATA;
|
||||||
|
|
||||||
|
/* USB Core Global Variables */
|
||||||
|
extern uint16_t USB_DeviceStatus;
|
||||||
|
extern uint8_t USB_DeviceAddress;
|
||||||
|
volatile extern uint8_t USB_Configuration;
|
||||||
|
extern uint32_t USB_EndPointMask;
|
||||||
|
extern uint32_t USB_EndPointHalt;
|
||||||
|
extern uint32_t USB_EndPointStall;
|
||||||
|
extern uint8_t USB_AltSetting[USB_IF_NUM];
|
||||||
|
|
||||||
|
|
||||||
|
/* USB Endpoint 0 Buffer */
|
||||||
|
extern uint8_t EP0Buf[USB_MAX_PACKET0];
|
||||||
|
|
||||||
|
/* USB Endpoint 0 Data Info */
|
||||||
|
extern USB_EP_DATA EP0Data;
|
||||||
|
|
||||||
|
/* USB Setup Packet */
|
||||||
|
extern USB_SETUP_PACKET SetupPacket;
|
||||||
|
|
||||||
|
/* USB Core Functions */
|
||||||
|
extern void USB_ResetCore (void);
|
||||||
|
|
||||||
|
/* Newer C compilers make it really difficult to add
|
||||||
|
* an integer to a pointer */
|
||||||
|
static inline void UsbAddPtr(void **vpptr, uint32_t n);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Add a number of bytes to a pointer's address
|
||||||
|
* Harder than you might think. Some compilers say:
|
||||||
|
* Expected an lvalue -- Assignment expects its first operand to be
|
||||||
|
* an lvalue. Please note that a cast removes the lvaluedness of an
|
||||||
|
* expression.
|
||||||
|
*
|
||||||
|
* vpptr = void pointer to pointer
|
||||||
|
* n = number of bytes to add to pointer
|
||||||
|
* Call looks like: AddPtr((void **)&myPointer, 8);
|
||||||
|
*/
|
||||||
|
static inline void UsbAddPtr(void **vpptr, uint32_t n)
|
||||||
|
{
|
||||||
|
/* Declare a pointer to a pointer to a byte. Only a byte pointer
|
||||||
|
* can be incremented by a number of bytes. Other pointers will
|
||||||
|
* increment by a multiple of what they point to.
|
||||||
|
*/
|
||||||
|
uint8_t **bpptr;
|
||||||
|
|
||||||
|
/* Convert our void pointer to a pointer to a byte pointer to a pointer */
|
||||||
|
bpptr = (uint8_t **)vpptr;
|
||||||
|
|
||||||
|
/* Add 'n' bytes to our pointer value */
|
||||||
|
(*bpptr) += n;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __USBCORE_H__ */
|
|
@ -0,0 +1,202 @@
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* U S B - K e r n e l
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* Name: usbdesc.c
|
||||||
|
* Purpose: USB Descriptors
|
||||||
|
* Version: V1.20
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* This software is supplied "AS IS" without any warranties, express,
|
||||||
|
* implied or statutory, including but not limited to the implied
|
||||||
|
* warranties of fitness for purpose, satisfactory quality and
|
||||||
|
* noninfringement. Keil extends you a royalty-free right to reproduce
|
||||||
|
* and distribute executable files created using this software for use
|
||||||
|
* on NXP Semiconductors LPC microcontroller devices only. Nothing else
|
||||||
|
* gives you the right to use this software.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009 Keil - An ARM Company. All rights reserved.
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* History:
|
||||||
|
* V1.20 Changed string descriptor handling
|
||||||
|
* V1.00 Initial Version
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#include "projectconfig.h"
|
||||||
|
#include "usb.h"
|
||||||
|
#include "cdc.h"
|
||||||
|
#include "usbcfg.h"
|
||||||
|
#include "usbdesc.h"
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* USB Standard Device Descriptor */
|
||||||
|
const uint8_t USB_DeviceDescriptor[] = {
|
||||||
|
USB_DEVICE_DESC_SIZE, /* bLength */
|
||||||
|
USB_DEVICE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
WBVAL(0x0200), /* 2.0 */ /* bcdUSB */
|
||||||
|
USB_DEVICE_CLASS_COMMUNICATIONS, /* bDeviceClass CDC*/
|
||||||
|
0x00, /* bDeviceSubClass */
|
||||||
|
0x00, /* bDeviceProtocol */
|
||||||
|
USB_MAX_PACKET0, /* bMaxPacketSize0 */
|
||||||
|
WBVAL(USB_VENDOR_ID), /* idVendor */
|
||||||
|
WBVAL(USB_PROD_ID), /* idProduct */
|
||||||
|
WBVAL(USB_DEVICE), /* 1.00 */ /* bcdDevice */
|
||||||
|
0x01, /* iManufacturer */
|
||||||
|
0x02, /* iProduct */
|
||||||
|
0x03, /* iSerialNumber */
|
||||||
|
0x01 /* bNumConfigurations: one possible configuration*/
|
||||||
|
};
|
||||||
|
|
||||||
|
/* USB Configuration Descriptor */
|
||||||
|
/* All Descriptors (Configuration, Interface, Endpoint, Class, Vendor */
|
||||||
|
const uint8_t USB_ConfigDescriptor[] = {
|
||||||
|
/* Configuration 1 */
|
||||||
|
USB_CONFIGUARTION_DESC_SIZE, /* bLength */
|
||||||
|
USB_CONFIGURATION_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
WBVAL( /* wTotalLength */
|
||||||
|
1*USB_CONFIGUARTION_DESC_SIZE +
|
||||||
|
1*USB_INTERFACE_DESC_SIZE + /* communication interface */
|
||||||
|
0x0013 + /* CDC functions */
|
||||||
|
1*USB_ENDPOINT_DESC_SIZE + /* interrupt endpoint */
|
||||||
|
1*USB_INTERFACE_DESC_SIZE + /* data interface */
|
||||||
|
2*USB_ENDPOINT_DESC_SIZE /* bulk endpoints */
|
||||||
|
),
|
||||||
|
0x02, /* bNumInterfaces */
|
||||||
|
0x01, /* bConfigurationValue: 0x01 is used to select this configuration */
|
||||||
|
0x00, /* iConfiguration: no string to describe this configuration */
|
||||||
|
USB_CONFIG_BUS_POWERED /*|*/ /* bmAttributes */
|
||||||
|
/*USB_CONFIG_REMOTE_WAKEUP*/,
|
||||||
|
USB_CONFIG_POWER_MA(100), /* bMaxPower, device power consumption is 100 mA */
|
||||||
|
/* Interface 0, Alternate Setting 0, Communication class interface descriptor */
|
||||||
|
USB_INTERFACE_DESC_SIZE, /* bLength */
|
||||||
|
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
USB_CDC_CIF_NUM, /* bInterfaceNumber: Number of Interface */
|
||||||
|
0x00, /* bAlternateSetting: Alternate setting */
|
||||||
|
0x01, /* bNumEndpoints: One endpoint used */
|
||||||
|
CDC_COMMUNICATION_INTERFACE_CLASS, /* bInterfaceClass: Communication Interface Class */
|
||||||
|
CDC_ABSTRACT_CONTROL_MODEL, /* bInterfaceSubClass: Abstract Control Model */
|
||||||
|
0x00, /* bInterfaceProtocol: no protocol used */
|
||||||
|
0x5E, /* iInterface: */
|
||||||
|
/*Header Functional Descriptor*/
|
||||||
|
0x05, /* bLength: Endpoint Descriptor size */
|
||||||
|
CDC_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */
|
||||||
|
CDC_HEADER, /* bDescriptorSubtype: Header Func Desc */
|
||||||
|
WBVAL(CDC_V1_10), /* 1.10 */ /* bcdCDC */
|
||||||
|
/*Call Management Functional Descriptor*/
|
||||||
|
0x05, /* bFunctionLength */
|
||||||
|
CDC_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */
|
||||||
|
CDC_CALL_MANAGEMENT, /* bDescriptorSubtype: Call Management Func Desc */
|
||||||
|
0x01, /* bmCapabilities: device handles call management */
|
||||||
|
0x01, /* bDataInterface: CDC data IF ID */
|
||||||
|
/*Abstract Control Management Functional Descriptor*/
|
||||||
|
0x04, /* bFunctionLength */
|
||||||
|
CDC_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */
|
||||||
|
CDC_ABSTRACT_CONTROL_MANAGEMENT, /* bDescriptorSubtype: Abstract Control Management desc */
|
||||||
|
0x02, /* bmCapabilities: SET_LINE_CODING, GET_LINE_CODING, SET_CONTROL_LINE_STATE supported */
|
||||||
|
/*Union Functional Descriptor*/
|
||||||
|
0x05, /* bFunctionLength */
|
||||||
|
CDC_CS_INTERFACE, /* bDescriptorType: CS_INTERFACE */
|
||||||
|
CDC_UNION, /* bDescriptorSubtype: Union func desc */
|
||||||
|
USB_CDC_CIF_NUM, /* bMasterInterface: Communication class interface is master */
|
||||||
|
USB_CDC_DIF_NUM, /* bSlaveInterface0: Data class interface is slave 0 */
|
||||||
|
/*Endpoint 1 Descriptor*/ /* event notification (optional) */
|
||||||
|
USB_ENDPOINT_DESC_SIZE, /* bLength */
|
||||||
|
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
USB_ENDPOINT_IN(1), /* bEndpointAddress */
|
||||||
|
USB_ENDPOINT_TYPE_INTERRUPT, /* bmAttributes */
|
||||||
|
WBVAL(0x0010), /* wMaxPacketSize */
|
||||||
|
0x02, /* 2ms */ /* bInterval */
|
||||||
|
/* Interface 1, Alternate Setting 0, Data class interface descriptor*/
|
||||||
|
USB_INTERFACE_DESC_SIZE, /* bLength */
|
||||||
|
USB_INTERFACE_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
USB_CDC_DIF_NUM, /* bInterfaceNumber: Number of Interface */
|
||||||
|
0x00, /* bAlternateSetting: no alternate setting */
|
||||||
|
0x02, /* bNumEndpoints: two endpoints used */
|
||||||
|
CDC_DATA_INTERFACE_CLASS, /* bInterfaceClass: Data Interface Class */
|
||||||
|
0x00, /* bInterfaceSubClass: no subclass available */
|
||||||
|
0x00, /* bInterfaceProtocol: no protocol used */
|
||||||
|
0x5E, /* iInterface: */
|
||||||
|
/* Endpoint, EP3 Bulk Out */
|
||||||
|
USB_ENDPOINT_DESC_SIZE, /* bLength */
|
||||||
|
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
USB_ENDPOINT_OUT(3), /* bEndpointAddress */
|
||||||
|
USB_ENDPOINT_TYPE_BULK, /* bmAttributes */
|
||||||
|
WBVAL(64), /* wMaxPacketSize */
|
||||||
|
0x00, /* bInterval: ignore for Bulk transfer */
|
||||||
|
/* Endpoint, EP3 Bulk In */
|
||||||
|
USB_ENDPOINT_DESC_SIZE, /* bLength */
|
||||||
|
USB_ENDPOINT_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
USB_ENDPOINT_IN(3), /* bEndpointAddress */
|
||||||
|
USB_ENDPOINT_TYPE_BULK, /* bmAttributes */
|
||||||
|
WBVAL(64), /* wMaxPacketSize */
|
||||||
|
0x00, /* bInterval: ignore for Bulk transfer */
|
||||||
|
/* Terminator */
|
||||||
|
0 /* bLength */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* USB String Descriptor (optional) */
|
||||||
|
const uint8_t USB_StringDescriptor[] = {
|
||||||
|
/* Index 0x00: LANGID Codes */
|
||||||
|
0x04, /* bLength */
|
||||||
|
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
WBVAL(0x0409), /* US English */ /* wLANGID */
|
||||||
|
/* Index 0x01: Manufacturer */
|
||||||
|
(13*2 + 2), /* bLength (13 Char + Type + lenght) */
|
||||||
|
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
'M',0,
|
||||||
|
'I',0,
|
||||||
|
'C',0,
|
||||||
|
'R',0,
|
||||||
|
'O',0,
|
||||||
|
'B',0,
|
||||||
|
'U',0,
|
||||||
|
'I',0,
|
||||||
|
'L',0,
|
||||||
|
'D',0,
|
||||||
|
'E',0,
|
||||||
|
'R',0,
|
||||||
|
' ',0,
|
||||||
|
/* Index 0x02: Product */
|
||||||
|
(17*2 + 2), /* bLength ( 17 Char + Type + lenght) */
|
||||||
|
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
'L',0,
|
||||||
|
'P',0,
|
||||||
|
'C',0,
|
||||||
|
'1',0,
|
||||||
|
'3',0,
|
||||||
|
'4',0,
|
||||||
|
'3',0,
|
||||||
|
' ',0,
|
||||||
|
'C',0,
|
||||||
|
'O',0,
|
||||||
|
'M',0,
|
||||||
|
' ',0,
|
||||||
|
'P',0,
|
||||||
|
'O',0,
|
||||||
|
'R',0,
|
||||||
|
'T',0,
|
||||||
|
' ',0,
|
||||||
|
/* Index 0x03: Serial Number */
|
||||||
|
(12*2 + 2), /* bLength (12 Char + Type + lenght) */
|
||||||
|
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
'D',0,
|
||||||
|
'E',0,
|
||||||
|
'M',0,
|
||||||
|
'O',0,
|
||||||
|
'0',0,
|
||||||
|
'0',0,
|
||||||
|
'0',0,
|
||||||
|
'0',0,
|
||||||
|
'0',0,
|
||||||
|
'0',0,
|
||||||
|
'0',0,
|
||||||
|
'0',0,
|
||||||
|
/* Index 0x04: Interface 0, Alternate Setting 0 */
|
||||||
|
( 4*2 + 2), /* bLength (4 Char + Type + lenght) */
|
||||||
|
USB_STRING_DESCRIPTOR_TYPE, /* bDescriptorType */
|
||||||
|
'V',0,
|
||||||
|
'C',0,
|
||||||
|
'O',0,
|
||||||
|
'M',0,
|
||||||
|
};
|
|
@ -0,0 +1,35 @@
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* U S B - K e r n e l
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* Name: usbdesc.h
|
||||||
|
* Purpose: USB Descriptors Definitions
|
||||||
|
* Version: V1.20
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* This software is supplied "AS IS" without any warranties, express,
|
||||||
|
* implied or statutory, including but not limited to the implied
|
||||||
|
* warranties of fitness for purpose, satisfactory quality and
|
||||||
|
* noninfringement. Keil extends you a royalty-free right to reproduce
|
||||||
|
* and distribute executable files created using this software for use
|
||||||
|
* on NXP Semiconductors LPC microcontroller devices only. Nothing else
|
||||||
|
* gives you the right to use this software.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009 Keil - An ARM Company. All rights reserved.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __USBDESC_H__
|
||||||
|
#define __USBDESC_H__
|
||||||
|
|
||||||
|
|
||||||
|
#define WBVAL(x) ((x) & 0xFF),(((x) >> 8) & 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))
|
||||||
|
|
||||||
|
extern const uint8_t USB_DeviceDescriptor[];
|
||||||
|
extern const uint8_t USB_ConfigDescriptor[];
|
||||||
|
extern const uint8_t USB_StringDescriptor[];
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __USBDESC_H__ */
|
|
@ -0,0 +1,606 @@
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* U S B - K e r n e l
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* Name: usbhw.c
|
||||||
|
* Purpose: USB Hardware Layer Module for Philips LPC17xx
|
||||||
|
* Version: V1.20
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* This software is supplied "AS IS" without any warranties, express,
|
||||||
|
* implied or statutory, including but not limited to the implied
|
||||||
|
* warranties of fitness for purpose, satisfactory quality and
|
||||||
|
* noninfringement. Keil extends you a royalty-free right to reproduce
|
||||||
|
* and distribute executable files created using this software for use
|
||||||
|
* on NXP Semiconductors LPC microcontroller devices only. Nothing else
|
||||||
|
* gives you the right to use this software.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009 Keil - An ARM Company. All rights reserved.
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* History:
|
||||||
|
* V1.20 Added USB_ClearEPBuf
|
||||||
|
* V1.00 Initial Version
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
#include "projectconfig.h" /* LPC13xx definitions */
|
||||||
|
#include "usb.h"
|
||||||
|
#include "usbcfg.h"
|
||||||
|
#include "usbreg.h"
|
||||||
|
#include "usbhw.h"
|
||||||
|
#include "usbcore.h"
|
||||||
|
#include "usbuser.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB and IO Clock configuration only.
|
||||||
|
* The same as call PeriClkIOInit(IOCON_USB);
|
||||||
|
* The purpose is to reduce the code space for
|
||||||
|
* overall USB project and reserve code space for
|
||||||
|
* USB debugging.
|
||||||
|
* Parameters: None
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
void USBIOClkConfig( void )
|
||||||
|
{
|
||||||
|
/* Enable AHB clock to the GPIO domain. */
|
||||||
|
SCB_SYSAHBCLKCTRL |= SCB_SYSAHBCLKCTRL_GPIO;
|
||||||
|
|
||||||
|
/* Enable Timer32_1, IOCON, and USB blocks */
|
||||||
|
SCB_SYSAHBCLKCTRL |= (SCB_SYSAHBCLKCTRL_CT32B1 | SCB_SYSAHBCLKCTRL_IOCON | SCB_SYSAHBCLKCTRL_USB_REG);
|
||||||
|
|
||||||
|
// Setup USB clock
|
||||||
|
SCB_PDRUNCFG &= ~(SCB_PDSLEEPCFG_USBPAD_PD); // Power-up USB PHY
|
||||||
|
SCB_PDRUNCFG &= ~(SCB_PDSLEEPCFG_USBPLL_PD); // Power-up USB PLL
|
||||||
|
|
||||||
|
SCB_USBPLLCLKSEL = SCB_USBPLLCLKSEL_SOURCE_MAINOSC; // Select PLL Input
|
||||||
|
SCB_USBPLLCLKUEN = SCB_USBPLLCLKUEN_UPDATE; // Update Clock Source
|
||||||
|
SCB_USBPLLCLKUEN = SCB_USBPLLCLKUEN_DISABLE; // Toggle Update Register
|
||||||
|
SCB_USBPLLCLKUEN = SCB_USBPLLCLKUEN_UPDATE;
|
||||||
|
|
||||||
|
// Wait until the USB clock is updated
|
||||||
|
while (!(SCB_USBPLLCLKUEN & SCB_USBPLLCLKUEN_UPDATE));
|
||||||
|
|
||||||
|
// Set USB clock to 48MHz (12MHz x 4)
|
||||||
|
SCB_USBPLLCTRL = (SCB_USBPLLCTRL_MULT_4);
|
||||||
|
while (!(SCB_USBPLLSTAT & SCB_USBPLLSTAT_LOCK)); // Wait Until PLL Locked
|
||||||
|
SCB_USBCLKSEL = SCB_USBCLKSEL_SOURCE_USBPLLOUT;
|
||||||
|
|
||||||
|
// Set USB pin functions
|
||||||
|
IOCON_PIO0_1 &= ~IOCON_PIO0_1_FUNC_MASK;
|
||||||
|
IOCON_PIO0_1 |= IOCON_PIO0_1_FUNC_CLKOUT; // CLK OUT
|
||||||
|
IOCON_PIO0_3 &= ~IOCON_PIO0_3_FUNC_MASK;
|
||||||
|
IOCON_PIO0_3 |= IOCON_PIO0_3_FUNC_USB_VBUS; // VBus
|
||||||
|
IOCON_PIO0_6 &= ~IOCON_PIO0_6_FUNC_MASK;
|
||||||
|
IOCON_PIO0_6 |= IOCON_PIO0_6_FUNC_USB_CONNECT; // Soft Connect
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Delay number of clock cycles
|
||||||
|
* Parameters: Delay length
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void delay (uint32_t length )
|
||||||
|
{
|
||||||
|
uint32_t i;
|
||||||
|
|
||||||
|
for ( i = 0; i < length; i++ )
|
||||||
|
{
|
||||||
|
__asm("nop");
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get Endpoint Physical Address
|
||||||
|
* Parameters: EPNum: Endpoint Number
|
||||||
|
* EPNum.0..3: Address
|
||||||
|
* EPNum.7: Dir
|
||||||
|
* Return Value: Endpoint Physical Address
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint32_t EPAdr (uint32_t EPNum)
|
||||||
|
{
|
||||||
|
uint32_t val;
|
||||||
|
|
||||||
|
val = (EPNum & 0x0F) << 1;
|
||||||
|
if (EPNum & 0x80) {
|
||||||
|
val += 1;
|
||||||
|
}
|
||||||
|
return (val);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write Command
|
||||||
|
* Parameters: cmd: Command
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void WrCmd (uint32_t cmd)
|
||||||
|
{
|
||||||
|
USB_DEVINTCLR = CCEMTY_INT;
|
||||||
|
USB_CMDCODE = cmd;
|
||||||
|
while ((USB_DEVINTST & (CCEMTY_INT | DEV_STAT_INT)) == 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write Command Data
|
||||||
|
* Parameters: cmd: Command
|
||||||
|
* val: Data
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void WrCmdDat (uint32_t cmd, uint32_t val)
|
||||||
|
{
|
||||||
|
WrCmd(cmd);
|
||||||
|
WrCmd(val);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write Command to Endpoint
|
||||||
|
* Parameters: cmd: Command
|
||||||
|
* val: Data
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void WrCmdEP (uint32_t EPNum, uint32_t cmd)
|
||||||
|
{
|
||||||
|
WrCmd(CMD_SEL_EP(EPAdr(EPNum)));
|
||||||
|
WrCmd(cmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read Command Data
|
||||||
|
* Parameters: cmd: Command
|
||||||
|
* Return Value: Data Value
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint32_t RdCmdDat (uint32_t cmd)
|
||||||
|
{
|
||||||
|
USB_DEVINTCLR = CCEMTY_INT | CDFULL_INT;
|
||||||
|
USB_CMDCODE = cmd;
|
||||||
|
while ((USB_DEVINTST & (CDFULL_INT | DEV_STAT_INT)) == 0);
|
||||||
|
return (USB_CMDDATA);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Initialize Function
|
||||||
|
* Called by the User to initialize USB
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_Init (void)
|
||||||
|
{
|
||||||
|
// Setup USB clock and pins
|
||||||
|
USBIOClkConfig();
|
||||||
|
|
||||||
|
#if USB_FIQ_EVENT
|
||||||
|
/* It's important that only BULK and FRAME(ISO) can be routed
|
||||||
|
to FIQ. */
|
||||||
|
USB_DEVFIQSEL = 0x01; /* SOF Use FIQ */
|
||||||
|
|
||||||
|
/* Enable the USB Interrupt */
|
||||||
|
NVIC_EnableIRQ(USB_FIQn);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Enable the USB Interrupt */
|
||||||
|
NVIC_EnableIRQ(USB_IRQn);
|
||||||
|
|
||||||
|
USB_Reset();
|
||||||
|
USB_SetAddress(0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Connect Function
|
||||||
|
* Called by the User to Connect/Disconnect USB
|
||||||
|
* Parameters: con: Connect/Disconnect
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_Connect (uint32_t con)
|
||||||
|
{
|
||||||
|
WrCmdDat(CMD_SET_DEV_STAT, DAT_WR_BYTE(con ? DEV_CON : 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Reset Function
|
||||||
|
* Called automatically on USB Reset
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_Reset (void)
|
||||||
|
{
|
||||||
|
USB_DEVINTCLR = 0x000FFFFF;
|
||||||
|
/* Enable all eight(8) EPs, note: EP won't be ready until it's
|
||||||
|
configured/enabled when device sending SetEPStatus command
|
||||||
|
to the command engine. */
|
||||||
|
USB_DEVINTEN = DEV_STAT_INT | (0xFF<<1) |
|
||||||
|
(USB_SOF_EVENT ? FRAME_INT : 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Suspend Function
|
||||||
|
* Called automatically on USB Suspend
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_Suspend (void)
|
||||||
|
{
|
||||||
|
/* Performed by Hardware */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Resume Function
|
||||||
|
* Called automatically on USB Resume
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_Resume (void)
|
||||||
|
{
|
||||||
|
/* Performed by Hardware */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Remote Wakeup Function
|
||||||
|
* Called automatically on USB Remote Wakeup
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_WakeUp (void)
|
||||||
|
{
|
||||||
|
if (USB_DeviceStatus & USB_GETSTATUS_REMOTE_WAKEUP)
|
||||||
|
{
|
||||||
|
WrCmdDat(CMD_SET_DEV_STAT, DAT_WR_BYTE(DEV_CON));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Remote Wakeup Configuration Function
|
||||||
|
* Parameters: cfg: Enable/Disable
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_WakeUpCfg (uint32_t cfg)
|
||||||
|
{
|
||||||
|
cfg = cfg; /* Not needed */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Set Address Function
|
||||||
|
* Parameters: adr: USB Address
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_SetAddress (uint32_t adr)
|
||||||
|
{
|
||||||
|
WrCmdDat(CMD_SET_ADDR, DAT_WR_BYTE(DEV_EN | adr)); /* Don't wait for next */
|
||||||
|
WrCmdDat(CMD_SET_ADDR, DAT_WR_BYTE(DEV_EN | adr)); /* Setup Status Phase */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Configure Function
|
||||||
|
* Parameters: cfg: Configure/Deconfigure
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_Configure (uint32_t cfg)
|
||||||
|
{
|
||||||
|
WrCmdDat(CMD_CFG_DEV, DAT_WR_BYTE(cfg ? CONF_DVICE : 0));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Configure USB Endpoint according to Descriptor
|
||||||
|
* Parameters: pEPD: Pointer to Endpoint Descriptor
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_ConfigEP (USB_ENDPOINT_DESCRIPTOR *pEPD)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set Direction for USB Control Endpoint
|
||||||
|
* Parameters: dir: Out (dir == 0), In (dir <> 0)
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_DirCtrlEP (uint32_t dir)
|
||||||
|
{
|
||||||
|
dir = dir; /* Not needed */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Enable USB Endpoint
|
||||||
|
* Parameters: EPNum: Endpoint Number
|
||||||
|
* EPNum.0..3: Address
|
||||||
|
* EPNum.7: Dir
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_EnableEP (uint32_t EPNum)
|
||||||
|
{
|
||||||
|
WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Disable USB Endpoint
|
||||||
|
* Parameters: EPNum: Endpoint Number
|
||||||
|
* EPNum.0..3: Address
|
||||||
|
* EPNum.7: Dir
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_DisableEP (uint32_t EPNum)
|
||||||
|
{
|
||||||
|
WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(EP_STAT_DA));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Reset USB Endpoint
|
||||||
|
* Parameters: EPNum: Endpoint Number
|
||||||
|
* EPNum.0..3: Address
|
||||||
|
* EPNum.7: Dir
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_ResetEP (uint32_t EPNum)
|
||||||
|
{
|
||||||
|
WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Set Stall for USB Endpoint
|
||||||
|
* Parameters: EPNum: Endpoint Number
|
||||||
|
* EPNum.0..3: Address
|
||||||
|
* EPNum.7: Dir
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_SetStallEP (uint32_t EPNum)
|
||||||
|
{
|
||||||
|
WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(EP_STAT_ST));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Clear Stall for USB Endpoint
|
||||||
|
* Parameters: EPNum: Endpoint Number
|
||||||
|
* EPNum.0..3: Address
|
||||||
|
* EPNum.7: Dir
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_ClrStallEP (uint32_t EPNum)
|
||||||
|
{
|
||||||
|
WrCmdDat(CMD_SET_EP_STAT(EPAdr(EPNum)), DAT_WR_BYTE(0));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Clear USB Endpoint Buffer
|
||||||
|
* Parameters: EPNum: Endpoint Number
|
||||||
|
* EPNum.0..3: Address
|
||||||
|
* EPNum.7: Dir
|
||||||
|
* Return Value: None
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_ClearEPBuf (uint32_t EPNum)
|
||||||
|
{
|
||||||
|
WrCmdEP(EPNum, CMD_CLR_BUF);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Read USB Endpoint Data
|
||||||
|
* Parameters: EPNum: Endpoint Number
|
||||||
|
* EPNum.0..3: Address
|
||||||
|
* EPNum.7: Dir
|
||||||
|
* pData: Pointer to Data Buffer
|
||||||
|
* Return Value: Number of bytes read
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint32_t USB_ReadEP (uint32_t EPNum, uint8_t *pData)
|
||||||
|
{
|
||||||
|
uint32_t cnt, n;
|
||||||
|
|
||||||
|
USB_CTRL = ((EPNum & 0x0F) << 2) | CTRL_RD_EN;
|
||||||
|
/* 3 clock cycles to fetch the packet length from RAM. */
|
||||||
|
delay( 5 );
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
cnt = USB_RXPLEN;
|
||||||
|
} while ((cnt & PKT_DV) == 0);
|
||||||
|
cnt &= PKT_LNGTH_MASK;
|
||||||
|
|
||||||
|
for (n = 0; n < (cnt + 3) / 4; n++)
|
||||||
|
{
|
||||||
|
*((uint32_t __attribute__((packed)) *)pData) = USB_RXDATA;
|
||||||
|
pData += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
USB_CTRL = 0;
|
||||||
|
|
||||||
|
if ((EPNum & 0x80) != 0x04)
|
||||||
|
{ /* Non-Isochronous Endpoint */
|
||||||
|
WrCmdEP(EPNum, CMD_CLR_BUF);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (cnt);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Write USB Endpoint Data
|
||||||
|
* Parameters: EPNum: Endpoint Number
|
||||||
|
* EPNum.0..3: Address
|
||||||
|
* EPNum.7: Dir
|
||||||
|
* pData: Pointer to Data Buffer
|
||||||
|
* cnt: Number of bytes to write
|
||||||
|
* Return Value: Number of bytes written
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint32_t USB_WriteEP (uint32_t EPNum, uint8_t *pData, uint32_t cnt)
|
||||||
|
{
|
||||||
|
uint32_t n;
|
||||||
|
|
||||||
|
USB_CTRL = ((EPNum & 0x0F) << 2) | CTRL_WR_EN;
|
||||||
|
/* 3 clock cycles to fetch the packet length from RAM. */
|
||||||
|
delay( 5 );
|
||||||
|
USB_TXPLEN = cnt;
|
||||||
|
|
||||||
|
for (n = 0; n < (cnt + 3) / 4; n++)
|
||||||
|
{
|
||||||
|
USB_TXDATA = *((uint32_t __attribute__((packed)) *)pData);
|
||||||
|
pData += 4;
|
||||||
|
}
|
||||||
|
|
||||||
|
USB_CTRL = 0;
|
||||||
|
|
||||||
|
WrCmdEP(EPNum, CMD_VALID_BUF);
|
||||||
|
|
||||||
|
return (cnt);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Get USB Last Frame Number
|
||||||
|
* Parameters: None
|
||||||
|
* Return Value: Frame Number
|
||||||
|
*/
|
||||||
|
|
||||||
|
uint32_t USB_GetFrame (void)
|
||||||
|
{
|
||||||
|
uint32_t val;
|
||||||
|
|
||||||
|
WrCmd(CMD_RD_FRAME);
|
||||||
|
val = RdCmdDat(DAT_RD_FRAME);
|
||||||
|
val = val | (RdCmdDat(DAT_RD_FRAME) << 8);
|
||||||
|
|
||||||
|
return (val);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Interrupt Service Routine
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if CFG_USBCDC
|
||||||
|
void USB_IRQHandler (void)
|
||||||
|
{
|
||||||
|
uint32_t disr, val, n, m;
|
||||||
|
|
||||||
|
disr = USB_DEVINTST; /* Device Interrupt Status */
|
||||||
|
USB_DEVINTCLR = disr;
|
||||||
|
|
||||||
|
/* Device Status Interrupt (Reset, Connect change, Suspend/Resume) */
|
||||||
|
if (disr & DEV_STAT_INT)
|
||||||
|
{
|
||||||
|
WrCmd(CMD_GET_DEV_STAT);
|
||||||
|
val = RdCmdDat(DAT_GET_DEV_STAT); /* Device Status */
|
||||||
|
if (val & DEV_RST) { /* Reset */
|
||||||
|
USB_Reset();
|
||||||
|
#if USB_RESET_EVENT
|
||||||
|
USB_Reset_Event();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (val & DEV_CON_CH) { /* Connect change */
|
||||||
|
#if USB_POWER_EVENT
|
||||||
|
USB_Power_Event(val & DEV_CON);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
if (val & DEV_SUS_CH) { /* Suspend/Resume */
|
||||||
|
if (val & DEV_SUS) { /* Suspend */
|
||||||
|
USB_Suspend();
|
||||||
|
#if USB_SUSPEND_EVENT
|
||||||
|
USB_Suspend_Event();
|
||||||
|
#endif
|
||||||
|
} else { /* Resume */
|
||||||
|
USB_Resume();
|
||||||
|
#if USB_RESUME_EVENT
|
||||||
|
USB_Resume_Event();
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
}
|
||||||
|
goto isr_end;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if USB_SOF_EVENT
|
||||||
|
/* Start of Frame Interrupt */
|
||||||
|
if (disr & FRAME_INT)
|
||||||
|
{
|
||||||
|
USB_DEVINTCLR = FRAME_INT;
|
||||||
|
USB_SOF_Event();
|
||||||
|
// SOFIRQCount++;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if USB_ERROR_EVENT
|
||||||
|
/* NO error interrupt anymore, below code can be used
|
||||||
|
as example to get error status from command engine. */
|
||||||
|
/* Error Interrupt */
|
||||||
|
if (disr & ERR_INT)
|
||||||
|
{
|
||||||
|
WrCmd(CMD_RD_ERR_STAT);
|
||||||
|
val = RdCmdDat(DAT_RD_ERR_STAT);
|
||||||
|
USB_Error_Event(val);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* Endpoint's Interrupt */
|
||||||
|
if (disr & (0xFF<<1)) {
|
||||||
|
/* if any of the EP0 through EP7 is set, or bit 1 through 9 on disr */
|
||||||
|
for (n = 0; n < USB_EP_NUM; n++) { /* Check All Endpoints */
|
||||||
|
/* skip frame interrupt at bit 0 in disr */
|
||||||
|
// if (disr & ((1 << n)<<1)) {
|
||||||
|
if ((disr>>1) & (1 << n)) {
|
||||||
|
m = n >> 1;
|
||||||
|
/* clear EP interrupt by sending cmd to the command engine. */
|
||||||
|
WrCmd(CMD_SEL_EP_CLRI(n));
|
||||||
|
val = RdCmdDat(DAT_SEL_EP_CLRI(n));
|
||||||
|
if ((n & 1) == 0) { /* OUT Endpoint */
|
||||||
|
if (n == 0) { /* Control OUT Endpoint */
|
||||||
|
if (val & EP_SEL_STP) { /* Setup Packet */
|
||||||
|
if (USB_P_EP[0]) {
|
||||||
|
USB_P_EP[0](USB_EVT_SETUP);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (USB_P_EP[m]) {
|
||||||
|
USB_P_EP[m](USB_EVT_OUT);
|
||||||
|
}
|
||||||
|
} else { /* IN Endpoint */
|
||||||
|
if (USB_P_EP[m]) {
|
||||||
|
USB_P_EP[m](USB_EVT_IN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
isr_end:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,62 @@
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* U S B - K e r n e l
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* Name: usbhw.h
|
||||||
|
* Purpose: USB Hardware Layer Definitions
|
||||||
|
* Version: V1.20
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* This software is supplied "AS IS" without any warranties, express,
|
||||||
|
* implied or statutory, including but not limited to the implied
|
||||||
|
* warranties of fitness for purpose, satisfactory quality and
|
||||||
|
* noninfringement. Keil extends you a royalty-free right to reproduce
|
||||||
|
* and distribute executable files created using this software for use
|
||||||
|
* on NXP Semiconductors LPC microcontroller devices only. Nothing else
|
||||||
|
* gives you the right to use this software.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009 Keil - An ARM Company. All rights reserved.
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* History:
|
||||||
|
* V1.20 Added USB_ClearEPBuf
|
||||||
|
* V1.00 Initial Version
|
||||||
|
*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __USBHW_H__
|
||||||
|
#define __USBHW_H__
|
||||||
|
|
||||||
|
|
||||||
|
/* USB Error Codes */
|
||||||
|
#define USB_ERR_PID 0x0001 /* PID Error */
|
||||||
|
#define USB_ERR_UEPKT 0x0002 /* Unexpected Packet */
|
||||||
|
#define USB_ERR_DCRC 0x0004 /* Data CRC Error */
|
||||||
|
#define USB_ERR_TIMOUT 0x0008 /* Bus Time-out Error */
|
||||||
|
#define USB_ERR_EOP 0x0010 /* End of Packet Error */
|
||||||
|
#define USB_ERR_B_OVRN 0x0020 /* Buffer Overrun */
|
||||||
|
#define USB_ERR_BTSTF 0x0040 /* Bit Stuff Error */
|
||||||
|
#define USB_ERR_TGL 0x0080 /* Toggle Bit Error */
|
||||||
|
|
||||||
|
/* USB Hardware Functions */
|
||||||
|
extern void USBIOClkConfig (void);
|
||||||
|
extern void USB_Init (void);
|
||||||
|
extern void USB_Connect (uint32_t con);
|
||||||
|
extern void USB_Reset (void);
|
||||||
|
extern void USB_Suspend (void);
|
||||||
|
extern void USB_Resume (void);
|
||||||
|
extern void USB_WakeUp (void);
|
||||||
|
extern void USB_WakeUpCfg (uint32_t cfg);
|
||||||
|
extern void USB_SetAddress (uint32_t adr);
|
||||||
|
extern void USB_Configure (uint32_t cfg);
|
||||||
|
extern void USB_ConfigEP (USB_ENDPOINT_DESCRIPTOR *pEPD);
|
||||||
|
extern void USB_DirCtrlEP (uint32_t dir);
|
||||||
|
extern void USB_EnableEP (uint32_t EPNum);
|
||||||
|
extern void USB_DisableEP (uint32_t EPNum);
|
||||||
|
extern void USB_ResetEP (uint32_t EPNum);
|
||||||
|
extern void USB_SetStallEP (uint32_t EPNum);
|
||||||
|
extern void USB_ClrStallEP (uint32_t EPNum);
|
||||||
|
extern void USB_ClearEPBuf (uint32_t EPNum);
|
||||||
|
extern uint32_t USB_ReadEP (uint32_t EPNum, uint8_t *pData);
|
||||||
|
extern uint32_t USB_WriteEP (uint32_t EPNum, uint8_t *pData, uint32_t cnt);
|
||||||
|
extern uint32_t USB_GetFrame(void);
|
||||||
|
extern void USB_IRQHandler (void);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __USBHW_H__ */
|
|
@ -0,0 +1,134 @@
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* U S B - K e r n e l
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* Name: USBREG.H
|
||||||
|
* Purpose: USB Hardware Layer Definitions for NXP LPC13xx
|
||||||
|
* Version: V1.20
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* This software is supplied "AS IS" without any warranties, express,
|
||||||
|
* implied or statutory, including but not limited to the implied
|
||||||
|
* warranties of fitness for purpose, satisfactory quality and
|
||||||
|
* noninfringement. Keil extends you a royalty-free right to reproduce
|
||||||
|
* and distribute executable files created using this software for use
|
||||||
|
* on NXP Semiconductors LPC microcontroller devices only. Nothing else
|
||||||
|
* gives you the right to use this software.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009 Keil - An ARM Company. All rights reserved.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __USBREG_H
|
||||||
|
#define __USBREG_H
|
||||||
|
|
||||||
|
/* Device Interrupt Bit Definitions */
|
||||||
|
#define FRAME_INT (0x1<<0)
|
||||||
|
#define EP0_INT (0x1<<1)
|
||||||
|
#define EP1_INT (0x1<<2)
|
||||||
|
#define EP2_INT (0x1<<3)
|
||||||
|
#define EP3_INT (0x1<<4)
|
||||||
|
#define EP4_INT (0x1<<5)
|
||||||
|
#define EP5_INT (0x1<<6)
|
||||||
|
#define EP6_INT (0x1<<7)
|
||||||
|
#define EP7_INT (0x1<<8)
|
||||||
|
#define DEV_STAT_INT (0x1<<9)
|
||||||
|
#define CCEMTY_INT (0x1<<10)
|
||||||
|
#define CDFULL_INT (0x1<<11)
|
||||||
|
#define RxENDPKT_INT (0x1<<12)
|
||||||
|
#define TxENDPKT_INT (0x1<<13)
|
||||||
|
|
||||||
|
/* Rx & Tx Packet Length Definitions */
|
||||||
|
#define PKT_LNGTH_MASK 0x000003FF
|
||||||
|
#define PKT_DV 0x00000400
|
||||||
|
#define PKT_RDY 0x00000800
|
||||||
|
|
||||||
|
/* USB Control Definitions */
|
||||||
|
#define CTRL_RD_EN 0x00000001
|
||||||
|
#define CTRL_WR_EN 0x00000002
|
||||||
|
|
||||||
|
/* Command Codes */
|
||||||
|
#define CMD_SET_ADDR 0x00D00500
|
||||||
|
#define CMD_CFG_DEV 0x00D80500
|
||||||
|
#define CMD_SET_MODE 0x00F30500
|
||||||
|
#define CMD_RD_INT 0x00F40500
|
||||||
|
#define DAT_RD_INT 0x00F40200
|
||||||
|
#define CMD_RD_FRAME 0x00F50500
|
||||||
|
#define DAT_RD_FRAME 0x00F50200
|
||||||
|
#define CMD_RD_CHIP_ID 0x00FD0500
|
||||||
|
#define DAT_RD_CHIP_ID 0x00FD0200
|
||||||
|
|
||||||
|
#define CMD_SET_DEV_STAT 0x00FE0500
|
||||||
|
#define CMD_GET_DEV_STAT 0x00FE0500
|
||||||
|
#define DAT_GET_DEV_STAT 0x00FE0200
|
||||||
|
#define CMD_GET_ERR_CODE 0x00FF0500
|
||||||
|
#define DAT_GET_ERR_CODE 0x00FF0200
|
||||||
|
|
||||||
|
#define DAT_WR_BYTE(x) (0x00000100 | ((x) << 16))
|
||||||
|
#define CMD_SEL_EP(x) (0x00000500 | ((x) << 16))
|
||||||
|
#define DAT_SEL_EP(x) (0x00000200 | ((x) << 16))
|
||||||
|
#define CMD_SEL_EP_CLRI(x) (0x00400500 | ((x) << 16))
|
||||||
|
#define DAT_SEL_EP_CLRI(x) (0x00400200 | ((x) << 16))
|
||||||
|
#define CMD_SET_EP_STAT(x) (0x00400500 | ((x) << 16))
|
||||||
|
#define CMD_CLR_BUF 0x00F20500
|
||||||
|
#define CMD_VALID_BUF 0x00FA0500
|
||||||
|
|
||||||
|
/* Device Address Register Definitions */
|
||||||
|
#define DEV_ADDR_MASK 0x7F
|
||||||
|
#define DEV_EN 0x80
|
||||||
|
|
||||||
|
/* Device Configure Register Definitions */
|
||||||
|
#define CONF_DVICE 0x01
|
||||||
|
|
||||||
|
/* Device Mode Register Definitions */
|
||||||
|
#define AP_CLK 0x01
|
||||||
|
#define INAK_CI 0x02
|
||||||
|
#define INAK_CO 0x04
|
||||||
|
#define INAK_AI 0x08
|
||||||
|
#define INAK_AO 0x10
|
||||||
|
|
||||||
|
/* Device Status Register Definitions */
|
||||||
|
#define DEV_CON 0x01
|
||||||
|
#define DEV_CON_CH 0x02
|
||||||
|
#define DEV_SUS 0x04
|
||||||
|
#define DEV_SUS_CH 0x08
|
||||||
|
#define DEV_RST 0x10
|
||||||
|
|
||||||
|
/* Error Code Register Definitions */
|
||||||
|
#define ERR_EC_MASK 0x0F
|
||||||
|
#define ERR_EA 0x10
|
||||||
|
|
||||||
|
/* Error Status Register Definitions */
|
||||||
|
#define ERR_NOERROR 0x00
|
||||||
|
#define ERR_PID_ENCODE 0x01
|
||||||
|
#define ERR_UNKNOWN_PID 0x02
|
||||||
|
#define ERR_UNEXPECT_PKT 0x03
|
||||||
|
#define ERR_TCRC 0x04
|
||||||
|
#define ERR_DCRC 0x05
|
||||||
|
#define ERR_TIMEOUT 0x06
|
||||||
|
#define ERR_BABBIE 0x07
|
||||||
|
#define ERR_EOF_PKT 0x08
|
||||||
|
#define ERR_TX_RX_NAK 0x09
|
||||||
|
#define ERR_SENT_STALL 0x0A
|
||||||
|
#define ERR_BUF_OVERRUN 0x0B
|
||||||
|
#define ERR_SENT_EPT_PKT 0x0C
|
||||||
|
#define ERR_BIT_STUFF 0x0D
|
||||||
|
#define ERR_SYNC 0x0E
|
||||||
|
#define ERR_TOGGLE_BIT 0x0F
|
||||||
|
|
||||||
|
/* Endpoint Select Register Definitions */
|
||||||
|
#define EP_SEL_F 0x01
|
||||||
|
#define EP_SEL_ST 0x02
|
||||||
|
#define EP_SEL_STP 0x04
|
||||||
|
#define EP_SEL_PO 0x08
|
||||||
|
#define EP_SEL_EPN 0x10
|
||||||
|
#define EP_SEL_B_1_FULL 0x20
|
||||||
|
#define EP_SEL_B_2_FULL 0x40
|
||||||
|
|
||||||
|
/* Endpoint Status Register Definitions */
|
||||||
|
#define EP_STAT_ST 0x01
|
||||||
|
#define EP_STAT_DA 0x20
|
||||||
|
#define EP_STAT_RF_MO 0x40
|
||||||
|
#define EP_STAT_CND_ST 0x80
|
||||||
|
|
||||||
|
/* Clear Buffer Register Definitions */
|
||||||
|
#define CLR_BUF_PO 0x01
|
||||||
|
|
||||||
|
#endif /* __USBREG_H */
|
|
@ -0,0 +1,208 @@
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* U S B - K e r n e l
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* Name: usbuser.c
|
||||||
|
* Purpose: USB Custom User Module
|
||||||
|
* Version: V1.20
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* This software is supplied "AS IS" without any warranties, express,
|
||||||
|
* implied or statutory, including but not limited to the implied
|
||||||
|
* warranties of fitness for purpose, satisfactory quality and
|
||||||
|
* noninfringement. Keil extends you a royalty-free right to reproduce
|
||||||
|
* and distribute executable files created using this software for use
|
||||||
|
* on NXP Semiconductors LPC microcontroller devices only. Nothing else
|
||||||
|
* gives you the right to use this software.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2009 Keil - An ARM Company. All rights reserved.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
#include "projectconfig.h"
|
||||||
|
|
||||||
|
#include "usb.h"
|
||||||
|
#include "usbcfg.h"
|
||||||
|
#include "usbhw.h"
|
||||||
|
#include "usbcore.h"
|
||||||
|
#include "usbuser.h"
|
||||||
|
#include "cdcuser.h"
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Power Event Callback
|
||||||
|
* Called automatically on USB Power Event
|
||||||
|
* Parameter: power: On(TRUE)/Off(FALSE)
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if USB_POWER_EVENT
|
||||||
|
void USB_Power_Event (uint32_t power) {
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Reset Event Callback
|
||||||
|
* Called automatically on USB Reset Event
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if USB_RESET_EVENT
|
||||||
|
void USB_Reset_Event (void) {
|
||||||
|
USB_ResetCore();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Suspend Event Callback
|
||||||
|
* Called automatically on USB Suspend Event
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if USB_SUSPEND_EVENT
|
||||||
|
void USB_Suspend_Event (void) {
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Resume Event Callback
|
||||||
|
* Called automatically on USB Resume Event
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if USB_RESUME_EVENT
|
||||||
|
void USB_Resume_Event (void) {
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Remote Wakeup Event Callback
|
||||||
|
* Called automatically on USB Remote Wakeup Event
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if USB_WAKEUP_EVENT
|
||||||
|
void USB_WakeUp_Event (void) {
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Start of Frame Event Callback
|
||||||
|
* Called automatically on USB Start of Frame Event
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if USB_SOF_EVENT
|
||||||
|
void USB_SOF_Event (void) {
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Error Event Callback
|
||||||
|
* Called automatically on USB Error Event
|
||||||
|
* Parameter: error: Error Code
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if USB_ERROR_EVENT
|
||||||
|
void USB_Error_Event (uint32_t error) {
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Set Configuration Event Callback
|
||||||
|
* Called automatically on USB Set Configuration Request
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if USB_CONFIGURE_EVENT
|
||||||
|
void USB_Configure_Event (void) {
|
||||||
|
|
||||||
|
if (USB_Configuration) { /* Check if USB is configured */
|
||||||
|
/* add your code here */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Set Interface Event Callback
|
||||||
|
* Called automatically on USB Set Interface Request
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if USB_INTERFACE_EVENT
|
||||||
|
void USB_Interface_Event (void) {
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Set/Clear Feature Event Callback
|
||||||
|
* Called automatically on USB Set/Clear Feature Request
|
||||||
|
*/
|
||||||
|
|
||||||
|
#if USB_FEATURE_EVENT
|
||||||
|
void USB_Feature_Event (void) {
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#define P_EP(n) ((USB_EP_EVENT & (1 << (n))) ? USB_EndPoint##n : NULL)
|
||||||
|
|
||||||
|
/* USB Endpoint Events Callback Pointers */
|
||||||
|
void (* const USB_P_EP[USB_LOGIC_EP_NUM]) (uint32_t event) = {
|
||||||
|
P_EP(0),
|
||||||
|
P_EP(1),
|
||||||
|
P_EP(2),
|
||||||
|
P_EP(3),
|
||||||
|
P_EP(4),
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Endpoint 1 Event Callback
|
||||||
|
* Called automatically on USB Endpoint 1 Event
|
||||||
|
* Parameter: event
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_EndPoint1 (uint32_t event) {
|
||||||
|
uint16_t temp;
|
||||||
|
static uint16_t serialState;
|
||||||
|
|
||||||
|
switch (event) {
|
||||||
|
case USB_EVT_IN:
|
||||||
|
temp = CDC_GetSerialState();
|
||||||
|
if (serialState != temp) {
|
||||||
|
serialState = temp;
|
||||||
|
CDC_NotificationIn(); /* send SERIAL_STATE notification */
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Endpoint 2 Event Callback
|
||||||
|
* Called automatically on USB Endpoint 2 Event
|
||||||
|
* Parameter: event
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_EndPoint2 (uint32_t event)
|
||||||
|
{
|
||||||
|
event = event;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* USB Endpoint 3 Event Callback
|
||||||
|
* Called automatically on USB Endpoint 3 Event
|
||||||
|
* Parameter: event
|
||||||
|
*/
|
||||||
|
|
||||||
|
void USB_EndPoint3 (uint32_t event) {
|
||||||
|
switch (event) {
|
||||||
|
case USB_EVT_OUT:
|
||||||
|
CDC_BulkOut (); /* data received from Host */
|
||||||
|
break;
|
||||||
|
case USB_EVT_IN:
|
||||||
|
CDC_BulkIn (); /* data expected from Host */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,57 @@
|
||||||
|
/*----------------------------------------------------------------------------
|
||||||
|
* U S B - K e r n e l
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* Name: USBUSER.H
|
||||||
|
* Purpose: USB Custom User Definitions
|
||||||
|
* Version: V1.10
|
||||||
|
*----------------------------------------------------------------------------
|
||||||
|
* This software is supplied "AS IS" without any warranties, express,
|
||||||
|
* implied or statutory, including but not limited to the implied
|
||||||
|
* warranties of fitness for purpose, satisfactory quality and
|
||||||
|
* noninfringement. Keil extends you a royalty-free right to reproduce
|
||||||
|
* and distribute executable files created using this software for use
|
||||||
|
* on NXP Semiconductors LPC microcontroller devices only. Nothing else
|
||||||
|
* gives you the right to use this software.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2005-2009 Keil Software.
|
||||||
|
*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef __USBUSER_H__
|
||||||
|
#define __USBUSER_H__
|
||||||
|
|
||||||
|
|
||||||
|
/* USB Device Events Callback Functions */
|
||||||
|
extern void USB_Power_Event (uint32_t power);
|
||||||
|
extern void USB_Reset_Event (void);
|
||||||
|
extern void USB_Suspend_Event (void);
|
||||||
|
extern void USB_Resume_Event (void);
|
||||||
|
extern void USB_WakeUp_Event (void);
|
||||||
|
extern void USB_SOF_Event (void);
|
||||||
|
extern void USB_Error_Event (uint32_t error);
|
||||||
|
|
||||||
|
/* USB Endpoint Callback Events */
|
||||||
|
#define USB_EVT_SETUP 1 /* Setup Packet */
|
||||||
|
#define USB_EVT_OUT 2 /* OUT Packet */
|
||||||
|
#define USB_EVT_IN 3 /* IN Packet */
|
||||||
|
#define USB_EVT_OUT_NAK 4 /* OUT Packet - Not Acknowledged */
|
||||||
|
#define USB_EVT_IN_NAK 5 /* IN Packet - Not Acknowledged */
|
||||||
|
#define USB_EVT_OUT_STALL 6 /* OUT Packet - Stalled */
|
||||||
|
#define USB_EVT_IN_STALL 7 /* IN Packet - Stalled */
|
||||||
|
|
||||||
|
/* USB Endpoint Events Callback Pointers */
|
||||||
|
extern void (* const USB_P_EP[USB_LOGIC_EP_NUM])(uint32_t event);
|
||||||
|
|
||||||
|
/* USB Endpoint Events Callback Functions */
|
||||||
|
extern void USB_EndPoint0 (uint32_t event);
|
||||||
|
extern void USB_EndPoint1 (uint32_t event);
|
||||||
|
extern void USB_EndPoint2 (uint32_t event);
|
||||||
|
extern void USB_EndPoint3 (uint32_t event);
|
||||||
|
extern void USB_EndPoint4 (uint32_t event);
|
||||||
|
|
||||||
|
/* USB Core Events Callback Functions */
|
||||||
|
extern void USB_Configure_Event (void);
|
||||||
|
extern void USB_Interface_Event (void);
|
||||||
|
extern void USB_Feature_Event (void);
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* __USBUSER_H__ */
|
Loading…
Reference in New Issue