diff options
Diffstat (limited to 'board/board.c')
-rw-r--r-- | board/board.c | 61 |
1 files changed, 51 insertions, 10 deletions
diff --git a/board/board.c b/board/board.c index 16b10b3a42..2e5e9cc49c 100644 --- a/board/board.c +++ b/board/board.c @@ -17,12 +17,33 @@ static uint8_t maxtri_table[CROS_ROW_NUM][CROS_COL_NUM] = { /* FIXME: waiting for approval to open-source this table. */ }; +static uint16_t scancode_set2[128] = { + /* 0 */ 0x0000, 0x000E, 0x0016, 0x001E, 0x0026, 0x0025, 0x002E, 0x0036, + /* 8 */ 0x003d, 0x003e, 0x0046, 0x0045, 0x004E, 0x0055, 0x0000, 0x0066, + /* 16 */ 0x000d, 0x0015, 0x001d, 0x0024, 0x002d, 0x002c, 0x0035, 0x003c, + /* 24 */ 0x0043, 0x0044, 0x004D, 0x0054, 0x005b, 0x005d, 0xE01F, 0x001c, + /* 32 */ 0x001b, 0x0023, 0x002b, 0x0034, 0x0033, 0x003B, 0x0042, 0x004B, + /* 40 */ 0x004C, 0x0052, 0x0000, 0x005A, 0x0012, 0x0000, 0x001A, 0x0022, + /* 48 */ 0x0021, 0x002A, 0x0032, 0x0031, 0x003A, 0x0041, 0x0049, 0x004A, + /* 56 */ 0x0000, 0x0059, 0x0014, 0xE037, 0x0011, 0x0029, 0xE011, 0x0000, + /* 64 */ 0xE014, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 72 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0xe06B, + /* 80 */ 0x0000, 0x0000, 0x0000, 0xE075, 0xE072, 0x0000, 0x0000, 0x0000, + /* 88 */ 0x0000, 0xE074, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 96 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + /* 104 */ 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0076, 0x0000, + /* 112 */ 0x0005, 0x0006, 0x0004, 0x000c, 0x0003, 0x000b, 0x0083, 0x0009, + /* 120 */ 0x0000, 0x000a, 0x0001, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; + static EcError MatrixCallback( int8_t row, int8_t col, int8_t pressed, - uint8_t *scan_code, int32_t* len) { + enum EcScancodeSet code_set, uint8_t *scan_code, int32_t* len) { - uint8_t make_code; + int key_index; /* the index og scancode_set */ + uint16_t make_code; + EC_ASSERT(code_set == EC_SCANCODE_SET_2); /* TODO: support other sets? */ EC_ASSERT(scan_code); EC_ASSERT(len); @@ -31,16 +52,36 @@ static EcError MatrixCallback( return EC_ERROR_INVALID_PARAMETER; } - make_code = maxtri_table[row][col]; - make_code = row * 13 + col; /* FIXME: remove this after we can open-source - * the matrix table. */ + *len = 0; + +#if 1 /* FIXME: remove #if after we can opensource the matrix table. */ + /* fake */ + maxtri_table[0][0] = scancode_set2[0]; // FIXME: to make compiler happy + make_code = scancode_set2[key_index = row * 8 + col]; +#else + key_index = maxtri_table[row][col]; + EC_ASSERT(key_index < (sizeof(scancode_set2) / sizeof(scancode_set2[0]))); + make_code = scancode_set2[key_index]; +#endif - if (pressed) { - *scan_code = make_code; - *len = 1; + /* Output the make code (from table) */ + EC_ASSERT(make_code); /* there must be a make code mapping to a key */ + if (make_code >= 0x0100) { + *len += 2; + scan_code[0] = make_code >> 8; + scan_code[1] = make_code & 0xff; } else { - *scan_code = make_code | 0x80; - *len = 1; + *len += 1; + scan_code[0] = make_code & 0xff; + } + + /* insert the break byte, move back the last byte and insert a 0xf0 byte + * before that. */ + if (!pressed) { + EC_ASSERT(*len >= 1); + scan_code[*len] = scan_code[*len - 1]; + scan_code[*len - 1] = 0xF0; + *len += 1; } return EC_SUCCESS; |