diff --git a/keyboard/kimera/config.h b/keyboard/kimera/config.h
index 14542ee2..38ceef65 100644
--- a/keyboard/kimera/config.h
+++ b/keyboard/kimera/config.h
@@ -35,7 +35,11 @@ along with this program. If not, see .
#define MATRIX_SIZE 16 * 16
#define FN_ACTIONS_COUNT 32
#define KEYMAPS_COUNT 3
+#ifndef TWO_HEADED_KIMERA
#define EECONFIG_KEYMAP_IN_EEPROM 45
+#else
+#define EECONFIG_KEYMAP_IN_EEPROM 77
+#endif
/* define if matrix has ghost */
//#define MATRIX_HAS_GHOST
diff --git a/keyboard/kimera/keymap_two_headed.c b/keyboard/kimera/keymap_two_headed.c
index f1f55d19..6f09142d 100644
--- a/keyboard/kimera/keymap_two_headed.c
+++ b/keyboard/kimera/keymap_two_headed.c
@@ -8,7 +8,7 @@ const uint8_t keymaps[][MATRIX_SIZE] PROGMEM = {
#endif
/* Keymap 0: Default Layer
* ,----------------------------------------. ,------------------------------------------------.
- * | ||Esc| | F1| F2| F3| F4| | | F5| F6| F7| F8| | F9|F10|F11|F12||Psc|Slk|Pus|
+ * | | | | ||Esc| | F1| F2| F3| F4| | | F5| F6| F7| F8| | F9|F10|F11|F12||Psc|Slk|Pus|
* |---------------||-----------------------| |-----------------------------------||-----------|
* |Num| /| *| -|| `| 1| 2| 3| 4| 5| | 6| 7| 8| 9| 0| -| =|Backsp ||Ins|Hom|PgU|
* |---------------||-------------------------. `-----------------------------------||-----------|
@@ -18,7 +18,7 @@ const uint8_t keymaps[][MATRIX_SIZE] PROGMEM = {
* |---------------||----------------------------. `-------------------------------|| ,---. |
* | 1| 2| 3| ||Shift | Z| X| C| V| B| | N| M| ,| .| /|Shift || |Up | |
* |-----------|Ent||----------------------------| |------------------------------||-----------|
- * | 0| .| ||Ctrl|Gui |Alt | Space | | Space |Alt |Gui |Fn0 |Ctrl||Lef|Dow|Rig|
+ * | 0| .| ||Ctrl|Gui |Alt | Space | | Space |Alt |Gui |App |Ctrl||Lef|Dow|Rig|
* `---------------------------------------------' `-------------------------------------------'
*/
KEYMAP_16x16(
@@ -36,7 +36,7 @@ const uint8_t keymaps[][MATRIX_SIZE] PROGMEM = {
Y, U, I, O, P, LBRC,RBRC,BSLS,DEL, END, PGDN,NO, NO, NO, NO, NO, \
H, J, K, L, SCLN,QUOT,NO, ENT, NO, NO, NO, NO, NO, NO, NO, NO, \
N, M, COMM,DOT, SLSH,NO, NO, RSFT,NO, UP, NO, NO, NO, NO, NO, NO, \
- NO, SPC, NO, RALT,RGUI,FN0, RCTL,NO, LEFT,DOWN,RGHT,NO, NO, NO, NO, NO, \
+ NO, SPC, NO, RALT,RGUI,APP, RCTL,NO, LEFT,DOWN,RGHT,NO, NO, NO, NO, NO, \
NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, \
NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO ),
};
diff --git a/keyboard/kimera/kimera.c b/keyboard/kimera/kimera.c
index e738fc98..e75ea8ac 100644
--- a/keyboard/kimera/kimera.c
+++ b/keyboard/kimera/kimera.c
@@ -32,7 +32,7 @@ along with this program. If not, see .
#define SCL_DURATION (1000000L/SCL_CLOCK)/2
extern uint8_t i2c_force_stop;
-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,
@@ -45,7 +45,7 @@ uint8_t row_mapping[PX_COUNT] = {
UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED, UNCONFIGURED
#endif
};
-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,
@@ -59,14 +59,17 @@ uint8_t col_mapping[PX_COUNT] = {
#endif
};
#ifndef TWO_HEADED_KIMERA
-uint8_t row_count = 8;
-uint8_t col_count = 24;
+static uint8_t row_count = 8;
+static uint8_t col_count = 24;
#else
-uint8_t row_count = 16;
-uint8_t col_count = 32;
+static uint8_t row_count = 16;
+static uint8_t col_count = 32;
+static uint8_t row_left_count = 8;
+static uint8_t col_left_count = 16;
+static matrix_row_t col_left_mask;
#endif
-uint8_t data[EXP_COUNT][EXP_PORT_COUNT];
-uint8_t exp_status = 0;
+static uint8_t data[EXP_COUNT][EXP_PORT_COUNT];
+static uint8_t exp_status = 0;
void kimera_init(void)
{
@@ -109,6 +112,11 @@ uint8_t read_matrix_mapping(void)
if (error) return error;
row_count = rows;
col_count = cols;
+#ifdef TWO_HEADED_KIMERA
+ row_left_count = (rows + 1) / 2;
+ col_left_count = (cols + 1) / 2;
+ col_left_mask = (1 << row_left_count) - 1;
+#endif
/* read row mapping */
uint8_t *mapping = EECONFIG_ROW_COL_MAPPING;
@@ -177,7 +185,23 @@ void kimera_scan(void)
}
}
-matrix_row_t read_cols(void)
+inline
+uint8_t kimera_matrix_rows(void)
+{
+ return row_count;
+}
+
+inline
+uint8_t kimera_matrix_cols(void)
+{
+#ifndef TWO_HEADED_KIMERA
+ return col_count;
+#else
+ return col_left_count;
+#endif
+}
+
+matrix_row_t kimera_read_cols(uint8_t row)
{
init_data(0xFF);
@@ -196,10 +220,20 @@ matrix_row_t read_cols(void)
}
}
}
+
+#ifdef TWO_HEADED_KIMERA
+ if (row < row_left_count) {
+ cols &= col_left_mask;
+ }
+ else {
+ cols >>= col_left_count;
+ }
+#endif
+
return cols;
}
-void unselect_rows(void)
+void kimera_unselect_rows(void)
{
/* set all output registers to 0xFF */
init_data(0xFF);
@@ -208,7 +242,7 @@ void unselect_rows(void)
}
}
-void select_row(uint8_t row)
+void kimera_select_row(uint8_t row)
{
/* set selected row to low */
init_data(0xFF);
diff --git a/keyboard/kimera/kimera.h b/keyboard/kimera/kimera.h
index 5ece9f84..d4e1943a 100644
--- a/keyboard/kimera/kimera.h
+++ b/keyboard/kimera/kimera.h
@@ -128,9 +128,11 @@ void wdt_init(void);
uint8_t read_matrix_mapping(void);
void write_matrix_mapping(void);
void kimera_scan(void);
-matrix_row_t read_cols(void);
-void unselect_rows(void);
-void select_row(uint8_t row);
+uint8_t kimera_matrix_rows(void);
+uint8_t kimera_matrix_cols(void);
+matrix_row_t kimera_read_cols(uint8_t row);
+void kimera_unselect_rows(void);
+void kimera_select_row(uint8_t row);
void expander_init(uint8_t exp);
uint8_t expander_write(uint8_t exp, uint8_t command, uint8_t *data);
uint8_t expander_read(uint8_t exp, uint8_t command, uint8_t *data);
diff --git a/keyboard/kimera/matrix.c b/keyboard/kimera/matrix.c
index b7a3e49a..677c4d81 100644
--- a/keyboard/kimera/matrix.c
+++ b/keyboard/kimera/matrix.c
@@ -39,24 +39,16 @@ static uint8_t debouncing = DEBOUNCE;
static matrix_row_t matrix[MATRIX_ROWS];
static matrix_row_t matrix_debouncing[MATRIX_ROWS];
-extern uint8_t row_count;
-extern uint8_t col_count;
-extern uint8_t data[EXP_COUNT][EXP_PORT_COUNT];
-
inline
uint8_t matrix_rows(void)
{
- return row_count;
+ return kimera_matrix_rows();
}
inline
uint8_t matrix_cols(void)
{
-#ifndef TWO_HEADED_KIMERA
- return col_count;
-#else
- return col_count / 2;
-#endif
+ return kimera_matrix_cols();
}
void matrix_init(void)
@@ -68,7 +60,7 @@ void matrix_init(void)
kimera_init();
// initialize row and col
- unselect_rows();
+ kimera_unselect_rows();
// initialize matrix state: all keys off
for (uint8_t i=0; i < matrix_rows(); i++) {
@@ -85,19 +77,9 @@ uint8_t matrix_scan(void)
kimera_scan();
for (uint8_t i = 0; i < matrix_rows(); i++) {
- select_row(i);
+ kimera_select_row(i);
_delay_us(30); // without this wait read unstable value.
-#ifndef TWO_HEADED_KIMERA
- matrix_row_t cols = read_cols();
-#else
- matrix_row_t cols = read_cols();
- if (i < 8) {
- cols &= 0xFFFFUL;
- }
- else {
- cols >>= 16;
- }
-#endif
+ matrix_row_t cols = kimera_read_cols(i);
if (matrix_debouncing[i] != cols) {
matrix_debouncing[i] = cols;
if (debouncing) {
@@ -105,7 +87,7 @@ uint8_t matrix_scan(void)
}
debouncing = DEBOUNCE;
}
- unselect_rows();
+ kimera_unselect_rows();
}
if (debouncing) {