uint8_t processed = 1; | uint8_t processed = 1; | ||||
bool last_print_enable = print_enable; | bool last_print_enable = print_enable; | ||||
print_enable = true; | print_enable = true; | ||||
switch (keyboard_report->keys[0]) { | |||||
switch (host_get_first_key()) { | |||||
case KB_H: | case KB_H: | ||||
help(); | help(); | ||||
break; | break; | ||||
print("timer: "); phex16(timer_count); print("\n"); | print("timer: "); phex16(timer_count); print("\n"); | ||||
break; | break; | ||||
case KB_P: // print toggle | case KB_P: // print toggle | ||||
if (print_enable) { | |||||
if (last_print_enable) { | |||||
print("print disabled.\n"); | print("print disabled.\n"); | ||||
last_print_enable = false; | last_print_enable = false; | ||||
} else { | } else { | ||||
break; | break; | ||||
#ifdef USB_NKRO_ENABLE | #ifdef USB_NKRO_ENABLE | ||||
case KB_N: | case KB_N: | ||||
// send empty report before change | |||||
host_clear_keyboard_report(); | host_clear_keyboard_report(); | ||||
host_send_keyboard_report(); | host_send_keyboard_report(); | ||||
keyboard_nkro = !keyboard_nkro; | keyboard_nkro = !keyboard_nkro; |
TARGET_DIR = . | TARGET_DIR = . | ||||
# keyboard dependent files | # keyboard dependent files | ||||
TARGET_SRC = tmk.c \ | |||||
TARGET_SRC = main_pjrc.c \ | |||||
keymap.c \ | keymap.c \ | ||||
matrix.c \ | matrix.c \ | ||||
led.c | led.c | ||||
CONFIG_H = config.h | |||||
# MCU name, you MUST set this to match the board you are using | # 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 | # type "make clean" after changing this, so all files will be rebuilt | ||||
USB_NKRO_ENABLE = yes # USB Nkey Rollover | USB_NKRO_ENABLE = yes # USB Nkey Rollover | ||||
#---------------- Programming Options -------------------------- | |||||
PROGRAM_CMD = teensy_loader_cli.exe -mmcu=$(MCU) -w -v $(TARGET).hex | |||||
include $(COMMON_DIR)/Makefile.pjrc | include $(COMMON_DIR)/Makefile.pjrc | ||||
include $(COMMON_DIR)/Makefile.common | include $(COMMON_DIR)/Makefile.common |
#define PRODUCT HHKB mod | #define PRODUCT HHKB mod | ||||
#define DESCRIPTION t.m.k. keyboard firmware for HHKB mod | #define DESCRIPTION t.m.k. keyboard firmware for HHKB mod | ||||
/* matrix size */ | /* matrix size */ | ||||
#define MATRIX_ROWS 8 | #define MATRIX_ROWS 8 | ||||
#define MATRIX_COLS 8 | #define MATRIX_COLS 8 | ||||
/* define if matrix has ghost */ | /* define if matrix has ghost */ | ||||
//#define MATRIX_HAS_GHOST | //#define MATRIX_HAS_GHOST | ||||
/* key combination for command */ | |||||
#define IS_COMMAND() (keyboard_report->mods == (BIT_LSHIFT | BIT_RSHIFT)) | |||||
/* key combination for command */ | |||||
#define IS_COMMAND() ( \ | |||||
keyboard_report->mods == (BIT_LSHIFT | BIT_RSHIFT) || \ | |||||
keyboard_report->mods == (BIT_LCTRL | BIT_RSHIFT) \ | |||||
) | |||||
/* USB NKey Rollover */ | |||||
#ifdef USB_NKRO_ENABLE | |||||
#endif | |||||
/* mouse keys */ | /* mouse keys */ | ||||
#ifdef MOUSEKEY_ENABLE | #ifdef MOUSEKEY_ENABLE | ||||
# define MOUSEKEY_DELAY_TIME 192 | # define MOUSEKEY_DELAY_TIME 192 | ||||
#endif | #endif | ||||
/* PS/2 mouse */ | /* PS/2 mouse */ | ||||
#ifdef PS2_MOUSE_ENABLE | #ifdef PS2_MOUSE_ENABLE | ||||
/* | /* |
#include "print.h" | #include "print.h" | ||||
#include "debug.h" | #include "debug.h" | ||||
#include "util.h" | #include "util.h" | ||||
#include "keymap_skel.h" | |||||
#include "keymap.h" | |||||
// Convert physical keyboard layout to matrix array. | // Convert physical keyboard layout to matrix array. | ||||
{ | { | ||||
return pgm_read_byte(&fn_keycode[(biton(fn_bits))]); | return pgm_read_byte(&fn_keycode[(biton(fn_bits))]); | ||||
} | } | ||||
// define a condition to enter special function mode | |||||
bool keymap_is_special_mode(uint8_t fn_bits) | |||||
{ | |||||
return host_get_mods() == (BIT_LSHIFT | BIT_RSHIFT) || host_get_mods() == (BIT_LCTRL | BIT_RSHIFT); | |||||
} |
#include <util/delay.h> | #include <util/delay.h> | ||||
#include "print.h" | #include "print.h" | ||||
#include "util.h" | #include "util.h" | ||||
#include "matrix_skel.h" | |||||
#include "matrix.h" | |||||
#if (MATRIX_COLS > 16) | #if (MATRIX_COLS > 16) |
void host_swap_keyboard_report(void); | void host_swap_keyboard_report(void); | ||||
void host_clear_keyboard_report(void); | void host_clear_keyboard_report(void); | ||||
uint8_t host_has_anykey(void); | uint8_t host_has_anykey(void); | ||||
uint8_t *host_get_keys(void); | |||||
uint8_t host_get_mods(void); | |||||
uint8_t host_get_first_key(void); | |||||
void host_send_keyboard_report(void); | void host_send_keyboard_report(void); |
#include "usb_mouse.h" | #include "usb_mouse.h" | ||||
#include "debug.h" | #include "debug.h" | ||||
#include "host.h" | #include "host.h" | ||||
#include "util.h" | |||||
#ifdef USB_NKRO_ENABLE | #ifdef USB_NKRO_ENABLE | ||||
return cnt; | return cnt; | ||||
} | } | ||||
uint8_t *host_get_keys(void) | |||||
uint8_t host_get_first_key(void) | |||||
{ | { | ||||
return keyboard_report->keys; | |||||
} | |||||
uint8_t host_get_mods(void) | |||||
{ | |||||
return keyboard_report->mods; | |||||
#ifdef USB_NKRO_ENABLE | |||||
if (keyboard_nkro) { | |||||
uint8_t i = 0; | |||||
for (; i < REPORT_KEYS && !keyboard_report->keys[i]; i++) | |||||
; | |||||
return i<<3 | biton(keyboard_report->keys[i]); | |||||
} | |||||
#endif | |||||
return keyboard_report->keys[0]; | |||||
} | } | ||||
/* 2010/08/23 noname | |||||
* keyboard firmware based on PJRC USB keyboard example | |||||
*/ | |||||
/* Keyboard example with debug channel, for Teensy USB Development Board | |||||
* http://www.pjrc.com/teensy/usb_keyboard.html | |||||
* Copyright (c) 2008 PJRC.COM, LLC | |||||
* | |||||
* Permission is hereby granted, free of charge, to any person obtaining a copy | |||||
* of this software and associated documentation files (the "Software"), to deal | |||||
* in the Software without restriction, including without limitation the rights | |||||
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||||
* copies of the Software, and to permit persons to whom the Software is | |||||
* furnished to do so, subject to the following conditions: | |||||
* | |||||
* The above copyright notice and this permission notice shall be included in | |||||
* all copies or substantial portions of the Software. | |||||
* | |||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||||
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||||
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||||
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||||
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | |||||
* THE SOFTWARE. | |||||
*/ | |||||
#include <stdbool.h> | |||||
#include <avr/io.h> | |||||
#include <avr/interrupt.h> | |||||
#include <util/delay.h> | |||||
#include "keyboard.h" | |||||
#include "usb.h" | |||||
#include "matrix.h" | |||||
#include "print.h" | |||||
#include "debug.h" | |||||
#include "util.h" | |||||
#include "jump_bootloader.h" | |||||
#ifdef PS2_MOUSE_ENABLE | |||||
# include "ps2_mouse.h" | |||||
#endif | |||||
#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n)) | |||||
bool debug_enable = false; | |||||
bool debug_matrix = false; | |||||
bool debug_keyboard = false; | |||||
bool debug_mouse = false; | |||||
int main(void) | |||||
{ | |||||
DEBUG_LED_CONFIG; | |||||
DEBUG_LED_OFF; | |||||
// set for 16 MHz clock | |||||
CPU_PRESCALE(0); | |||||
// Initialize the USB, and then wait for the host to set configuration. | |||||
// If the Teensy is powered without a PC connected to the USB port, | |||||
// this will wait forever. | |||||
usb_init(); | |||||
while (!usb_configured()) /* wait */ ; | |||||
keyboard_init(); | |||||
matrix_scan(); | |||||
if (matrix_key_count() >= 3) { | |||||
#ifdef DEBUG_LED | |||||
for (int i = 0; i < 6; i++) { | |||||
DEBUG_LED_CONFIG; | |||||
DEBUG_LED_ON; | |||||
_delay_ms(500); | |||||
DEBUG_LED_OFF; | |||||
_delay_ms(500); | |||||
} | |||||
#else | |||||
_delay_ms(5000); | |||||
#endif | |||||
print_enable = true; | |||||
debug_enable = true; | |||||
debug_matrix = true; | |||||
debug_keyboard = true; | |||||
debug_mouse = true; | |||||
print("debug enabled.\n"); | |||||
} | |||||
if (matrix_key_count() >= 4) { | |||||
print("jump to bootloader...\n"); | |||||
_delay_ms(1000); | |||||
jump_bootloader(); // not return | |||||
} | |||||
while (1) { | |||||
keyboard_proc(); | |||||
} | |||||
} |