-SRC += host.c \
- keyboard.c \
- command.c \
- layer.c \
- timer.c \
- print.c \
- bootloader.c \
- util.c
+COMMON_DIR = common
+SRC += $(COMMON_DIR)/host.c \
+ $(COMMON_DIR)/keyboard.c \
+ $(COMMON_DIR)/command.c \
+ $(COMMON_DIR)/layer.c \
+ $(COMMON_DIR)/timer.c \
+ $(COMMON_DIR)/print.c \
+ $(COMMON_DIR)/bootloader.c \
+ $(COMMON_DIR)/util.c
# Option modules
ifdef MOUSEKEY_ENABLE
- SRC += mousekey.c
+ SRC += $(COMMON_DIR)/mousekey.c
OPT_DEFS += -DMOUSEKEY_ENABLE
endif
ifdef PS2_MOUSE_ENABLE
- SRC += ps2.c \
- ps2_mouse.c
+ SRC += $(COMMON_DIR)/ps2.c \
+ $(COMMON_DIR)/ps2_mouse.c
OPT_DEFS += -DPS2_MOUSE_ENABLE
endif
* |Gui |Alt |Space |Alt |xxx|
* `--------------------------------------------'
*/
- KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
+ KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, INS, DEL, \
CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,BRK, UP, NO, BSPC, \
LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \
LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,FN1, \
+++ /dev/null
-# 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 \
- pjrc/bootloader_teensy.c
-CONFIG_H = config.h
-
-
-# Build Options
-# comment out to disable the options.
-#
-MOUSEKEY_ENABLE = yes # Mouse keys
-#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support
-EXTRAKEY_ENABLE = yes # Audio control and System control
-#NKRO_ENABLE = yes # USB Nkey Rollover
-
-
-# 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)
+++ /dev/null
-/*
-Copyright 2011 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#ifndef CONFIG_H
-#define CONFIG_H
-
-/* controller configuration */
-#include "controller_teensy.h"
-
-
-/* USB Device descriptor */
-#define VENDOR_ID 0xFEED
-#define PRODUCT_ID 0xBEE6
-#define DEVICE_VER 0x0202
-#define MANUFACTURER t.m.k.
-#define PRODUCT Macway mod(LUFA)
-
-
-/* message strings */
-#define DESCRIPTION t.m.k. keyboard firmware for Macway mod(LUFA)
-
-
-/* matrix size */
-#define MATRIX_ROWS 9
-#define MATRIX_COLS 8
-/* define if matrix has ghost */
-#define MATRIX_HAS_GHOST
-/* Set 0 if need no debouncing */
-#define DEBOUNCE 5
-
-
-/* key combination for command */
-#define IS_COMMAND() ( \
- keyboard_report->mods == (MOD_BIT(KB_LSHIFT) | MOD_BIT(KB_LCTRL) | MOD_BIT(KB_LALT) | MOD_BIT(KB_LGUI)) || \
- keyboard_report->mods == (MOD_BIT(KB_LSHIFT) | MOD_BIT(KB_RSHIFT)) \
-)
-
-
-/* layer switching */
-#define LAYER_SWITCH_DELAY 100
-#define LAYER_SEND_FN_TERM 300
-
-
-/* mouse keys */
-#ifdef MOUSEKEY_ENABLE
-# define MOUSEKEY_DELAY_TIME 192
-#endif
-
-
-/* PS/2 mouse */
-#ifdef PS2_MOUSE_ENABLE
-# define PS2_CLOCK_PORT PORTF
-# define PS2_CLOCK_PIN PINF
-# define PS2_CLOCK_DDR DDRF
-# define PS2_CLOCK_BIT 0
-# define PS2_DATA_PORT PORTF
-# define PS2_DATA_PIN PINF
-# define PS2_DATA_DDR DDRF
-# define PS2_DATA_BIT 1
-#endif
-
-#endif
+++ /dev/null
-/*
- * Copyright 2012 Jun Wako <wakojun@gmail.com>
- * This file is based on:
- * LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse
- * LUFA-120219/Demos/Device/Lowlevel/GenericHID
- */
-
-/*
- 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.
-*/
-
-#include "util.h"
-#include "report.h"
-#include "descriptor.h"
-
-
-/*******************************************************************************
- * HID Report Descriptors
- ******************************************************************************/
-const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] =
-{
- HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
- HID_RI_USAGE(8, 0x06), /* Keyboard */
- HID_RI_COLLECTION(8, 0x01), /* Application */
- HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */
- HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */
- HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */
- HID_RI_LOGICAL_MINIMUM(8, 0x00),
- HID_RI_LOGICAL_MAXIMUM(8, 0x01),
- HID_RI_REPORT_SIZE(8, 0x01),
- HID_RI_REPORT_COUNT(8, 0x08),
- HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
- HID_RI_REPORT_COUNT(8, 0x01),
- HID_RI_REPORT_SIZE(8, 0x08),
- HID_RI_INPUT(8, HID_IOF_CONSTANT),
- HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */
- HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */
- HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */
- HID_RI_REPORT_COUNT(8, 0x05),
- HID_RI_REPORT_SIZE(8, 0x01),
- HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
- HID_RI_REPORT_COUNT(8, 0x01),
- HID_RI_REPORT_SIZE(8, 0x03),
- HID_RI_OUTPUT(8, HID_IOF_CONSTANT),
- HID_RI_LOGICAL_MINIMUM(8, 0x00),
- HID_RI_LOGICAL_MAXIMUM(8, 0x65),
- HID_RI_USAGE_PAGE(8, 0x07), /* Keyboard */
- HID_RI_USAGE_MINIMUM(8, 0x00), /* Reserved (no event indicated) */
- HID_RI_USAGE_MAXIMUM(8, 0x65), /* Keyboard Application */
- HID_RI_REPORT_COUNT(8, 0x06),
- HID_RI_REPORT_SIZE(8, 0x08),
- HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
- HID_RI_END_COLLECTION(0),
-};
-
-const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =
-{
- HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
- HID_RI_USAGE(8, 0x02), /* Mouse */
- HID_RI_COLLECTION(8, 0x01), /* Application */
- HID_RI_USAGE(8, 0x01), /* Pointer */
- HID_RI_COLLECTION(8, 0x00), /* Physical */
-
- HID_RI_USAGE_PAGE(8, 0x09), /* Button */
- HID_RI_USAGE_MINIMUM(8, 0x01), /* Button 1 */
- HID_RI_USAGE_MAXIMUM(8, 0x05), /* Button 5 */
- HID_RI_LOGICAL_MINIMUM(8, 0x00),
- HID_RI_LOGICAL_MAXIMUM(8, 0x01),
- HID_RI_REPORT_COUNT(8, 0x05),
- HID_RI_REPORT_SIZE(8, 0x01),
- HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
- HID_RI_REPORT_COUNT(8, 0x01),
- HID_RI_REPORT_SIZE(8, 0x03),
- HID_RI_INPUT(8, HID_IOF_CONSTANT),
-
- HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
- HID_RI_USAGE(8, 0x30), /* Usage X */
- HID_RI_USAGE(8, 0x31), /* Usage Y */
- HID_RI_LOGICAL_MINIMUM(8, -127),
- HID_RI_LOGICAL_MAXIMUM(8, 127),
- HID_RI_REPORT_COUNT(8, 0x02),
- HID_RI_REPORT_SIZE(8, 0x08),
- HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
-
- HID_RI_USAGE(8, 0x38), /* Wheel */
- HID_RI_LOGICAL_MINIMUM(8, -127),
- HID_RI_LOGICAL_MAXIMUM(8, 127),
- HID_RI_REPORT_COUNT(8, 0x01),
- HID_RI_REPORT_SIZE(8, 0x08),
- HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
-
- HID_RI_USAGE_PAGE(8, 0x0C), /* Consumer */
- HID_RI_USAGE(16, 0x0238), /* AC Pan (Horizontal wheel) */
- HID_RI_LOGICAL_MINIMUM(8, -127),
- HID_RI_LOGICAL_MAXIMUM(8, 127),
- HID_RI_REPORT_COUNT(8, 0x01),
- HID_RI_REPORT_SIZE(8, 0x08),
- HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
-
- HID_RI_END_COLLECTION(0),
- HID_RI_END_COLLECTION(0),
-};
-
-const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] =
-{
- HID_RI_USAGE_PAGE(16, 0xFF00), /* Vendor Page 0 */
- HID_RI_USAGE(8, 0x01), /* Vendor Usage 1 */
- HID_RI_COLLECTION(8, 0x01), /* Application */
- HID_RI_USAGE(8, 0x02), /* Vendor Usage 2 */
- HID_RI_LOGICAL_MINIMUM(8, 0x00),
- HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
- HID_RI_REPORT_SIZE(8, 0x08),
- HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE),
- HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
- HID_RI_USAGE(8, 0x03), /* Vendor Usage 3 */
- HID_RI_LOGICAL_MINIMUM(8, 0x00),
- HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
- HID_RI_REPORT_SIZE(8, 0x08),
- HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE),
- HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
- HID_RI_END_COLLECTION(0),
-};
-
-const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtraReport[] =
-{
- HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
- HID_RI_USAGE(8, 0x80), /* System Control */
- HID_RI_COLLECTION(8, 0x01), /* Application */
- HID_RI_REPORT_ID(8, REPORT_ID_SYSTEM),
- HID_RI_LOGICAL_MINIMUM(16, 0x0081),
- HID_RI_LOGICAL_MAXIMUM(16, 0x00B7),
- HID_RI_USAGE_MINIMUM(16, 0x0081), /* System Power Down */
- HID_RI_USAGE_MAXIMUM(16, 0x00B7), /* System Display LCD Autoscale */
- HID_RI_REPORT_SIZE(8, 16),
- HID_RI_REPORT_COUNT(8, 1),
- HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
- HID_RI_END_COLLECTION(0),
-
- HID_RI_USAGE_PAGE(8, 0x0C), /* Consumer */
- HID_RI_USAGE(8, 0x01), /* Consumer Control */
- HID_RI_COLLECTION(8, 0x01), /* Application */
- HID_RI_REPORT_ID(8, REPORT_ID_CONSUMER),
- HID_RI_LOGICAL_MINIMUM(16, 0x0010),
- HID_RI_LOGICAL_MAXIMUM(16, 0x029C),
- HID_RI_USAGE_MINIMUM(16, 0x0010), /* +10 */
- HID_RI_USAGE_MAXIMUM(16, 0x029C), /* AC Distribute Vertically */
- HID_RI_REPORT_SIZE(8, 16),
- HID_RI_REPORT_COUNT(8, 1),
- HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
- HID_RI_END_COLLECTION(0),
-};
-
-/*******************************************************************************
- * Device Descriptors
- ******************************************************************************/
-const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
-{
- .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},
-
- .USBSpecification = VERSION_BCD(01.10),
- .Class = USB_CSCP_NoDeviceClass,
- .SubClass = USB_CSCP_NoDeviceSubclass,
- .Protocol = USB_CSCP_NoDeviceProtocol,
-
- .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE,
-
- .VendorID = VENDOR_ID,
- .ProductID = PRODUCT_ID,
- .ReleaseNumber = DEVICE_VER,
-
- .ManufacturerStrIndex = 0x01,
- .ProductStrIndex = 0x02,
- .SerialNumStrIndex = NO_DESCRIPTOR,
-
- .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
-};
-
-/*******************************************************************************
- * Configuration Descriptors
- ******************************************************************************/
-const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
-{
- .Config =
- {
- .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration},
-
- .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t),
- .TotalInterfaces = TOTAL_INTERFACES,
-
- .ConfigurationNumber = 1,
- .ConfigurationStrIndex = NO_DESCRIPTOR,
-
- .ConfigAttributes = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_REMOTEWAKEUP),
-
- .MaxPowerConsumption = USB_CONFIG_POWER_MA(100)
- },
-
- /*
- * Keyboard
- */
- .Keyboard_Interface =
- {
- .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
-
- .InterfaceNumber = KEYBOARD_INTERFACE,
- .AlternateSetting = 0x00,
-
- .TotalEndpoints = 1,
-
- .Class = HID_CSCP_HIDClass,
- .SubClass = HID_CSCP_BootSubclass,
- .Protocol = HID_CSCP_KeyboardBootProtocol,
-
- .InterfaceStrIndex = NO_DESCRIPTOR
- },
-
- .Keyboard_HID =
- {
- .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
-
- .HIDSpec = VERSION_BCD(01.11),
- .CountryCode = 0x00,
- .TotalReportDescriptors = 1,
- .HIDReportType = HID_DTYPE_Report,
- .HIDReportLength = sizeof(KeyboardReport)
- },
-
- .Keyboard_INEndpoint =
- {
- .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
-
- .EndpointAddress = (ENDPOINT_DIR_IN | KEYBOARD_IN_EPNUM),
- .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
- .EndpointSize = KEYBOARD_EPSIZE,
- .PollingIntervalMS = 0x01
- },
-
- /*
- * Mouse
- */
- .Mouse_Interface =
- {
- .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
-
- .InterfaceNumber = MOUSE_INTERFACE,
- .AlternateSetting = 0x00,
-
- .TotalEndpoints = 1,
-
- .Class = HID_CSCP_HIDClass,
- .SubClass = HID_CSCP_BootSubclass,
- .Protocol = HID_CSCP_MouseBootProtocol,
-
- .InterfaceStrIndex = NO_DESCRIPTOR
- },
-
- .Mouse_HID =
- {
- .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
-
- .HIDSpec = VERSION_BCD(01.11),
- .CountryCode = 0x00,
- .TotalReportDescriptors = 1,
- .HIDReportType = HID_DTYPE_Report,
- .HIDReportLength = sizeof(MouseReport)
- },
-
- .Mouse_INEndpoint =
- {
- .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
-
- .EndpointAddress = (ENDPOINT_DIR_IN | MOUSE_IN_EPNUM),
- .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
- .EndpointSize = MOUSE_EPSIZE,
- .PollingIntervalMS = 0x01
- },
-
- /*
- * Console
- */
- .Console_Interface =
- {
- .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
-
- .InterfaceNumber = CONSOLE_INTERFACE,
- .AlternateSetting = 0x00,
-
- .TotalEndpoints = 2,
-
- .Class = HID_CSCP_HIDClass,
- .SubClass = HID_CSCP_NonBootSubclass,
- .Protocol = HID_CSCP_NonBootProtocol,
-
- .InterfaceStrIndex = NO_DESCRIPTOR
- },
-
- .Console_HID =
- {
- .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
-
- .HIDSpec = VERSION_BCD(01.11),
- .CountryCode = 0x00,
- .TotalReportDescriptors = 1,
- .HIDReportType = HID_DTYPE_Report,
- .HIDReportLength = sizeof(ConsoleReport)
- },
-
- .Console_INEndpoint =
- {
- .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
-
- .EndpointAddress = (ENDPOINT_DIR_IN | CONSOLE_IN_EPNUM),
- .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
- .EndpointSize = CONSOLE_EPSIZE,
- .PollingIntervalMS = 0x01
- },
-
- .Console_OUTEndpoint =
- {
- .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
-
- .EndpointAddress = (ENDPOINT_DIR_OUT | CONSOLE_OUT_EPNUM),
- .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
- .EndpointSize = CONSOLE_EPSIZE,
- .PollingIntervalMS = 0x01
- },
-
- /*
- * Extra
- */
- .Extra_Interface =
- {
- .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
-
- .InterfaceNumber = EXTRA_INTERFACE,
- .AlternateSetting = 0x00,
-
- .TotalEndpoints = 1,
-
- .Class = HID_CSCP_HIDClass,
- .SubClass = HID_CSCP_NonBootSubclass,
- .Protocol = HID_CSCP_NonBootProtocol,
-
- .InterfaceStrIndex = NO_DESCRIPTOR
- },
-
- .Extra_HID =
- {
- .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
-
- .HIDSpec = VERSION_BCD(01.11),
- .CountryCode = 0x00,
- .TotalReportDescriptors = 1,
- .HIDReportType = HID_DTYPE_Report,
- .HIDReportLength = sizeof(ExtraReport)
- },
-
- .Extra_INEndpoint =
- {
- .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
-
- .EndpointAddress = (ENDPOINT_DIR_IN | EXTRA_IN_EPNUM),
- .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
- .EndpointSize = EXTRA_EPSIZE,
- .PollingIntervalMS = 0x01
- },
-};
-
-
-/*******************************************************************************
- * String Descriptors
- ******************************************************************************/
-const USB_Descriptor_String_t PROGMEM LanguageString =
-{
- .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String},
-
- .UnicodeString = {LANGUAGE_ID_ENG}
-};
-
-const USB_Descriptor_String_t PROGMEM ManufacturerString =
-{
- .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String},
-
- .UnicodeString = LSTR(MANUFACTURER)
-};
-
-const USB_Descriptor_String_t PROGMEM ProductString =
-{
- .Header = {.Size = USB_STRING_LEN(28), .Type = DTYPE_String},
-
- .UnicodeString = LSTR(PRODUCT)
-};
-
-
-/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
- * documentation) by the application code so that the address and size of a requested descriptor can be given
- * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function
- * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the
- * USB host.
- */
-uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
- const uint8_t wIndex,
- const void** const DescriptorAddress)
-{
- const uint8_t DescriptorType = (wValue >> 8);
- const uint8_t DescriptorIndex = (wValue & 0xFF);
-
- const void* Address = NULL;
- uint16_t Size = NO_DESCRIPTOR;
-
- switch (DescriptorType)
- {
- case DTYPE_Device:
- Address = &DeviceDescriptor;
- Size = sizeof(USB_Descriptor_Device_t);
- break;
- case DTYPE_Configuration:
- Address = &ConfigurationDescriptor;
- Size = sizeof(USB_Descriptor_Configuration_t);
- break;
- case DTYPE_String:
- switch (DescriptorIndex )
- {
- case 0x00:
- Address = &LanguageString;
- Size = pgm_read_byte(&LanguageString.Header.Size);
- break;
- case 0x01:
- Address = &ManufacturerString;
- Size = pgm_read_byte(&ManufacturerString.Header.Size);
- break;
- case 0x02:
- Address = &ProductString;
- Size = pgm_read_byte(&ProductString.Header.Size);
- break;
- }
- break;
- case HID_DTYPE_HID:
- switch (wIndex) {
- case KEYBOARD_INTERFACE:
- Address = &ConfigurationDescriptor.Keyboard_HID;
- Size = sizeof(USB_HID_Descriptor_HID_t);
- break;
- case MOUSE_INTERFACE:
- Address = &ConfigurationDescriptor.Mouse_HID;
- Size = sizeof(USB_HID_Descriptor_HID_t);
- break;
- case CONSOLE_INTERFACE:
- Address = &ConfigurationDescriptor.Console_HID;
- Size = sizeof(USB_HID_Descriptor_HID_t);
- break;
- case EXTRA_INTERFACE:
- Address = &ConfigurationDescriptor.Extra_HID;
- Size = sizeof(USB_HID_Descriptor_HID_t);
- break;
- }
- break;
- case HID_DTYPE_Report:
- switch (wIndex) {
- case KEYBOARD_INTERFACE:
- Address = &KeyboardReport;
- Size = sizeof(KeyboardReport);
- break;
- case MOUSE_INTERFACE:
- Address = &MouseReport;
- Size = sizeof(MouseReport);
- break;
- case CONSOLE_INTERFACE:
- Address = &ConsoleReport;
- Size = sizeof(ConsoleReport);
- break;
- case EXTRA_INTERFACE:
- Address = &ExtraReport;
- Size = sizeof(ExtraReport);
- break;
- }
- break;
- }
-
- *DescriptorAddress = Address;
- return Size;
-}
+++ /dev/null
-/*
- 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 Keyboard_Interface;
- USB_HID_Descriptor_HID_t Keyboard_HID;
- USB_Descriptor_Endpoint_t Keyboard_INEndpoint;
-
- // Mouse HID Interface
- USB_Descriptor_Interface_t Mouse_Interface;
- USB_HID_Descriptor_HID_t Mouse_HID;
- USB_Descriptor_Endpoint_t Mouse_INEndpoint;
-
- // Console HID Interface
- USB_Descriptor_Interface_t Console_Interface;
- USB_HID_Descriptor_HID_t Console_HID;
- USB_Descriptor_Endpoint_t Console_INEndpoint;
- USB_Descriptor_Endpoint_t Console_OUTEndpoint;
-
- // Extra HID Interface
- USB_Descriptor_Interface_t Extra_Interface;
- USB_HID_Descriptor_HID_t Extra_HID;
- USB_Descriptor_Endpoint_t Extra_INEndpoint;
-} USB_Descriptor_Configuration_t;
-
-
-/* nubmer of interfaces */
-#define TOTAL_INTERFACES 4
-
-/* index of interface */
-#define KEYBOARD_INTERFACE 0
-#define MOUSE_INTERFACE 1
-#define CONSOLE_INTERFACE 2
-#define EXTRA_INTERFACE 3
-
-// Endopoint number and size
-#define KEYBOARD_IN_EPNUM 1
-#define MOUSE_IN_EPNUM 2
-#define CONSOLE_IN_EPNUM 3
-#define CONSOLE_OUT_EPNUM 4
-#define EXTRA_IN_EPNUM 5
-
-#define KEYBOARD_EPSIZE 8
-#define MOUSE_EPSIZE 8
-#define CONSOLE_EPSIZE 8
-#define EXTRA_EPSIZE 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
+++ /dev/null
-/*
-Copyright 2011 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * Keymap for Macway mod
- */
-#include <stdint.h>
-#include <stdbool.h>
-#include <avr/pgmspace.h>
-#include "usb_keycodes.h"
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "keymap.h"
-
-
-// Convert physical keyboard layout to matrix array.
-// This is a macro to define keymap easily in keyboard layout form.
-#define KEYMAP( \
- K11, K10, K20, K30, K40, K41, K51, K50, K60, K70, K80, K81, K61, K02, \
- K12, K13, K23, K33, K43, K42, K52, K53, K63, K73, K83, K82, K62, K01, \
- K15, K14, K24, K34, K44, K45, K55, K54, K64, K74, K84, K85, K06, \
- K67, K16, K26, K36, K46, K47, K57, K56, K66, K76, K87, K32, K35, \
- K75, K22, K00, K07, K21, K04, K37, K27, K17 \
-) { \
- { KB_##K00, KB_##K01, KB_##K02, KB_NO, KB_##K04, KB_NO, KB_##K06, KB_##K07 }, \
- { KB_##K10, KB_##K11, KB_##K12, KB_##K13, KB_##K14, KB_##K15, KB_##K16, KB_##K17 }, \
- { KB_##K20, KB_##K21, KB_##K22, KB_##K23, KB_##K24, KB_NO, KB_##K26, KB_##K27 }, \
- { KB_##K30, KB_NO, KB_##K32, KB_##K33, KB_##K34, KB_##K35, KB_##K36, KB_##K37 }, \
- { KB_##K40, KB_##K41, KB_##K42, KB_##K43, KB_##K44, KB_##K45, KB_##K46, KB_##K47 }, \
- { KB_##K50, KB_##K51, KB_##K52, KB_##K53, KB_##K54, KB_##K55, KB_##K56, KB_##K57 }, \
- { KB_##K60, KB_##K61, KB_##K62, KB_##K63, KB_##K64, KB_NO, KB_##K66, KB_##K67 }, \
- { KB_##K70, KB_NO, KB_NO, KB_##K73, KB_##K74, KB_##K75, KB_##K76, KB_NO }, \
- { KB_##K80, KB_##K81, KB_##K82, KB_##K83, KB_##K84, KB_##K85, KB_NO, KB_##K87 } \
-}
-
-#define KEYCODE(layer, row, col) (pgm_read_byte(&keymaps[(layer)][(row)][(col)]))
-
-
-// Assign Fn key(0-7) to a layer to which switch with the Fn key pressed.
-static const uint8_t PROGMEM fn_layer[] = {
- 0, // Fn0
- 1, // Fn1
- 2, // Fn2
- 3, // Fn3
- 4, // Fn4
- 0, // Fn5
- 3, // Fn6
- 3 // Fn7
-};
-
-// Assign Fn key(0-7) to a keycode sent when release Fn key without use of the layer.
-// See layer.c for details.
-static const uint8_t PROGMEM fn_keycode[] = {
- KB_NO, // Fn0
- KB_NO, // Fn1
- KB_SLSH, // Fn2
- KB_SCLN, // Fn3
- KB_SPC, // Fn4
- KB_NO, // Fn5
- KB_NO, // Fn6
- KB_NO // Fn7
-};
-
-static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = {
- /* Layer 0: Default Layer
- * ,-----------------------------------------------------------.
- * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =|Backsp |
- * |-----------------------------------------------------------|
- * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]| |
- * |-----------------------------------------------------' |
- * |Contro| A| S| D| F| G| H| J| K| L|Fn3| '|Return |
- * |-----------------------------------------------------------|
- * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Fn1|
- * |-----------------------------------------------------------|
- * |Fn7|Gui |Alt |Fn4 |Alt |Gui|Fn6|Fn6|Ctr|
- * `-----------------------------------------------------------'
- */
- KEYMAP(ESC, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, MINS,EQL, BSPC, \
- TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \
- LCTL,A, S, D, F, G, H, J, K, L, FN3, QUOT,ENT, \
- LSFT,Z, X, C, V, B, N, M, COMM,DOT, FN2, RSFT,FN1, \
- FN7, LGUI,LALT,FN4, RALT,BSLS,FN6, FN6, RCTL),
-
-
- /* Layer 1: HHKB mode (HHKB Fn)
- * ,-----------------------------------------------------------.
- * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete |
- * |-----------------------------------------------------------|
- * |Caps | | | | | | | |Psc|Slk|Pus|Up | | |
- * |-----------------------------------------------------' |
- * |Contro|VoD|VoU|Mut| | | *| /|Hom|PgU|Lef|Rig|Enter |
- * |-----------------------------------------------------------|
- * |Shift | | | | | | +| -|End|PgD|Dow|Shift |xxx|
- * |-----------------------------------------------------------|
- * | |Gui |Alt | |Alt |Gui| | |Ctr|
- * `-----------------------------------------------------------'
- */
- KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, \
- CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,BRK, UP, NO, NO, \
- LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \
- LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,FN1, \
- NO, LGUI,LALT,SPC, RALT,NO, NO, NO, RCTL),
-
-
- /* Layer 2: Vi mode (Quote/Rmeta)
- * ,-----------------------------------------------------------.
- * | `| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| ` |
- * |-----------------------------------------------------------|
- * | \ |Hom|PgD|Up |PgU|End|Hom|PgD|PgU|End| | | | |
- * |-----------------------------------------------------' |
- * |Contro| |Lef|Dow|Rig| |Lef|Dow|Up |Rig| | | \ |
- * |-----------------------------------------------------------|
- * |Shift | | | | | |Hom|PgD|PgU|End|xxx|Shift | |
- * |-----------------------------------------------------------|
- * | |Gui |Alt |Space |Alt |Gui|Fn6|Fn6|Ctr|
- * `-----------------------------------------------------------'
- */
- KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, GRV, \
- BSLS,HOME,PGDN,UP, PGUP,END, HOME,PGDN,PGUP,END, NO, NO, NO, NO, \
- LCTL,NO, LEFT,DOWN,RGHT,NO, LEFT,DOWN,UP, RGHT,NO, NO, BSLS, \
- LSFT,NO, NO, NO, NO, NO, HOME,PGDN,PGUP,END, FN2, RSFT,NO, \
- NO, LGUI,LALT,SPC, RALT,RGUI,FN6, FN6, RCTL),
-
-
- /* Layer 3: Mouse mode (Semicolon)
- * ,-----------------------------------------------------------.
- * | `| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12| ` |
- * |-----------------------------------------------------------|
- * | \ |MwL|MwD|McU|MwU|MwR|MwL|MwD|MwU|MwR| | | | |
- * |-----------------------------------------------------' |
- * |Contro| |McL|McD|McR| |McL|McD|McU|McR|xxx| | \ |
- * |-----------------------------------------------------------|
- * |Shift | | |Mb1|Mb2|Mb3|Mb2|Mb1| | | |Shift | |
- * |-----------------------------------------------------------|
- * |xxx|Gui |Alt |Mb1 |Alt | | | | |
- * `-----------------------------------------------------------'
- * Mc: Mouse Cursor / Mb: Mouse Button / Mw: Mouse Wheel
- */
- KEYMAP(GRV, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, GRV, \
- BSLS,WH_L,WH_D,MS_U,WH_U,WH_R,WH_L,WH_D,WH_U,WH_R,NO, NO, NO, NO, \
- LCTL,NO, MS_L,MS_D,MS_R,NO, MS_L,MS_D,MS_U,MS_R,FN3, NO, BSLS, \
- LSFT,NO, NO, BTN1,BTN2,BTN3,BTN2,BTN1,NO, NO, NO, RSFT,NO, \
- FN7, LGUI,LALT,BTN1,RALT,NO, FN6, FN6, NO),
-
-
- /* Layer 4: Matias half keyboard style (Space)
- * ,-----------------------------------------------------------.
- * |Esc| F1| F2| F3| F4| F5| F6| F7| F8| F9|F10|F11|F12|Delete |
- * |-----------------------------------------------------------|
- * |Backs| P| O| I| U| Y| T| R| E| W| Q|Tab|Tab| |
- * |-----------------------------------------------------' |
- * |Contro| ;| L| K| J| H| G| F| D| S| A|Con|Control |
- * |-----------------------------------------------------------|
- * |Shift | /| .| ,| M| N| B| V| C| X| Z|Shift | |
- * |-----------------------------------------------------------|
- * | |Gui |Alt |xxxxxxxxxxxxxxxxxxxxxx|Alt |Gui| | |Ctr|
- * `-----------------------------------------------------------'
- */
- KEYMAP(MINS,0, 9, 8, 7, 6, 5, 4, 3, 2, 1, NO, NO, ESC, \
- BSPC,P, O, I, U, Y, T, R, E, W, Q, TAB, TAB, TAB, \
- LCTL,SCLN,L, K, J, H, G, F, D, S, A, RCTL,RCTL, \
- LSFT,SLSH,DOT, COMM,M, N, B, V, C, X, Z, RSFT,NO, \
- NO, LGUI,LALT,FN4, RALT,RGUI,NO, NO, RCTL),
-};
-
-
-uint8_t keymap_get_keycode(uint8_t layer, uint8_t row, uint8_t col)
-{
- return KEYCODE(layer, row, col);
-}
-
-uint8_t keymap_fn_layer(uint8_t fn_bits)
-{
- return pgm_read_byte(&fn_layer[biton(fn_bits)]);
-}
-
-uint8_t keymap_fn_keycode(uint8_t fn_bits)
-{
- return pgm_read_byte(&fn_keycode[(biton(fn_bits))]);
-}
+++ /dev/null
-/*
-Copyright 2011 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-#include "stdint.h"
-#include "led.h"
-
-
-void led_set(uint8_t usb_led)
-{
-}
+++ /dev/null
-/*
- * Copyright 2012 Jun Wako <wakojun@gmail.com>
- * This file is based on:
- * LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse
- * LUFA-120219/Demos/Device/Lowlevel/GenericHID
- */
-
-/*
- 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.
-*/
-
-#include "report.h"
-#include "host.h"
-#include "host_driver.h"
-#include "keyboard.h"
-#include "sendchar.h"
-#include "debug.h"
-
-#include "descriptor.h"
-#include "lufa.h"
-
-static uint8_t keyboard_led_stats = 0;
-
-// 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);
-static void send_keyboard(report_keyboard_t *report);
-static void send_mouse(report_mouse_t *report);
-static void send_system(uint16_t data);
-static void send_consumer(uint16_t data);
-static host_driver_t lufa_driver = {
- keyboard_leds,
- send_keyboard,
- send_mouse,
- send_system,
- send_consumer
-};
-
-
-static void SetupHardware(void);
-static void Console_HID_Task(void);
-
-int main(void)
-{
- SetupHardware();
- sei();
-
- print_enable = true;
- debug_enable = true;
- debug_matrix = true;
- debug_keyboard = true;
- debug_mouse = true;
-
-/* 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();
-
- Console_HID_Task();
- USB_USBTask();
- }
-}
-
-void SetupHardware(void)
-{
- /* Disable watchdog if enabled by bootloader/fuses */
- MCUSR &= ~(1 << WDRF);
- wdt_disable();
-
- /* Disable clock division */
- clock_prescale_set(clock_div_1);
-
- USB_Init();
-}
-
-static void Console_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(CONSOLE_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 ConsoleData[CONSOLE_EPSIZE];
-
- /* Read Console Report Data */
- Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL);
-
- /* Process Console Report Data */
- //ProcessConsoleHIDReport(ConsoleData);
- }
-
- /* Finalize the stream transfer to send the last packet */
- Endpoint_ClearOUT();
- }
-
- /* IN packet */
- Endpoint_SelectEndpoint(CONSOLE_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)
-{
-}
-
-/** Event handler for the USB_Disconnect event. */
-void EVENT_USB_Device_Disconnect(void)
-{
-}
-
-/** Event handler for the USB_ConfigurationChanged event.
- * This is fired when the host sets the current configuration of the USB device after enumeration.
- */
-void EVENT_USB_Device_ConfigurationChanged(void)
-{
- bool ConfigSuccess = true;
-
- /* Setup Keyboard HID Report Endpoints */
- ConfigSuccess &= Endpoint_ConfigureEndpoint(KEYBOARD_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
- KEYBOARD_EPSIZE, ENDPOINT_BANK_SINGLE);
-
- /* Setup Mouse HID Report Endpoint */
- ConfigSuccess &= Endpoint_ConfigureEndpoint(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
- MOUSE_EPSIZE, ENDPOINT_BANK_SINGLE);
-
- /* Setup Console HID Report Endpoints */
- ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
- CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE);
- ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
- CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE);
-
- /* Setup Extra HID Report Endpoint */
- ConfigSuccess &= Endpoint_ConfigureEndpoint(EXTRA_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
- EXTRA_EPSIZE, ENDPOINT_BANK_SINGLE);
-}
-
-/*
-Appendix G: HID Request Support Requirements
-
-The following table enumerates the requests that need to be supported by various types of HID class devices.
-
-Device type GetReport SetReport GetIdle SetIdle GetProtocol SetProtocol
-------------------------------------------------------------------------------------------
-Boot Mouse Required Optional Optional Optional Required Required
-Non-Boot Mouse Required Optional Optional Optional Optional Optional
-Boot Keyboard Required Optional Required Required Required Required
-Non-Boot Keybrd Required Optional Required Required Optional Optional
-Other Device Required Optional Optional Optional Optional Optional
-*/
-/** Event handler for the USB_ControlRequest event.
- * This is fired before passing along unhandled control requests to the library for processing internally.
- */
-void EVENT_USB_Device_ControlRequest(void)
-{
- uint8_t* ReportData = NULL;
- uint8_t ReportSize = 0;
-
- /* Handle HID Class specific requests */
- switch (USB_ControlRequest.bRequest)
- {
- case HID_REQ_GetReport:
- if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
- {
- Endpoint_ClearSETUP();
-
- // Interface
- switch (USB_ControlRequest.wIndex) {
- case KEYBOARD_INTERFACE:
- // TODO: test/check
- ReportData = (uint8_t*)&keyboard_report_sent;
- ReportSize = sizeof(keyboard_report_sent);
- break;
- case MOUSE_INTERFACE:
- // TODO: test/check
- ReportData = (uint8_t*)&mouse_report_sent;
- ReportSize = sizeof(mouse_report_sent);
- break;
- case CONSOLE_INTERFACE:
- break;
- case EXTRA_INTERFACE:
- break;
- }
-
- /* Write the report data to the control endpoint */
- Endpoint_Write_Control_Stream_LE(ReportData, ReportSize);
- Endpoint_ClearOUT();
- }
-
- break;
- case HID_REQ_SetReport:
- if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
- {
- Endpoint_ClearSETUP();
-
- /* Wait until the LED report has been sent by the host */
- while (!(Endpoint_IsOUTReceived()))
- {
- if (USB_DeviceState == DEVICE_STATE_Unattached)
- return;
- }
-
- // Interface
- switch (USB_ControlRequest.wIndex) {
- case KEYBOARD_INTERFACE:
- // TODO: test/check
- /* Read in the LED report from the host */
- keyboard_led_stats = Endpoint_Read_8();
- break;
- case MOUSE_INTERFACE:
- break;
- case CONSOLE_INTERFACE:
- break;
- case EXTRA_INTERFACE:
- break;
- }
-
- Endpoint_ClearOUT();
- Endpoint_ClearStatusStage();
- }
-
- break;
- }
-}
-
-/*******************************************************************************
- * Host driver
- ******************************************************************************/
-static uint8_t keyboard_leds(void)
-{
- return keyboard_led_stats;
-}
-
-static void send_keyboard(report_keyboard_t *report)
-{
- // TODO: handle NKRO report
- /* Select the Keyboard Report Endpoint */
- Endpoint_SelectEndpoint(KEYBOARD_IN_EPNUM);
-
- /* Check if Keyboard Endpoint Ready for Read/Write */
- if (Endpoint_IsReadWriteAllowed())
- {
- /* Write Keyboard Report Data */
- Endpoint_Write_Stream_LE(report, sizeof(report_keyboard_t), NULL);
-
- /* Finalize the stream transfer to send the last packet */
- Endpoint_ClearIN();
- }
- keyboard_report_sent = *report;
-}
-
-static void send_mouse(report_mouse_t *report)
-{
- /* Select the Mouse Report Endpoint */
- Endpoint_SelectEndpoint(MOUSE_IN_EPNUM);
-
- /* Check if Mouse Endpoint Ready for Read/Write */
- if (Endpoint_IsReadWriteAllowed())
- {
- /* Write Mouse Report Data */
- Endpoint_Write_Stream_LE(report, sizeof(report_mouse_t), NULL);
-
- /* Finalize the stream transfer to send the last packet */
- Endpoint_ClearIN();
- }
- mouse_report_sent = *report;
-}
-
-typedef struct {
- uint8_t report_id;
- uint16_t usage;
-} __attribute__ ((packed)) report_extra_t;
-
-static void send_system(uint16_t data)
-{
- Endpoint_SelectEndpoint(EXTRA_IN_EPNUM);
- if (Endpoint_IsReadWriteAllowed()) {
- report_extra_t r = {
- .report_id = REPORT_ID_SYSTEM,
- .usage = data
- };
- Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
- Endpoint_ClearIN();
- }
-}
-
-static void send_consumer(uint16_t data)
-{
- Endpoint_SelectEndpoint(EXTRA_IN_EPNUM);
- if (Endpoint_IsReadWriteAllowed()) {
- report_extra_t r = {
- .report_id = REPORT_ID_CONSUMER,
- .usage = data
- };
- Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
- Endpoint_ClearIN();
- }
-}
-
-
-/*******************************************************************************
- * sendchar
- ******************************************************************************/
-int8_t sendchar(uint8_t c)
-{
- if (USB_DeviceState != DEVICE_STATE_Configured)
- return -1;
-
- Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM);
-
- uint8_t timeout = 10;
- uint16_t prevFN = USB_Device_GetFrameNumber();
- while (!Endpoint_IsINReady()) {
- switch (USB_DeviceState) {
- case DEVICE_STATE_Unattached:
- case DEVICE_STATE_Suspended:
- return -1;
- }
- if (Endpoint_IsStalled())
- return -1;
- if (prevFN != USB_Device_GetFrameNumber()) {
- if (!(timeout--))
- return -1;
- prevFN = USB_Device_GetFrameNumber();
- }
- }
-
- Endpoint_Write_8(c);
-
- // send when packet is full
- if (!Endpoint_IsReadWriteAllowed())
- Endpoint_ClearIN();
-
- return 0;
-}
+++ /dev/null
-/*
- 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
+++ /dev/null
-/*
-Copyright 2011 Jun Wako <wakojun@gmail.com>
-
-This program is free software: you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation, either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program. If not, see <http://www.gnu.org/licenses/>.
-*/
-
-/*
- * scan matrix
- */
-#include <stdint.h>
-#include <stdbool.h>
-#include <avr/io.h>
-#include <util/delay.h>
-#include "print.h"
-#include "debug.h"
-#include "util.h"
-#include "matrix.h"
-
-
-#if (MATRIX_COLS > 16)
-# error "MATRIX_COLS must not exceed 16"
-#endif
-#if (MATRIX_ROWS > 255)
-# error "MATRIX_ROWS must not exceed 255"
-#endif
-
-
-#ifndef DEBOUNCE
-# define DEBOUNCE 0
-#endif
-static uint8_t debouncing = DEBOUNCE;
-
-// matrix state buffer(1:on, 0:off)
-#if (MATRIX_COLS <= 8)
-static uint8_t *matrix;
-static uint8_t *matrix_prev;
-static uint8_t _matrix0[MATRIX_ROWS];
-static uint8_t _matrix1[MATRIX_ROWS];
-#else
-static uint16_t *matrix;
-static uint16_t *matrix_prev;
-static uint16_t _matrix0[MATRIX_ROWS];
-static uint16_t _matrix1[MATRIX_ROWS];
-#endif
-
-#ifdef MATRIX_HAS_GHOST
-static bool matrix_has_ghost_in_row(uint8_t row);
-#endif
-static uint8_t read_col(void);
-static void unselect_rows(void);
-static void select_row(uint8_t row);
-
-
-inline
-uint8_t matrix_rows(void)
-{
- return MATRIX_ROWS;
-}
-
-inline
-uint8_t matrix_cols(void)
-{
- return MATRIX_COLS;
-}
-
-void matrix_init(void)
-{
- // initialize row and col
- unselect_rows();
- // Input with pull-up(DDR:0, PORT:1)
- DDRB = 0x00;
- PORTB = 0xFF;
-
- // initialize matrix state: all keys off
- for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix0[i] = 0x00;
- for (uint8_t i=0; i < MATRIX_ROWS; i++) _matrix1[i] = 0x00;
- matrix = _matrix0;
- matrix_prev = _matrix1;
-}
-
-uint8_t matrix_scan(void)
-{
- if (!debouncing) {
- uint8_t *tmp = matrix_prev;
- matrix_prev = matrix;
- matrix = tmp;
- }
-
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- unselect_rows();
- select_row(i);
- _delay_us(30); // without this wait read unstable value.
- if (matrix[i] != (uint8_t)~read_col()) {
- matrix[i] = (uint8_t)~read_col();
- if (debouncing) {
- debug("bounce!: "); debug_hex(debouncing); print("\n");
- }
- debouncing = DEBOUNCE;
- }
- }
- unselect_rows();
-
- if (debouncing) {
- debouncing--;
- }
-
- return 1;
-}
-
-bool matrix_is_modified(void)
-{
- if (debouncing) return false;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- if (matrix[i] != matrix_prev[i]) {
- return true;
- }
- }
- return false;
-}
-
-inline
-bool matrix_has_ghost(void)
-{
-#ifdef MATRIX_HAS_GHOST
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
- if (matrix_has_ghost_in_row(i))
- return true;
- }
-#endif
- return false;
-}
-
-inline
-bool matrix_is_on(uint8_t row, uint8_t col)
-{
- return (matrix[row] & (1<<col));
-}
-
-inline
-#if (MATRIX_COLS <= 8)
-uint8_t matrix_get_row(uint8_t row)
-#else
-uint16_t matrix_get_row(uint8_t row)
-#endif
-{
- return matrix[row];
-}
-
-void matrix_print(void)
-{
- print("\nr/c 01234567\n");
- for (uint8_t row = 0; row < matrix_rows(); row++) {
- phex(row); print(": ");
-#if (MATRIX_COLS <= 8)
- pbin_reverse(matrix_get_row(row));
-#else
- pbin_reverse16(matrix_get_row(row));
-#endif
-#ifdef MATRIX_HAS_GHOST
- if (matrix_has_ghost_in_row(row)) {
- print(" <ghost");
- }
-#endif
- print("\n");
- }
-}
-
-uint8_t matrix_key_count(void)
-{
- uint8_t count = 0;
- for (uint8_t i = 0; i < MATRIX_ROWS; i++) {
-#if (MATRIX_COLS <= 8)
- count += bitpop(matrix[i]);
-#else
- count += bitpop16(matrix[i]);
-#endif
- }
- return count;
-}
-
-#ifdef MATRIX_HAS_GHOST
-inline
-static bool matrix_has_ghost_in_row(uint8_t row)
-{
- // no ghost exists in case less than 2 keys on
- if (((matrix[row] - 1) & matrix[row]) == 0)
- return false;
-
- // ghost exists in case same state as other row
- for (uint8_t i=0; i < MATRIX_ROWS; i++) {
- if (i != row && (matrix[i] & matrix[row]) == matrix[row])
- return true;
- }
- return false;
-}
-#endif
-
-inline
-static uint8_t read_col(void)
-{
- return PINB;
-}
-
-inline
-static void unselect_rows(void)
-{
- // Hi-Z(DDR:0, PORT:0) to unselect
- DDRC &= ~0b01000000; // PC: 6
- PORTC &= ~0b11000000;
- DDRD &= ~0b11100111; // PD: 7,6,5,2,1,0
- PORTD &= ~0b11000111;
- DDRF &= ~0b11000000; // PF: 7,6
- PORTF &= ~0b11000000;
-}
-
-inline
-static void select_row(uint8_t row)
-{
- // Output low(DDR:1, PORT:0) to select
- // row: 0 1 2 3 4 5 6 7 8
- // pin: PD0, PD5, PD7, PF6, PD6, PD1, PD2, PC6, PF7
- switch (row) {
- case 0:
- DDRD |= (1<<0);
- PORTD &= ~(1<<0);
- break;
- case 1:
- DDRD |= (1<<5);
- PORTD &= ~(1<<5);
- break;
- case 2:
- DDRD |= (1<<7);
- PORTD &= ~(1<<7);
- break;
- case 3:
- DDRF |= (1<<6);
- PORTF &= ~(1<<6);
- break;
- case 4:
- DDRD |= (1<<6);
- PORTD &= ~(1<<6);
- break;
- case 5:
- DDRD |= (1<<1);
- PORTD &= ~(1<<1);
- break;
- case 6:
- DDRD |= (1<<2);
- PORTD &= ~(1<<2);
- break;
- case 7:
- DDRC |= (1<<6);
- PORTC &= ~(1<<6);
- break;
- case 8:
- DDRF |= (1<<7);
- PORTF &= ~(1<<7);
- break;
- }
-}
+++ /dev/null
-# Target file name (without extension).
-TARGET = macway
-
-# Directory common source filess exist
-TOP_DIR = ../..
-
-# Directory keyboard dependent files exist
-TARGET_DIR = .
-
-# keyboard dependent files
-SRC = main.c \
- keymap.c \
- matrix.c \
- led.c
-
-CONFIG_H = config.h
-
-
-# MCU name, you MUST set this to match the board you are using
-# type "make clean" after changing this, so all files will be rebuilt
-#MCU = at90usb162 # Teensy 1.0
-MCU = atmega32u4 # Teensy 2.0
-#MCU = at90usb646 # Teensy++ 1.0
-#MCU = at90usb1286 # Teensy++ 2.0
-
-
-# Processor frequency.
-# Normally the first thing your program should do is set the clock prescaler,
-# so your program will run at the correct speed. You should also set this
-# variable to same clock speed. The _delay_ms() macro uses this, and many
-# examples use this variable to calculate timings. Do not add a "UL" here.
-F_CPU = 16000000
-
-
-# Build Options
-# comment out to disable the options.
-#
-MOUSEKEY_ENABLE = yes # Mouse keys
-#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support
-EXTRAKEY_ENABLE = yes # Audio control and System control
-#NKRO_ENABLE = yes # USB Nkey Rollover
-
-
-
-#---------------- Programming Options --------------------------
-PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
-
-
-
-include $(TOP_DIR)/protocol/pjrc.mk
-include $(TOP_DIR)/protocol.mk
-include $(TOP_DIR)/common.mk
-include $(TOP_DIR)/rules.mk
--- /dev/null
+#----------------------------------------------------------------------------
+# 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.
+# Please customize your programmer settings(PROGRAM_CMD)
+#
+# make teensy = Download the hex file to the device, using teensy_loader_cli.
+# (must have teensy_loader_cli installed).
+#
+# 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 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".
+#----------------------------------------------------------------------------
+
+# Target file name (without extension).
+TARGET = macway_lufa
+
+# Directory common source filess exist
+TOP_DIR = ../..
+
+# Directory keyboard dependent files exist
+TARGET_DIR = .
+
+
+# List C source files here. (C dependencies are automatically generated.)
+SRC += keymap.c \
+ matrix.c \
+ led.c \
+ protocol/pjrc/bootloader_teensy.c
+
+CONFIG_H = config.h
+
+
+# MCU name
+#MCU = at90usb1287
+MCU = atmega32u4
+
+# 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
+
+
+#
+# LUFA specific
+#
+# Target architecture (see library "Board Types" documentation).
+ARCH = AVR8
+
+# 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)
+
+
+
+# Build Options
+# comment out to disable the options.
+#
+MOUSEKEY_ENABLE = yes # Mouse keys
+#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support
+EXTRAKEY_ENABLE = yes # Audio control and System control
+#NKRO_ENABLE = yes # USB Nkey Rollover
+
+
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TOP_DIR)
+
+include $(TOP_DIR)/protocol/lufa.mk
+include $(TOP_DIR)/common.mk
+include $(TOP_DIR)/rules.mk
--- /dev/null
+#----------------------------------------------------------------------------
+# 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.
+# Please customize your programmer settings(PROGRAM_CMD)
+#
+# make teensy = Download the hex file to the device, using teensy_loader_cli.
+# (must have teensy_loader_cli installed).
+#
+# 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 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".
+#----------------------------------------------------------------------------
+
+# Target file name (without extension).
+TARGET = macway_pjrc
+
+# Directory common source filess exist
+TOP_DIR = ../..
+
+# Directory keyboard dependent files exist
+TARGET_DIR = .
+
+# keyboard dependent files
+SRC = protocol/pjrc/main.c \
+ keymap.c \
+ matrix.c \
+ led.c
+
+CONFIG_H = config.h
+
+
+# MCU name, you MUST set this to match the board you are using
+# type "make clean" after changing this, so all files will be rebuilt
+#MCU = at90usb162 # Teensy 1.0
+MCU = atmega32u4 # Teensy 2.0
+#MCU = at90usb646 # Teensy++ 1.0
+#MCU = at90usb1286 # Teensy++ 2.0
+
+
+# Processor frequency.
+# Normally the first thing your program should do is set the clock prescaler,
+# so your program will run at the correct speed. You should also set this
+# variable to same clock speed. The _delay_ms() macro uses this, and many
+# examples use this variable to calculate timings. Do not add a "UL" here.
+F_CPU = 16000000
+
+
+# Build Options
+# comment out to disable the options.
+#
+MOUSEKEY_ENABLE = yes # Mouse keys
+#PS2_MOUSE_ENABLE = yes # PS/2 mouse(TrackPoint) support
+EXTRAKEY_ENABLE = yes # Audio control and System control
+#NKRO_ENABLE = yes # USB Nkey Rollover
+
+
+
+#---------------- Programming Options --------------------------
+PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex
+
+
+
+# Search Path
+VPATH += $(TARGET_DIR)
+VPATH += $(TOP_DIR)
+
+include $(TOP_DIR)/protocol/pjrc.mk
+include $(TOP_DIR)/common.mk
+include $(TOP_DIR)/rules.mk
/* controller configuration */
#include "controller_teensy.h"
+
+/* USB Device descriptor parameter */
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0xBEE0
+#define DEVICE_VER 0x0202
#define MANUFACTURER t.m.k.
#define PRODUCT Macway mod
+
+
+/* message strings */
#define DESCRIPTION t.m.k. keyboard firmware for Macway mod
3, // Fn3
4, // Fn4
0, // Fn5
- 2, // Fn6
+ 3, // Fn6
3 // Fn7
};
TAB, Q, W, E, R, T, Y, U, I, O, P, LBRC,RBRC,BSLS, \
LCTL,A, S, D, F, G, H, J, K, L, FN3, QUOT,ENT, \
LSFT,Z, X, C, V, B, N, M, COMM,DOT, FN2, RSFT,FN1, \
- FN7, LGUI,LALT,FN4, RALT,BSLS,GRV, FN6, RCTL),
+ FN7, LGUI,LALT,FN4, RALT,GRV, FN6, FN6, RCTL),
/* Layer 1: HHKB mode (HHKB Fn)
* | |Gui |Alt | |Alt |Gui| | |Ctr|
* `-----------------------------------------------------------'
*/
- KEYMAP(ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, \
+ KEYMAP(PWR, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, DEL, \
CAPS,NO, NO, NO, NO, NO, NO, NO, PSCR,SLCK,BRK, UP, NO, NO, \
LCTL,VOLD,VOLU,MUTE,NO, NO, PAST,PSLS,HOME,PGUP,LEFT,RGHT,ENT, \
LSFT,NO, NO, NO, NO, NO, PPLS,PMNS,END, PGDN,DOWN,RSFT,FN1, \
BSLS,WH_L,WH_D,MS_U,WH_U,WH_R,WH_L,WH_D,WH_U,WH_R,NO, NO, NO, NO, \
LCTL,NO, MS_L,MS_D,MS_R,NO, MS_L,MS_D,MS_U,MS_R,FN3, NO, BSLS, \
LSFT,NO, NO, BTN1,BTN2,BTN3,BTN2,BTN1,NO, NO, NO, RSFT,NO, \
- FN7, LGUI,LALT,BTN1,RALT,NO, NO, NO, NO),
+ FN7, LGUI,LALT,BTN1,RALT,NO, FN6, FN6, NO),
/* Layer 4: Matias half keyboard style (Space)
--- /dev/null
+LUFA_DIR = protocol/lufa
+
+# Path to the LUFA library
+LUFA_PATH = $(TOP_DIR)/protocol/lufa/LUFA-120219
+
+# Create the LUFA source path variables by including the LUFA root makefile
+include $(LUFA_PATH)/LUFA/makefile
+
+LUFA_SRC = $(LUFA_DIR)/lufa.c \
+ $(LUFA_DIR)/descriptor.c \
+ $(LUFA_SRC_USB)
+SRC += $(subst $(LUFA_PATH)/,,$(LUFA_SRC))
+
+# Search Path
+VPATH += $(LUFA_PATH)
+
+# Option modules
+#ifdef $(or MOUSEKEY_ENABLE, PS2_MOUSE_ENABLE)
+#endif
+
+#ifdef EXTRAKEY_ENABLE
+#endif
+
+# 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_USB=$(F_USB)UL
+OPT_DEFS += -DARCH=ARCH_$(ARCH)
+OPT_DEFS += $(LUFA_OPTS)
+OPT_DEFS += -DHOST_LUFA
--- /dev/null
+/*
+ * Copyright 2012 Jun Wako <wakojun@gmail.com>
+ * This file is based on:
+ * LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse
+ * LUFA-120219/Demos/Device/Lowlevel/GenericHID
+ */
+
+/*
+ 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.
+*/
+
+#include "util.h"
+#include "report.h"
+#include "descriptor.h"
+
+
+/*******************************************************************************
+ * HID Report Descriptors
+ ******************************************************************************/
+const USB_Descriptor_HIDReport_Datatype_t PROGMEM KeyboardReport[] =
+{
+ HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
+ HID_RI_USAGE(8, 0x06), /* Keyboard */
+ HID_RI_COLLECTION(8, 0x01), /* Application */
+ HID_RI_USAGE_PAGE(8, 0x07), /* Key Codes */
+ HID_RI_USAGE_MINIMUM(8, 0xE0), /* Keyboard Left Control */
+ HID_RI_USAGE_MAXIMUM(8, 0xE7), /* Keyboard Right GUI */
+ HID_RI_LOGICAL_MINIMUM(8, 0x00),
+ HID_RI_LOGICAL_MAXIMUM(8, 0x01),
+ HID_RI_REPORT_SIZE(8, 0x01),
+ HID_RI_REPORT_COUNT(8, 0x08),
+ HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
+ HID_RI_REPORT_COUNT(8, 0x01),
+ HID_RI_REPORT_SIZE(8, 0x08),
+ HID_RI_INPUT(8, HID_IOF_CONSTANT),
+ HID_RI_USAGE_PAGE(8, 0x08), /* LEDs */
+ HID_RI_USAGE_MINIMUM(8, 0x01), /* Num Lock */
+ HID_RI_USAGE_MAXIMUM(8, 0x05), /* Kana */
+ HID_RI_REPORT_COUNT(8, 0x05),
+ HID_RI_REPORT_SIZE(8, 0x01),
+ HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
+ HID_RI_REPORT_COUNT(8, 0x01),
+ HID_RI_REPORT_SIZE(8, 0x03),
+ HID_RI_OUTPUT(8, HID_IOF_CONSTANT),
+ HID_RI_LOGICAL_MINIMUM(8, 0x00),
+ HID_RI_LOGICAL_MAXIMUM(8, 0x65),
+ HID_RI_USAGE_PAGE(8, 0x07), /* Keyboard */
+ HID_RI_USAGE_MINIMUM(8, 0x00), /* Reserved (no event indicated) */
+ HID_RI_USAGE_MAXIMUM(8, 0x65), /* Keyboard Application */
+ HID_RI_REPORT_COUNT(8, 0x06),
+ HID_RI_REPORT_SIZE(8, 0x08),
+ HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
+ HID_RI_END_COLLECTION(0),
+};
+
+const USB_Descriptor_HIDReport_Datatype_t PROGMEM MouseReport[] =
+{
+ HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
+ HID_RI_USAGE(8, 0x02), /* Mouse */
+ HID_RI_COLLECTION(8, 0x01), /* Application */
+ HID_RI_USAGE(8, 0x01), /* Pointer */
+ HID_RI_COLLECTION(8, 0x00), /* Physical */
+
+ HID_RI_USAGE_PAGE(8, 0x09), /* Button */
+ HID_RI_USAGE_MINIMUM(8, 0x01), /* Button 1 */
+ HID_RI_USAGE_MAXIMUM(8, 0x05), /* Button 5 */
+ HID_RI_LOGICAL_MINIMUM(8, 0x00),
+ HID_RI_LOGICAL_MAXIMUM(8, 0x01),
+ HID_RI_REPORT_COUNT(8, 0x05),
+ HID_RI_REPORT_SIZE(8, 0x01),
+ HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
+ HID_RI_REPORT_COUNT(8, 0x01),
+ HID_RI_REPORT_SIZE(8, 0x03),
+ HID_RI_INPUT(8, HID_IOF_CONSTANT),
+
+ HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
+ HID_RI_USAGE(8, 0x30), /* Usage X */
+ HID_RI_USAGE(8, 0x31), /* Usage Y */
+ HID_RI_LOGICAL_MINIMUM(8, -127),
+ HID_RI_LOGICAL_MAXIMUM(8, 127),
+ HID_RI_REPORT_COUNT(8, 0x02),
+ HID_RI_REPORT_SIZE(8, 0x08),
+ HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
+
+ HID_RI_USAGE(8, 0x38), /* Wheel */
+ HID_RI_LOGICAL_MINIMUM(8, -127),
+ HID_RI_LOGICAL_MAXIMUM(8, 127),
+ HID_RI_REPORT_COUNT(8, 0x01),
+ HID_RI_REPORT_SIZE(8, 0x08),
+ HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
+
+ HID_RI_USAGE_PAGE(8, 0x0C), /* Consumer */
+ HID_RI_USAGE(16, 0x0238), /* AC Pan (Horizontal wheel) */
+ HID_RI_LOGICAL_MINIMUM(8, -127),
+ HID_RI_LOGICAL_MAXIMUM(8, 127),
+ HID_RI_REPORT_COUNT(8, 0x01),
+ HID_RI_REPORT_SIZE(8, 0x08),
+ HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_RELATIVE),
+
+ HID_RI_END_COLLECTION(0),
+ HID_RI_END_COLLECTION(0),
+};
+
+const USB_Descriptor_HIDReport_Datatype_t PROGMEM ConsoleReport[] =
+{
+ HID_RI_USAGE_PAGE(16, 0xFF00), /* Vendor Page 0 */
+ HID_RI_USAGE(8, 0x01), /* Vendor Usage 1 */
+ HID_RI_COLLECTION(8, 0x01), /* Application */
+ HID_RI_USAGE(8, 0x02), /* Vendor Usage 2 */
+ HID_RI_LOGICAL_MINIMUM(8, 0x00),
+ HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
+ HID_RI_REPORT_SIZE(8, 0x08),
+ HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE),
+ HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE),
+ HID_RI_USAGE(8, 0x03), /* Vendor Usage 3 */
+ HID_RI_LOGICAL_MINIMUM(8, 0x00),
+ HID_RI_LOGICAL_MAXIMUM(8, 0xFF),
+ HID_RI_REPORT_SIZE(8, 0x08),
+ HID_RI_REPORT_COUNT(8, CONSOLE_EPSIZE),
+ HID_RI_OUTPUT(8, HID_IOF_DATA | HID_IOF_VARIABLE | HID_IOF_ABSOLUTE | HID_IOF_NON_VOLATILE),
+ HID_RI_END_COLLECTION(0),
+};
+
+const USB_Descriptor_HIDReport_Datatype_t PROGMEM ExtraReport[] =
+{
+ HID_RI_USAGE_PAGE(8, 0x01), /* Generic Desktop */
+ HID_RI_USAGE(8, 0x80), /* System Control */
+ HID_RI_COLLECTION(8, 0x01), /* Application */
+ HID_RI_REPORT_ID(8, REPORT_ID_SYSTEM),
+ HID_RI_LOGICAL_MINIMUM(16, 0x0081),
+ HID_RI_LOGICAL_MAXIMUM(16, 0x00B7),
+ HID_RI_USAGE_MINIMUM(16, 0x0081), /* System Power Down */
+ HID_RI_USAGE_MAXIMUM(16, 0x00B7), /* System Display LCD Autoscale */
+ HID_RI_REPORT_SIZE(8, 16),
+ HID_RI_REPORT_COUNT(8, 1),
+ HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
+ HID_RI_END_COLLECTION(0),
+
+ HID_RI_USAGE_PAGE(8, 0x0C), /* Consumer */
+ HID_RI_USAGE(8, 0x01), /* Consumer Control */
+ HID_RI_COLLECTION(8, 0x01), /* Application */
+ HID_RI_REPORT_ID(8, REPORT_ID_CONSUMER),
+ HID_RI_LOGICAL_MINIMUM(16, 0x0010),
+ HID_RI_LOGICAL_MAXIMUM(16, 0x029C),
+ HID_RI_USAGE_MINIMUM(16, 0x0010), /* +10 */
+ HID_RI_USAGE_MAXIMUM(16, 0x029C), /* AC Distribute Vertically */
+ HID_RI_REPORT_SIZE(8, 16),
+ HID_RI_REPORT_COUNT(8, 1),
+ HID_RI_INPUT(8, HID_IOF_DATA | HID_IOF_ARRAY | HID_IOF_ABSOLUTE),
+ HID_RI_END_COLLECTION(0),
+};
+
+/*******************************************************************************
+ * Device Descriptors
+ ******************************************************************************/
+const USB_Descriptor_Device_t PROGMEM DeviceDescriptor =
+{
+ .Header = {.Size = sizeof(USB_Descriptor_Device_t), .Type = DTYPE_Device},
+
+ .USBSpecification = VERSION_BCD(01.10),
+ .Class = USB_CSCP_NoDeviceClass,
+ .SubClass = USB_CSCP_NoDeviceSubclass,
+ .Protocol = USB_CSCP_NoDeviceProtocol,
+
+ .Endpoint0Size = FIXED_CONTROL_ENDPOINT_SIZE,
+
+ .VendorID = VENDOR_ID,
+ .ProductID = PRODUCT_ID,
+ .ReleaseNumber = DEVICE_VER,
+
+ .ManufacturerStrIndex = 0x01,
+ .ProductStrIndex = 0x02,
+ .SerialNumStrIndex = NO_DESCRIPTOR,
+
+ .NumberOfConfigurations = FIXED_NUM_CONFIGURATIONS
+};
+
+/*******************************************************************************
+ * Configuration Descriptors
+ ******************************************************************************/
+const USB_Descriptor_Configuration_t PROGMEM ConfigurationDescriptor =
+{
+ .Config =
+ {
+ .Header = {.Size = sizeof(USB_Descriptor_Configuration_Header_t), .Type = DTYPE_Configuration},
+
+ .TotalConfigurationSize = sizeof(USB_Descriptor_Configuration_t),
+ .TotalInterfaces = TOTAL_INTERFACES,
+
+ .ConfigurationNumber = 1,
+ .ConfigurationStrIndex = NO_DESCRIPTOR,
+
+ .ConfigAttributes = (USB_CONFIG_ATTR_RESERVED | USB_CONFIG_ATTR_REMOTEWAKEUP),
+
+ .MaxPowerConsumption = USB_CONFIG_POWER_MA(100)
+ },
+
+ /*
+ * Keyboard
+ */
+ .Keyboard_Interface =
+ {
+ .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+ .InterfaceNumber = KEYBOARD_INTERFACE,
+ .AlternateSetting = 0x00,
+
+ .TotalEndpoints = 1,
+
+ .Class = HID_CSCP_HIDClass,
+ .SubClass = HID_CSCP_BootSubclass,
+ .Protocol = HID_CSCP_KeyboardBootProtocol,
+
+ .InterfaceStrIndex = NO_DESCRIPTOR
+ },
+
+ .Keyboard_HID =
+ {
+ .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
+
+ .HIDSpec = VERSION_BCD(01.11),
+ .CountryCode = 0x00,
+ .TotalReportDescriptors = 1,
+ .HIDReportType = HID_DTYPE_Report,
+ .HIDReportLength = sizeof(KeyboardReport)
+ },
+
+ .Keyboard_INEndpoint =
+ {
+ .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+ .EndpointAddress = (ENDPOINT_DIR_IN | KEYBOARD_IN_EPNUM),
+ .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+ .EndpointSize = KEYBOARD_EPSIZE,
+ .PollingIntervalMS = 0x01
+ },
+
+ /*
+ * Mouse
+ */
+ .Mouse_Interface =
+ {
+ .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+ .InterfaceNumber = MOUSE_INTERFACE,
+ .AlternateSetting = 0x00,
+
+ .TotalEndpoints = 1,
+
+ .Class = HID_CSCP_HIDClass,
+ .SubClass = HID_CSCP_BootSubclass,
+ .Protocol = HID_CSCP_MouseBootProtocol,
+
+ .InterfaceStrIndex = NO_DESCRIPTOR
+ },
+
+ .Mouse_HID =
+ {
+ .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
+
+ .HIDSpec = VERSION_BCD(01.11),
+ .CountryCode = 0x00,
+ .TotalReportDescriptors = 1,
+ .HIDReportType = HID_DTYPE_Report,
+ .HIDReportLength = sizeof(MouseReport)
+ },
+
+ .Mouse_INEndpoint =
+ {
+ .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+ .EndpointAddress = (ENDPOINT_DIR_IN | MOUSE_IN_EPNUM),
+ .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+ .EndpointSize = MOUSE_EPSIZE,
+ .PollingIntervalMS = 0x01
+ },
+
+ /*
+ * Console
+ */
+ .Console_Interface =
+ {
+ .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+ .InterfaceNumber = CONSOLE_INTERFACE,
+ .AlternateSetting = 0x00,
+
+ .TotalEndpoints = 2,
+
+ .Class = HID_CSCP_HIDClass,
+ .SubClass = HID_CSCP_NonBootSubclass,
+ .Protocol = HID_CSCP_NonBootProtocol,
+
+ .InterfaceStrIndex = NO_DESCRIPTOR
+ },
+
+ .Console_HID =
+ {
+ .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
+
+ .HIDSpec = VERSION_BCD(01.11),
+ .CountryCode = 0x00,
+ .TotalReportDescriptors = 1,
+ .HIDReportType = HID_DTYPE_Report,
+ .HIDReportLength = sizeof(ConsoleReport)
+ },
+
+ .Console_INEndpoint =
+ {
+ .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+ .EndpointAddress = (ENDPOINT_DIR_IN | CONSOLE_IN_EPNUM),
+ .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+ .EndpointSize = CONSOLE_EPSIZE,
+ .PollingIntervalMS = 0x01
+ },
+
+ .Console_OUTEndpoint =
+ {
+ .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+ .EndpointAddress = (ENDPOINT_DIR_OUT | CONSOLE_OUT_EPNUM),
+ .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+ .EndpointSize = CONSOLE_EPSIZE,
+ .PollingIntervalMS = 0x01
+ },
+
+ /*
+ * Extra
+ */
+ .Extra_Interface =
+ {
+ .Header = {.Size = sizeof(USB_Descriptor_Interface_t), .Type = DTYPE_Interface},
+
+ .InterfaceNumber = EXTRA_INTERFACE,
+ .AlternateSetting = 0x00,
+
+ .TotalEndpoints = 1,
+
+ .Class = HID_CSCP_HIDClass,
+ .SubClass = HID_CSCP_NonBootSubclass,
+ .Protocol = HID_CSCP_NonBootProtocol,
+
+ .InterfaceStrIndex = NO_DESCRIPTOR
+ },
+
+ .Extra_HID =
+ {
+ .Header = {.Size = sizeof(USB_HID_Descriptor_HID_t), .Type = HID_DTYPE_HID},
+
+ .HIDSpec = VERSION_BCD(01.11),
+ .CountryCode = 0x00,
+ .TotalReportDescriptors = 1,
+ .HIDReportType = HID_DTYPE_Report,
+ .HIDReportLength = sizeof(ExtraReport)
+ },
+
+ .Extra_INEndpoint =
+ {
+ .Header = {.Size = sizeof(USB_Descriptor_Endpoint_t), .Type = DTYPE_Endpoint},
+
+ .EndpointAddress = (ENDPOINT_DIR_IN | EXTRA_IN_EPNUM),
+ .Attributes = (EP_TYPE_INTERRUPT | ENDPOINT_ATTR_NO_SYNC | ENDPOINT_USAGE_DATA),
+ .EndpointSize = EXTRA_EPSIZE,
+ .PollingIntervalMS = 0x01
+ },
+};
+
+
+/*******************************************************************************
+ * String Descriptors
+ ******************************************************************************/
+const USB_Descriptor_String_t PROGMEM LanguageString =
+{
+ .Header = {.Size = USB_STRING_LEN(1), .Type = DTYPE_String},
+
+ .UnicodeString = {LANGUAGE_ID_ENG}
+};
+
+const USB_Descriptor_String_t PROGMEM ManufacturerString =
+{
+ .Header = {.Size = USB_STRING_LEN(11), .Type = DTYPE_String},
+
+ .UnicodeString = LSTR(MANUFACTURER)
+};
+
+const USB_Descriptor_String_t PROGMEM ProductString =
+{
+ .Header = {.Size = USB_STRING_LEN(28), .Type = DTYPE_String},
+
+ .UnicodeString = LSTR(PRODUCT)
+};
+
+
+/** This function is called by the library when in device mode, and must be overridden (see library "USB Descriptors"
+ * documentation) by the application code so that the address and size of a requested descriptor can be given
+ * to the USB library. When the device receives a Get Descriptor request on the control endpoint, this function
+ * is called so that the descriptor details can be passed back and the appropriate descriptor sent back to the
+ * USB host.
+ */
+uint16_t CALLBACK_USB_GetDescriptor(const uint16_t wValue,
+ const uint8_t wIndex,
+ const void** const DescriptorAddress)
+{
+ const uint8_t DescriptorType = (wValue >> 8);
+ const uint8_t DescriptorIndex = (wValue & 0xFF);
+
+ const void* Address = NULL;
+ uint16_t Size = NO_DESCRIPTOR;
+
+ switch (DescriptorType)
+ {
+ case DTYPE_Device:
+ Address = &DeviceDescriptor;
+ Size = sizeof(USB_Descriptor_Device_t);
+ break;
+ case DTYPE_Configuration:
+ Address = &ConfigurationDescriptor;
+ Size = sizeof(USB_Descriptor_Configuration_t);
+ break;
+ case DTYPE_String:
+ switch (DescriptorIndex )
+ {
+ case 0x00:
+ Address = &LanguageString;
+ Size = pgm_read_byte(&LanguageString.Header.Size);
+ break;
+ case 0x01:
+ Address = &ManufacturerString;
+ Size = pgm_read_byte(&ManufacturerString.Header.Size);
+ break;
+ case 0x02:
+ Address = &ProductString;
+ Size = pgm_read_byte(&ProductString.Header.Size);
+ break;
+ }
+ break;
+ case HID_DTYPE_HID:
+ switch (wIndex) {
+ case KEYBOARD_INTERFACE:
+ Address = &ConfigurationDescriptor.Keyboard_HID;
+ Size = sizeof(USB_HID_Descriptor_HID_t);
+ break;
+ case MOUSE_INTERFACE:
+ Address = &ConfigurationDescriptor.Mouse_HID;
+ Size = sizeof(USB_HID_Descriptor_HID_t);
+ break;
+ case CONSOLE_INTERFACE:
+ Address = &ConfigurationDescriptor.Console_HID;
+ Size = sizeof(USB_HID_Descriptor_HID_t);
+ break;
+ case EXTRA_INTERFACE:
+ Address = &ConfigurationDescriptor.Extra_HID;
+ Size = sizeof(USB_HID_Descriptor_HID_t);
+ break;
+ }
+ break;
+ case HID_DTYPE_Report:
+ switch (wIndex) {
+ case KEYBOARD_INTERFACE:
+ Address = &KeyboardReport;
+ Size = sizeof(KeyboardReport);
+ break;
+ case MOUSE_INTERFACE:
+ Address = &MouseReport;
+ Size = sizeof(MouseReport);
+ break;
+ case CONSOLE_INTERFACE:
+ Address = &ConsoleReport;
+ Size = sizeof(ConsoleReport);
+ break;
+ case EXTRA_INTERFACE:
+ Address = &ExtraReport;
+ Size = sizeof(ExtraReport);
+ break;
+ }
+ break;
+ }
+
+ *DescriptorAddress = Address;
+ return Size;
+}
--- /dev/null
+/*
+ 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 Keyboard_Interface;
+ USB_HID_Descriptor_HID_t Keyboard_HID;
+ USB_Descriptor_Endpoint_t Keyboard_INEndpoint;
+
+ // Mouse HID Interface
+ USB_Descriptor_Interface_t Mouse_Interface;
+ USB_HID_Descriptor_HID_t Mouse_HID;
+ USB_Descriptor_Endpoint_t Mouse_INEndpoint;
+
+ // Console HID Interface
+ USB_Descriptor_Interface_t Console_Interface;
+ USB_HID_Descriptor_HID_t Console_HID;
+ USB_Descriptor_Endpoint_t Console_INEndpoint;
+ USB_Descriptor_Endpoint_t Console_OUTEndpoint;
+
+ // Extra HID Interface
+ USB_Descriptor_Interface_t Extra_Interface;
+ USB_HID_Descriptor_HID_t Extra_HID;
+ USB_Descriptor_Endpoint_t Extra_INEndpoint;
+} USB_Descriptor_Configuration_t;
+
+
+/* nubmer of interfaces */
+#define TOTAL_INTERFACES 4
+
+/* index of interface */
+#define KEYBOARD_INTERFACE 0
+#define MOUSE_INTERFACE 1
+#define CONSOLE_INTERFACE 2
+#define EXTRA_INTERFACE 3
+
+// Endopoint number and size
+#define KEYBOARD_IN_EPNUM 1
+#define MOUSE_IN_EPNUM 2
+#define CONSOLE_IN_EPNUM 3
+#define CONSOLE_OUT_EPNUM 4
+#define EXTRA_IN_EPNUM 5
+
+#define KEYBOARD_EPSIZE 8
+#define MOUSE_EPSIZE 8
+#define CONSOLE_EPSIZE 8
+#define EXTRA_EPSIZE 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
--- /dev/null
+/*
+ * Copyright 2012 Jun Wako <wakojun@gmail.com>
+ * This file is based on:
+ * LUFA-120219/Demos/Device/Lowlevel/KeyboardMouse
+ * LUFA-120219/Demos/Device/Lowlevel/GenericHID
+ */
+
+/*
+ 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.
+*/
+
+#include "report.h"
+#include "host.h"
+#include "host_driver.h"
+#include "keyboard.h"
+#include "sendchar.h"
+#include "debug.h"
+
+#include "descriptor.h"
+#include "lufa.h"
+
+static uint8_t keyboard_led_stats = 0;
+
+// 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);
+static void send_keyboard(report_keyboard_t *report);
+static void send_mouse(report_mouse_t *report);
+static void send_system(uint16_t data);
+static void send_consumer(uint16_t data);
+static host_driver_t lufa_driver = {
+ keyboard_leds,
+ send_keyboard,
+ send_mouse,
+ send_system,
+ send_consumer
+};
+
+
+static void SetupHardware(void);
+static void Console_HID_Task(void);
+
+int main(void)
+{
+ SetupHardware();
+ sei();
+
+ print_enable = true;
+ debug_enable = true;
+ debug_matrix = true;
+ debug_keyboard = true;
+ debug_mouse = true;
+
+/* 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();
+
+ Console_HID_Task();
+ USB_USBTask();
+ }
+}
+
+void SetupHardware(void)
+{
+ /* Disable watchdog if enabled by bootloader/fuses */
+ MCUSR &= ~(1 << WDRF);
+ wdt_disable();
+
+ /* Disable clock division */
+ clock_prescale_set(clock_div_1);
+
+ USB_Init();
+}
+
+static void Console_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(CONSOLE_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 ConsoleData[CONSOLE_EPSIZE];
+
+ /* Read Console Report Data */
+ Endpoint_Read_Stream_LE(&ConsoleData, sizeof(ConsoleData), NULL);
+
+ /* Process Console Report Data */
+ //ProcessConsoleHIDReport(ConsoleData);
+ }
+
+ /* Finalize the stream transfer to send the last packet */
+ Endpoint_ClearOUT();
+ }
+
+ /* IN packet */
+ Endpoint_SelectEndpoint(CONSOLE_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)
+{
+}
+
+/** Event handler for the USB_Disconnect event. */
+void EVENT_USB_Device_Disconnect(void)
+{
+}
+
+/** Event handler for the USB_ConfigurationChanged event.
+ * This is fired when the host sets the current configuration of the USB device after enumeration.
+ */
+void EVENT_USB_Device_ConfigurationChanged(void)
+{
+ bool ConfigSuccess = true;
+
+ /* Setup Keyboard HID Report Endpoints */
+ ConfigSuccess &= Endpoint_ConfigureEndpoint(KEYBOARD_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
+ KEYBOARD_EPSIZE, ENDPOINT_BANK_SINGLE);
+
+ /* Setup Mouse HID Report Endpoint */
+ ConfigSuccess &= Endpoint_ConfigureEndpoint(MOUSE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
+ MOUSE_EPSIZE, ENDPOINT_BANK_SINGLE);
+
+ /* Setup Console HID Report Endpoints */
+ ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
+ CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE);
+ ConfigSuccess &= Endpoint_ConfigureEndpoint(CONSOLE_OUT_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_OUT,
+ CONSOLE_EPSIZE, ENDPOINT_BANK_SINGLE);
+
+ /* Setup Extra HID Report Endpoint */
+ ConfigSuccess &= Endpoint_ConfigureEndpoint(EXTRA_IN_EPNUM, EP_TYPE_INTERRUPT, ENDPOINT_DIR_IN,
+ EXTRA_EPSIZE, ENDPOINT_BANK_SINGLE);
+}
+
+/*
+Appendix G: HID Request Support Requirements
+
+The following table enumerates the requests that need to be supported by various types of HID class devices.
+
+Device type GetReport SetReport GetIdle SetIdle GetProtocol SetProtocol
+------------------------------------------------------------------------------------------
+Boot Mouse Required Optional Optional Optional Required Required
+Non-Boot Mouse Required Optional Optional Optional Optional Optional
+Boot Keyboard Required Optional Required Required Required Required
+Non-Boot Keybrd Required Optional Required Required Optional Optional
+Other Device Required Optional Optional Optional Optional Optional
+*/
+/** Event handler for the USB_ControlRequest event.
+ * This is fired before passing along unhandled control requests to the library for processing internally.
+ */
+void EVENT_USB_Device_ControlRequest(void)
+{
+ uint8_t* ReportData = NULL;
+ uint8_t ReportSize = 0;
+
+ /* Handle HID Class specific requests */
+ switch (USB_ControlRequest.bRequest)
+ {
+ case HID_REQ_GetReport:
+ if (USB_ControlRequest.bmRequestType == (REQDIR_DEVICETOHOST | REQTYPE_CLASS | REQREC_INTERFACE))
+ {
+ Endpoint_ClearSETUP();
+
+ // Interface
+ switch (USB_ControlRequest.wIndex) {
+ case KEYBOARD_INTERFACE:
+ // TODO: test/check
+ ReportData = (uint8_t*)&keyboard_report_sent;
+ ReportSize = sizeof(keyboard_report_sent);
+ break;
+ case MOUSE_INTERFACE:
+ // TODO: test/check
+ ReportData = (uint8_t*)&mouse_report_sent;
+ ReportSize = sizeof(mouse_report_sent);
+ break;
+ case CONSOLE_INTERFACE:
+ break;
+ case EXTRA_INTERFACE:
+ break;
+ }
+
+ /* Write the report data to the control endpoint */
+ Endpoint_Write_Control_Stream_LE(ReportData, ReportSize);
+ Endpoint_ClearOUT();
+ }
+
+ break;
+ case HID_REQ_SetReport:
+ if (USB_ControlRequest.bmRequestType == (REQDIR_HOSTTODEVICE | REQTYPE_CLASS | REQREC_INTERFACE))
+ {
+ Endpoint_ClearSETUP();
+
+ /* Wait until the LED report has been sent by the host */
+ while (!(Endpoint_IsOUTReceived()))
+ {
+ if (USB_DeviceState == DEVICE_STATE_Unattached)
+ return;
+ }
+
+ // Interface
+ switch (USB_ControlRequest.wIndex) {
+ case KEYBOARD_INTERFACE:
+ // TODO: test/check
+ /* Read in the LED report from the host */
+ keyboard_led_stats = Endpoint_Read_8();
+ break;
+ case MOUSE_INTERFACE:
+ break;
+ case CONSOLE_INTERFACE:
+ break;
+ case EXTRA_INTERFACE:
+ break;
+ }
+
+ Endpoint_ClearOUT();
+ Endpoint_ClearStatusStage();
+ }
+
+ break;
+ }
+}
+
+/*******************************************************************************
+ * Host driver
+ ******************************************************************************/
+static uint8_t keyboard_leds(void)
+{
+ return keyboard_led_stats;
+}
+
+static void send_keyboard(report_keyboard_t *report)
+{
+ // TODO: handle NKRO report
+ /* Select the Keyboard Report Endpoint */
+ Endpoint_SelectEndpoint(KEYBOARD_IN_EPNUM);
+
+ /* Check if Keyboard Endpoint Ready for Read/Write */
+ if (Endpoint_IsReadWriteAllowed())
+ {
+ /* Write Keyboard Report Data */
+ Endpoint_Write_Stream_LE(report, sizeof(report_keyboard_t), NULL);
+
+ /* Finalize the stream transfer to send the last packet */
+ Endpoint_ClearIN();
+ }
+ keyboard_report_sent = *report;
+}
+
+static void send_mouse(report_mouse_t *report)
+{
+ /* Select the Mouse Report Endpoint */
+ Endpoint_SelectEndpoint(MOUSE_IN_EPNUM);
+
+ /* Check if Mouse Endpoint Ready for Read/Write */
+ if (Endpoint_IsReadWriteAllowed())
+ {
+ /* Write Mouse Report Data */
+ Endpoint_Write_Stream_LE(report, sizeof(report_mouse_t), NULL);
+
+ /* Finalize the stream transfer to send the last packet */
+ Endpoint_ClearIN();
+ }
+ mouse_report_sent = *report;
+}
+
+typedef struct {
+ uint8_t report_id;
+ uint16_t usage;
+} __attribute__ ((packed)) report_extra_t;
+
+static void send_system(uint16_t data)
+{
+ Endpoint_SelectEndpoint(EXTRA_IN_EPNUM);
+ if (Endpoint_IsReadWriteAllowed()) {
+ report_extra_t r = {
+ .report_id = REPORT_ID_SYSTEM,
+ .usage = data
+ };
+ Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
+ Endpoint_ClearIN();
+ }
+}
+
+static void send_consumer(uint16_t data)
+{
+ Endpoint_SelectEndpoint(EXTRA_IN_EPNUM);
+ if (Endpoint_IsReadWriteAllowed()) {
+ report_extra_t r = {
+ .report_id = REPORT_ID_CONSUMER,
+ .usage = data
+ };
+ Endpoint_Write_Stream_LE(&r, sizeof(report_extra_t), NULL);
+ Endpoint_ClearIN();
+ }
+}
+
+
+/*******************************************************************************
+ * sendchar
+ ******************************************************************************/
+int8_t sendchar(uint8_t c)
+{
+ if (USB_DeviceState != DEVICE_STATE_Configured)
+ return -1;
+
+ Endpoint_SelectEndpoint(CONSOLE_IN_EPNUM);
+
+ uint8_t timeout = 10;
+ uint16_t prevFN = USB_Device_GetFrameNumber();
+ while (!Endpoint_IsINReady()) {
+ switch (USB_DeviceState) {
+ case DEVICE_STATE_Unattached:
+ case DEVICE_STATE_Suspended:
+ return -1;
+ }
+ if (Endpoint_IsStalled())
+ return -1;
+ if (prevFN != USB_Device_GetFrameNumber()) {
+ if (!(timeout--))
+ return -1;
+ prevFN = USB_Device_GetFrameNumber();
+ }
+ }
+
+ Endpoint_Write_8(c);
+
+ // send when packet is full
+ if (!Endpoint_IsReadWriteAllowed())
+ Endpoint_ClearIN();
+
+ return 0;
+}
--- /dev/null
+/*
+ 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
-OPT_DEFS += -DHOST_PJRC
-
-SRC += pjrc.c \
- usb_keyboard.c \
- usb_debug.c \
- usb.c \
- bootloader_teensy.c
+PJRC_DIR = protocol/pjrc
+OPT_DEFS += -DHOST_PJRC
-# Search Path
-VPATH += $(TOP_DIR)/protocol/pjrc
-
+SRC += $(PJRC_DIR)/pjrc.c \
+ $(PJRC_DIR)/usb_keyboard.c \
+ $(PJRC_DIR)/usb_debug.c \
+ $(PJRC_DIR)/usb.c \
+ $(PJRC_DIR)/bootloader_teensy.c
# Option modules
ifdef $(or MOUSEKEY_ENABLE, PS2_MOUSE_ENABLE)
- SRC += usb_mouse.c
+ SRC += $(PJRC_DIR)/usb_mouse.c
endif
ifdef EXTRAKEY_ENABLE
- SRC += usb_extra.c
+ SRC += $(PJRC_DIR)/usb_extra.c
endif
+
+# Search Path
+VPATH += $(TOP_DIR)/$(PJRC_DIR)
#
# 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 program = Download the hex file to the device.
+# Please customize your programmer settings(PROGRAM_CMD)
+#
+# make teensy = Download the hex file to the device, using teensy_loader_cli.
+# (must have teensy_loader_cli installed).
+#
+# 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 debug = Start either simulavr or avarice as specified for debugging,
# with avr-gdb or avr-insight as the front end for debugging.
$(REMOVE) -r .dep
$(REMOVE) -r $(OBJDIR)
+show_path:
+ @echo VPATH=$(VPATH)
+ @echo SRC=$(SRC)
+
# Create object files directory
$(shell mkdir $(OBJDIR) 2>/dev/null)
# Listing of phony targets.
.PHONY : all begin finish end sizebefore sizeafter gccversion \
build elf hex eep lss sym coff extcoff \
-clean clean_list program debug gdb-config
-
+clean clean_list debug gdb-config show_path \
+program teensy dfu flip dfu-ee flip-ee