diff options
-rw-r--r-- | keyboard/lufa/Makefile | 320 | ||||
-rw-r--r-- | keyboard/lufa/config.h | 6 | ||||
-rw-r--r-- | keyboard/lufa/descriptor.c (renamed from keyboard/lufa/Descriptors.c) | 78 | ||||
-rw-r--r-- | keyboard/lufa/descriptor.h (renamed from keyboard/lufa/Descriptors.h) | 170 | ||||
-rw-r--r-- | keyboard/lufa/lufa.c | 146 | ||||
-rw-r--r-- | keyboard/lufa/lufa.h | 123 |
6 files changed, 397 insertions, 446 deletions
diff --git a/keyboard/lufa/Makefile b/keyboard/lufa/Makefile index 115c7e6ec..12af013f8 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 4662e3dd3..c375a576f 100644 --- a/keyboard/lufa/config.h +++ b/keyboard/lufa/config.h @@ -21,10 +21,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. /* 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 index a4e9defab..6059fd4a8 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 index 03e2426a3..19e24c201 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 <LUFA/Drivers/USB/USB.h>
-#include <avr/pgmspace.h>
-
-
-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 <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 diff --git a/keyboard/lufa/lufa.c b/keyboard/lufa/lufa.c index d841f45c6..569960e2a 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 3ba14b360..efb8c3837 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 <avr/io.h>
- #include <avr/wdt.h>
- #include <avr/power.h>
- #include <avr/interrupt.h>
- #include <stdbool.h>
- #include <string.h>
-
- #include "Descriptors.h"
-
- #include <LUFA/Version.h>
- #include <LUFA/Drivers/USB/USB.h>
- #include <LUFA/Drivers/Board/Joystick.h>
- #include <LUFA/Drivers/Board/LEDs.h>
- #include <LUFA/Drivers/Board/Buttons.h>
-
- /* 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 <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 |