clean descriptor setting. Remove keyboard OUT Endpoint.

- to make descriptor get VID/PID/Version from config.h.
- remove keyboard out endpoint. Instead host can use control request.
This commit is contained in:
tmk 2012-06-28 12:59:17 +09:00
parent 3969ec09b4
commit effa5914bf
6 changed files with 397 additions and 446 deletions

View File

@ -1,160 +1,160 @@
# Hey Emacs, this is a -*- makefile -*- # Hey Emacs, this is a -*- makefile -*-
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
# WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al. # WinAVR Makefile Template written by Eric B. Weddington, Jörg Wunsch, et al.
# >> Modified for use with the LUFA project. << # >> Modified for use with the LUFA project. <<
# #
# Released to the Public Domain # Released to the Public Domain
# #
# Additional material for this makefile was written by: # Additional material for this makefile was written by:
# Peter Fleury # Peter Fleury
# Tim Henigan # Tim Henigan
# Colin O'Flynn # Colin O'Flynn
# Reiner Patommel # Reiner Patommel
# Markus Pfaff # Markus Pfaff
# Sander Pool # Sander Pool
# Frederik Rouleau # Frederik Rouleau
# Carlos Lamas # Carlos Lamas
# Dean Camera # Dean Camera
# Opendous Inc. # Opendous Inc.
# Denver Gingerich # Denver Gingerich
# #
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
# On command line: # On command line:
# #
# make all = Make software. # make all = Make software.
# #
# make clean = Clean out built project files. # make clean = Clean out built project files.
# #
# make coff = Convert ELF to AVR COFF. # make coff = Convert ELF to AVR COFF.
# #
# make extcoff = Convert ELF to AVR Extended COFF. # make extcoff = Convert ELF to AVR Extended COFF.
# #
# make program = Download the hex file to the device, using avrdude. # make program = Download the hex file to the device, using avrdude.
# Please customize the avrdude settings below first! # Please customize the avrdude settings below first!
# #
# make dfu = Download the hex file to the device, using dfu-programmer (must # make dfu = Download the hex file to the device, using dfu-programmer (must
# have dfu-programmer installed). # have dfu-programmer installed).
# #
# make flip = Download the hex file to the device, using Atmel FLIP (must # make flip = Download the hex file to the device, using Atmel FLIP (must
# have Atmel FLIP installed). # have Atmel FLIP installed).
# #
# make dfu-ee = Download the eeprom file to the device, using dfu-programmer # make dfu-ee = Download the eeprom file to the device, using dfu-programmer
# (must have dfu-programmer installed). # (must have dfu-programmer installed).
# #
# make flip-ee = Download the eeprom file to the device, using Atmel FLIP # make flip-ee = Download the eeprom file to the device, using Atmel FLIP
# (must have Atmel FLIP installed). # (must have Atmel FLIP installed).
# #
# make doxygen = Generate DoxyGen documentation for the project (must have # make doxygen = Generate DoxyGen documentation for the project (must have
# DoxyGen installed) # DoxyGen installed)
# #
# make debug = Start either simulavr or avarice as specified for debugging, # make debug = Start either simulavr or avarice as specified for debugging,
# with avr-gdb or avr-insight as the front end 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.s = Just compile filename.c into the assembler code only.
# #
# make filename.i = Create a preprocessed source file for use in submitting # make filename.i = Create a preprocessed source file for use in submitting
# bug reports to the GCC project. # bug reports to the GCC project.
# #
# To rebuild project do "make clean" then "make all". # To rebuild project do "make clean" then "make all".
#---------------------------------------------------------------------------- #----------------------------------------------------------------------------
# Directory common source filess exist # Directory common source filess exist
TOP_DIR = ../.. TOP_DIR = ../..
# Directory keyboard dependent files exist # Directory keyboard dependent files exist
TARGET_DIR = . TARGET_DIR = .
# MCU name # MCU name
#MCU = at90usb1287 #MCU = at90usb1287
MCU = atmega32u4 MCU = atmega32u4
# Target architecture (see library "Board Types" documentation). # Target architecture (see library "Board Types" documentation).
ARCH = AVR8 ARCH = AVR8
# Target board (see library "Board Types" documentation, NONE for projects not requiring # 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 # LUFA board drivers). If USER is selected, put custom board drivers in a directory called
# "Board" inside the application directory. # "Board" inside the application directory.
BOARD = USBKEY BOARD = USBKEY
# Processor frequency. # Processor frequency.
# This will define a symbol, F_CPU, in all source code files equal to the # 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 # 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 # 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. # 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 # 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 # 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 # 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 # reflect the processor speed set externally so that the code can use accurate
# software delays. # software delays.
F_CPU = 16000000 F_CPU = 16000000
# Input clock frequency. # Input clock frequency.
# This will define a symbol, F_USB, in all source code files equal to the # 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 # 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 # 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 # 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' # 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 # at the end, this will be done automatically to create a 32-bit value in your
# source code. # source code.
# #
# If no clock division is performed on the input clock inside the AVR (via the # 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. # CPU clock adjust registers or the clock division fuses), this will be equal to F_CPU.
F_USB = $(F_CPU) F_USB = $(F_CPU)
# Target file name (without extension). # Target file name (without extension).
TARGET = lufa TARGET = lufa
# Path to the LUFA library # Path to the LUFA library
LUFA_PATH = ../../protocol LUFA_PATH = ../../protocol
# Create the LUFA source path variables by including the LUFA root makefile # Create the LUFA source path variables by including the LUFA root makefile
include $(LUFA_PATH)/LUFA/makefile include $(LUFA_PATH)/LUFA/makefile
# List C source files here. (C dependencies are automatically generated.) # List C source files here. (C dependencies are automatically generated.)
LSRC = $(TARGET).c \ LUFA_SRC = $(TARGET).c \
Descriptors.c \ descriptor.c \
$(LUFA_SRC_USB) \ $(LUFA_SRC_USB) \
$(LUFA_SRC_USBCLASS) $(LUFA_SRC_USBCLASS)
SRC = $(subst $(LUFA_PATH)/LUFA/,,$(LSRC)) SRC = $(subst $(LUFA_PATH)/LUFA/,,$(LUFA_SRC))
SRC += keymap.c \ SRC += keymap.c \
matrix.c \ matrix.c \
led.c led.c
CONFIG_H = config.h CONFIG_H = config.h
# LUFA library compile-time options and predefined tokens # LUFA library compile-time options and predefined tokens
LUFA_OPTS = -D USB_DEVICE_ONLY LUFA_OPTS = -D USB_DEVICE_ONLY
LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8 LUFA_OPTS += -D FIXED_CONTROL_ENDPOINT_SIZE=8
LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1 LUFA_OPTS += -D FIXED_NUM_CONFIGURATIONS=1
LUFA_OPTS += -D USE_FLASH_DESCRIPTORS LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)" 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_CPU=$(F_CPU)UL
OPT_DEFS += -DF_USB=$(F_USB)UL OPT_DEFS += -DF_USB=$(F_USB)UL
OPT_DEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH) OPT_DEFS += -DBOARD=BOARD_$(BOARD) -DARCH=ARCH_$(ARCH)
OPT_DEFS += $(LUFA_OPTS) OPT_DEFS += $(LUFA_OPTS)
# Search Path # Search Path
VPATH += $(TARGET_DIR) VPATH += $(TARGET_DIR)
VPATH += $(LUFA_PATH)/LUFA VPATH += $(LUFA_PATH)/LUFA
include $(TOP_DIR)/protocol.mk include $(TOP_DIR)/protocol.mk
include $(TOP_DIR)/common.mk include $(TOP_DIR)/common.mk
include $(TOP_DIR)/rules.mk include $(TOP_DIR)/rules.mk
test: test:
echo $(SRC) echo $(SRC)

View File

@ -21,10 +21,16 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
/* 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)

View File

@ -36,14 +36,8 @@
this software. this software.
*/ */
/** \file #include "util.h"
* #include "descriptor.h"
* 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"
/******************************************************************************* /*******************************************************************************
@ -152,9 +146,9 @@ const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
.Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE, .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE,
.VendorID = 0xFEED, .VendorID = VENDOR_ID,
.ProductID = 0x204D, .ProductID = PRODUCT_ID,
.ReleaseNumber = VERSION_BCD(00.02), .ReleaseNumber = DEVICE_VER,
.ManufacturerStrIndex = 0x01, .ManufacturerStrIndex = 0x01,
.ProductStrIndex = 0x02, .ProductStrIndex = 0x02,
@ -178,7 +172,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
.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)
}, },
@ -186,14 +180,14 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
/* /*
* 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,
@ -202,7 +196,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
.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},
@ -213,7 +207,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
.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},
@ -223,24 +217,14 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
.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,
@ -252,7 +236,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
.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},
@ -263,7 +247,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
.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},
@ -276,11 +260,11 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
/* /*
* 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,
@ -292,7 +276,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
.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},
@ -303,7 +287,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
.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},
@ -313,7 +297,7 @@ const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
.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},
@ -339,14 +323,14 @@ const USB_Descriptor_String_t PROGMEM ManufacturerString =
{ {
.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)
}; };
@ -395,31 +379,31 @@ uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
break; break;
case HID_DTYPE_HID: case HID_DTYPE_HID:
switch (wIndex) { switch (wIndex) {
case 0: case KEYBOARD_INTERFACE:
Address = &ConfigurationDescriptor.HID1_KeyboardHID; Address = &ConfigurationDescriptor.HID0_KeyboardHID;
Size = sizeof(USB_HID_Descriptor_HID_t); Size = sizeof(USB_HID_Descriptor_HID_t);
break; break;
case 1: case MOUSE_INTERFACE:
Address = &ConfigurationDescriptor.HID2_MouseHID; Address = &ConfigurationDescriptor.HID1_MouseHID;
Size = sizeof(USB_HID_Descriptor_HID_t); Size = sizeof(USB_HID_Descriptor_HID_t);
break; break;
case 2: case GENERIC_INTERFACE:
Address = &ConfigurationDescriptor.HID3_GenericHID; 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;

View File

@ -1,84 +1,86 @@
/* /*
LUFA Library LUFA Library
Copyright (C) Dean Camera, 2012. Copyright (C) Dean Camera, 2012.
dean [at] fourwalledcubicle [dot] com dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org www.lufa-lib.org
*/ */
/* /*
Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com) Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com) Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com)
Permission to use, copy, modify, distribute, and sell this Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in without fee, provided that the above copyright notice appear in
all copies and that both that the copyright notice and this all copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the advertising or publicity pertaining to distribution of the
software without specific, written prior permission. software without specific, written prior permission.
The author disclaim all warranties with regard to this The author disclaim all warranties with regard to this
software, including all implied warranties of merchantability software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action, in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of arising out of or in connection with the use or performance of
this software. this software.
*/ */
/** \file /** \file
* *
* Header file for Descriptors.c. * Header file for Descriptors.c.
*/ */
#ifndef _DESCRIPTORS_H_ #ifndef _DESCRIPTORS_H_
#define _DESCRIPTORS_H_ #define _DESCRIPTORS_H_
#include <LUFA/Drivers/USB/USB.h> #include <LUFA/Drivers/USB/USB.h>
#include <avr/pgmspace.h> #include <avr/pgmspace.h>
typedef struct typedef struct
{ {
USB_Descriptor_Configuration_Header_t Config; USB_Descriptor_Configuration_Header_t Config;
// Keyboard HID Interface // Keyboard HID Interface
USB_Descriptor_Interface_t HID1_KeyboardInterface; USB_Descriptor_Interface_t HID0_KeyboardInterface;
USB_HID_Descriptor_HID_t HID1_KeyboardHID; USB_HID_Descriptor_HID_t HID0_KeyboardHID;
USB_Descriptor_Endpoint_t HID1_ReportINEndpoint; USB_Descriptor_Endpoint_t HID0_ReportINEndpoint;
USB_Descriptor_Endpoint_t HID1_ReportOUTEndpoint;
// Mouse HID Interface
// Mouse HID Interface USB_Descriptor_Interface_t HID1_MouseInterface;
USB_Descriptor_Interface_t HID2_MouseInterface; USB_HID_Descriptor_HID_t HID1_MouseHID;
USB_HID_Descriptor_HID_t HID2_MouseHID; USB_Descriptor_Endpoint_t HID1_ReportINEndpoint;
USB_Descriptor_Endpoint_t HID2_ReportINEndpoint;
// Generic HID Interface
// Generic HID Interface USB_Descriptor_Interface_t HID2_GenericInterface;
USB_Descriptor_Interface_t HID3_GenericInterface; USB_HID_Descriptor_HID_t HID2_GenericHID;
USB_HID_Descriptor_HID_t HID3_GenericHID; USB_Descriptor_Endpoint_t HID2_ReportINEndpoint;
USB_Descriptor_Endpoint_t HID3_ReportINEndpoint; USB_Descriptor_Endpoint_t HID2_ReportOUTEndpoint;
USB_Descriptor_Endpoint_t HID3_ReportOUTEndpoint; } USB_Descriptor_Configuration_t;
} USB_Descriptor_Configuration_t;
#define KEYBOARD_INTERFACE 0
// Endopoint number/size #define MOUSE_INTERFACE 1
#define KEYBOARD_IN_EPNUM 1 #define GENERIC_INTERFACE 2
#define KEYBOARD_OUT_EPNUM 2
#define MOUSE_IN_EPNUM 3 // Endopoint number/size
#define GENERIC_IN_EPNUM 4 #define KEYBOARD_IN_EPNUM 1
#define GENERIC_OUT_EPNUM 5 #define MOUSE_IN_EPNUM 2
#define GENERIC_IN_EPNUM 3
#define HID_EPSIZE 8 #define GENERIC_OUT_EPNUM 4
#define GENERIC_EPSIZE 8
#define GENERIC_REPORT_SIZE 8 #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) uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3); const uint8_t wIndex,
const void** const DescriptorAddress)
#endif ATTR_WARN_UNUSED_RESULT ATTR_NON_NULL_PTR_ARG(3);
#endif

View File

@ -42,11 +42,15 @@
#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);
@ -63,6 +67,9 @@ static host_driver_t lufa_driver = {
}; };
static void SetupHardware(void);
static void Generic_HID_Task(void);
int main(void) int main(void)
{ {
SetupHardware(); SetupHardware();
@ -74,20 +81,23 @@ int main(void)
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 */
@ -100,6 +110,46 @@ void SetupHardware(void)
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)
{ {
@ -120,18 +170,16 @@ void EVENT_USB_Device_ConfigurationChanged(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 */ /* Setup Generic HID Report Endpoints */
ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN, ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE); GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE);
ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT, ConfigSuccess &= Endpoint_ConfigureEndpoint(GENERIC_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE); GENERIC_EPSIZE, ENDPOINT_BANK_SINGLE);
} }
/** Event handler for the USB_ControlRequest event. /** Event handler for the USB_ControlRequest event.
@ -152,15 +200,17 @@ void EVENT_USB_Device_ControlRequest(void)
// 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;
} }
@ -184,13 +234,14 @@ void EVENT_USB_Device_ControlRequest(void)
// 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;
} }
@ -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 * Host driver
******************************************************************************/ ******************************************************************************/
@ -332,7 +325,6 @@ int8_t sendchar(uint8_t c)
} }
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;

View File

@ -1,78 +1,45 @@
/* /*
LUFA Library LUFA Library
Copyright (C) Dean Camera, 2012. Copyright (C) Dean Camera, 2012.
dean [at] fourwalledcubicle [dot] com dean [at] fourwalledcubicle [dot] com
www.lufa-lib.org www.lufa-lib.org
*/ */
/* /*
Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com) Copyright 2012 Dean Camera (dean [at] fourwalledcubicle [dot] com)
Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com) Copyright 2010 Denver Gingerich (denver [at] ossguy [dot] com)
Permission to use, copy, modify, distribute, and sell this Permission to use, copy, modify, distribute, and sell this
software and its documentation for any purpose is hereby granted software and its documentation for any purpose is hereby granted
without fee, provided that the above copyright notice appear in without fee, provided that the above copyright notice appear in
all copies and that both that the copyright notice and this all copies and that both that the copyright notice and this
permission notice and warranty disclaimer appear in supporting permission notice and warranty disclaimer appear in supporting
documentation, and that the name of the author not be used in documentation, and that the name of the author not be used in
advertising or publicity pertaining to distribution of the advertising or publicity pertaining to distribution of the
software without specific, written prior permission. software without specific, written prior permission.
The author disclaim all warranties with regard to this The author disclaim all warranties with regard to this
software, including all implied warranties of merchantability software, including all implied warranties of merchantability
and fitness. In no event shall the author be liable for any and fitness. In no event shall the author be liable for any
special, indirect or consequential damages or any damages special, indirect or consequential damages or any damages
whatsoever resulting from loss of use, data or profits, whether whatsoever resulting from loss of use, data or profits, whether
in an action of contract, negligence or other tortious action, in an action of contract, negligence or other tortious action,
arising out of or in connection with the use or performance of arising out of or in connection with the use or performance of
this software. this software.
*/ */
#ifndef _LUFA_H_ #ifndef _LUFA_H_
#define _LUFA_H_ #define _LUFA_H_
/* Includes: */ /* Includes: */
#include <avr/io.h> #include <avr/io.h>
#include <avr/wdt.h> #include <avr/wdt.h>
#include <avr/power.h> #include <avr/power.h>
#include <avr/interrupt.h> #include <avr/interrupt.h>
#include <stdbool.h> #include <stdbool.h>
#include <string.h> #include <string.h>
#include <LUFA/Version.h>
#include "Descriptors.h" #include <LUFA/Drivers/USB/USB.h>
#include <LUFA/Version.h> #endif
#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