Browse Source

kimera: Improve flexibility of combining of keymap

- Assign combining in row/col mapping
- Remove macro TWO_HEADED_KIMERA
- Now Kimera and Two Headed Kimera can use a common firmware
master
Kai Ryu 8 years ago
parent
commit
45e4210673
3 changed files with 56 additions and 101 deletions
  1. 0
    4
      keyboard/kimera/config.h
  2. 49
    93
      keyboard/kimera/kimera.c
  3. 7
    4
      keyboard/kimera/kimera.h

+ 0
- 4
keyboard/kimera/config.h View File

#define MATRIX_SIZE 16 * 16 #define MATRIX_SIZE 16 * 16
#define FN_ACTIONS_COUNT 32 #define FN_ACTIONS_COUNT 32
#define KEYMAPS_COUNT 3 #define KEYMAPS_COUNT 3
#ifndef TWO_HEADED_KIMERA
#define EECONFIG_KEYMAP_IN_EEPROM 50
#else
#define EECONFIG_KEYMAP_IN_EEPROM 82 #define EECONFIG_KEYMAP_IN_EEPROM 82
#endif


/* define if matrix has ghost */ /* define if matrix has ghost */
//#define MATRIX_HAS_GHOST //#define MATRIX_HAS_GHOST

+ 49
- 93
keyboard/kimera/kimera.c View File

#include "debug.h" #include "debug.h"


static uint8_t row_mapping[PX_COUNT] = { static uint8_t row_mapping[PX_COUNT] = {
#ifndef TWO_HEADED_KIMERA
0, 1, 2, 3, 4, 5, 6, 7,
UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED,
UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED,
UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED
#else
0, 1, 2, 3, 4, 5, 6, 7, 0, 1, 2, 3, 4, 5, 6, 7,
32, 33, 34, 35, 36, 37, 38, 39, 32, 33, 34, 35, 36, 37, 38, 39,
UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED,
UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED
#endif
}; };
static uint8_t col_mapping[PX_COUNT] = { static uint8_t col_mapping[PX_COUNT] = {
#ifndef TWO_HEADED_KIMERA
8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23,
24, 25, 26, 27, 28, 29, 30, 31,
UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED
#else
8, 9, 10, 11, 12, 13, 14, 15, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 22, 23, 16, 17, 18, 19, 20, 21, 22, 23,
40, 41, 42, 43, 44, 45, 46, 47, 40, 41, 42, 43, 44, 45, 46, 47,
48, 49, 50, 51, 52, 53, 54, 55 48, 49, 50, 51, 52, 53, 54, 55
#endif
}; };
#ifndef TWO_HEADED_KIMERA
static uint8_t row_count = 8;
static uint8_t col_count = 24;
#else
static uint8_t row_count = 16; static uint8_t row_count = 16;
static uint8_t col_count = 32; static uint8_t col_count = 32;
static uint8_t row_left_count = 8; static uint8_t row_left_count = 8;
static uint8_t col_left_count = 16; static uint8_t col_left_count = 16;
static matrix_row_t col_left_mask; static matrix_row_t col_left_mask;
#endif
static uint8_t combining = COMBINING_NONE;
static uint8_t data[EXP_COUNT][EXP_PORT_COUNT]; static uint8_t data[EXP_COUNT][EXP_PORT_COUNT];
static uint8_t exp_in_use = 0; static uint8_t exp_in_use = 0;
static uint8_t exp_online = 0; static uint8_t exp_online = 0;
uint8_t rows = eeprom_read_byte(EECONFIG_ROW_COUNT); uint8_t rows = eeprom_read_byte(EECONFIG_ROW_COUNT);
uint8_t cols = eeprom_read_byte(EECONFIG_COL_COUNT); uint8_t cols = eeprom_read_byte(EECONFIG_COL_COUNT);
if (rows == 0) error++; if (rows == 0) error++;
if (rows == UNCONFIGURED) error++;
else if (rows == UNCONFIGURED) error++;
else if (rows & COMBINING_BIT) {
if (combining != COMBINING_NONE) error++;
combining = COMBINING_ROW;
rows -= COMBINING_BIT;
}
if (cols == 0) error++; if (cols == 0) error++;
if (cols == UNCONFIGURED) error++;
else if (cols == UNCONFIGURED) error++;
else if (cols & COMBINING_BIT) {
if (combining != COMBINING_NONE) error++;
combining = COMBINING_COL;
cols -= COMBINING_BIT;
}
if (rows + cols > PX_COUNT) error++; if (rows + cols > PX_COUNT) error++;
if (error) return error; if (error) return error;
row_count = rows; row_count = rows;
col_count = cols; col_count = cols;
#ifdef TWO_HEADED_KIMERA
row_left_count = (rows + 1) / 2;
col_left_count = (cols + 1) / 2;
col_left_mask = (1 << col_left_count) - 1;
#endif
if (combining != COMBINING_NONE) {
row_left_count = (rows + 1) / 2;
col_left_count = (cols + 1) / 2;
col_left_mask = (1 << col_left_count) - 1;
}


/* read row mapping */ /* read row mapping */
uint8_t *mapping = EECONFIG_ROW_COL_MAPPING; uint8_t *mapping = EECONFIG_ROW_COL_MAPPING;
void kimera_scan(void) void kimera_scan(void)
{ {
uint8_t ret; uint8_t ret;
xprintf("exp in use: %d\n", exp_in_use);
xprintf("exp online: %d\n", exp_online);
dprintf("exp in use: %d\n", exp_in_use);
dprintf("exp online: %d\n", exp_online);
for (uint8_t exp = 0; exp < EXP_COUNT; exp++) { for (uint8_t exp = 0; exp < EXP_COUNT; exp++) {
if (exp_in_use & (1<<exp)) { if (exp_in_use & (1<<exp)) {
ret = i2c_start(EXP_ADDR(exp) | I2C_WRITE); ret = i2c_start(EXP_ADDR(exp) | I2C_WRITE);
clear_keyboard(); clear_keyboard();
} }
} }
#if 0
if (exp_online & (1<<exp)) {
if (ret) {
xprintf("lost: %d\n", exp);
exp_online &= ~(1<<exp);
clear_keyboard();
}
}
else {
if (!ret) {
xprintf("found: %d\n", exp);
exp_online |= (1<<exp);
i2c_stop();
expander_init(exp);
clear_keyboard();
}
else {
i2c_stop();
}
}
#endif
} }
} }
} }


#define CHANGE_COMBINING 1

inline inline
uint8_t kimera_matrix_rows(void) uint8_t kimera_matrix_rows(void)
{ {
#if CHANGE_COMBINING
#ifndef TWO_HEADED_KIMERA
return row_count;
#else
return row_left_count;
#endif
#else
return row_count;
#endif
if (combining == COMBINING_ROW) {
return row_left_count;
}
else {
return row_count;
}
} }


inline inline
uint8_t kimera_matrix_cols(void) uint8_t kimera_matrix_cols(void)
{ {
#if CHANGE_COMBINING
return col_count;
#else
#ifndef TWO_HEADED_KIMERA
return col_count;
#else
return col_left_count;
#endif
#endif
if (combining == COMBINING_COL) {
return col_left_count;
}
else {
return col_count;
}
} }


void kimera_read_cols(void) void kimera_read_cols(void)


uint8_t kimera_get_col(uint8_t row, uint8_t col) uint8_t kimera_get_col(uint8_t row, uint8_t col)
{ {
#if CHANGE_COMBINING
#else
#ifdef TWO_HEADED_KIMERA
if (row >= row_left_count) {
col += col_left_count;
if (combining == COMBINING_ROW) {
if (row >= row_left_count) {
col += col_left_count;
}
} }
#endif
#endif


uint8_t px = col_mapping[col]; uint8_t px = col_mapping[col];
if (px != UNCONFIGURED) { if (px != UNCONFIGURED) {
} }
} }


#if CHANGE_COMBINING
#else
#ifdef TWO_HEADED_KIMERA
if (row < row_left_count) {
cols &= col_left_mask;
}
else {
cols >>= col_left_count;
if (combining == COMBINING_COL) {
if (row < row_left_count) {
cols &= col_left_mask;
}
else {
cols >>= col_left_count;
}
} }
#endif
#endif


return cols; return cols;
} }
data[exp][PX_TO_PORT(px)] &= ~(1 << PX_TO_PIN(px)); data[exp][PX_TO_PORT(px)] &= ~(1 << PX_TO_PIN(px));
expander_write_config(exp, data[exp]); expander_write_config(exp, data[exp]);
} }
#if CHANGE_COMBINING
#ifdef TWO_HEADED_KIMERA
if (row < row_left_count) {
kimera_select_row(row + row_left_count);

if (combining == COMBINING_ROW) {
if (row < row_left_count) {
kimera_select_row(row + row_left_count);
}
} }
#endif
#endif
} }


void expander_init(uint8_t exp) void expander_init(uint8_t exp)
if (ret) goto stop; if (ret) goto stop;
ret = i2c_write(command); ret = i2c_write(command);
if (ret) goto stop; if (ret) goto stop;
ret = i2c_start(addr | I2C_READ);
ret = i2c_rep_start(addr | I2C_READ);
if (ret) goto stop; if (ret) goto stop;
*data++ = i2c_readAck(); *data++ = i2c_readAck();
*data = i2c_readNak(); *data = i2c_readNak();

+ 7
- 4
keyboard/kimera/kimera.h View File

`----------' `----------' `----------' `----------'
*/ */


#ifndef TWO_HEADED_KIMERA
#define EXP_COUNT 2
#else
#define EXP_COUNT 4 #define EXP_COUNT 4
#endif
#define EXP_ADDR(n) ((0x20+(n))<<1) #define EXP_ADDR(n) ((0x20+(n))<<1)
#define EXP_OUTPUT 0 #define EXP_OUTPUT 0
#define EXP_INPUT 1 #define EXP_INPUT 1
#define EECONFIG_ROW_COL_MAPPING (uint8_t *)18 #define EECONFIG_ROW_COL_MAPPING (uint8_t *)18
#define UNCONFIGURED 0xFF #define UNCONFIGURED 0xFF


enum {
COMBINING_NONE = 0,
COMBINING_COL,
COMBINING_ROW
};
#define COMBINING_BIT (0x80)

/* Functions */ /* Functions */


void kimera_init(void); void kimera_init(void);