diff --git a/keyboard/lufa/Makefile b/keyboard/lufa/Makefile index 115c7e6e..12af013f 100644 --- a/keyboard/lufa/Makefile +++ b/keyboard/lufa/Makefile @@ -1,160 +1,160 @@ -# 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.) -LSRC = $(TARGET).c \ - Descriptors.c \ - $(LUFA_SRC_USB) \ - $(LUFA_SRC_USBCLASS) - -SRC = $(subst $(LUFA_PATH)/LUFA/,,$(LSRC)) -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) +# 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) diff --git a/keyboard/lufa/config.h b/keyboard/lufa/config.h index 4662e3dd..c375a576 100644 --- a/keyboard/lufa/config.h +++ b/keyboard/lufa/config.h @@ -21,10 +21,16 @@ along with this program. If not, see . /* 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) diff --git a/keyboard/lufa/Descriptors.c b/keyboard/lufa/descriptor.c similarity index 89% rename from keyboard/lufa/Descriptors.c rename to keyboard/lufa/descriptor.c index a4e9defa..6059fd4a 100644 --- a/keyboard/lufa/Descriptors.c +++ b/keyboard/lufa/descriptor.c @@ -36,14 +36,8 @@ 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" /******************************************************************************* @@ -152,9 +146,9 @@ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor = .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, @@ -178,7 +172,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .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) }, @@ -186,14 +180,14 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = /* * 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, @@ -202,7 +196,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .InterfaceStrIndex = NO_DESCRIPTOR }, - .HID1_KeyboardHID = + .HID0_KeyboardHID = { .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, @@ -213,7 +207,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .HIDReportLength = sizeof(KeyboardReport) }, - .HID1_ReportINEndpoint = + .HID0_ReportINEndpoint = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, @@ -223,24 +217,14 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .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, @@ -252,7 +236,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .InterfaceStrIndex = NO_DESCRIPTOR }, - .HID2_MouseHID = + .HID1_MouseHID = { .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, @@ -263,7 +247,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .HIDReportLength = sizeof(MouseReport) }, - .HID2_ReportINEndpoint = + .HID1_ReportINEndpoint = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, @@ -276,11 +260,11 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = /* * Generic */ - .HID3_GenericInterface = + .HID2_GenericInterface = { .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, - .InterfaceNumber = 0x02, + .InterfaceNumber = GENERIC_INTERFACE, .AlternateSetting = 0x00, .TotalEndpoints = 2, @@ -292,7 +276,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .InterfaceStrIndex = NO_DESCRIPTOR }, - .HID3_GenericHID = + .HID2_GenericHID = { .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, @@ -303,7 +287,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .HIDReportLength = sizeof(GenericReport) }, - .HID3_ReportINEndpoint = + .HID2_ReportINEndpoint = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, @@ -313,7 +297,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor = .PollingIntervalMS = 0x01 }, - .HID3_ReportOUTEndpoint = + .HID2_ReportOUTEndpoint = { .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, @@ -339,14 +323,14 @@ const USB_Descriptor_String_t PROGMEM ManufacturerString = { .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) }; @@ -395,31 +379,31 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue, 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; diff --git a/keyboard/lufa/Descriptors.h b/keyboard/lufa/descriptor.h similarity index 68% rename from keyboard/lufa/Descriptors.h rename to keyboard/lufa/descriptor.h index 03e2426a..19e24c20 100644 --- a/keyboard/lufa/Descriptors.h +++ b/keyboard/lufa/descriptor.h @@ -1,84 +1,86 @@ -/* - 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 -#include - - -typedef struct -{ - USB_Descriptor_Configuration_Header_t Config; - - // Keyboard HID Interface - USB_Descriptor_Interface_t HID1_KeyboardInterface; - USB_HID_Descriptor_HID_t HID1_KeyboardHID; - USB_Descriptor_Endpoint_t HID1_ReportINEndpoint; - USB_Descriptor_Endpoint_t HID1_ReportOUTEndpoint; - - // Mouse HID Interface - USB_Descriptor_Interface_t HID2_MouseInterface; - USB_HID_Descriptor_HID_t HID2_MouseHID; - USB_Descriptor_Endpoint_t HID2_ReportINEndpoint; - - // Generic HID Interface - USB_Descriptor_Interface_t HID3_GenericInterface; - USB_HID_Descriptor_HID_t HID3_GenericHID; - USB_Descriptor_Endpoint_t HID3_ReportINEndpoint; - USB_Descriptor_Endpoint_t HID3_ReportOUTEndpoint; -} USB_Descriptor_Configuration_t; - - -// Endopoint number/size -#define KEYBOARD_IN_EPNUM 1 -#define KEYBOARD_OUT_EPNUM 2 -#define MOUSE_IN_EPNUM 3 -#define GENERIC_IN_EPNUM 4 -#define GENERIC_OUT_EPNUM 5 - -#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 +/* + 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 +#include + + +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 diff --git a/keyboard/lufa/lufa.c b/keyboard/lufa/lufa.c index d841f45c..569960e2 100644 --- a/keyboard/lufa/lufa.c +++ b/keyboard/lufa/lufa.c @@ -42,11 +42,15 @@ #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); @@ -63,6 +67,9 @@ static host_driver_t lufa_driver = { }; +static void SetupHardware(void); +static void Generic_HID_Task(void); + int main(void) { SetupHardware(); @@ -74,20 +81,23 @@ int main(void) 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 */ @@ -100,6 +110,46 @@ void SetupHardware(void) 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) { @@ -120,18 +170,16 @@ void EVENT_USB_Device_ConfigurationChanged(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. @@ -152,15 +200,17 @@ void EVENT_USB_Device_ControlRequest(void) // 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; } @@ -184,13 +234,14 @@ void EVENT_USB_Device_ControlRequest(void) // 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; } @@ -202,64 +253,6 @@ void EVENT_USB_Device_ControlRequest(void) } } -/** 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 ******************************************************************************/ @@ -332,7 +325,6 @@ int8_t sendchar(uint8_t c) } if (Endpoint_IsStalled()) return -1; - uint16_t currFN = USB_Device_GetFrameNumber(); if (prevFN != USB_Device_GetFrameNumber()) { if (!(timeout--)) return -1; diff --git a/keyboard/lufa/lufa.h b/keyboard/lufa/lufa.h index 3ba14b36..efb8c383 100644 --- a/keyboard/lufa/lufa.h +++ b/keyboard/lufa/lufa.h @@ -1,78 +1,45 @@ -/* - 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 - #include - #include - #include - #include - #include - - #include "Descriptors.h" - - #include - #include - #include - #include - #include - - /* Macros: */ - /** LED mask for the library LED driver, to indicate that the USB interface is not ready. */ - #define LEDMASK_USB_NOTREADY LEDS_LED1 - - /** LED mask for the library LED driver, to indicate that the USB interface is enumerating. */ - #define LEDMASK_USB_ENUMERATING (LEDS_LED2 | LEDS_LED3) - - /** LED mask for the library LED driver, to indicate that the USB interface is ready. */ - #define LEDMASK_USB_READY (LEDS_LED2 | LEDS_LED4) - - /** LED mask for the library LED driver, to indicate that an error has occurred in the USB interface. */ - #define LEDMASK_USB_ERROR (LEDS_LED1 | LEDS_LED3) - - /* Function Prototypes: */ - void SetupHardware(void); - void Keyboard_ProcessLEDReport(const uint8_t LEDStatus); - void Keyboard_HID_Task(void); - void Generic_HID_Task(void); - - void EVENT_USB_Device_Connect(void); - void EVENT_USB_Device_Disconnect(void); - void EVENT_USB_Device_ConfigurationChanged(void); - void EVENT_USB_Device_ControlRequest(void); - void EVENT_USB_Device_StartOfFrame(void); - - void Keyboard_send(USB_KeyboardReport_Data_t report); -#endif - +/* + 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 +#include +#include +#include +#include +#include +#include +#include + +#endif