|
// DOM-IGNORE-BEGIN
|
|
/*******************************************************************************
|
|
Copyright 2015 Microchip Technology Inc. (www.microchip.com)
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
|
|
To request to license the code under the MLA license (www.microchip.com/mla_license),
|
|
please contact mla_licensing@microchip.com
|
|
*******************************************************************************/
|
|
//DOM-IGNORE-END
|
|
|
|
#include "usb_config.h"
|
|
|
|
/* Short Packet States - Used by Control Transfer Read - CTRL_TRF_TX */
|
|
#define SHORT_PKT_NOT_USED 0
|
|
#define SHORT_PKT_PENDING 1
|
|
#define SHORT_PKT_SENT 2
|
|
|
|
/* Control Transfer States */
|
|
#define WAIT_SETUP 0
|
|
#define CTRL_TRF_TX 1
|
|
#define CTRL_TRF_RX 2
|
|
|
|
|
|
typedef union
|
|
{
|
|
struct
|
|
{
|
|
unsigned char ping_pong_state :1;
|
|
unsigned char transfer_terminated :1;
|
|
} bits;
|
|
uint8_t Val;
|
|
} EP_STATUS;
|
|
|
|
#if (USB_PING_PONG_MODE == USB_PING_PONG__NO_PING_PONG)
|
|
#define USB_NEXT_EP0_OUT_PING_PONG 0x0000 // Used in USB Device Mode only
|
|
#define USB_NEXT_EP0_IN_PING_PONG 0x0000 // Used in USB Device Mode only
|
|
#define USB_NEXT_PING_PONG 0x0000 // Used in USB Device Mode only
|
|
#define EP0_OUT_EVEN 0 // Used in USB Device Mode only
|
|
#define EP0_OUT_ODD 0 // Used in USB Device Mode only
|
|
#define EP0_IN_EVEN 1 // Used in USB Device Mode only
|
|
#define EP0_IN_ODD 1 // Used in USB Device Mode only
|
|
#define EP1_OUT_EVEN 2 // Used in USB Device Mode only
|
|
#define EP1_OUT_ODD 2 // Used in USB Device Mode only
|
|
#define EP1_IN_EVEN 3 // Used in USB Device Mode only
|
|
#define EP1_IN_ODD 3 // Used in USB Device Mode only
|
|
#define EP2_OUT_EVEN 4 // Used in USB Device Mode only
|
|
#define EP2_OUT_ODD 4 // Used in USB Device Mode only
|
|
#define EP2_IN_EVEN 5 // Used in USB Device Mode only
|
|
#define EP2_IN_ODD 5 // Used in USB Device Mode only
|
|
#define EP3_OUT_EVEN 6 // Used in USB Device Mode only
|
|
#define EP3_OUT_ODD 6 // Used in USB Device Mode only
|
|
#define EP3_IN_EVEN 7 // Used in USB Device Mode only
|
|
#define EP3_IN_ODD 7 // Used in USB Device Mode only
|
|
#define EP4_OUT_EVEN 8 // Used in USB Device Mode only
|
|
#define EP4_OUT_ODD 8 // Used in USB Device Mode only
|
|
#define EP4_IN_EVEN 9 // Used in USB Device Mode only
|
|
#define EP4_IN_ODD 9 // Used in USB Device Mode only
|
|
#define EP5_OUT_EVEN 10 // Used in USB Device Mode only
|
|
#define EP5_OUT_ODD 10 // Used in USB Device Mode only
|
|
#define EP5_IN_EVEN 11 // Used in USB Device Mode only
|
|
#define EP5_IN_ODD 11 // Used in USB Device Mode only
|
|
#define EP6_OUT_EVEN 12 // Used in USB Device Mode only
|
|
#define EP6_OUT_ODD 12 // Used in USB Device Mode only
|
|
#define EP6_IN_EVEN 13 // Used in USB Device Mode only
|
|
#define EP6_IN_ODD 13 // Used in USB Device Mode only
|
|
#define EP7_OUT_EVEN 14 // Used in USB Device Mode only
|
|
#define EP7_OUT_ODD 14 // Used in USB Device Mode only
|
|
#define EP7_IN_EVEN 15 // Used in USB Device Mode only
|
|
#define EP7_IN_ODD 15 // Used in USB Device Mode only
|
|
#define EP8_OUT_EVEN 16 // Used in USB Device Mode only
|
|
#define EP8_OUT_ODD 16 // Used in USB Device Mode only
|
|
#define EP8_IN_EVEN 17 // Used in USB Device Mode only
|
|
#define EP8_IN_ODD 17 // Used in USB Device Mode only
|
|
#define EP9_OUT_EVEN 18 // Used in USB Device Mode only
|
|
#define EP9_OUT_ODD 18 // Used in USB Device Mode only
|
|
#define EP9_IN_EVEN 19 // Used in USB Device Mode only
|
|
#define EP9_IN_ODD 19 // Used in USB Device Mode only
|
|
#define EP10_OUT_EVEN 20 // Used in USB Device Mode only
|
|
#define EP10_OUT_ODD 20 // Used in USB Device Mode only
|
|
#define EP10_IN_EVEN 21 // Used in USB Device Mode only
|
|
#define EP10_IN_ODD 21 // Used in USB Device Mode only
|
|
#define EP11_OUT_EVEN 22 // Used in USB Device Mode only
|
|
#define EP11_OUT_ODD 22 // Used in USB Device Mode only
|
|
#define EP11_IN_EVEN 23 // Used in USB Device Mode only
|
|
#define EP11_IN_ODD 23 // Used in USB Device Mode only
|
|
#define EP12_OUT_EVEN 24 // Used in USB Device Mode only
|
|
#define EP12_OUT_ODD 24 // Used in USB Device Mode only
|
|
#define EP12_IN_EVEN 25 // Used in USB Device Mode only
|
|
#define EP12_IN_ODD 25 // Used in USB Device Mode only
|
|
#define EP13_OUT_EVEN 26 // Used in USB Device Mode only
|
|
#define EP13_OUT_ODD 26 // Used in USB Device Mode only
|
|
#define EP13_IN_EVEN 27 // Used in USB Device Mode only
|
|
#define EP13_IN_ODD 27 // Used in USB Device Mode only
|
|
#define EP14_OUT_EVEN 28 // Used in USB Device Mode only
|
|
#define EP14_OUT_ODD 28 // Used in USB Device Mode only
|
|
#define EP14_IN_EVEN 29 // Used in USB Device Mode only
|
|
#define EP14_IN_ODD 29 // Used in USB Device Mode only
|
|
#define EP15_OUT_EVEN 30 // Used in USB Device Mode only
|
|
#define EP15_OUT_ODD 30 // Used in USB Device Mode only
|
|
#define EP15_IN_EVEN 31 // Used in USB Device Mode only
|
|
#define EP15_IN_ODD 31 // Used in USB Device Mode only
|
|
|
|
#define EP(ep,dir,pp) (2*ep+dir) // Used in USB Device Mode only
|
|
#define BD(ep,dir,pp) ((8 * ep) + (4 * dir)) // Used in USB Device Mode only
|
|
|
|
#elif (USB_PING_PONG_MODE == USB_PING_PONG__EP0_OUT_ONLY)
|
|
#define USB_NEXT_EP0_OUT_PING_PONG 0x0004
|
|
#define USB_NEXT_EP0_IN_PING_PONG 0x0000
|
|
#define USB_NEXT_PING_PONG 0x0000
|
|
#define EP0_OUT_EVEN 0
|
|
#define EP0_OUT_ODD 1
|
|
#define EP0_IN_EVEN 2
|
|
#define EP0_IN_ODD 2
|
|
#define EP1_OUT_EVEN 3
|
|
#define EP1_OUT_ODD 3
|
|
#define EP1_IN_EVEN 4
|
|
#define EP1_IN_ODD 4
|
|
#define EP2_OUT_EVEN 5
|
|
#define EP2_OUT_ODD 5
|
|
#define EP2_IN_EVEN 6
|
|
#define EP2_IN_ODD 6
|
|
#define EP3_OUT_EVEN 7
|
|
#define EP3_OUT_ODD 7
|
|
#define EP3_IN_EVEN 8
|
|
#define EP3_IN_ODD 8
|
|
#define EP4_OUT_EVEN 9
|
|
#define EP4_OUT_ODD 9
|
|
#define EP4_IN_EVEN 10
|
|
#define EP4_IN_ODD 10
|
|
#define EP5_OUT_EVEN 11
|
|
#define EP5_OUT_ODD 11
|
|
#define EP5_IN_EVEN 12
|
|
#define EP5_IN_ODD 12
|
|
#define EP6_OUT_EVEN 13
|
|
#define EP6_OUT_ODD 13
|
|
#define EP6_IN_EVEN 14
|
|
#define EP6_IN_ODD 14
|
|
#define EP7_OUT_EVEN 15
|
|
#define EP7_OUT_ODD 15
|
|
#define EP7_IN_EVEN 16
|
|
#define EP7_IN_ODD 16
|
|
#define EP8_OUT_EVEN 17
|
|
#define EP8_OUT_ODD 17
|
|
#define EP8_IN_EVEN 18
|
|
#define EP8_IN_ODD 18
|
|
#define EP9_OUT_EVEN 19
|
|
#define EP9_OUT_ODD 19
|
|
#define EP9_IN_EVEN 20
|
|
#define EP9_IN_ODD 20
|
|
#define EP10_OUT_EVEN 21
|
|
#define EP10_OUT_ODD 21
|
|
#define EP10_IN_EVEN 22
|
|
#define EP10_IN_ODD 22
|
|
#define EP11_OUT_EVEN 23
|
|
#define EP11_OUT_ODD 23
|
|
#define EP11_IN_EVEN 24
|
|
#define EP11_IN_ODD 24
|
|
#define EP12_OUT_EVEN 25
|
|
#define EP12_OUT_ODD 25
|
|
#define EP12_IN_EVEN 26
|
|
#define EP12_IN_ODD 26
|
|
#define EP13_OUT_EVEN 27
|
|
#define EP13_OUT_ODD 27
|
|
#define EP13_IN_EVEN 28
|
|
#define EP13_IN_ODD 28
|
|
#define EP14_OUT_EVEN 29
|
|
#define EP14_OUT_ODD 29
|
|
#define EP14_IN_EVEN 30
|
|
#define EP14_IN_ODD 30
|
|
#define EP15_OUT_EVEN 31
|
|
#define EP15_OUT_ODD 31
|
|
#define EP15_IN_EVEN 32
|
|
#define EP15_IN_ODD 32
|
|
|
|
#define EP(ep,dir,pp) (2u*ep+dir+(((ep==0)&&(dir==0))?pp:1))
|
|
#define BD(ep,dir,pp) (4u*((2u*ep)+dir+(((ep==0)&&(dir==0))?pp:1)))
|
|
|
|
#elif (USB_PING_PONG_MODE == USB_PING_PONG__FULL_PING_PONG)
|
|
#if defined (__18CXX) || defined(__C30__) || defined __XC16__ || defined(__XC8)
|
|
#if (defined (__dsPIC33E__) || defined (__PIC24E__))
|
|
#define USB_NEXT_EP0_OUT_PING_PONG 0x0008
|
|
#define USB_NEXT_EP0_IN_PING_PONG 0x0008
|
|
#define USB_NEXT_PING_PONG 0x0008
|
|
#else
|
|
#define USB_NEXT_EP0_OUT_PING_PONG 0x0004
|
|
#define USB_NEXT_EP0_IN_PING_PONG 0x0004
|
|
#define USB_NEXT_PING_PONG 0x0004
|
|
#endif
|
|
#elif defined(__C32__)
|
|
#define USB_NEXT_EP0_OUT_PING_PONG 0x0008
|
|
#define USB_NEXT_EP0_IN_PING_PONG 0x0008
|
|
#define USB_NEXT_PING_PONG 0x0008
|
|
#else
|
|
#error "Not defined for this compiler"
|
|
#endif
|
|
#define EP0_OUT_EVEN 0
|
|
#define EP0_OUT_ODD 1
|
|
#define EP0_IN_EVEN 2
|
|
#define EP0_IN_ODD 3
|
|
#define EP1_OUT_EVEN 4
|
|
#define EP1_OUT_ODD 5
|
|
#define EP1_IN_EVEN 6
|
|
#define EP1_IN_ODD 7
|
|
#define EP2_OUT_EVEN 8
|
|
#define EP2_OUT_ODD 9
|
|
#define EP2_IN_EVEN 10
|
|
#define EP2_IN_ODD 11
|
|
#define EP3_OUT_EVEN 12
|
|
#define EP3_OUT_ODD 13
|
|
#define EP3_IN_EVEN 14
|
|
#define EP3_IN_ODD 15
|
|
#define EP4_OUT_EVEN 16
|
|
#define EP4_OUT_ODD 17
|
|
#define EP4_IN_EVEN 18
|
|
#define EP4_IN_ODD 19
|
|
#define EP5_OUT_EVEN 20
|
|
#define EP5_OUT_ODD 21
|
|
#define EP5_IN_EVEN 22
|
|
#define EP5_IN_ODD 23
|
|
#define EP6_OUT_EVEN 24
|
|
#define EP6_OUT_ODD 25
|
|
#define EP6_IN_EVEN 26
|
|
#define EP6_IN_ODD 27
|
|
#define EP7_OUT_EVEN 28
|
|
#define EP7_OUT_ODD 29
|
|
#define EP7_IN_EVEN 30
|
|
#define EP7_IN_ODD 31
|
|
#define EP8_OUT_EVEN 32
|
|
#define EP8_OUT_ODD 33
|
|
#define EP8_IN_EVEN 34
|
|
#define EP8_IN_ODD 35
|
|
#define EP9_OUT_EVEN 36
|
|
#define EP9_OUT_ODD 37
|
|
#define EP9_IN_EVEN 38
|
|
#define EP9_IN_ODD 39
|
|
#define EP10_OUT_EVEN 40
|
|
#define EP10_OUT_ODD 41
|
|
#define EP10_IN_EVEN 42
|
|
#define EP10_IN_ODD 43
|
|
#define EP11_OUT_EVEN 44
|
|
#define EP11_OUT_ODD 45
|
|
#define EP11_IN_EVEN 46
|
|
#define EP11_IN_ODD 47
|
|
#define EP12_OUT_EVEN 48
|
|
#define EP12_OUT_ODD 49
|
|
#define EP12_IN_EVEN 50
|
|
#define EP12_IN_ODD 51
|
|
#define EP13_OUT_EVEN 52
|
|
#define EP13_OUT_ODD 53
|
|
#define EP13_IN_EVEN 54
|
|
#define EP13_IN_ODD 55
|
|
#define EP14_OUT_EVEN 56
|
|
#define EP14_OUT_ODD 57
|
|
#define EP14_IN_EVEN 58
|
|
#define EP14_IN_ODD 59
|
|
#define EP15_OUT_EVEN 60
|
|
#define EP15_OUT_ODD 61
|
|
#define EP15_IN_EVEN 62
|
|
#define EP15_IN_ODD 63
|
|
|
|
#define EP(ep,dir,pp) (4*ep+2*dir+pp)
|
|
|
|
#if defined (__18CXX) || defined(__C30__) || defined __XC16__ || (__XC8)
|
|
#if (defined(__dsPIC33E__) || defined (__PIC24E__))
|
|
#define BD(ep,dir,pp) (8*(4*ep+2*dir+pp))
|
|
#else
|
|
#define BD(ep,dir,pp) (4*(4*ep+2*dir+pp))
|
|
#endif
|
|
#elif defined(__C32__)
|
|
#define BD(ep,dir,pp) (8*(4*ep+2*dir+pp))
|
|
#else
|
|
#error "Not defined for this compiler"
|
|
#endif
|
|
|
|
#elif (USB_PING_PONG_MODE == USB_PING_PONG__ALL_BUT_EP0)
|
|
#define USB_NEXT_EP0_OUT_PING_PONG 0x0000
|
|
#define USB_NEXT_EP0_IN_PING_PONG 0x0000
|
|
#define USB_NEXT_PING_PONG 0x0004
|
|
#define EP0_OUT_EVEN 0
|
|
#define EP0_OUT_ODD 0
|
|
#define EP0_IN_EVEN 1
|
|
#define EP0_IN_ODD 1
|
|
#define EP1_OUT_EVEN 2
|
|
#define EP1_OUT_ODD 3
|
|
#define EP1_IN_EVEN 4
|
|
#define EP1_IN_ODD 5
|
|
#define EP2_OUT_EVEN 6
|
|
#define EP2_OUT_ODD 7
|
|
#define EP2_IN_EVEN 8
|
|
#define EP2_IN_ODD 9
|
|
#define EP3_OUT_EVEN 10
|
|
#define EP3_OUT_ODD 11
|
|
#define EP3_IN_EVEN 12
|
|
#define EP3_IN_ODD 13
|
|
#define EP4_OUT_EVEN 14
|
|
#define EP4_OUT_ODD 15
|
|
#define EP4_IN_EVEN 16
|
|
#define EP4_IN_ODD 17
|
|
#define EP5_OUT_EVEN 18
|
|
#define EP5_OUT_ODD 19
|
|
#define EP5_IN_EVEN 20
|
|
#define EP5_IN_ODD 21
|
|
#define EP6_OUT_EVEN 22
|
|
#define EP6_OUT_ODD 23
|
|
#define EP6_IN_EVEN 24
|
|
#define EP6_IN_ODD 25
|
|
#define EP7_OUT_EVEN 26
|
|
#define EP7_OUT_ODD 27
|
|
#define EP7_IN_EVEN 28
|
|
#define EP7_IN_ODD 29
|
|
#define EP8_OUT_EVEN 30
|
|
#define EP8_OUT_ODD 31
|
|
#define EP8_IN_EVEN 32
|
|
#define EP8_IN_ODD 33
|
|
#define EP9_OUT_EVEN 34
|
|
#define EP9_OUT_ODD 35
|
|
#define EP9_IN_EVEN 36
|
|
#define EP9_IN_ODD 37
|
|
#define EP10_OUT_EVEN 38
|
|
#define EP10_OUT_ODD 39
|
|
#define EP10_IN_EVEN 40
|
|
#define EP10_IN_ODD 41
|
|
#define EP11_OUT_EVEN 42
|
|
#define EP11_OUT_ODD 43
|
|
#define EP11_IN_EVEN 44
|
|
#define EP11_IN_ODD 45
|
|
#define EP12_OUT_EVEN 46
|
|
#define EP12_OUT_ODD 47
|
|
#define EP12_IN_EVEN 48
|
|
#define EP12_IN_ODD 49
|
|
#define EP13_OUT_EVEN 50
|
|
#define EP13_OUT_ODD 51
|
|
#define EP13_IN_EVEN 52
|
|
#define EP13_IN_ODD 53
|
|
#define EP14_OUT_EVEN 54
|
|
#define EP14_OUT_ODD 55
|
|
#define EP14_IN_EVEN 56
|
|
#define EP14_IN_ODD 57
|
|
#define EP15_OUT_EVEN 58
|
|
#define EP15_OUT_ODD 59
|
|
#define EP15_IN_EVEN 60
|
|
#define EP15_IN_ODD 61
|
|
|
|
#define EP(ep,dir,pp) (4*ep+2*dir+((ep==0)?0:(pp-2)))
|
|
#define BD(ep,dir,pp) (4*(4*ep+2*dir+((ep==0)?0:(pp-2))))
|
|
|
|
#else
|
|
#error "No ping pong mode defined."
|
|
#endif
|
|
|
|
/****** Event callback enabling/disabling macros ********************
|
|
This section of code is used to disable specific USB events that may not be
|
|
desired by the user. This can save code size and increase throughput and
|
|
decrease CPU utiliazation.
|
|
********************************************************************/
|
|
#if defined USB_DISABLE_SUSPEND_HANDLER
|
|
#define USB_SUSPEND_HANDLER(event,pointer,size)
|
|
|
|
#warning "Disabling the suspend handler is not recommended. Proper suspend handling is required to create a compliant USB device."
|
|
#else
|
|
#define USB_SUSPEND_HANDLER(event,pointer,size) USER_USB_CALLBACK_EVENT_HANDLER((USB_EVENT)event,pointer,size)
|
|
#endif
|
|
|
|
#if defined USB_DISABLE_WAKEUP_FROM_SUSPEND_HANDLER
|
|
#define USB_WAKEUP_FROM_SUSPEND_HANDLER(event,pointer,size)
|
|
|
|
#warning "Disabling the wake from suspend handler is not recommended. Proper suspend handling is required to create a compliant USB device."
|
|
#else
|
|
#define USB_WAKEUP_FROM_SUSPEND_HANDLER(event,pointer,size) USER_USB_CALLBACK_EVENT_HANDLER((USB_EVENT)event,pointer,size)
|
|
#endif
|
|
|
|
#if defined USB_DISABLE_SOF_HANDLER
|
|
#define USB_SOF_HANDLER(event,pointer,size)
|
|
#else
|
|
#define USB_SOF_HANDLER(event,pointer,size) USER_USB_CALLBACK_EVENT_HANDLER((USB_EVENT)event,pointer,size)
|
|
#endif
|
|
|
|
#if defined USB_DISABLE_TRANSFER_TERMINATED_HANDLER
|
|
#define USB_TRANSFER_TERMINATED_HANDLER(event,pointer,size)
|
|
#else
|
|
#define USB_TRANSFER_TERMINATED_HANDLER(event,pointer,size) USER_USB_CALLBACK_EVENT_HANDLER((USB_EVENT)event,pointer,size)
|
|
#endif
|
|
|
|
#if defined USB_DISABLE_ERROR_HANDLER
|
|
#define USB_ERROR_HANDLER(event,pointer,size)
|
|
#else
|
|
#define USB_ERROR_HANDLER(event,pointer,size) USER_USB_CALLBACK_EVENT_HANDLER((USB_EVENT)event,pointer,size)
|
|
#endif
|
|
|
|
#if defined USB_DISABLE_NONSTANDARD_EP0_REQUEST_HANDLER
|
|
#define USB_NONSTANDARD_EP0_REQUEST_HANDLER(event,pointer,size)
|
|
#else
|
|
#define USB_NONSTANDARD_EP0_REQUEST_HANDLER(event,pointer,size) USER_USB_CALLBACK_EVENT_HANDLER((USB_EVENT)event,pointer,size)
|
|
#endif
|
|
|
|
#if defined USB_DISABLE_SET_DESCRIPTOR_HANDLER
|
|
#define USB_SET_DESCRIPTOR_HANDLER(event,pointer,size)
|
|
#else
|
|
#define USB_SET_DESCRIPTOR_HANDLER(event,pointer,size) USER_USB_CALLBACK_EVENT_HANDLER((USB_EVENT)event,pointer,size)
|
|
#endif
|
|
|
|
#if defined USB_DISABLE_SET_CONFIGURATION_HANDLER
|
|
#define USB_SET_CONFIGURATION_HANDLER(event,pointer,size)
|
|
#else
|
|
#define USB_SET_CONFIGURATION_HANDLER(event,pointer,size) USER_USB_CALLBACK_EVENT_HANDLER((USB_EVENT)event,pointer,size)
|
|
#endif
|
|
|
|
#if defined USB_DISABLE_TRANSFER_COMPLETE_HANDLER
|
|
#define USB_TRANSFER_COMPLETE_HANDLER(event,pointer,size)
|
|
#else
|
|
#define USB_TRANSFER_COMPLETE_HANDLER(event,pointer,size) USER_USB_CALLBACK_EVENT_HANDLER((USB_EVENT)event,pointer,size)
|
|
#endif
|
|
|