Add protocol/lufa. LUFA supported now.
This commit is contained in:
		
							parent
							
								
									3d81d5221e
								
							
						
					
					
						commit
						cc68adeb57
					
				
					 18 changed files with 215 additions and 733 deletions
				
			
		|  | @ -110,7 +110,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
|      *      |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, \ | ||||
|  |  | |||
|  | @ -1,76 +0,0 @@ | |||
| /*
 | ||||
| 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 | ||||
|  | @ -1,509 +0,0 @@ | |||
| /* 
 | ||||
|  * 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; | ||||
| } | ||||
|  | @ -1,98 +0,0 @@ | |||
| /*
 | ||||
|              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 | ||||
|  | @ -1,195 +0,0 @@ | |||
| /*
 | ||||
| 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))]); | ||||
| } | ||||
|  | @ -1,24 +0,0 @@ | |||
| /*
 | ||||
| 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) | ||||
| { | ||||
| } | ||||
|  | @ -1,386 +0,0 @@ | |||
| /* 
 | ||||
|  * 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; | ||||
| } | ||||
|  | @ -1,45 +0,0 @@ | |||
| /*
 | ||||
|              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 | ||||
|  | @ -1,271 +0,0 @@ | |||
| /*
 | ||||
| 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; | ||||
|     } | ||||
| } | ||||
|  | @ -1,53 +0,0 @@ | |||
| # 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 | ||||
|  | @ -1,23 +1,3 @@ | |||
| # 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: | ||||
| # | ||||
|  | @ -29,8 +9,11 @@ | |||
| # | ||||
| # 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). | ||||
|  | @ -44,10 +27,7 @@ | |||
| # 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, | ||||
| # 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. | ||||
|  | @ -58,27 +38,29 @@ | |||
| # 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 | ||||
| 
 | ||||
| 
 | ||||
| # 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 | ||||
|  | @ -93,6 +75,12 @@ BOARD = USBKEY | |||
| 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 | ||||
|  | @ -107,31 +95,6 @@ F_CPU = 16000000 | |||
| 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. | ||||
|  | @ -142,28 +105,10 @@ 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 | ||||
| VPATH += $(TOP_DIR) | ||||
| 
 | ||||
| 
 | ||||
| include $(TOP_DIR)/protocol.mk | ||||
| include $(TOP_DIR)/protocol/lufa.mk | ||||
| include $(TOP_DIR)/common.mk | ||||
| include $(TOP_DIR)/rules.mk | ||||
| 
 | ||||
| test: | ||||
| 	echo $(SRC) | ||||
							
								
								
									
										96
									
								
								keyboard/macway/Makefile.pjrc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								keyboard/macway/Makefile.pjrc
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,96 @@ | |||
| #---------------------------------------------------------------------------- | ||||
| # 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 | ||||
|  | @ -21,10 +21,16 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>. | |||
| /* controller configuration */ | ||||
| #include "controller_teensy.h" | ||||
| 
 | ||||
| 
 | ||||
| /* USB Device descriptor 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 | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -59,7 +59,7 @@ static const uint8_t PROGMEM fn_layer[] = { | |||
|     3,              // Fn3
 | ||||
|     4,              // Fn4
 | ||||
|     0,              // Fn5
 | ||||
|     2,              // Fn6
 | ||||
|     3,              // Fn6
 | ||||
|     3               // Fn7
 | ||||
| }; | ||||
| 
 | ||||
|  | @ -94,7 +94,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
|            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)
 | ||||
|  | @ -110,7 +110,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
|      * |   |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, \ | ||||
|  | @ -155,7 +155,7 @@ static const uint8_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { | |||
|            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)
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 tmk
						tmk