- to make descriptor get VID/PID/Version from config.h.
- remove keyboard out endpoint. Instead host can use control request.
-# Hey Emacs, this is a -*- makefile -*-\r
-#----------------------------------------------------------------------------\r
-# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.\r
-# >> Modified for use with the LUFA project. <<\r
-#\r
-# Released to the Public Domain\r
-#\r
-# Additional material for this makefile was written by:\r
-# Peter Fleury\r
-# Tim Henigan\r
-# Colin O'Flynn\r
-# Reiner Patommel\r
-# Markus Pfaff\r
-# Sander Pool\r
-# Frederik Rouleau\r
-# Carlos Lamas\r
-# Dean Camera\r
-# Opendous Inc.\r
-# Denver Gingerich\r
-#\r
-#----------------------------------------------------------------------------\r
-# On command line:\r
-#\r
-# make all = Make software.\r
-#\r
-# make clean = Clean out built project files.\r
-#\r
-# make coff = Convert ELF to AVR COFF.\r
-#\r
-# make extcoff = Convert ELF to AVR Extended COFF.\r
-#\r
-# make program = Download the hex file to the device, using avrdude.\r
-# Please customize the avrdude settings below first!\r
-#\r
-# make dfu = Download the hex file to the device, using dfu-programmer (must\r
-# have dfu-programmer installed).\r
-#\r
-# make flip = Download the hex file to the device, using Atmel FLIP (must\r
-# have Atmel FLIP installed).\r
-#\r
-# make dfu-ee = Download the eeprom file to the device, using dfu-programmer\r
-# (must have dfu-programmer installed).\r
-#\r
-# make flip-ee = Download the eeprom file to the device, using Atmel FLIP\r
-# (must have Atmel FLIP installed).\r
-#\r
-# make doxygen = Generate DoxyGen documentation for the project (must have\r
-# DoxyGen installed)\r
-#\r
-# make debug = Start either simulavr or avarice as specified for debugging,\r
-# with avr-gdb or avr-insight as the front end for debugging.\r
-#\r
-# make filename.s = Just compile filename.c into the assembler code only.\r
-#\r
-# make filename.i = Create a preprocessed source file for use in submitting\r
-# bug reports to the GCC project.\r
-#\r
-# To rebuild project do "make clean" then "make all".\r
-#----------------------------------------------------------------------------\r
-\r
-# Directory common source filess exist\r
-TOP_DIR = ../..\r
-\r
-# Directory keyboard dependent files exist\r
-TARGET_DIR = .\r
-\r
-# MCU name\r
-#MCU = at90usb1287\r
-MCU = atmega32u4\r
-\r
-\r
-# Target architecture (see library "Board Types" documentation).\r
-ARCH = AVR8\r
-\r
-\r
-# Target board (see library "Board Types" documentation, NONE for projects not requiring\r
-# LUFA board drivers). If USER is selected, put custom board drivers in a directory called\r
-# "Board" inside the application directory.\r
-BOARD = USBKEY\r
-\r
-\r
-# Processor frequency.\r
-# This will define a symbol, F_CPU, in all source code files equal to the\r
-# processor frequency in Hz. You can then use this symbol in your source code to\r
-# calculate timings. Do NOT tack on a 'UL' at the end, this will be done\r
-# automatically to create a 32-bit value in your source code.\r
-#\r
-# This will be an integer division of F_USB below, as it is sourced by\r
-# F_USB after it has run through any CPU prescalers. Note that this value\r
-# does not *change* the processor frequency - it should merely be updated to\r
-# reflect the processor speed set externally so that the code can use accurate\r
-# software delays.\r
-F_CPU = 16000000\r
-\r
-\r
-# Input clock frequency.\r
-# This will define a symbol, F_USB, in all source code files equal to the\r
-# input clock frequency (before any prescaling is performed) in Hz. This value may\r
-# differ from F_CPU if prescaling is used on the latter, and is required as the\r
-# raw input clock is fed directly to the PLL sections of the AVR for high speed\r
-# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'\r
-# at the end, this will be done automatically to create a 32-bit value in your\r
-# source code.\r
-#\r
-# If no clock division is performed on the input clock inside the AVR (via the\r
-# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.\r
-F_USB = $(F_CPU)\r
-\r
-\r
-# Target file name (without extension).\r
-TARGET = lufa\r
-\r
-\r
-# Path to the LUFA library\r
-LUFA_PATH = ../../protocol\r
-\r
-# Create the LUFA source path variables by including the LUFA root makefile\r
-include $(LUFA_PATH)/LUFA/makefile\r
-\r
-\r
-\r
-# List C source files here. (C dependencies are automatically generated.)\r
-LSRC = $(TARGET).c \\r
- Descriptors.c \\r
- $(LUFA_SRC_USB) \\r
- $(LUFA_SRC_USBCLASS)\r
-\r
-SRC = $(subst $(LUFA_PATH)/LUFA/,,$(LSRC))\r
-SRC += keymap.c \\r
- matrix.c \\r
- led.c\r
-CONFIG_H = config.h\r
-\r
-\r
-\r
-# LUFA library compile-time options and predefined tokens\r
-LUFA_OPTS = -D USB_DEVICE_ONLY\r
-LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8\r
-LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1\r
-LUFA_OPTS += -D USE_FLASH_DESCRIPTORS\r
-LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"\r
-\r
-OPT_DEFS = -DF_CPU=$(F_CPU)UL\r
-OPT_DEFS += -DF_USB=$(F_USB)UL\r
-OPT_DEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)\r
-OPT_DEFS += $(LUFA_OPTS)\r
-\r
-\r
-\r
-# Search Path\r
-VPATH += $(TARGET_DIR)\r
-VPATH += $(LUFA_PATH)/LUFA\r
-\r
-\r
-include $(TOP_DIR)/protocol.mk\r
-include $(TOP_DIR)/common.mk\r
-include $(TOP_DIR)/rules.mk\r
-\r
-test:\r
- echo $(SRC)\r
+# Hey Emacs, this is a -*- makefile -*-
+#----------------------------------------------------------------------------
+# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
+# >> Modified for use with the LUFA project. <<
+#
+# Released to the Public Domain
+#
+# Additional material for this makefile was written by:
+# Peter Fleury
+# Tim Henigan
+# Colin O'Flynn
+# Reiner Patommel
+# Markus Pfaff
+# Sander Pool
+# Frederik Rouleau
+# Carlos Lamas
+# Dean Camera
+# Opendous Inc.
+# Denver Gingerich
+#
+#----------------------------------------------------------------------------
+# On command line:
+#
+# make all = Make software.
+#
+# make clean = Clean out built project files.
+#
+# make coff = Convert ELF to AVR COFF.
+#
+# make extcoff = Convert ELF to AVR Extended COFF.
+#
+# make program = Download the hex file to the device, using avrdude.
+# Please customize the avrdude settings below first!
+#
+# make dfu = Download the hex file to the device, using dfu-programmer (must
+# have dfu-programmer installed).
+#
+# make flip = Download the hex file to the device, using Atmel FLIP (must
+# have Atmel FLIP installed).
+#
+# make dfu-ee = Download the eeprom file to the device, using dfu-programmer
+# (must have dfu-programmer installed).
+#
+# make flip-ee = Download the eeprom file to the device, using Atmel FLIP
+# (must have Atmel FLIP installed).
+#
+# make doxygen = Generate DoxyGen documentation for the project (must have
+# DoxyGen installed)
+#
+# make debug = Start either simulavr or avarice as specified for debugging,
+# with avr-gdb or avr-insight as the front end for debugging.
+#
+# make filename.s = Just compile filename.c into the assembler code only.
+#
+# make filename.i = Create a preprocessed source file for use in submitting
+# bug reports to the GCC project.
+#
+# To rebuild project do "make clean" then "make all".
+#----------------------------------------------------------------------------
+
+# Directory common source filess exist
+TOP_DIR = ../..
+
+# Directory keyboard dependent files exist
+TARGET_DIR = .
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+
+# Target board (see library "Board Types" documentation, NONE for projects not requiring
+# LUFA board drivers). If USER is selected, put custom board drivers in a directory called
+# "Board" inside the application directory.
+BOARD = USBKEY
+
+
+# Processor frequency.
+# This will define a symbol, F_CPU, in all source code files equal to the
+# processor frequency in Hz. You can then use this symbol in your source code to
+# calculate timings. Do NOT tack on a 'UL' at the end, this will be done
+# automatically to create a 32-bit value in your source code.
+#
+# This will be an integer division of F_USB below, as it is sourced by
+# F_USB after it has run through any CPU prescalers. Note that this value
+# does not *change* the processor frequency - it should merely be updated to
+# reflect the processor speed set externally so that the code can use accurate
+# software delays.
+F_CPU = 16000000
+
+
+# Input clock frequency.
+# This will define a symbol, F_USB, in all source code files equal to the
+# input clock frequency (before any prescaling is performed) in Hz. This value may
+# differ from F_CPU if prescaling is used on the latter, and is required as the
+# raw input clock is fed directly to the PLL sections of the AVR for high speed
+# clock generation for the USB and other AVR subsections. Do NOT tack on a 'UL'
+# at the end, this will be done automatically to create a 32-bit value in your
+# source code.
+#
+# If no clock division is performed on the input clock inside the AVR (via the
+# CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
+F_USB = $(F_CPU)
+
+
+# Target file name (without extension).
+TARGET = lufa
+
+
+# Path to the LUFA library
+LUFA_PATH = ../../protocol
+
+# Create the LUFA source path variables by including the LUFA root makefile
+include $(LUFA_PATH)/LUFA/makefile
+
+
+
+# List C source files here. (C dependencies are automatically generated.)
+LUFA_SRC = $(TARGET).c \
+ descriptor.c \
+ $(LUFA_SRC_USB) \
+ $(LUFA_SRC_USBCLASS)
+
+SRC = $(subst $(LUFA_PATH)/LUFA/,,$(LUFA_SRC))
+SRC += keymap.c \
+ matrix.c \
+ led.c
+CONFIG_H = config.h
+
+
+
+# LUFA library compile-time options and predefined tokens
+LUFA_OPTS = -D USB_DEVICE_ONLY
+LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8
+LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
+LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
+LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
+
+OPT_DEFS = -DF_CPU=$(F_CPU)UL
+OPT_DEFS += -DF_USB=$(F_USB)UL
+OPT_DEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)
+OPT_DEFS += $(LUFA_OPTS)
+
+
+
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(LUFA_PATH)/LUFA
+
+
+include $(TOP_DIR)/protocol.mk
+include $(TOP_DIR)/common.mk
+include $(TOP_DIR)/rules.mk
+
+test:
+ echo $(SRC)
/* controller configuration */
#include "controller_teensy.h"
+
+/* USB Device descriptor */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0xBEE1
+#define DEVICE_VER 0x0101
#define MANUFACTURER t.m.k.
#define PRODUCT Macway mod(LUFA)
+
+
+/* message strings */
#define DESCRIPTION t.m.k. keyboard firmware for Macway mod(LUFA)
this software.
*/
-/** \file
- *
- * USB Device Descriptors, for library use when in USB device mode. Descriptors are special
- * computer-readable structures which the host requests upon device enumeration, to determine
- * the device's capabilities and functions.
- */
-
-#include "Descriptors.h"
+#include "util.h"
+#include "descriptor.h"
/*******************************************************************************
.Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE,
- .VendorID = 0xFEED,
- .ProductID = 0x204D,
- .ReleaseNumber = VERSION_BCD(00.02),
+ .VendorID = VENDOR_ID,
+ .ProductID = PRODUCT_ID,
+ .ReleaseNumber = DEVICE_VER,
.ManufacturerStrIndex = 0x01,
.ProductStrIndex = 0x02,
.ConfigurationNumber = 1,
.ConfigurationStrIndex = NO_DESCRIPTOR,
- .ConfigAttributes = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_SELFPOWERED), //TODO: bus powered?
+ .ConfigAttributes = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_REMOTEWAKEUP),
.MaxPowerConsumption = USB_CONFIG_POWER_MA(100)
},
/*
* Keyboard
*/
- .HID1_KeyboardInterface =
+ .HID0_KeyboardInterface =
{
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
- .InterfaceNumber = 0x00,
+ .InterfaceNumber = KEYBOARD_INTERFACE,
.AlternateSetting = 0x00,
- .TotalEndpoints = 2,
+ .TotalEndpoints = 1,
.Class = HID_CSCP_HIDClass,
.SubClass = HID_CSCP_BootSubclass,
.InterfaceStrIndex = NO_DESCRIPTOR
},
- .HID1_KeyboardHID =
+ .HID0_KeyboardHID =
{
.Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
.HIDReportLength = sizeof(KeyboardReport)
},
- .HID1_ReportINEndpoint =
+ .HID0_ReportINEndpoint =
{
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
.PollingIntervalMS = 0x01
},
- .HID1_ReportOUTEndpoint =
- {
- .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
-
- .EndpointAddress = (ENDPOINT_DIR_OUT | KEYBOARD_OUT_EPNUM),
- .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
- .EndpointSize = HID_EPSIZE,
- .PollingIntervalMS = 0x01
- },
-
/*
* Mouse
*/
- .HID2_MouseInterface =
+ .HID1_MouseInterface =
{
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
- .InterfaceNumber = 0x01,
+ .InterfaceNumber = MOUSE_INTERFACE,
.AlternateSetting = 0x00,
.TotalEndpoints = 1,
.InterfaceStrIndex = NO_DESCRIPTOR
},
- .HID2_MouseHID =
+ .HID1_MouseHID =
{
.Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
.HIDReportLength = sizeof(MouseReport)
},
- .HID2_ReportINEndpoint =
+ .HID1_ReportINEndpoint =
{
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
/*
* Generic
*/
- .HID3_GenericInterface =
+ .HID2_GenericInterface =
{
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
- .InterfaceNumber = 0x02,
+ .InterfaceNumber = GENERIC_INTERFACE,
.AlternateSetting = 0x00,
.TotalEndpoints = 2,
.InterfaceStrIndex = NO_DESCRIPTOR
},
- .HID3_GenericHID =
+ .HID2_GenericHID =
{
.Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
.HIDReportLength = sizeof(GenericReport)
},
- .HID3_ReportINEndpoint =
+ .HID2_ReportINEndpoint =
{
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
.PollingIntervalMS = 0x01
},
- .HID3_ReportOUTEndpoint =
+ .HID2_ReportOUTEndpoint =
{
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
{
.Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String},
- .UnicodeString = L"Dean Camera" // TODO:
+ .UnicodeString = LSTR(MANUFACTURER)
};
const USB_Descriptor_String_t PROGMEM ProductString =
{
.Header = {.Size = USB_STRING_LEN(28), .Type = DTYPE_String},
- .UnicodeString = L"LUFA Mouse and Keyboard Demo" // TODO:
+ .UnicodeString = LSTR(PRODUCT)
};
break;
case HID_DTYPE_HID:
switch (wIndex) {
- case 0:
- Address = &ConfigurationDescriptor.HID1_KeyboardHID;
+ case KEYBOARD_INTERFACE:
+ Address = &ConfigurationDescriptor.HID0_KeyboardHID;
Size = sizeof(USB_HID_Descriptor_HID_t);
break;
- case 1:
- Address = &ConfigurationDescriptor.HID2_MouseHID;
+ case MOUSE_INTERFACE:
+ Address = &ConfigurationDescriptor.HID1_MouseHID;
Size = sizeof(USB_HID_Descriptor_HID_t);
break;
- case 2:
- Address = &ConfigurationDescriptor.HID3_GenericHID;
+ case GENERIC_INTERFACE:
+ Address = &ConfigurationDescriptor.HID2_GenericHID;
Size = sizeof(USB_HID_Descriptor_HID_t);
break;
}
break;
case HID_DTYPE_Report:
switch (wIndex) {
- case 0:
+ case KEYBOARD_INTERFACE:
Address = &KeyboardReport;
Size = sizeof(KeyboardReport);
break;
- case 1:
+ case MOUSE_INTERFACE:
Address = &MouseReport;
Size = sizeof(MouseReport);
break;
- case 2:
+ case GENERIC_INTERFACE:
Address = &GenericReport;
Size = sizeof(GenericReport);
break;
-/*\r
- LUFA Library\r
- Copyright (C) Dean Camera, 2012.\r
-\r
- dean [at] fourwalledcubicle [dot] com\r
- www.lufa-lib.org\r
-*/\r
-\r
-/*\r
- Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
- Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com)\r
-\r
- Permission to use, copy, modify, distribute, and sell this\r
- software and its documentation for any purpose is hereby granted\r
- without fee, provided that the above copyright notice appear in\r
- all copies and that both that the copyright notice and this\r
- permission notice and warranty disclaimer appear in supporting\r
- documentation, and that the name of the author not be used in\r
- advertising or publicity pertaining to distribution of the\r
- software without specific, written prior permission.\r
-\r
- The author disclaim all warranties with regard to this\r
- software, including all implied warranties of merchantability\r
- and fitness. In no event shall the author be liable for any\r
- special, indirect or consequential damages or any damages\r
- whatsoever resulting from loss of use, data or profits, whether\r
- in an action of contract, negligence or other tortious action,\r
- arising out of or in connection with the use or performance of\r
- this software.\r
-*/\r
-\r
-/** \file\r
- *\r
- * Header file for Descriptors.c.\r
- */\r
-\r
-#ifndef _DESCRIPTORS_H_\r
-#define _DESCRIPTORS_H_\r
-\r
-#include <LUFA/Drivers/USB/USB.h>\r
-#include <avr/pgmspace.h>\r
-\r
-\r
-typedef struct\r
-{\r
- USB_Descriptor_Configuration_Header_t Config;\r
-\r
- // Keyboard HID Interface\r
- USB_Descriptor_Interface_t HID1_KeyboardInterface;\r
- USB_HID_Descriptor_HID_t HID1_KeyboardHID;\r
- USB_Descriptor_Endpoint_t HID1_ReportINEndpoint;\r
- USB_Descriptor_Endpoint_t HID1_ReportOUTEndpoint;\r
-\r
- // Mouse HID Interface\r
- USB_Descriptor_Interface_t HID2_MouseInterface;\r
- USB_HID_Descriptor_HID_t HID2_MouseHID;\r
- USB_Descriptor_Endpoint_t HID2_ReportINEndpoint;\r
-\r
- // Generic HID Interface\r
- USB_Descriptor_Interface_t HID3_GenericInterface;\r
- USB_HID_Descriptor_HID_t HID3_GenericHID;\r
- USB_Descriptor_Endpoint_t HID3_ReportINEndpoint;\r
- USB_Descriptor_Endpoint_t HID3_ReportOUTEndpoint;\r
-} USB_Descriptor_Configuration_t;\r
-\r
-\r
-// Endopoint number/size\r
-#define KEYBOARD_IN_EPNUM 1\r
-#define KEYBOARD_OUT_EPNUM 2\r
-#define MOUSE_IN_EPNUM 3\r
-#define GENERIC_IN_EPNUM 4\r
-#define GENERIC_OUT_EPNUM 5\r
-\r
-#define HID_EPSIZE 8\r
-#define GENERIC_EPSIZE 8\r
-#define GENERIC_REPORT_SIZE 8\r
-\r
-\r
-uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,\r
- const uint8_t wIndex,\r
- const void** const DescriptorAddress)\r
- ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);\r
-\r
-#endif\r
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2012.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+ Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com)
+
+ Permission to use, copy, modify, distribute, and sell this
+ software and its documentation for any purpose is hereby granted
+ without fee, provided that the above copyright notice appear in
+ all copies and that both that the copyright notice and this
+ permission notice and warranty disclaimer appear in supporting
+ documentation, and that the name of the author not be used in
+ advertising or publicity pertaining to distribution of the
+ software without specific, written prior permission.
+
+ The author disclaim all warranties with regard to this
+ software, including all implied warranties of merchantability
+ and fitness. In no event shall the author be liable for any
+ special, indirect or consequential damages or any damages
+ whatsoever resulting from loss of use, data or profits, whether
+ in an action of contract, negligence or other tortious action,
+ arising out of or in connection with the use or performance of
+ this software.
+*/
+
+/** \file
+ *
+ * Header file for Descriptors.c.
+ */
+
+#ifndef _DESCRIPTORS_H_
+#define _DESCRIPTORS_H_
+
+#include <LUFA/Drivers/USB/USB.h>
+#include <avr/pgmspace.h>
+
+
+typedef struct
+{
+ USB_Descriptor_Configuration_Header_t Config;
+
+ // Keyboard HID Interface
+ USB_Descriptor_Interface_t HID0_KeyboardInterface;
+ USB_HID_Descriptor_HID_t HID0_KeyboardHID;
+ USB_Descriptor_Endpoint_t HID0_ReportINEndpoint;
+
+ // Mouse HID Interface
+ USB_Descriptor_Interface_t HID1_MouseInterface;
+ USB_HID_Descriptor_HID_t HID1_MouseHID;
+ USB_Descriptor_Endpoint_t HID1_ReportINEndpoint;
+
+ // Generic HID Interface
+ USB_Descriptor_Interface_t HID2_GenericInterface;
+ USB_HID_Descriptor_HID_t HID2_GenericHID;
+ USB_Descriptor_Endpoint_t HID2_ReportINEndpoint;
+ USB_Descriptor_Endpoint_t HID2_ReportOUTEndpoint;
+} USB_Descriptor_Configuration_t;
+
+
+#define KEYBOARD_INTERFACE 0
+#define MOUSE_INTERFACE 1
+#define GENERIC_INTERFACE 2
+
+// Endopoint number/size
+#define KEYBOARD_IN_EPNUM 1
+#define MOUSE_IN_EPNUM 2
+#define GENERIC_IN_EPNUM 3
+#define GENERIC_OUT_EPNUM 4
+
+#define HID_EPSIZE 8
+#define GENERIC_EPSIZE 8
+#define GENERIC_REPORT_SIZE 8
+
+
+uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
+ const uint8_t wIndex,
+ const void** const DescriptorAddress)
+ ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
+
+#endif
#include "keyboard.h"
#include "sendchar.h"
#include "debug.h"
+
+#include "descriptor.h"
#include "lufa.h"
static uint8_t keyboard_led_stats = 0;
-report_keyboard_t keyboard_report_sent;
-report_mouse_t mouse_report_sent;
+
+// TODO: impl Control Request GET_REPORT
+static report_keyboard_t keyboard_report_sent;
+static report_mouse_t mouse_report_sent;
/* Host driver */
static uint8_t keyboard_leds(void);
};
+static void SetupHardware(void);
+static void Generic_HID_Task(void);
+
int main(void)
{
SetupHardware();
debug_keyboard = true;
debug_mouse = true;
- _delay_ms(3000);
+/* TODO: can't print here
+ _delay_ms(5000);
+ USB_USBTask();
print("abcdefg\n");
+ USB_USBTask();
+*/
keyboard_init();
host_set_driver(&lufa_driver);
while (1) {
keyboard_proc();
- Keyboard_HID_Task();
+
Generic_HID_Task();
USB_USBTask();
}
}
-/** Configures the board hardware and chip peripherals for the demo's functionality. */
void SetupHardware(void)
{
/* Disable watchdog if enabled by bootloader/fuses */
USB_Init();
}
+static void Generic_HID_Task(void)
+{
+ /* Device must be connected and configured for the task to run */
+ if (USB_DeviceState != DEVICE_STATE_Configured)
+ return;
+
+ // TODO: impl receivechar()/recvchar()
+ Endpoint_SelectEndpoint(GENERIC_OUT_EPNUM);
+
+ /* Check to see if a packet has been sent from the host */
+ if (Endpoint_IsOUTReceived())
+ {
+ /* Check to see if the packet contains data */
+ if (Endpoint_IsReadWriteAllowed())
+ {
+ /* Create a temporary buffer to hold the read in report from the host */
+ uint8_t GenericData[GENERIC_REPORT_SIZE];
+
+ /* Read Generic Report Data */
+ Endpoint_Read_Stream_LE(&GenericData, sizeof(GenericData), NULL);
+
+ /* Process Generic Report Data */
+ //ProcessGenericHIDReport(GenericData);
+ }
+
+ /* Finalize the stream transfer to send the last packet */
+ Endpoint_ClearOUT();
+ }
+
+ /* IN packet */
+ Endpoint_SelectEndpoint(GENERIC_IN_EPNUM);
+ // send IN packet
+ if (Endpoint_IsINReady())
+ Endpoint_ClearIN();
+}
+
+
+/*******************************************************************************
+ * USB Events
+ ******************************************************************************/
/** Event handler for the USB_Connect event. */
void EVENT_USB_Device_Connect(void)
{
/* Setup Keyboard HID Report Endpoints */
ConfigSuccess &= Endpoint_ConfigureEndpoint(KEYBOARD_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
HID_EPSIZE, ENDPOINT_BANK_SINGLE);
- ConfigSuccess &= Endpoint_ConfigureEndpoint(KEYBOARD_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
- HID_EPSIZE, ENDPOINT_BANK_SINGLE);
/* Setup Mouse HID Report Endpoint */
ConfigSuccess &= Endpoint_ConfigureEndpoint(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
HID_EPSIZE, ENDPOINT_BANK_SINGLE);
- /* Setup Generic HID Report Endpoints */
- ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
- GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE);
- ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
- GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE);
+ /* Setup Generic HID Report Endpoints */
+ ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
+ GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE);
+ ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
+ GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE);
}
/** Event handler for the USB_ControlRequest event.
// Interface
switch (USB_ControlRequest.wIndex) {
- case 1: // Keyboard
+ case KEYBOARD_INTERFACE:
+ // TODO: test/check
ReportData = (uint8_t*)&keyboard_report_sent;
ReportSize = sizeof(keyboard_report_sent);
break;
- case 2: // Mouse
+ case MOUSE_INTERFACE:
+ // TODO: test/check
ReportData = (uint8_t*)&mouse_report_sent;
ReportSize = sizeof(mouse_report_sent);
break;
- case 3: // Generic
+ case GENERIC_INTERFACE:
break;
}
// Interface
switch (USB_ControlRequest.wIndex) {
- case 1: // Keyboard
+ case KEYBOARD_INTERFACE:
+ // TODO: test/check
/* Read in the LED report from the host */
keyboard_led_stats = Endpoint_Read_8();
break;
- case 2: // Mouse
+ case MOUSE_INTERFACE:
break;
- case 3: // Generic
+ case GENERIC_INTERFACE:
break;
}
}
}
-/** Keyboard task.
- * This processes host LED status reports sent to the device via the keyboard OUT reporting endpoint.
- */
-void Keyboard_HID_Task(void)
-{
- /* Device must be connected and configured for the task to run */
- if (USB_DeviceState != DEVICE_STATE_Configured)
- return;
-
- /* Select the Keyboard LED Report Endpoint */
- Endpoint_SelectEndpoint(KEYBOARD_OUT_EPNUM);
-
- /* Check if Keyboard LED Endpoint Ready for Read/Write */
- if (Endpoint_IsReadWriteAllowed())
- {
- /* Read in the LED report from the host */
- keyboard_led_stats = Endpoint_Read_8();
-
- /* Handshake the OUT Endpoint - clear endpoint and ready for next report */
- Endpoint_ClearOUT();
- }
-}
-
-void Generic_HID_Task(void)
-{
- /* Device must be connected and configured for the task to run */
- if (USB_DeviceState != DEVICE_STATE_Configured)
- return;
-
- Endpoint_SelectEndpoint(GENERIC_OUT_EPNUM);
-
- /* Check to see if a packet has been sent from the host */
- if (Endpoint_IsOUTReceived())
- {
- /* Check to see if the packet contains data */
- if (Endpoint_IsReadWriteAllowed())
- {
- /* Create a temporary buffer to hold the read in report from the host */
- uint8_t GenericData[GENERIC_REPORT_SIZE];
-
- /* Read Generic Report Data */
- Endpoint_Read_Stream_LE(&GenericData, sizeof(GenericData), NULL);
-
- /* Process Generic Report Data */
- //TODO: ProcessGenericHIDReport(GenericData);
- }
-
- /* Finalize the stream transfer to send the last packet */
- Endpoint_ClearOUT();
- }
-
- /* IN packet */
- Endpoint_SelectEndpoint(GENERIC_IN_EPNUM);
- // send IN packet
- if (Endpoint_IsINReady())
- Endpoint_ClearIN();
-}
-
/*******************************************************************************
* Host driver
******************************************************************************/
}
if (Endpoint_IsStalled())
return -1;
- uint16_t currFN = USB_Device_GetFrameNumber();
if (prevFN != USB_Device_GetFrameNumber()) {
if (!(timeout--))
return -1;
-/*\r
- LUFA Library\r
- Copyright (C) Dean Camera, 2012.\r
-\r
- dean [at] fourwalledcubicle [dot] com\r
- www.lufa-lib.org\r
-*/\r
-\r
-/*\r
- Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)\r
- Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com)\r
-\r
- Permission to use, copy, modify, distribute, and sell this\r
- software and its documentation for any purpose is hereby granted\r
- without fee, provided that the above copyright notice appear in\r
- all copies and that both that the copyright notice and this\r
- permission notice and warranty disclaimer appear in supporting\r
- documentation, and that the name of the author not be used in\r
- advertising or publicity pertaining to distribution of the\r
- software without specific, written prior permission.\r
-\r
- The author disclaim all warranties with regard to this\r
- software, including all implied warranties of merchantability\r
- and fitness. In no event shall the author be liable for any\r
- special, indirect or consequential damages or any damages\r
- whatsoever resulting from loss of use, data or profits, whether\r
- in an action of contract, negligence or other tortious action,\r
- arising out of or in connection with the use or performance of\r
- this software.\r
-*/\r
-\r
-#ifndef _LUFA_H_\r
-#define _LUFA_H_\r
-\r
- /* Includes: */\r
- #include <avr/io.h>\r
- #include <avr/wdt.h>\r
- #include <avr/power.h>\r
- #include <avr/interrupt.h>\r
- #include <stdbool.h>\r
- #include <string.h>\r
-\r
- #include "Descriptors.h"\r
-\r
- #include <LUFA/Version.h>\r
- #include <LUFA/Drivers/USB/USB.h>\r
- #include <LUFA/Drivers/Board/Joystick.h>\r
- #include <LUFA/Drivers/Board/LEDs.h>\r
- #include <LUFA/Drivers/Board/Buttons.h>\r
-\r
- /* Macros: */\r
- /** LED mask for the library LED driver, to indicate that the USB interface is not ready. */\r
- #define LEDMASK_USB_NOTREADY LEDS_LED1\r
-\r
- /** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */\r
- #define LEDMASK_USB_ENUMERATING (LEDS_LED2 | LEDS_LED3)\r
-\r
- /** LED mask for the library LED driver, to indicate that the USB interface is ready. */\r
- #define LEDMASK_USB_READY (LEDS_LED2 | LEDS_LED4)\r
-\r
- /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */\r
- #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3)\r
-\r
- /* Function Prototypes: */\r
- void SetupHardware(void);\r
- void Keyboard_ProcessLEDReport(const uint8_t LEDStatus);\r
- void Keyboard_HID_Task(void);\r
- void Generic_HID_Task(void);\r
-\r
- void EVENT_USB_Device_Connect(void);\r
- void EVENT_USB_Device_Disconnect(void);\r
- void EVENT_USB_Device_ConfigurationChanged(void);\r
- void EVENT_USB_Device_ControlRequest(void);\r
- void EVENT_USB_Device_StartOfFrame(void);\r
-\r
- void Keyboard_send(USB_KeyboardReport_Data_t report);\r
-#endif\r
-\r
+/*
+ LUFA Library
+ Copyright (C) Dean Camera, 2012.
+
+ dean [at] fourwalledcubicle [dot] com
+ www.lufa-lib.org
+*/
+
+/*
+ Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
+ Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com)
+
+ Permission to use, copy, modify, distribute, and sell this
+ software and its documentation for any purpose is hereby granted
+ without fee, provided that the above copyright notice appear in
+ all copies and that both that the copyright notice and this
+ permission notice and warranty disclaimer appear in supporting
+ documentation, and that the name of the author not be used in
+ advertising or publicity pertaining to distribution of the
+ software without specific, written prior permission.
+
+ The author disclaim all warranties with regard to this
+ software, including all implied warranties of merchantability
+ and fitness. In no event shall the author be liable for any
+ special, indirect or consequential damages or any damages
+ whatsoever resulting from loss of use, data or profits, whether
+ in an action of contract, negligence or other tortious action,
+ arising out of or in connection with the use or performance of
+ this software.
+*/
+
+#ifndef _LUFA_H_
+#define _LUFA_H_
+
+ /* Includes: */
+#include <avr/io.h>
+#include <avr/wdt.h>
+#include <avr/power.h>
+#include <avr/interrupt.h>
+#include <stdbool.h>
+#include <string.h>
+#include <LUFA/Version.h>
+#include <LUFA/Drivers/USB/USB.h>
+
+#endif