1
0
mirror of https://github.com/raphnet/4nes4snes synced 2024-12-21 22:48:51 -05:00

auto detect live

This commit is contained in:
Raphaël Assénat 2009-05-02 13:55:11 +00:00
parent 958c62b658
commit 9bcdbb7121
6 changed files with 336 additions and 108 deletions

View File

@ -5,10 +5,10 @@
# Tabsize: 4 # Tabsize: 4
# Copyright: (c) 2006 by OBJECTIVE DEVELOPMENT Software GmbH # Copyright: (c) 2006 by OBJECTIVE DEVELOPMENT Software GmbH
# License: Proprietary, free under certain conditions. See Documentation. # License: Proprietary, free under certain conditions. See Documentation.
# This Revision: $Id: Makefile,v 1.3 2009-05-02 12:07:45 cvs Exp $ # This Revision: $Id: Makefile,v 1.4 2009-05-02 13:55:11 cvs Exp $
UISP = uisp -dprog=stk500 -dpart=atmega8 -dserial=/dev/avr UISP = uisp -dprog=stk500 -dpart=atmega8 -dserial=/dev/avr
COMPILE = avr-gcc -Wall -Os -Iusbdrv -I. -mmcu=atmega8 #-DDEBUG_LEVEL=1 COMPILE = avr-gcc -Wall -Os -Iusbdrv -I. -mmcu=atmega8 -DF_CPU=12000000L #-DDEBUG_LEVEL=1
COMMON_OBJS = usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o COMMON_OBJS = usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o
OBJECTS = usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o snes.o devdesc.o OBJECTS = usbdrv/usbdrv.o usbdrv/usbdrvasm.o usbdrv/oddebug.o main.o snes.o devdesc.o

View File

@ -19,16 +19,9 @@ const char usbDescrDevice[] PROGMEM = { /* USB device descriptor */
#else #else
0, /* manufacturer string index */ 0, /* manufacturer string index */
#endif #endif
#if USB_CFG_DEVICE_NAME_LEN
2, /* product string index */ 2, /* product string index */
#else
0, /* product string index */
#endif
#if USB_CFG_SERIAL_NUMBER_LENGTH
3, /* serial number string index */ 3, /* serial number string index */
#else
0, /* serial number string index */
#endif
1, /* number of configurations */ 1, /* number of configurations */
}; };

100
main.c
View File

@ -1,14 +1,11 @@
/* Name: main.c /* Name: main.c
* Project: Multiple NES/SNES to USB converter * Project: Multiple NES/SNES to USB converter
* Author: Raphael Assenat <raph@raphnet.net> * Author: Raphael Assenat <raph@raphnet.net>
* Copyright: (C) 2007 Raphael Assenat <raph@raphnet.net> * Copyright: (C) 2007-2009 Raphael Assenat <raph@raphnet.net>
* License: Proprietary, free under certain conditions. See Documentation. * License: GPLv2
* Tabsize: 4 * Tabsize: 4
* Comments: Based on HID-Test by Christian Starkjohann * Comments: Based on HID-Test by Christian Starkjohann
*/ */
#define F_CPU 12000000L
#include <avr/io.h> #include <avr/io.h>
#include <avr/interrupt.h> #include <avr/interrupt.h>
#include <avr/pgmspace.h> #include <avr/pgmspace.h>
@ -25,13 +22,69 @@
#include "leds.h" #include "leds.h"
#include "devdesc.h" #include "devdesc.h"
static uchar *rt_usbHidReportDescriptor=NULL;
static uchar rt_usbHidReportDescriptorSize=0;
static uchar *rt_usbDeviceDescriptor=NULL;
static uchar rt_usbDeviceDescriptorSize=0;
/* The maximum number of independent reports that are supported. */ /* The maximum number of independent reports that are supported. */
#define MAX_REPORTS 8 #define MAX_REPORTS 8
int usbCfgSerialNumberStringDescriptor[] PROGMEM = { PROGMEM int usbDescriptorStringSerialNumber[] = {
USB_STRING_DESCRIPTOR_HEADER(USB_CFG_SERIAL_NUMBER_LENGTH), USB_STRING_DESCRIPTOR_HEADER(4),
'1', '0', '0', '0' '1','0','0','0'
}; };
int usbDescriptorStringDevice[] = {
USB_STRING_DESCRIPTOR_HEADER(DEVICE_STRING_LENGTH),
DEFAULT_PROD_STRING
};
char usbDescriptorConfiguration[] = { 0 }; // dummy
uchar my_usbDescriptorConfiguration[] = { /* USB configuration descriptor */
9, /* sizeof(usbDescriptorConfiguration): length of descriptor in bytes */
USBDESCR_CONFIG, /* descriptor type */
18 + 7 * USB_CFG_HAVE_INTRIN_ENDPOINT + 9, 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
USBATTR_BUSPOWER, /* 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 */
0x81, /* IN endpoint number 1 */
0x03, /* attrib: Interrupt endpoint */
8, 0, /* maximum packet size */
USB_CFG_INTR_POLL_INTERVAL, /* in ms */
#endif
};
static Gamepad *curGamepad; static Gamepad *curGamepad;
@ -83,6 +136,32 @@ static uchar reportBuffer[12]; /* buffer for HID reports */
static uchar idleRates[MAX_REPORTS]; /* in 4 ms units */ static uchar idleRates[MAX_REPORTS]; /* in 4 ms units */
uchar usbFunctionDescriptor(struct usbRequest *rq)
{
if ((rq->bmRequestType & USBRQ_TYPE_MASK) != USBRQ_TYPE_STANDARD)
return 0;
if (rq->bRequest == USBRQ_GET_DESCRIPTOR)
{
// USB spec 9.4.3, high byte is descriptor type
switch (rq->wValue.bytes[1])
{
case USBDESCR_DEVICE:
usbMsgPtr = rt_usbDeviceDescriptor;
return rt_usbDeviceDescriptorSize;
case USBDESCR_HID_REPORT:
usbMsgPtr = rt_usbHidReportDescriptor;
return rt_usbHidReportDescriptorSize;
case USBDESCR_CONFIG:
usbMsgPtr = my_usbDescriptorConfiguration;
return sizeof(my_usbDescriptorConfiguration);
}
}
return 0;
}
static uchar reportPos=0; static uchar reportPos=0;
uchar usbFunctionSetup(uchar data[8]) uchar usbFunctionSetup(uchar data[8])
@ -156,6 +235,9 @@ int main(void)
rt_usbDeviceDescriptorSize = getUsbDescrDevice_size(); rt_usbDeviceDescriptorSize = getUsbDescrDevice_size();
} }
// patch the config descriptor with the HID report descriptor size
my_usbDescriptorConfiguration[25] = rt_usbHidReportDescriptorSize;
//wdt_enable(WDTO_2S); //wdt_enable(WDTO_2S);
hardwareInit(); hardwareInit();
curGamepad->init(); curGamepad->init();

79
snes.c
View File

@ -1,8 +1,8 @@
/* Name: snes.c /* Name: snes.c
* Project: Multiple NES/SNES to USB converter * Project: Multiple NES/SNES to USB converter
* Author: Raphael Assenat <raph@raphnet.net> * Author: Raphael Assenat <raph@raphnet.net>
* Copyright: (C) 2007 Raphael Assenat <raph@raphnet.net> * Copyright: (C) 2007-2009 Raphael Assenat <raph@raphnet.net>
* License: Proprietary, free under certain conditions. See Documentation. * License: GPLv2
* Tabsize: 4 * Tabsize: 4
*/ */
#define F_CPU 12000000L #define F_CPU 12000000L
@ -62,6 +62,12 @@ static unsigned char last_reported_controller_bytes[GAMEPAD_BYTES];
// indicates if a controller is in NES mode // indicates if a controller is in NES mode
static unsigned char nesMode=0; /* Bit0: controller 1, Bit1: controller 2...*/ static unsigned char nesMode=0; /* Bit0: controller 1, Bit1: controller 2...*/
static unsigned char fourscore_mode = 0; static unsigned char fourscore_mode = 0;
static unsigned char live_autodetect = 1;
void disableLiveAutodetect(void)
{
live_autodetect = 0;
}
static void autoDetectFourScore(void) static void autoDetectFourScore(void)
{ {
@ -126,30 +132,32 @@ static void snesInit(void)
nesMode = 0; nesMode = 0;
snesUpdate(); snesUpdate();
/* Snes controller buttons are sent in this order: if (!live_autodetect) {
* 1st byte: B Y SEL START UP DOWN LEFT RIGHT /* Snes controller buttons are sent in this order:
* 2nd byte: A X L R 1 1 1 1 * 1st byte: B Y SEL START UP DOWN LEFT RIGHT
* * 2nd byte: A X L R 1 1 1 1
* Nes controller buttons are sent in this order: *
* One byte: A B SEL START UP DOWN LEFT RIGHT * Nes controller buttons are sent in this order:
* * One byte: A B SEL START UP DOWN LEFT RIGHT
* When an additional byte is read from a NES controller, *
* all bits are 0. Because the data signal is active low, * When an additional byte is read from a NES controller,
* this corresponds to pressed buttons. When we read * all bits are 0. Because the data signal is active low,
* from the controller for the first time, detect NES * this corresponds to pressed buttons. When we read
* controllers by checking those 4 bits. * from the controller for the first time, detect NES
**/ * controllers by checking those 4 bits.
if (last_read_controller_bytes[1]==0xFF) **/
nesMode |= 1; if (last_read_controller_bytes[1]==0xFF)
nesMode |= 1;
if (last_read_controller_bytes[3]==0xFF) if (last_read_controller_bytes[3]==0xFF)
nesMode |= 2; nesMode |= 2;
if (last_read_controller_bytes[5]==0xFF) if (last_read_controller_bytes[5]==0xFF)
nesMode |= 4; nesMode |= 4;
if (last_read_controller_bytes[7]==0xFF) if (last_read_controller_bytes[7]==0xFF)
nesMode |= 8; nesMode |= 8;
}
autoDetectFourScore(); autoDetectFourScore();
@ -286,6 +294,31 @@ static void snesUpdate(void)
_delay_us(6); _delay_us(6);
SNES_CLOCK_HIGH(); SNES_CLOCK_HIGH();
} }
if (live_autodetect) {
if (tmp1==0xFF)
nesMode |= 1;
else
nesMode &= ~1;
if (tmp2==0xFF)
nesMode |= 2;
else
nesMode &= ~2;
if (tmp3==0xFF)
nesMode |= 4;
else
nesMode &= ~4;
if (tmp4==0xFF)
nesMode |= 8;
else
nesMode &= ~8;
}
/* Force extra bits to 0 when in NES mode. Otherwise, if /* Force extra bits to 0 when in NES mode. Otherwise, if
* we read zeros on the wire, we will have permanantly * we read zeros on the wire, we will have permanantly
* pressed buttons */ * pressed buttons */

1
snes.h
View File

@ -1,4 +1,5 @@
#include "gamepad.h" #include "gamepad.h"
void disableLiveAutodetect(void);
Gamepad *snesGetGamepad(void); Gamepad *snesGetGamepad(void);

View File

@ -1,11 +1,11 @@
/* Name: usbconfig.h /* Name: usbconfig.h
* Project: AVR USB driver * Project: AVR USB driver
* Author: Christian Starkjohann, Modified by Raphael Assenat <raph@raphnet.net> * Author: Christian Starkjohann
* Creation Date: 2005-04-01 * Creation Date: 2005-04-01
* Tabsize: 4 * Tabsize: 4
* Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH * Copyright: (c) 2005 by OBJECTIVE DEVELOPMENT Software GmbH
* License: Proprietary, free under certain conditions. See Documentation. * License: GNU GPL v2 (see License.txt) or proprietary (CommercialLicense.txt)
* This Revision: $Id: usbconfig.h,v 1.6 2009-05-02 12:07:46 cvs Exp $ * This Revision: $Id: usbconfig.h,v 1.7 2009-05-02 13:55:11 cvs Exp $
*/ */
#ifndef __usbconfig_h_included__ #ifndef __usbconfig_h_included__
@ -13,26 +13,51 @@
/* /*
General Description: General Description:
This file contains parts of the USB driver which can be configured and can or This file is an example configuration (with inline documentation) for the USB
must be adapted to your hardware. driver. It configures AVR-USB for an ATMega8 with USB D+ connected to Port D
bit 2 (which is also hardware interrupt 0) and USB D- to Port D bit 0. You may
wire the lines to any other port, as long as D+ is also wired to INT0.
To create your own usbconfig.h file, copy this file to the directory
containing "usbdrv" (that is your project firmware source directory) and
rename it to "usbconfig.h". Then edit it accordingly.
*/ */
/* ---------------------------- Hardware Config ---------------------------- */ /* ---------------------------- Hardware Config ---------------------------- */
#define USB_CFG_IOPORT PORTD #define USB_CFG_IOPORTNAME D
/* This is the port where the USB bus is connected. When you configure it to /* This is the port where the USB bus is connected. When you configure it to
* "PORTB", the registers PORTB, PINB (=PORTB+2) and DDRB (=PORTB+1) will be * "B", the registers PORTB, PINB and DDRB will be used.
* used.
*/ */
#define USB_CFG_DMINUS_BIT 0 #define USB_CFG_DMINUS_BIT 0
/* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected. /* This is the bit number in USB_CFG_IOPORT where the USB D- line is connected.
* This MUST be bit 0. All other values will result in a compile error! * This may be any bit in the port.
*/ */
#define USB_CFG_DPLUS_BIT 2 #define USB_CFG_DPLUS_BIT 2
/* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected. /* This is the bit number in USB_CFG_IOPORT where the USB D+ line is connected.
* This may be any bit in the port. Please note that D+ must also be connected * This may be any bit in the port. Please note that D+ must also be connected
* to interrupt pin INT0! * to interrupt pin INT0!
*/ */
#define USB_CFG_CLOCK_KHZ (F_CPU/1000)
/* Clock rate of the AVR in MHz. Legal values are 12000, 15000, 16000 or 16500.
* The 16.5 MHz version of the code requires no crystal, it tolerates +/- 1%
* deviation from the nominal frequency. All other rates require a precision
* of 2000 ppm and thus a crystal!
* Default if not specified: 12 MHz
*/
/* ----------------------- Optional Hardware Config ------------------------ */
/* #define USB_CFG_PULLUP_IOPORTNAME D */
/* If you connect the 1.5k pullup resistor from D- to a port pin instead of
* V+, you can connect and disconnect the device from firmware by calling
* the macros usbDeviceConnect() and usbDeviceDisconnect() (see usbdrv.h).
* This constant defines the port on which the pullup resistor is connected.
*/
/* #define USB_CFG_PULLUP_BIT 4 */
/* This constant defines the bit number in USB_CFG_PULLUP_IOPORT (defined
* above) where the 1.5k pullup resistor is connected. See description
* above for details.
*/
/* --------------------------- Functional Range ---------------------------- */ /* --------------------------- Functional Range ---------------------------- */
@ -40,6 +65,15 @@ must be adapted to your hardware.
/* Define this to 1 if you want to compile a version with two endpoints: The /* Define this to 1 if you want to compile a version with two endpoints: The
* default control endpoint 0 and an interrupt-in endpoint 1. * default control endpoint 0 and an interrupt-in endpoint 1.
*/ */
#define USB_CFG_HAVE_INTRIN_ENDPOINT3 0
/* Define this to 1 if you want to compile a version with three endpoints: The
* default control endpoint 0, an interrupt-in endpoint 1 and an interrupt-in
* endpoint 3. You must also enable endpoint 1 above.
*/
/* #define USB_INITIAL_DATATOKEN USBPID_DATA0 */
/* The above macro defines the startup condition for data toggling on the
* interrupt/bulk endpoints 1 and 3. Defaults to USBPID_DATA0.
*/
#define USB_CFG_IMPLEMENT_HALT 0 #define USB_CFG_IMPLEMENT_HALT 0
/* Define this to 1 if you also want to implement the ENDPOINT_HALT feature /* Define this to 1 if you also want to implement the ENDPOINT_HALT feature
* for endpoint 1 (interrupt endpoint). Although you may not need this feature, * for endpoint 1 (interrupt endpoint). Although you may not need this feature,
@ -60,15 +94,6 @@ must be adapted to your hardware.
* The value is in milliamperes. [It will be divided by two since USB * The value is in milliamperes. [It will be divided by two since USB
* communicates power requirements in units of 2 mA.] * communicates power requirements in units of 2 mA.]
*/ */
#define USB_CFG_SAMPLE_EXACT 1
/* This variable affects Sampling Jitter for USB receiving. When it is 0, the
* driver guarantees a sampling window of 1/2 bit. The USB spec requires
* that the receiver has at most 1/4 bit sampling window. The 1/2 bit window
* should still work reliably enough because we work at low speed. If you want
* to meet the spec, set this value to 1. This will unroll a loop which
* results in bigger code size.
* If you have problems with long cables, try setting this value to 1.
*/
#define USB_CFG_IMPLEMENT_FN_WRITE 0 #define USB_CFG_IMPLEMENT_FN_WRITE 0
/* Set this to 1 if you want usbFunctionWrite() to be called for control-out /* Set this to 1 if you want usbFunctionWrite() to be called for control-out
* transfers. Set it to 0 if you don't need it and want to save a couple of * transfers. Set it to 0 if you don't need it and want to save a couple of
@ -80,28 +105,44 @@ must be adapted to your hardware.
* data from a static buffer, set it to 0 and return the data from * data from a static buffer, set it to 0 and return the data from
* usbFunctionSetup(). This saves a couple of bytes. * usbFunctionSetup(). This saves a couple of bytes.
*/ */
#define USB_CFG_IMPLEMENT_FN_WRITEOUT 0
/* Define this to 1 if you want to use interrupt-out (or bulk out) endpoint 1.
* You must implement the function usbFunctionWriteOut() which receives all
* interrupt/bulk data sent to endpoint 1.
*/
#define USB_CFG_HAVE_FLOWCONTROL 0
/* Define this to 1 if you want flowcontrol over USB data. See the definition
* of the macros usbDisableAllRequests() and usbEnableAllRequests() in
* usbdrv.h.
*/
/* #define USB_RX_USER_HOOK(data, len) if(usbRxToken == (uchar)USBPID_SETUP) blinkLED(); */
/* This macro is a hook if you want to do unconventional things. If it is
* defined, it's inserted at the beginning of received message processing.
* If you eat the received message and don't want default processing to
* proceed, do a return after doing your things. One possible application
* (besides debugging) is to flash a status LED on each packet.
*/
#define USB_COUNT_SOF 0
/* define this macro to 1 if you need the global variable "usbSofCount" which
* counts SOF packets.
*/
/* -------------------------- Device Description --------------------------- */ /* -------------------------- Device Description --------------------------- */
/* We cannot use Obdev's free shared VID/PID pair because this is a HID. /* This vendor ID comes from "Mecanique" which used to sale
* We use John Hyde's VID (author of the book "USB Design By Example") for * ranges of product IDs. */
* this example instead. John has offered this VID for use by students for
* non-commercial devices. Well... This example is for demonstration and
* education only... DO NOT LET DEVICES WITH THIS VID ESCAPE YOUR LAB!
* The Product-ID is a random number.
*/
#define USB_CFG_VENDOR_ID 0x81, 0x17 #define USB_CFG_VENDOR_ID 0x81, 0x17
/* USB vendor ID for the device, low byte first. If you have registered your
* own Vendor ID, define it here. Otherwise you use obdev's free shared /* This product ID is registered to the author. If you change the code
* VID/PID pair. Be sure to read USBID-License.txt for rules! * and wish to distribute it, please obtain and use your own VID/PID. Otherwise,
* there are serious compatibility and conflict risks, under Windows
* in particular.
*
* See the technical notes in usbdrv/USBID-License.txt for more details.
*/ */
#define USB_CFG_DEVICE_ID 0x9d, 0x0a #define USB_CFG_DEVICE_ID 0x9d, 0x0a
/* This is the ID of the product, low byte first. It is interpreted in the
* scope of the vendor ID. If you have registered your own VID with usb.org
* or if you have licensed a PID from somebody else, define it here. Otherwise
* you use obdev's free shared VID/PID pair. Be sure to read the rules in
* USBID-License.txt!
*/
#define USB_CFG_DEVICE_VERSION 0x02, 0x01 #define USB_CFG_DEVICE_VERSION 0x02, 0x01
/* Version number of the device: Minor number first, then major number. /* Version number of the device: Minor number first, then major number.
*/ */
@ -115,51 +156,129 @@ must be adapted to your hardware.
* obdev's free shared VID/PID pair. See the file USBID-License.txt for * obdev's free shared VID/PID pair. See the file USBID-License.txt for
* details. * details.
*/ */
#define USB_CFG_DEVICE_NAME '4','n','e','s','4','s','n','e','s' /*
#define USB_CFG_DEVICE_NAME_LEN 9 #define USB_CFG_DEVICE_NAME '(', 'S', ')', 'N', 'E', 'S', '/', \
'A', 't', 'a', 'r', 'i', '_', 'U', 'S', 'B'
#define USB_CFG_DEVICE_NAME_LEN 16*/
/* 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 USBID-License.txt before you assign a name. * the macros. See the file USBID-License.txt before you assign a name if you
* use a shared VID/PID.
*/ */
#define USB_CFG_SERIAL_NUMBER_LENGTH 4 //#define USB_CFG_SERIAL_NUMBER 'N', 'o', 'n', 'e'
/* Set this define to the number of charcters in the serial number if your #define USB_CFG_SERIAL_NUMBER_LEN 4
* device should have a serial number to uniquely identify each hardware /* Same as above for the serial number. If you don't want a serial number,
* instance. You must supply the serial number in a string descriptor with the * undefine the macros.
* name "usbCfgSerialNumberStringDescriptor", e.g.: * It may be useful to provide the serial number through other means than at
* #define USB_CFG_SERIAL_NUMBER_LENGTH 5 * compile time. See the section about descriptor properties below for how
* int usbCfgSerialNumberStringDescriptor[] PROGMEM = { * to fine tune control over USB descriptors such as the string descriptor
* USB_STRING_DESCRIPTOR_HEADER(USB_CFG_SERIAL_NUMBER_LENGTH), * for the serial number.
* '1', '2', '3', '4', '5'
* };
* See usbdrv.h for more information about the USB_STRING_DESCRIPTOR_HEADER()
* macro or usbdrv.c for example string descriptors.
* You may want to put "usbCfgSerialNumberStringDescriptor" at a constant
* flash memory address (with magic linker commands) so that you don't need
* to recompile if you change it.
*/ */
#define USB_CFG_DEVICE_CLASS 0 /* specify the class at the interface level */ #define USB_CFG_DEVICE_CLASS 0
#define USB_CFG_DEVICE_SUBCLASS 0 #define USB_CFG_DEVICE_SUBCLASS 0
/* See USB specification if you want to conform to an existing device class. /* See USB specification if you want to conform to an existing device class.
*/ */
#define USB_CFG_INTERFACE_CLASS 0x03 /* HID class */ #define USB_CFG_INTERFACE_CLASS 3 /* HID */
#define USB_CFG_INTERFACE_SUBCLASS 0 /* no boot interface */ #define USB_CFG_INTERFACE_SUBCLASS 0
#define USB_CFG_INTERFACE_PROTOCOL 0 /* no protocol */ #define USB_CFG_INTERFACE_PROTOCOL 0
/* See USB specification if you want to conform to an existing device class or /* See USB specification if you want to conform to an existing device class or
* protocol. * protocol.
* This template defines a HID class device. If you implement a vendor class
* device, set USB_CFG_INTERFACE_CLASS to 0 and USB_CFG_DEVICE_CLASS to 0xff.
*/ */
//#define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 42 #define USB_CFG_HID_REPORT_DESCRIPTOR_LENGTH 0 /* total length of report descriptor */
/* Define this to the length of the HID report descriptor, if you implement /* Define this to the length of the HID report descriptor, if you implement
* an HID device. Otherwise don't define it or define it to 0. * an HID device. Otherwise don't define it or define it to 0.
* Since this template defines a HID device, it must also specify a HID
* report descriptor length. You must add a PROGMEM character array named
* "usbHidReportDescriptor" to your code which contains the report descriptor.
* Don't forget to keep the array and this define in sync!
*/ */
/* Define this if you want to be able to set the report descriptor /* #define USB_PUBLIC static */
* dynamically at runtime. /* Use the define above if you #include usbdrv.c instead of linking against it.
* */ * This technique saves a couple of bytes in flash memory.
#define USB_CFG_HID_REPORT_DESCRIPTOR_RUNTIME
/* Define this if you want to be able to set the device descriptor
* dynamically at runtime.
*/ */
#define USB_CFG_DEVICE_DESCRIPTOR_RUNTIME
/* ------------------- Fine Control over USB Descriptors ------------------- */
/* If you don't want to use the driver's default USB descriptors, you can
* provide our own. These can be provided as (1) fixed length static data in
* flash memory, (2) fixed length static data in RAM or (3) dynamically at
* runtime in the function usbFunctionDescriptor(). See usbdrv.h for more
* information about this function.
* Descriptor handling is configured through the descriptor's properties. If
* no properties are defined or if they are 0, the default descriptor is used.
* Possible properties are:
* + USB_PROP_IS_DYNAMIC: The data for the descriptor should be fetched
* at runtime via usbFunctionDescriptor().
* + USB_PROP_IS_RAM: The data returned by usbFunctionDescriptor() or found
* in static memory is in RAM, not in flash memory.
* + USB_PROP_LENGTH(len): If the data is in static memory (RAM or flash),
* the driver must know the descriptor's length. The descriptor itself is
* found at the address of a well known identifier (see below).
* List of static descriptor names (must be declared PROGMEM if in flash):
* char usbDescriptorDevice[];
* char usbDescriptorConfiguration[];
* char usbDescriptorHidReport[];
* char usbDescriptorString0[];
* int usbDescriptorStringVendor[];
* int usbDescriptorStringDevice[];
* int usbDescriptorStringSerialNumber[];
* Other descriptors can't be provided statically, they must be provided
* dynamically at runtime.
*
* Descriptor properties are or-ed or added together, e.g.:
* #define USB_CFG_DESCR_PROPS_DEVICE (USB_PROP_IS_RAM | USB_PROP_LENGTH(18))
*
* The following descriptors are defined:
* USB_CFG_DESCR_PROPS_DEVICE
* USB_CFG_DESCR_PROPS_CONFIGURATION
* USB_CFG_DESCR_PROPS_STRINGS
* USB_CFG_DESCR_PROPS_STRING_0
* USB_CFG_DESCR_PROPS_STRING_VENDOR
* USB_CFG_DESCR_PROPS_STRING_PRODUCT
* USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER
* USB_CFG_DESCR_PROPS_HID
* USB_CFG_DESCR_PROPS_HID_REPORT
* USB_CFG_DESCR_PROPS_UNKNOWN (for all descriptors not handled by the driver)
*
*/
#define USB_CFG_DESCR_PROPS_DEVICE USB_PROP_IS_DYNAMIC
#define USB_CFG_DESCR_PROPS_CONFIGURATION (USB_PROP_IS_DYNAMIC | USB_PROP_IS_RAM)
#define USB_CFG_DESCR_PROPS_STRINGS 0
#define USB_CFG_DESCR_PROPS_STRING_0 0
#define USB_CFG_DESCR_PROPS_STRING_VENDOR 0
/*
* Conveniently all 16 characters long so we can use fixed length.
* USB strings use two bytes per character.
*/
#define DEVICE_STRING_LENGTH 9 /* 16 characters */
#define DEFAULT_PROD_STRING '4','n','e','s','4','s','n','e','s'
#define USB_CFG_DESCR_PROPS_STRING_PRODUCT (USB_PROP_LENGTH(((DEVICE_STRING_LENGTH+2)*2)) | USB_PROP_IS_RAM)
#define USB_CFG_DESCR_PROPS_STRING_SERIAL_NUMBER USB_PROP_LENGTH((6*2))
#define USB_CFG_DESCR_PROPS_HID 0
#define USB_CFG_DESCR_PROPS_HID_REPORT USB_PROP_IS_DYNAMIC
#define USB_CFG_DESCR_PROPS_UNKNOWN 0
/* ----------------------- Optional MCU Description ------------------------ */
/* The following configurations have working defaults in usbdrv.h. You
* usually don't need to set them explicitly. Only if you want to run
* the driver on a device which is not yet supported or with a compiler
* which is not fully supported (such as IAR C) or if you use a differnt
* interrupt than INT0, you may have to define some of these.
*/
/* #define USB_INTR_CFG MCUCR */
/* #define USB_INTR_CFG_SET ((1 << ISC00) | (1 << ISC01)) */
/* #define USB_INTR_CFG_CLR 0 */
/* #define USB_INTR_ENABLE GIMSK */
/* #define USB_INTR_ENABLE_BIT INT0 */
/* #define USB_INTR_PENDING GIFR */
/* #define USB_INTR_PENDING_BIT INTF0 */
/* #define USB_INTR_VECTOR SIG_INTERRUPT0 */
#endif /* __usbconfig_h_included__ */ #endif /* __usbconfig_h_included__ */