159 lines
5.6 KiB
C
159 lines
5.6 KiB
C
/* Name: main.c
|
|
* Project: Testing driver features
|
|
* Author: Christian Starkjohann
|
|
* Creation Date: 2008-04-29
|
|
* Tabsize: 4
|
|
* Copyright: (c) 2008 by OBJECTIVE DEVELOPMENT Software GmbH
|
|
* License: GNU GPL v2 (see License.txt), GNU GPL v3 or proprietary (CommercialLicense.txt)
|
|
*/
|
|
|
|
/*
|
|
This module is a do-nothing test code linking against (or including) the USB
|
|
driver. It is used to determine the code size for various options and to
|
|
check whether the code compiles with all options.
|
|
*/
|
|
#include <avr/io.h>
|
|
#include <avr/interrupt.h> /* for sei() */
|
|
#include <avr/pgmspace.h> /* required by usbdrv.h */
|
|
#include <util/delay.h> /* for _delay_ms() */
|
|
#include "usbdrv.h"
|
|
#if USE_INCLUDE
|
|
#include "usbdrv.c"
|
|
#endif
|
|
|
|
/* ------------------------------------------------------------------------- */
|
|
/* ----------------------------- USB interface ----------------------------- */
|
|
/* ------------------------------------------------------------------------- */
|
|
|
|
#if USB_CFG_IMPLEMENT_FN_WRITE
|
|
uchar usbFunctionWrite(uchar *data, uchar len)
|
|
{
|
|
return 1;
|
|
}
|
|
#endif
|
|
|
|
#if USB_CFG_IMPLEMENT_FN_READ
|
|
uchar usbFunctionRead(uchar *data, uchar len)
|
|
{
|
|
return len;
|
|
}
|
|
#endif
|
|
|
|
#if USB_CFG_IMPLEMENT_FN_WRITEOUT
|
|
void usbFunctionWriteOut(uchar *data, uchar len)
|
|
{
|
|
}
|
|
#endif
|
|
|
|
#if USE_DYNAMIC_DESCRIPTOR
|
|
|
|
static PROGMEM const char myDescriptorDevice[] = { /* USB device descriptor */
|
|
18, /* sizeof(usbDescriptorDevice): length of descriptor in bytes */
|
|
USBDESCR_DEVICE, /* descriptor type */
|
|
0x10, 0x01, /* USB version supported */
|
|
USB_CFG_DEVICE_CLASS,
|
|
USB_CFG_DEVICE_SUBCLASS,
|
|
0, /* protocol */
|
|
8, /* max packet size */
|
|
/* the following two casts affect the first byte of the constant only, but
|
|
* that's sufficient to avoid a warning with the default values.
|
|
*/
|
|
(char)USB_CFG_VENDOR_ID,/* 2 bytes */
|
|
(char)USB_CFG_DEVICE_ID,/* 2 bytes */
|
|
USB_CFG_DEVICE_VERSION, /* 2 bytes */
|
|
USB_CFG_DESCR_PROPS_STRING_VENDOR != 0 ? 1 : 0, /* manufacturer string index */
|
|
USB_CFG_DESCR_PROPS_STRING_PRODUCT != 0 ? 2 : 0, /* product string index */
|
|
USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER != 0 ? 3 : 0, /* serial number string index */
|
|
1, /* number of configurations */
|
|
};
|
|
|
|
static PROGMEM const char myDescriptorConfiguration[] = { /* USB configuration descriptor */
|
|
9, /* sizeof(usbDescriptorConfiguration): length of descriptor in bytes */
|
|
USBDESCR_CONFIG, /* descriptor type */
|
|
18 + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT + (USB_CFG_DESCR_PROPS_HID & 0xff), 0,
|
|
/* total length of data returned (including inlined descriptors) */
|
|
1, /* number of interfaces in this configuration */
|
|
1, /* index of this configuration */
|
|
0, /* configuration name string index */
|
|
#if USB_CFG_IS_SELF_POWERED
|
|
USBATTR_SELFPOWER, /* attributes */
|
|
#else
|
|
0, /* attributes */
|
|
#endif
|
|
USB_CFG_MAX_BUS_POWER/2, /* max USB current in 2mA units */
|
|
/* interface descriptor follows inline: */
|
|
9, /* sizeof(usbDescrInterface): length of descriptor in bytes */
|
|
USBDESCR_INTERFACE, /* descriptor type */
|
|
0, /* index of this interface */
|
|
0, /* alternate setting for this interface */
|
|
USB_CFG_HAVE_INTRIN_ENDPOINT, /* endpoints excl 0: number of endpoint descriptors to follow */
|
|
USB_CFG_INTERFACE_CLASS,
|
|
USB_CFG_INTERFACE_SUBCLASS,
|
|
USB_CFG_INTERFACE_PROTOCOL,
|
|
0, /* string index for interface */
|
|
#if (USB_CFG_DESCR_PROPS_HID & 0xff) /* HID descriptor */
|
|
9, /* sizeof(usbDescrHID): length of descriptor in bytes */
|
|
USBDESCR_HID, /* descriptor type: HID */
|
|
0x01, 0x01, /* BCD representation of HID version */
|
|
0x00, /* target country code */
|
|
0x01, /* number of HID Report (or other HID class) Descriptor infos to follow */
|
|
0x22, /* descriptor type: report */
|
|
USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH, 0, /* total length of report descriptor */
|
|
#endif
|
|
#if USB_CFG_HAVE_INTRIN_ENDPOINT /* endpoint descriptor for endpoint 1 */
|
|
7, /* sizeof(usbDescrEndpoint) */
|
|
USBDESCR_ENDPOINT, /* descriptor type = endpoint */
|
|
(char)0x81, /* IN endpoint number 1 */
|
|
0x03, /* attrib: Interrupt endpoint */
|
|
8, 0, /* maximum packet size */
|
|
USB_CFG_INTR_POLL_INTERVAL, /* in ms */
|
|
#endif
|
|
};
|
|
|
|
USB_PUBLIC usbMsgLen_t usbFunctionDescriptor(usbRequest_t *rq)
|
|
{
|
|
uchar *p = 0, len = 0;
|
|
|
|
if(rq->wValue.bytes[1] == USBDESCR_DEVICE){
|
|
p = (uchar *)myDescriptorDevice;
|
|
len = sizeof(myDescriptorDevice);
|
|
}else{ /* must be configuration descriptor */
|
|
p = (uchar *)(myDescriptorConfiguration);
|
|
len = sizeof(myDescriptorConfiguration);
|
|
}
|
|
usbMsgPtr = (usbMsgPtr_t)p;
|
|
return len;
|
|
}
|
|
#endif
|
|
|
|
USB_PUBLIC usbMsgLen_t usbFunctionSetup(uchar data[8])
|
|
{
|
|
usbRequest_t *rq = (void *)data;
|
|
|
|
if(rq->bRequest == 0) /* request using usbFunctionRead()/usbFunctionWrite() */
|
|
return 0xff;
|
|
return 0; /* default for not implemented requests: return no data back to host */
|
|
}
|
|
|
|
/* ------------------------------------------------------------------------- */
|
|
|
|
int main(void)
|
|
{
|
|
uchar i;
|
|
|
|
usbInit();
|
|
usbDeviceDisconnect(); /* enforce re-enumeration, do this while interrupts are disabled! */
|
|
i = 0;
|
|
while(--i){ /* fake USB disconnect for > 250 ms */
|
|
_delay_ms(1);
|
|
}
|
|
usbDeviceConnect();
|
|
sei();
|
|
for(;;){ /* main event loop */
|
|
usbPoll();
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
/* ------------------------------------------------------------------------- */
|