Sizeoptimized v-usb added.
This commit is contained in:
parent
c1d91c2448
commit
9d6eb9dfc5
4 changed files with 57 additions and 39 deletions
|
@ -249,8 +249,8 @@ section at the end of this file).
|
||||||
* obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
|
* obdev's free shared VID/PID pair. See the file USB-IDs-for-free.txt for
|
||||||
* details.
|
* details.
|
||||||
*/
|
*/
|
||||||
#define USB_CFG_DEVICE_NAME 'M', 'i', 'n', 'i', 'L', 'E', 'D', 'C', 'u', 'b', 'e'
|
#define USB_CFG_DEVICE_NAME 'L', 'E', 'D', 'C', 'u', 'b', 'e'
|
||||||
#define USB_CFG_DEVICE_NAME_LEN 11
|
#define USB_CFG_DEVICE_NAME_LEN 7
|
||||||
/* Same as above for the device name. If you don't want a device name, undefine
|
/* Same as above for the device name. If you don't want a device name, undefine
|
||||||
* the macros. See the file USB-IDs-for-free.txt before you assign a name if
|
* the macros. See the file USB-IDs-for-free.txt before you assign a name if
|
||||||
* you use a shared VID/PID.
|
* you use a shared VID/PID.
|
||||||
|
@ -370,4 +370,6 @@ section at the end of this file).
|
||||||
/* #define USB_INTR_PENDING_BIT INTF0 */
|
/* #define USB_INTR_PENDING_BIT INTF0 */
|
||||||
/* #define USB_INTR_VECTOR INT0_vect */
|
/* #define USB_INTR_VECTOR INT0_vect */
|
||||||
|
|
||||||
|
#define USB_CFG_USE_GPIOR 1
|
||||||
|
|
||||||
#endif /* __usbconfig_h_included__ */
|
#endif /* __usbconfig_h_included__ */
|
||||||
|
|
|
@ -46,8 +46,13 @@ uchar usbCurrentDataToken;/* when we check data toggling to ignore duplica
|
||||||
|
|
||||||
/* USB status registers / not shared with asm code */
|
/* USB status registers / not shared with asm code */
|
||||||
uchar *usbMsgPtr; /* data to transmit next -- ROM or RAM address */
|
uchar *usbMsgPtr; /* data to transmit next -- ROM or RAM address */
|
||||||
|
|
||||||
static usbMsgLen_t usbMsgLen = USB_NO_MSG; /* remaining number of bytes */
|
static usbMsgLen_t usbMsgLen = USB_NO_MSG; /* remaining number of bytes */
|
||||||
|
#ifdef USB_CFG_USE_GPIOR
|
||||||
|
# define usbMsgFlags (*((uchar*)&GPIOR0))
|
||||||
|
#else
|
||||||
static uchar usbMsgFlags; /* flag values see below */
|
static uchar usbMsgFlags; /* flag values see below */
|
||||||
|
#endif
|
||||||
|
|
||||||
#define USB_FLG_MSGPTR_IS_ROM (1<<6)
|
#define USB_FLG_MSGPTR_IS_ROM (1<<6)
|
||||||
#define USB_FLG_USE_USER_RW (1<<7)
|
#define USB_FLG_USE_USER_RW (1<<7)
|
||||||
|
@ -194,16 +199,6 @@ PROGMEM char usbDescriptorConfiguration[] = { /* USB configuration descriptor
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
static inline void usbResetDataToggling(void)
|
|
||||||
{
|
|
||||||
#if USB_CFG_HAVE_INTRIN_ENDPOINT && !USB_CFG_SUPPRESS_INTR_CODE
|
|
||||||
USB_SET_DATATOKEN1(USB_INITIAL_DATATOKEN); /* reset data toggling for interrupt endpoint */
|
|
||||||
# if USB_CFG_HAVE_INTRIN_ENDPOINT3
|
|
||||||
USB_SET_DATATOKEN3(USB_INITIAL_DATATOKEN); /* reset data toggling for interrupt endpoint */
|
|
||||||
# endif
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void usbResetStall(void)
|
static inline void usbResetStall(void)
|
||||||
{
|
{
|
||||||
#if USB_CFG_IMPLEMENT_HALT && USB_CFG_HAVE_INTRIN_ENDPOINT
|
#if USB_CFG_IMPLEMENT_HALT && USB_CFG_HAVE_INTRIN_ENDPOINT
|
||||||
|
@ -547,9 +542,9 @@ uchar len;
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifdef USB_RESET_HOOK
|
||||||
static inline void usbHandleResetHook(uchar notResetState)
|
static inline void usbHandleResetHook(uchar notResetState)
|
||||||
{
|
{
|
||||||
#ifdef USB_RESET_HOOK
|
|
||||||
static uchar wasReset;
|
static uchar wasReset;
|
||||||
uchar isReset = !notResetState;
|
uchar isReset = !notResetState;
|
||||||
|
|
||||||
|
@ -557,8 +552,8 @@ uchar isReset = !notResetState;
|
||||||
USB_RESET_HOOK(isReset);
|
USB_RESET_HOOK(isReset);
|
||||||
wasReset = isReset;
|
wasReset = isReset;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
@ -591,35 +586,22 @@ uchar i;
|
||||||
for(i = 20; i > 0; i--){
|
for(i = 20; i > 0; i--){
|
||||||
uchar usbLineStatus = USBIN & USBMASK;
|
uchar usbLineStatus = USBIN & USBMASK;
|
||||||
if(usbLineStatus != 0) /* SE0 has ended */
|
if(usbLineStatus != 0) /* SE0 has ended */
|
||||||
|
#ifdef USB_RESET_HOOK
|
||||||
goto isNotReset;
|
goto isNotReset;
|
||||||
|
#else
|
||||||
|
return;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
/* RESET condition, called multiple times during reset */
|
/* RESET condition, called multiple times during reset */
|
||||||
usbNewDeviceAddr = 0;
|
usbNewDeviceAddr = 0;
|
||||||
usbDeviceAddr = 0;
|
usbDeviceAddr = 0;
|
||||||
usbResetStall();
|
usbResetStall();
|
||||||
DBG1(0xff, 0, 0);
|
DBG1(0xff, 0, 0);
|
||||||
|
#ifdef USB_RESET_HOOK
|
||||||
isNotReset:
|
isNotReset:
|
||||||
usbHandleResetHook(i);
|
usbHandleResetHook(i);
|
||||||
}
|
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
|
||||||
|
|
||||||
USB_PUBLIC void usbInit(void)
|
|
||||||
{
|
|
||||||
#if USB_INTR_CFG_SET != 0
|
|
||||||
USB_INTR_CFG |= USB_INTR_CFG_SET;
|
|
||||||
#endif
|
|
||||||
#if USB_INTR_CFG_CLR != 0
|
|
||||||
USB_INTR_CFG &= ~(USB_INTR_CFG_CLR);
|
|
||||||
#endif
|
|
||||||
USB_INTR_ENABLE |= (1 << USB_INTR_ENABLE_BIT);
|
|
||||||
usbResetDataToggling();
|
|
||||||
#if USB_CFG_HAVE_INTRIN_ENDPOINT && !USB_CFG_SUPPRESS_INTR_CODE
|
|
||||||
usbTxLen1 = USBPID_NAK;
|
|
||||||
#if USB_CFG_HAVE_INTRIN_ENDPOINT3
|
|
||||||
usbTxLen3 = USBPID_NAK;
|
|
||||||
#endif
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
|
|
@ -165,12 +165,6 @@ USB messages, even if they address another (low-speed) device on the same bus.
|
||||||
|
|
||||||
struct usbRequest; /* forward declaration */
|
struct usbRequest; /* forward declaration */
|
||||||
|
|
||||||
USB_PUBLIC void usbInit(void);
|
|
||||||
/* This function must be called before interrupts are enabled and the main
|
|
||||||
* loop is entered. We exepct that the PORT and DDR bits for D+ and D- have
|
|
||||||
* not been changed from their default status (which is 0). If you have changed
|
|
||||||
* them, set both back to 0 (configure them as input with no internal pull-up).
|
|
||||||
*/
|
|
||||||
USB_PUBLIC void usbPoll(void);
|
USB_PUBLIC void usbPoll(void);
|
||||||
/* This function must be called at regular intervals from the main loop.
|
/* This function must be called at regular intervals from the main loop.
|
||||||
* Maximum delay between calls is somewhat less than 50ms (USB timeout for
|
* Maximum delay between calls is somewhat less than 50ms (USB timeout for
|
||||||
|
@ -732,4 +726,40 @@ typedef struct usbRequest{
|
||||||
|
|
||||||
/* ------------------------------------------------------------------------- */
|
/* ------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#ifndef __ASSEMBLER__
|
||||||
|
|
||||||
|
static inline void usbResetDataToggling(void)
|
||||||
|
{
|
||||||
|
#if USB_CFG_HAVE_INTRIN_ENDPOINT && !USB_CFG_SUPPRESS_INTR_CODE
|
||||||
|
USB_SET_DATATOKEN1(USB_INITIAL_DATATOKEN); /* reset data toggling for interrupt endpoint */
|
||||||
|
# if USB_CFG_HAVE_INTRIN_ENDPOINT3
|
||||||
|
USB_SET_DATATOKEN3(USB_INITIAL_DATATOKEN); /* reset data toggling for interrupt endpoint */
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void usbInit(void)
|
||||||
|
{
|
||||||
|
#if USB_INTR_CFG_SET != 0
|
||||||
|
USB_INTR_CFG |= USB_INTR_CFG_SET;
|
||||||
|
#endif
|
||||||
|
#if USB_INTR_CFG_CLR != 0
|
||||||
|
USB_INTR_CFG &= ~(USB_INTR_CFG_CLR);
|
||||||
|
#endif
|
||||||
|
USB_INTR_ENABLE |= (1 << USB_INTR_ENABLE_BIT);
|
||||||
|
usbResetDataToggling();
|
||||||
|
#if USB_CFG_HAVE_INTRIN_ENDPOINT && !USB_CFG_SUPPRESS_INTR_CODE
|
||||||
|
usbTxLen1 = USBPID_NAK;
|
||||||
|
#if USB_CFG_HAVE_INTRIN_ENDPOINT3
|
||||||
|
usbTxLen3 = USBPID_NAK;
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
/* This function must be called before interrupts are enabled and the main
|
||||||
|
* loop is entered. We exepct that the PORT and DDR bits for D+ and D- have
|
||||||
|
* not been changed from their default status (which is 0). If you have changed
|
||||||
|
* them, set both back to 0 (configure them as input with no internal pull-up).
|
||||||
|
*/
|
||||||
|
#endif /* __ASSEMBLER */
|
||||||
|
|
||||||
#endif /* __usbdrv_h_included__ */
|
#endif /* __usbdrv_h_included__ */
|
||||||
|
|
|
@ -368,6 +368,10 @@ usbMFTimeout:
|
||||||
# endif
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* place the interrupt routine in .vectors, after the jump to __init.
|
||||||
|
Warning: This depends on correct linking order. Link crt0 before usbdrasm! */
|
||||||
|
.section .vectors
|
||||||
|
|
||||||
#if USB_CFG_CHECK_CRC /* separate dispatcher for CRC type modules */
|
#if USB_CFG_CHECK_CRC /* separate dispatcher for CRC type modules */
|
||||||
# if USB_CFG_CLOCK_KHZ == 18000
|
# if USB_CFG_CLOCK_KHZ == 18000
|
||||||
# include "usbdrvasm18-crc.inc"
|
# include "usbdrvasm18-crc.inc"
|
||||||
|
|
Loading…
Reference in a new issue