diff --git a/editor/hhkb/MEMO.txt b/editor/hhkb/MEMO.txt deleted file mode 100644 index b381fb88..00000000 --- a/editor/hhkb/MEMO.txt +++ /dev/null @@ -1,419 +0,0 @@ -TODO ----- - Better source output - KEYMAP macro - - layer operation - copy, swap, set all, clear... - - X Share URL - X shoten service? 09/07 - - Bootloader jump doesn't work - - Keyobard external line graphic - - X test on remote site - tmk.github.io/tmk_editor/hhkb/? - github pages - https://help.github.com/articles/user-organization-and-project-pages - - X save file button - https://developer.mozilla.org/en-US/docs/Web/API/Blob - var typedArray = GetTheTypedArraySomehow(); - var blob = new Blob([typedArray], {type: "application/octet-binary"}); // pass a useful mime type here - "application/octet-stream" - var url = URL.createObjectURL(blob); - - TrueErgonomic - var a = document.getElementById("download-link"); - a.href = window.URL.createObjectURL(blob); - a.download = 'TrulyErgonomic_v3_3.hex'; - // a.textContent = 'Download file.'; - a.className = 'TE_link'; - a.click() - - X keyboard key text css - X align of wrapped text - - edit action for FN key - action map support - Macro editor - - Where it converts key postion into matrix position at? - Convert table? UI can use position of elemen placing. - UI uses matrix posiotn for ID of element. - - X save hex(binary) - - X firmware - P load binary - P Mass Storage or HID comm - X fixed address for keymaps - - - -ld script/Firmware structure ----------------------------- - Flash Map of ATMega32U4(32KB) - +------------+ 0x0000 - | .vectors | 0xac (43vectors * 4bytes) - | .progmem | PROGMEM variables and PSTR - | .init0-9 | - | .text | code - | .fini9-0 | - | | > text region - |------------| _etext - | .data | - | .bss | - | .noinit | - | | > data region - |------------| 0x6800 - | .keymap | > keymap region(2KB) - |------------| 0x7000 - | bootloader | 4KB - +------------+ 0x7FFF - - -TMK keymapping mode -------------------- - keymap 8bit code - Special 8bit code Fn0-32 can be assigned for action code. - actions[] -> --------------- - | action x 32 | - keymaps[] -> --------------- - | keymap 0 | - --------------- - | keymap 1 | - --------------- - | keymap 2 | - --------------- - | keymap 3 | - --------------- - Interface: uint8_t keymap_key_to_keycode(uint8_t layer, key_t key) in keymap.h - action_t keymap_fn_to_action(uint8_t keycode) in keymap.h - - static const uint16_t PROGMEM fn_actions[] = { - [0] = ACTION_LAYER_MOMENTARY(0), - [1] = ACTION_LAYER_MOMENTARY(1), - [2] = ACTION_LAYER_MOMENTARY(2), - [3] = ACTION_LAYER_MOMENTARY(3), - [4] = ACTION_LAYER_TOGGLE(0), - [5] = ACTION_LAYER_TOGGLE(1), - [6] = ACTION_LAYER_TOGGLE(2), - [7] = ACTION_LAYER_TOGGLE(3), - [8] = ACTION_LAYER_TAP_TOGGLE(0), - [9] = ACTION_LAYER_TAP_TOGGLE(1), - [10] = ACTION_LAYER_TAP_TOGGLE(2), - [11] = ACTION_LAYER_TAP_TOGGLE(3), - }; - - actionmap 16bit code - All key action can be defined in 16bit code. - Memory usage will be about doubled size compared to keymap 8bit code. - Map Structure: - actionmaps[] -> --------------- - | actionmap 0 | - --------------- - | actionmap 1 | - --------------- - | actionmap 2 | - --------------- - | actionmap 3 | - --------------- - Interface: action_t action_for_key(uint8_t layer, key_t key) in action.h - - Flash usage cosidaration - ATmega32U4 - 32KB Firmware -24KB(with full option) - Keymapping 4KB- - Bootloader 4KB(Atmel stock) or 512B(Teensy) - ATmega16U4 - 16KB Firmware -10KB - Keymapping 2KB- - Bootloader 4KB(Atmel stock) or 512B(Teensy) - PS/2 and ADB have 256 keys in map, so use 512B each layer. - 8layers will be available for ATMega32U4 and 4layers for 16U4. This seems like enough in most case. - - -Hex file format - http://en.wikipedia.org/wiki/Intel_HEX - 1.Start code: ':' - 2.Byte Count: 2 hex(0-255) - 3.Address: 4 hex(0-2^16) - 4.Record Type: 2 hex(00-05) - 00: Data record. which contains 16bit address and data. - 01: End of File record. It must appear in the last line.(usually :00000001FF) - 02: Extended Segment Address Record. - 03: Start Segment Address Record. - 04: Extended Linear Address Record. Upper two bytes of 32 bit address. - 05: Start Linear Address Record. - 5.Data: byte_count * hex(a sequence of bytes) - 6.Checksum: 2 hex LSB of 2's complement of the sum of fields: 'Byte Count', 'Address', 'Record Type' and 'Data'. - checksum = ~(the sum of bytes)&0xff + 1 = (the sum)&0xff^0xff + 1 - - - - - -HHKB key matrix - COL 0 1 2 3 4 5 6 7 - ROW --------------------------------------------------------------- - 0| 2 q w s a z x c - 1| 3 4 r e d f v b - 2| 5 6 y t g h n _NONE_ - 3| 1 Esc Tab Control LShift LAlt LMeta Space - 4| 7 8 u i k j m _NONE_ - 5| \ ` Delete Return Fn RShift RAlt RMeta - 6| 9 0 o p ; l , _NONE_ - 7| - + ] [ ' / . _NONE_ - - -Key to matrix Table -/* Qwerty - * ,-----------------------------------------------------------. - * |Esc| 1| 2| 3| 4| 5| 6| 7| 8| 9| 0| -| =| \| `| - * |-----------------------------------------------------------| - * |Tab | Q| W| E| R| T| Y| U| I| O| P| [| ]|Backs| - * |-----------------------------------------------------------| - * |Contro| A| S| D| F| G| H| J| K| L| ;| '|Enter | - * |-----------------------------------------------------------| - * |Shift | Z| X| C| V| B| N| M| ,| .| /|Shift |Fn | - * `-----------------------------------------------------------' - * |Gui|Alt | Space |Alt |Gui| - * `-------------------------------------------' - */ -[ - 0x31, 0x30, 0x00, 0x10, 0x11, 0x20, 0x21, 0x40, 0x41, 0x60, 0x61, 0x70, 0x71, 0x50, 0x51, - 0x32, 0x01, 0x02, 0x13, 0x12, 0x23, 0x22, 0x42, 0x43, 0x62, 0x63, 0x73, 0x72, 0x52, - 0x33, 0x04, 0x03, 0x14, 0x15, 0x24, 0x25, 0x45, 0x44, 0x65, 0x64, 0x66, 0x53, - 0x34, 0x05, 0x06, 0x07, 0x16, 0x17, 0x26, 0x46, 0x66, 0x76, 0x75, 0x55, 0x54, - 0x35, 0x36, 0x37, 0x57, 0x56, -] - - - -Keycodes - KC_NO = 0x00, - KC_ROLL_OVER, - KC_POST_FAIL, - KC_UNDEFINED, - KC_A, - KC_B, - KC_C, - KC_D, - KC_E, - KC_F, - KC_G, - KC_H, - KC_I, - KC_J, - KC_K, - KC_L, - KC_M, /* 0x10 */ - KC_N, - KC_O, - KC_P, - KC_Q, - KC_R, - KC_S, - KC_T, - KC_U, - KC_V, - KC_W, - KC_X, - KC_Y, - KC_Z, - KC_1, - KC_2, - KC_3, /* 0x20 */ - KC_4, - KC_5, - KC_6, - KC_7, - KC_8, - KC_9, - KC_0, - KC_ENTER, - KC_ESCAPE, - KC_BSPACE, - KC_TAB, - KC_SPACE, - KC_MINUS, - KC_EQUAL, - KC_LBRACKET, - KC_RBRACKET, /* 0x30 */ - KC_BSLASH, /* \ (and |) */ - KC_NONUS_HASH, /* Non-US # and ~ */ - KC_SCOLON, /* ; (and :) */ - KC_QUOTE, /* ' and " */ - KC_GRAVE, /* Grave accent and tilde */ - KC_COMMA, /* , and < */ - KC_DOT, /* . and > */ - KC_SLASH, /* / and ? */ - KC_CAPSLOCK, - KC_F1, - KC_F2, - KC_F3, - KC_F4, - KC_F5, - KC_F6, - KC_F7, /* 0x40 */ - KC_F8, - KC_F9, - KC_F10, - KC_F11, - KC_F12, - KC_PSCREEN, - KC_SCROLLLOCK, - KC_PAUSE, - KC_INSERT, - KC_HOME, - KC_PGUP, - KC_DELETE, - KC_END, - KC_PGDOWN, - KC_RIGHT, - KC_LEFT, /* 0x50 */ - KC_DOWN, - KC_UP, - KC_NUMLOCK, - KC_KP_SLASH, - KC_KP_ASTERISK, - KC_KP_MINUS, - KC_KP_PLUS, - KC_KP_ENTER, - KC_KP_1, - KC_KP_2, - KC_KP_3, - KC_KP_4, - KC_KP_5, - KC_KP_6, - KC_KP_7, - KC_KP_8, /* 0x60 */ - KC_KP_9, - KC_KP_0, - KC_KP_DOT, - KC_NONUS_BSLASH, /* Non-US \ and | */ - KC_APPLICATION, - KC_POWER, - KC_KP_EQUAL, - KC_F13, - KC_F14, - KC_F15, - KC_F16, - KC_F17, - KC_F18, - KC_F19, - KC_F20, - KC_F21, /* 0x70 */ - KC_F22, - KC_F23, - KC_F24, - KC_EXECUTE, - KC_HELP, - KC_MENU, - KC_SELECT, - KC_STOP, - KC_AGAIN, - KC_UNDO, - KC_CUT, - KC_COPY, - KC_PASTE, - KC_FIND, - KC__MUTE, - KC__VOLUP, /* 0x80 */ - KC__VOLDOWN, - KC_LOCKING_CAPS, /* locking Caps Lock */ - KC_LOCKING_NUM, /* locking Num Lock */ - KC_LOCKING_SCROLL, /* locking Scroll Lock */ - KC_KP_COMMA, - KC_KP_EQUAL_AS400, /* equal sign on AS/400 */ - KC_INT1, - KC_INT2, - KC_INT3, - KC_INT4, - KC_INT5, - KC_INT6, - KC_INT7, - KC_INT8, - KC_INT9, - KC_LANG1, /* 0x90 */ - KC_LANG2, - KC_LANG3, - KC_LANG4, - KC_LANG5, - KC_LANG6, - KC_LANG7, - KC_LANG8, - KC_LANG9, - KC_ALT_ERASE, - KC_SYSREQ, - KC_CANCEL, - KC_CLEAR, - KC_PRIOR, - KC_RETURN, - KC_SEPARATOR, - KC_OUT, /* 0xA0 */ - KC_OPER, - KC_CLEAR_AGAIN, - KC_CRSEL, - KC_EXSEL, /* 0xA4 */ - - /* NOTE: Following codes(0xB0-DD) are not used. Leave them for reference. */ - KC_KP_00 = 0xB0, - KC_KP_000, - KC_THOUSANDS_SEPARATOR, - KC_DECIMAL_SEPARATOR, - KC_CURRENCY_UNIT, - KC_CURRENCY_SUB_UNIT, - KC_KP_LPAREN, - KC_KP_RPAREN, - KC_KP_LCBRACKET, /* { */ - KC_KP_RCBRACKET, /* } */ - KC_KP_TAB, - KC_KP_BSPACE, - KC_KP_A, - KC_KP_B, - KC_KP_C, - KC_KP_D, - KC_KP_E, /* 0xC0 */ - KC_KP_F, - KC_KP_XOR, - KC_KP_HAT, - KC_KP_PERC, - KC_KP_LT, - KC_KP_GT, - KC_KP_AND, - KC_KP_LAZYAND, - KC_KP_OR, - KC_KP_LAZYOR, - KC_KP_COLON, - KC_KP_HASH, - KC_KP_SPACE, - KC_KP_ATMARK, - KC_KP_EXCLAMATION, - KC_KP_MEM_STORE, /* 0xD0 */ - KC_KP_MEM_RECALL, - KC_KP_MEM_CLEAR, - KC_KP_MEM_ADD, - KC_KP_MEM_SUB, - KC_KP_MEM_MUL, - KC_KP_MEM_DIV, - KC_KP_PLUS_MINUS, - KC_KP_CLEAR, - KC_KP_CLEAR_ENTRY, - KC_KP_BINARY, - KC_KP_OCTAL, - KC_KP_DECIMAL, - KC_KP_HEXADECIMAL, /* 0xDD */ - - /* Modifiers */ - KC_LCTRL = 0xE0, - KC_LSHIFT, - KC_LALT, - KC_LGUI, - KC_RCTRL, - KC_RSHIFT, - KC_RALT, - KC_RGUI, diff --git a/editor/index.md b/editor/index.md new file mode 100644 index 00000000..81a6baa0 --- /dev/null +++ b/editor/index.md @@ -0,0 +1,155 @@ +Keymap Editor for TMK firmware +============================== + +- [HHKB](hhkb/index.html) + + +Instruction +----------- + + +Limitation +---------- + + +TODO & MEMO +------------ +### Edit action for FN key +### Better source output +KEYMAP macro +### Actionmap support +### Macro editor +### Layer operation +copy, swap, set all, clear... +### Compress share URL +lz-string.js + +### Bootloader jump doesn't work +### Better Keyobard graphic +### Keyobard layout screenshot +- HTML5 canvas +- png image file output + + +ldscript and Flash Memory +------------------------- +`ldscript_keymap_avr5.x` is ldscript and located at top directory. Using + +Flash Memroy Map of ATMega32U4(32KB) + + +--------------------+ 0x0000 + | .vectors | 0xac (43vectors * 4bytes) + | .progmem | PROGMEM variables and PSTR + | .init0-9 | + | .text | code + | .fini9-0 | + | | > text region + |--------------------| _etext + | .data | + | .bss | + | .noinit | + | | > data region + |--------------------| 0x6800 + | .keymap.fn_actions | + | .keymap.keymaps | > keymap region(2KB) + |--------------------| 0x7000 + | bootloader | 4KB + +--------------------+ 0x7FFF + + +Keymap(8bit code) +----------------- +`const uint16_t fn_actions[] __attribute__ ((section (".keymap.fn_actions")))` +`const uint8_t keymaps[8][ROW][COL] __attribute__ ((section (".keymap.keymaps")))` + +These arrays are placed at fixed address in .keymap section: + + + actions[] -> +-------------+ + | action x 32 | + keymaps[] -> |-------------| + | keymap 0 | + |-------------| + | keymap 1 | + |-------------| + | keymap 2 | + |-------------| + | keymap 3 | + |-------------| + | : : | + + + +Actionmap(16bit code) +--------------------- +`const uint16_t actionmaps[] __attribute__ ((section (".keymap.actionmaps")))` + +All key action can be defined in 16bit code. Memory usage will be about doubled size compared to keymap(8bit code). + + actionmaps[] -> +-------------+ + | actionmap 0 | + |-------------| + | actionmap 1 | + |-------------| + | actionmap 2 | + |-------------| + | actionmap 3 | + |-------------| + | : : | + + +Flash usage cosidaration +------------------------ +For example of biggest ever map, PS/2 and ADB converter have 256 keys in a layer, so use 256 bytes each layer in keymap and 512 bytes in actionmap. +In most cases map size of keyboard will be far smaller than that. + +### ATmega32U4 + + Firmware -24KB(with full option) + Keymapping 4KB- + Bootloader 4KB(Atmel stock) or 512B(Teensy) + +### ATmega16U4(Not suppoeted yet) + + Firmware -10KB + Keymapping 2KB- + Bootloader 4KB(Atmel stock) or 512B(Teensy) + + + +Hex file format +--------------- +[Intel Hex(wikipedia)](http://en.wikipedia.org/wiki/Intel_HEX) + +### 1.Start code + ':' + +### 2.Byte Count + 2 x hex(0-FF) + +### 3.Address + 4 x hex(0-FFFF) + +### 4.Record Type + 2 x hex(00-05) + +#### Record Type code + 00: Data record. which contains 16bit address and data. + 01: End of File record. It must appear in the last line.(usually :00000001FF) + 02: Extended Segment Address Record. + 03: Start Segment Address Record. + 04: Extended Linear Address Record. Upper two bytes of 32 bit address. + 05: Start Linear Address Record. + +### 5.Data + byte_count * hex(00-FF) + +a sequence of data bytes + +### 6.Checksum + 2 x hex(00-FF) + +LSB of 2's complement of the sum of fields[ 'Byte Count', 'Address', 'Record Type' and 'Data' ] + +`checksum = ~(the sum of bytes)&0xff + 1 = (the sum)&0xff^0xff + 1` +