Browse Source

Add editor/index.md

gh-pages
tmk 10 years ago
parent
commit
adc3d77ed0
2 changed files with 155 additions and 419 deletions
  1. 0
    419
      editor/hhkb/MEMO.txt
  2. 155
    0
      editor/index.md

+ 0
- 419
editor/hhkb/MEMO.txt View File

@@ -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,

+ 155
- 0
editor/index.md View File

@@ -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`


Loading…
Cancel
Save