- to make descriptor get VID/PID/Version from config.h. - remove keyboard out endpoint. Instead host can use control request.tags/v1.9
# 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) |
/* controller configuration */ | /* controller configuration */ | ||||
#include "controller_teensy.h" | #include "controller_teensy.h" | ||||
/* USB Device descriptor */ | |||||
#define VENDOR_ID 0xFEED | #define VENDOR_ID 0xFEED | ||||
#define PRODUCT_ID 0xBEE1 | #define PRODUCT_ID 0xBEE1 | ||||
#define DEVICE_VER 0x0101 | |||||
#define MANUFACTURER t.m.k. | #define MANUFACTURER t.m.k. | ||||
#define PRODUCT Macway mod(LUFA) | #define PRODUCT Macway mod(LUFA) | ||||
/* message strings */ | |||||
#define DESCRIPTION t.m.k. keyboard firmware for Macway mod(LUFA) | #define DESCRIPTION t.m.k. keyboard firmware for Macway mod(LUFA) | ||||
this software. | 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, | .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, | .ManufacturerStrIndex = 0x01, | ||||
.ProductStrIndex = 0x02, | .ProductStrIndex = 0x02, | ||||
.ConfigurationNumber = 1, | .ConfigurationNumber = 1, | ||||
.ConfigurationStrIndex = NO_DESCRIPTOR, | .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) | .MaxPowerConsumption = USB_CONFIG_POWER_MA(100) | ||||
}, | }, | ||||
/* | /* | ||||
* Keyboard | * Keyboard | ||||
*/ | */ | ||||
.HID1_KeyboardInterface = | |||||
.HID0_KeyboardInterface = | |||||
{ | { | ||||
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
.InterfaceNumber = 0x00, | |||||
.InterfaceNumber = KEYBOARD_INTERFACE, | |||||
.AlternateSetting = 0x00, | .AlternateSetting = 0x00, | ||||
.TotalEndpoints = 2, | |||||
.TotalEndpoints = 1, | |||||
.Class = HID_CSCP_HIDClass, | .Class = HID_CSCP_HIDClass, | ||||
.SubClass = HID_CSCP_BootSubclass, | .SubClass = HID_CSCP_BootSubclass, | ||||
.InterfaceStrIndex = NO_DESCRIPTOR | .InterfaceStrIndex = NO_DESCRIPTOR | ||||
}, | }, | ||||
.HID1_KeyboardHID = | |||||
.HID0_KeyboardHID = | |||||
{ | { | ||||
.Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | ||||
.HIDReportLength = sizeof(KeyboardReport) | .HIDReportLength = sizeof(KeyboardReport) | ||||
}, | }, | ||||
.HID1_ReportINEndpoint = | |||||
.HID0_ReportINEndpoint = | |||||
{ | { | ||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
.PollingIntervalMS = 0x01 | .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 | * Mouse | ||||
*/ | */ | ||||
.HID2_MouseInterface = | |||||
.HID1_MouseInterface = | |||||
{ | { | ||||
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
.InterfaceNumber = 0x01, | |||||
.InterfaceNumber = MOUSE_INTERFACE, | |||||
.AlternateSetting = 0x00, | .AlternateSetting = 0x00, | ||||
.TotalEndpoints = 1, | .TotalEndpoints = 1, | ||||
.InterfaceStrIndex = NO_DESCRIPTOR | .InterfaceStrIndex = NO_DESCRIPTOR | ||||
}, | }, | ||||
.HID2_MouseHID = | |||||
.HID1_MouseHID = | |||||
{ | { | ||||
.Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | ||||
.HIDReportLength = sizeof(MouseReport) | .HIDReportLength = sizeof(MouseReport) | ||||
}, | }, | ||||
.HID2_ReportINEndpoint = | |||||
.HID1_ReportINEndpoint = | |||||
{ | { | ||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
/* | /* | ||||
* Generic | * Generic | ||||
*/ | */ | ||||
.HID3_GenericInterface = | |||||
.HID2_GenericInterface = | |||||
{ | { | ||||
.Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface}, | ||||
.InterfaceNumber = 0x02, | |||||
.InterfaceNumber = GENERIC_INTERFACE, | |||||
.AlternateSetting = 0x00, | .AlternateSetting = 0x00, | ||||
.TotalEndpoints = 2, | .TotalEndpoints = 2, | ||||
.InterfaceStrIndex = NO_DESCRIPTOR | .InterfaceStrIndex = NO_DESCRIPTOR | ||||
}, | }, | ||||
.HID3_GenericHID = | |||||
.HID2_GenericHID = | |||||
{ | { | ||||
.Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID}, | ||||
.HIDReportLength = sizeof(GenericReport) | .HIDReportLength = sizeof(GenericReport) | ||||
}, | }, | ||||
.HID3_ReportINEndpoint = | |||||
.HID2_ReportINEndpoint = | |||||
{ | { | ||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
.PollingIntervalMS = 0x01 | .PollingIntervalMS = 0x01 | ||||
}, | }, | ||||
.HID3_ReportOUTEndpoint = | |||||
.HID2_ReportOUTEndpoint = | |||||
{ | { | ||||
.Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint}, | ||||
{ | { | ||||
.Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, | .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String}, | ||||
.UnicodeString = L"Dean Camera" // TODO: | |||||
.UnicodeString = LSTR(MANUFACTURER) | |||||
}; | }; | ||||
const USB_Descriptor_String_t PROGMEM ProductString = | const USB_Descriptor_String_t PROGMEM ProductString = | ||||
{ | { | ||||
.Header = {.Size = USB_STRING_LEN(28), .Type = DTYPE_String}, | .Header = {.Size = USB_STRING_LEN(28), .Type = DTYPE_String}, | ||||
.UnicodeString = L"LUFA Mouse and Keyboard Demo" // TODO: | |||||
.UnicodeString = LSTR(PRODUCT) | |||||
}; | }; | ||||
break; | break; | ||||
case HID_DTYPE_HID: | case HID_DTYPE_HID: | ||||
switch (wIndex) { | switch (wIndex) { | ||||
case 0: | |||||
Address = &ConfigurationDescriptor.HID1_KeyboardHID; | |||||
case KEYBOARD_INTERFACE: | |||||
Address = &ConfigurationDescriptor.HID0_KeyboardHID; | |||||
Size = sizeof(USB_HID_Descriptor_HID_t); | Size = sizeof(USB_HID_Descriptor_HID_t); | ||||
break; | break; | ||||
case 1: | |||||
Address = &ConfigurationDescriptor.HID2_MouseHID; | |||||
case MOUSE_INTERFACE: | |||||
Address = &ConfigurationDescriptor.HID1_MouseHID; | |||||
Size = sizeof(USB_HID_Descriptor_HID_t); | Size = sizeof(USB_HID_Descriptor_HID_t); | ||||
break; | break; | ||||
case 2: | |||||
Address = &ConfigurationDescriptor.HID3_GenericHID; | |||||
case GENERIC_INTERFACE: | |||||
Address = &ConfigurationDescriptor.HID2_GenericHID; | |||||
Size = sizeof(USB_HID_Descriptor_HID_t); | Size = sizeof(USB_HID_Descriptor_HID_t); | ||||
break; | break; | ||||
} | } | ||||
break; | break; | ||||
case HID_DTYPE_Report: | case HID_DTYPE_Report: | ||||
switch (wIndex) { | switch (wIndex) { | ||||
case 0: | |||||
case KEYBOARD_INTERFACE: | |||||
Address = &KeyboardReport; | Address = &KeyboardReport; | ||||
Size = sizeof(KeyboardReport); | Size = sizeof(KeyboardReport); | ||||
break; | break; | ||||
case 1: | |||||
case MOUSE_INTERFACE: | |||||
Address = &MouseReport; | Address = &MouseReport; | ||||
Size = sizeof(MouseReport); | Size = sizeof(MouseReport); | ||||
break; | break; | ||||
case 2: | |||||
case GENERIC_INTERFACE: | |||||
Address = &GenericReport; | Address = &GenericReport; | ||||
Size = sizeof(GenericReport); | Size = sizeof(GenericReport); | ||||
break; | break; |
/* | |||||
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 |
#include "keyboard.h" | #include "keyboard.h" | ||||
#include "sendchar.h" | #include "sendchar.h" | ||||
#include "debug.h" | #include "debug.h" | ||||
#include "descriptor.h" | |||||
#include "lufa.h" | #include "lufa.h" | ||||
static uint8_t keyboard_led_stats = 0; | 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 */ | /* Host driver */ | ||||
static uint8_t keyboard_leds(void); | static uint8_t keyboard_leds(void); | ||||
}; | }; | ||||
static void SetupHardware(void); | |||||
static void Generic_HID_Task(void); | |||||
int main(void) | int main(void) | ||||
{ | { | ||||
SetupHardware(); | SetupHardware(); | ||||
debug_keyboard = true; | debug_keyboard = true; | ||||
debug_mouse = true; | debug_mouse = true; | ||||
_delay_ms(3000); | |||||
/* TODO: can't print here | |||||
_delay_ms(5000); | |||||
USB_USBTask(); | |||||
print("abcdefg\n"); | print("abcdefg\n"); | ||||
USB_USBTask(); | |||||
*/ | |||||
keyboard_init(); | keyboard_init(); | ||||
host_set_driver(&lufa_driver); | host_set_driver(&lufa_driver); | ||||
while (1) { | while (1) { | ||||
keyboard_proc(); | keyboard_proc(); | ||||
Keyboard_HID_Task(); | |||||
Generic_HID_Task(); | Generic_HID_Task(); | ||||
USB_USBTask(); | USB_USBTask(); | ||||
} | } | ||||
} | } | ||||
/** Configures the board hardware and chip peripherals for the demo's functionality. */ | |||||
void SetupHardware(void) | void SetupHardware(void) | ||||
{ | { | ||||
/* Disable watchdog if enabled by bootloader/fuses */ | /* Disable watchdog if enabled by bootloader/fuses */ | ||||
USB_Init(); | 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. */ | /** Event handler for the USB_Connect event. */ | ||||
void EVENT_USB_Device_Connect(void) | void EVENT_USB_Device_Connect(void) | ||||
{ | { | ||||
/* Setup Keyboard HID Report Endpoints */ | /* Setup Keyboard HID Report Endpoints */ | ||||
ConfigSuccess &= Endpoint_ConfigureEndpoint(KEYBOARD_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, | ConfigSuccess &= Endpoint_ConfigureEndpoint(KEYBOARD_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, | ||||
HID_EPSIZE, ENDPOINT_BANK_SINGLE); | 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 */ | /* Setup Mouse HID Report Endpoint */ | ||||
ConfigSuccess &= Endpoint_ConfigureEndpoint(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, | ConfigSuccess &= Endpoint_ConfigureEndpoint(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, | ||||
HID_EPSIZE, ENDPOINT_BANK_SINGLE); | 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. | /** Event handler for the USB_ControlRequest event. | ||||
// Interface | // Interface | ||||
switch (USB_ControlRequest.wIndex) { | switch (USB_ControlRequest.wIndex) { | ||||
case 1: // Keyboard | |||||
case KEYBOARD_INTERFACE: | |||||
// TODO: test/check | |||||
ReportData = (uint8_t*)&keyboard_report_sent; | ReportData = (uint8_t*)&keyboard_report_sent; | ||||
ReportSize = sizeof(keyboard_report_sent); | ReportSize = sizeof(keyboard_report_sent); | ||||
break; | break; | ||||
case 2: // Mouse | |||||
case MOUSE_INTERFACE: | |||||
// TODO: test/check | |||||
ReportData = (uint8_t*)&mouse_report_sent; | ReportData = (uint8_t*)&mouse_report_sent; | ||||
ReportSize = sizeof(mouse_report_sent); | ReportSize = sizeof(mouse_report_sent); | ||||
break; | break; | ||||
case 3: // Generic | |||||
case GENERIC_INTERFACE: | |||||
break; | break; | ||||
} | } | ||||
// Interface | // Interface | ||||
switch (USB_ControlRequest.wIndex) { | switch (USB_ControlRequest.wIndex) { | ||||
case 1: // Keyboard | |||||
case KEYBOARD_INTERFACE: | |||||
// TODO: test/check | |||||
/* Read in the LED report from the host */ | /* Read in the LED report from the host */ | ||||
keyboard_led_stats = Endpoint_Read_8(); | keyboard_led_stats = Endpoint_Read_8(); | ||||
break; | break; | ||||
case 2: // Mouse | |||||
case MOUSE_INTERFACE: | |||||
break; | break; | ||||
case 3: // Generic | |||||
case GENERIC_INTERFACE: | |||||
break; | 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 | * Host driver | ||||
******************************************************************************/ | ******************************************************************************/ | ||||
} | } | ||||
if (Endpoint_IsStalled()) | if (Endpoint_IsStalled()) | ||||
return -1; | return -1; | ||||
uint16_t currFN = USB_Device_GetFrameNumber(); | |||||
if (prevFN != USB_Device_GetFrameNumber()) { | if (prevFN != USB_Device_GetFrameNumber()) { | ||||
if (!(timeout--)) | if (!(timeout--)) | ||||
return -1; | return -1; |
/* | |||||
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 |