keyboard controller firmware for Atmel AVR USB family
C Assembly Objective-C C++
Switch branches/tags
Nothing to show
Clone or download
Pull request Compare This branch is 11 commits ahead, 1238 commits behind tmk:master.
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.

t.m.k. Keyboard Firmware Collection

This is a keyboard firmware with some features for Atmel AVR controller.

Source code is available here:


  • Mouse key - Mouse control by keyboard.
  • System Control Key - Power Down, Sleep, Wake Up and USB Remote Wake up.
  • Media Control Key - Volume Down/Up, Mute, Next/Prev track, Play, Stop and etc.
  • USB NKRO - Can send 120 keys(+ 8 modifiers) simultaneously.
  • PS/2 mouse support - integrate PS/2 mouse(TrackPoint) into keyboard as composite device.
  • keyboard protocols - PS/2, ADB and old keyboard protocols.




Files & Directories


  • common/ - common codes
  • protocol/ - keyboard protocol support
  • keyboard/ - keyboard projects
  • converter/ - protocol converter projects
  • doc/ - documents
  • - Makefile for common
  • - Makefile for protocol
  • - Makefile for build rules

Keyboard Protocols

  • pjrc/ - PJRC USB stack
  • vusb/ - Objective Development V-USB
  • iwrap/ - Bluetooth HID for Bluegiga iWRAP
  • ps2.c - PS/2 protocol
  • adb.c - Apple Desktop Bus protocol
  • m0110.c - Macintosh 128K/512K/Plus keyboard protocol
  • news.c - Sony NEWS keyboard protocol
  • x68k.c - Sharp X68000 keyboard protocol

Build & Program

Build firmware

To compile you need AVR GCC, AVR Libc and GNU make. You can use WinAVR on Windows and CrossPack on Mac.

$ cd <project>
$ make

The firmware will be compiled as a file tmk_<project>.hex.

Program Controller

If you have a proper program command in Makefile just type this.

$ make program

As for Teensy you can use PJRC's loader to program hex file.

Makefile Options

1. MCU and Frequency.

MCU = atmega32u4       # Teensy 2.0
#MCU = at90usb1286      # Teensy++ 2.0
F_CPU = 16000000

2. Features

Note that comment out to disable them.

MOUSEKEY_ENABLE = yes	# Mouse keys
PS2_MOUSE_ENABLE = yes	# PS/2 mouse(TrackPoint) support
EXTRAKEY_ENABLE = yes	# Enhanced feature for Windows(Audio control and System control)
NKRO_ENABLE = yes		# USB Nkey Rollover

3. Programmer

Set proper command for your controller, bootloader and programmer.

# for PJRC Teensy
PROGRAM_CMD = teensy_loader_cli -mmcu=$(MCU) -w -v $(TARGET).hex

# for Atmel AT90USBKEY
PROGRAM_CMD = dfu-programmer $(MCU) flash $(TARGET).hex

# avrdude
PROGRAM_CMD = avrdude -p $(MCU) -c avrispmkII -P USB -U flash:w:$(TARGET).hex
PROGRAM_CMD = avrdude -p $(MCU) -c usbasp -U flash:w:$(TARGET).hex
PROGRAM_CMD = avrdude -p $(MCU) -c arduino -P COM1 -b 57600 -U flash:w:$(TARGET).hex

config.h Options

1. USB vendor/product ID and device description

#define VENDOR_ID       0xFEED
#define PRODUCT_ID      0xBEEF
/* device description */
#define MANUFACTURER    t.m.k.
#define PRODUCT         Macway mod
#define DESCRIPTION     t.m.k. keyboard firmware for Macway mod

2. Keyboard matrix configuration

#define MATRIX_ROWS 8
#define MATRIX_COLS 8

3. Mouse keys

4. PS/2 mouse

5. COMMAND key combination

#define IS_COMMAND() (keyboard_report->mods == (MOD_BIT(KB_LSHIFT) | MOD_BIT(KB_RSHIFT))) 


Build your own firmware


Use PJRC's hid_listen to see debug messages and press <COMMAND> + H to debug menu. See config.h for definition of <COMMAND> key combination.

Other Keyboard Projects

PJRC USB Keyboard/Mouse Example