/* 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 #include /* for sei() */ #include /* required by usbdrv.h */ #include /* 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; } /* ------------------------------------------------------------------------- */