Browse Source

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.
tags/v1.9
tmk 11 years ago
parent
commit
effa5914bf
6 changed files with 397 additions and 446 deletions
  1. 160
    160
      keyboard/lufa/Makefile
  2. 6
    0
      keyboard/lufa/config.h
  3. 31
    47
      keyboard/lufa/descriptor.c
  4. 86
    84
      keyboard/lufa/descriptor.h
  5. 69
    77
      keyboard/lufa/lufa.c
  6. 45
    78
      keyboard/lufa/lufa.h

+ 160
- 160
keyboard/lufa/Makefile View File

@@ -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)

+ 6
- 0
keyboard/lufa/config.h View File

@@ -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)



keyboard/lufa/Descriptors.c → keyboard/lufa/descriptor.c View File

@@ -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;

keyboard/lufa/Descriptors.h → keyboard/lufa/descriptor.h View File

@@ -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

+ 69
- 77
keyboard/lufa/lufa.c View File

@@ -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;

+ 45
- 78
keyboard/lufa/lufa.h View File

@@ -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

Loading…
Cancel
Save