From d51386d3b5ec5225402f22933f9ab8e9e0e6791f Mon Sep 17 00:00:00 2001 From: Matt Books Date: Sat, 9 Dec 2017 11:28:58 -0800 Subject: [PATCH] WIP hb #2 firmware --- keyboards/hbno2/config.h | 6 +- keyboards/hbno2/hbno2.c | 30 ++--- keyboards/hbno2/hbno2.h | 40 ++++--- keyboards/hbno2/keymaps/default/keymap.c | 20 ++-- keyboards/hbno2/matrix.c | 141 ++++++++++++----------- 5 files changed, 130 insertions(+), 107 deletions(-) diff --git a/keyboards/hbno2/config.h b/keyboards/hbno2/config.h index e083ec843ad5..30d7fd32eebb 100644 --- a/keyboards/hbno2/config.h +++ b/keyboards/hbno2/config.h @@ -30,8 +30,8 @@ along with this program. If not, see . #define DESCRIPTION QMK keyboard firmware for HBNO2 /* key matrix size */ -#define MATRIX_ROWS 5 -#define MATRIX_COLS 13 +#define MATRIX_ROWS 13 +#define MATRIX_COLS 5 #define MATRIX_COLS_RIGHT 7 #define MOUSEKEY_INTERVAL 20 @@ -96,7 +96,7 @@ along with this program. If not, see . * runs seeming to need it. This may change when configuration for * this is more directly exposed. */ -#define DEBOUNCE 15 +#define DEBOUNCE 5 #define PREVENT_STUCK_MODIFIERS diff --git a/keyboards/hbno2/hbno2.c b/keyboards/hbno2/hbno2.c index db985c278464..bb36ebf58454 100644 --- a/keyboards/hbno2/hbno2.c +++ b/keyboards/hbno2/hbno2.c @@ -12,20 +12,20 @@ extern inline void ergodox_led_all_off(void); bool i2c_initialized = 0; uint8_t mcp23018_status = 0x20; -void matrix_init_kb(void) { - /* // keyboard LEDs (see "PWM on ports OC1(A|B|C)" in "teensy-2-0.md") */ - /* TCCR1A = 0b10101001; // set and configure fast PWM */ - /* TCCR1B = 0b00001001; // set and configure fast PWM */ - /* TCCR4D = 0b00001001; // set and configure fast PWM */ +/* void matrix_init_kb(void) { */ +/* /1* // keyboard LEDs (see "PWM on ports OC1(A|B|C)" in "teensy-2-0.md") *1/ */ +/* /1* TCCR1A = 0b10101001; // set and configure fast PWM *1/ */ +/* /1* TCCR1B = 0b00001001; // set and configure fast PWM *1/ */ +/* /1* TCCR4D = 0b00001001; // set and configure fast PWM *1/ */ - /* ergodox_board_led_on(); */ - /* _delay_ms(500); */ - /* ergodox_board_led_off(); */ +/* /1* ergodox_board_led_on(); *1/ */ +/* /1* _delay_ms(500); *1/ */ +/* /1* ergodox_board_led_off(); *1/ */ - /* matrix_init_user(); */ +/* /1* matrix_init_user(); *1/ */ - init_mcp23018(); -} +/* init_mcp23018(); */ +/* } */ uint8_t init_mcp23018(void) { mcp23018_status = 0x20; @@ -45,8 +45,8 @@ uint8_t init_mcp23018(void) { /* // - driving : output : 0 */ mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out; mcp23018_status = i2c_write(IODIRA); if (mcp23018_status) goto out; - mcp23018_status = i2c_write(0b11111111); if (mcp23018_status) goto out; - mcp23018_status = i2c_write(0b11111111); if (mcp23018_status) goto out; + mcp23018_status = i2c_write(0b10000000); if (mcp23018_status) goto out; + mcp23018_status = i2c_write(0b11000000); if (mcp23018_status) goto out; i2c_stop(); /* // set pull-up */ @@ -55,8 +55,8 @@ uint8_t init_mcp23018(void) { /* // - driving : off : 0 */ mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out; mcp23018_status = i2c_write(GPPUA); if (mcp23018_status) goto out; - mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out; - mcp23018_status = i2c_write(0b00000000); if (mcp23018_status) goto out; + mcp23018_status = i2c_write(0b01111111); if (mcp23018_status) goto out; + mcp23018_status = i2c_write(0b00111111); if (mcp23018_status) goto out; out: i2c_stop(); diff --git a/keyboards/hbno2/hbno2.h b/keyboards/hbno2/hbno2.h index c1a5b6467e1b..11d87b66f46e 100644 --- a/keyboards/hbno2/hbno2.h +++ b/keyboards/hbno2/hbno2.h @@ -42,7 +42,6 @@ inline void ergodox_board_led_on(void) { } inline void ergodox_board_led_off(void) { - DDRB &= ~(1<<5); PORTB &= ~(1<<6); } @@ -57,19 +56,32 @@ inline void ergodox_led_all_off(void) } #define KEYMAP( \ - k00,k05,k10,k15,k20,k25, k30,k35,k40,k45,k50,k55, \ - k01,k06,k11,k16,k21,k26, k31,k36,k41,k46,k51,k56, \ - k02,k07,k12,k17,k22,k27, k32,k37,k42,k47,k52,k57, \ - k03,k08,k13,k18,k23,k28, k33,k38,k43,k48,k53,k58, \ - k04,k09,k14,k19,k24,k29, k34,k39,k44,k49,k54,k59, \ - k60, k61, k62, k63 ) { \ - { k00, k05, k10, k15, k20, k25, k30, k35, k40, k45, k50, k55, k60 }, \ - { k01, k06, k11, k16, k21, k26, k31, k36, k41, k46, k51, k56, k61 }, \ - { k02, k07, k12, k17, k22, k27, k32, k37, k42, k47, k52, k57, k62 }, \ - { k03, k08, k13, k18, k23, k28, k33, k38, k43, k48, k53, k58, k63 }, \ - { k04, k09, k14, k19, k24, k29, k34, k39, k44, k49, k54, k59, KC_NO }, \ + k00,k05,k10,k15,k20,k25, \ + k01,k06,k11,k16,k21,k26, \ + k02,k07,k12,k17,k22,k27, \ + k03,k08,k13,k18,k23,k28, \ + k04,k09,k14,k19,k24,k29, \ +\ + k30,k35,k40,k45,k50,k55, \ + k31,k36,k41,k46,k51,k56, \ + k32,k37,k42,k47,k52,k57, \ + k33,k38,k43,k48,k53,k58, \ + k34,k39,k44,k49,k54,k59, \ +\ + k60, k61, k63, k62 ) { \ + { k00, k01, k02, k03, k04 }, \ + { k05, k06, k07, k08, k09 }, \ + { k10, k11, k12, k13, k14 }, \ + { k15, k16, k17, k18, k19 }, \ + { k20, k21, k22, k23, k24 }, \ + { k25, k26, k27, k28, k29 }, \ + { k30, k31, k32, k33, k34 }, \ + { k35, k36, k37, k38, k39 }, \ + { k40, k41, k42, k43, k44 }, \ + { k45, k46, k47, k48, k49 }, \ + { k50, k51, k52, k53, k54 }, \ + { k55, k56, k57, k58, k59 }, \ + { k60, k61, k62, k63, KC_NO } \ } -#define LAYOUT_ergodox KEYMAP - #endif diff --git a/keyboards/hbno2/keymaps/default/keymap.c b/keyboards/hbno2/keymaps/default/keymap.c index 10c040b69c7b..ce5c5223b655 100644 --- a/keyboards/hbno2/keymaps/default/keymap.c +++ b/keyboards/hbno2/keymaps/default/keymap.c @@ -16,14 +16,20 @@ enum custom_keycodes { const uint16_t PROGMEM keymaps[][MATRIX_ROWS][MATRIX_COLS] = { [BASE] = KEYMAP( // layer 0 : default - // left hand - CTL_T(KC_ESC), KC_1, KC_2, KC_3, KC_4, KC_5, KC_6, KC_7, KC_8, KC_9, KC_0, CTL_T(KC_ESC), - KC_LGUI, KC_Q, KC_W, KC_E, KC_R, KC_T, KC_Y, KC_U, KC_I, KC_O, KC_P, KC_RGUI, - KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G, KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_RCTRL, - KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RSHIFT, - KC_NO, KC_LALT, KC_LSHIFT, KC_LGUI, KC_LCTRL, KC_BSPACE, KC_TAB, KC_RCTRL, KC_RGUI, KC_RSHIFT, KC_RALT, KC_NO, + // left hand + CTL_T(KC_ESC), KC_1, KC_2, KC_3, KC_4, KC_5, + KC_LGUI, KC_Q, KC_W, KC_E, KC_R, KC_T, + KC_LCTRL, KC_A, KC_S, KC_D, KC_F, KC_G, + KC_LSHIFT, KC_Z, KC_X, KC_C, KC_V, KC_B, + KC_NO, KC_LALT, KC_LSHIFT, KC_LGUI, KC_LCTRL, KC_BSPACE, - KC_SPACE, KC_NO, KC_NO, KC_ENTER) + KC_6, KC_7, KC_8, KC_9, KC_0, CTL_T(KC_ESC), + KC_Y, KC_U, KC_I, KC_O, KC_P, KC_RGUI, + KC_H, KC_J, KC_K, KC_L, KC_SCOLON, KC_RCTRL, + KC_N, KC_M, KC_COMMA, KC_DOT, KC_SLASH, KC_RSHIFT, + KC_TAB, KC_RCTRL, KC_RGUI, KC_RSHIFT, KC_RALT, KC_NO, + + KC_SPACE, KC_NO, KC_NO, KC_ENTER) }; const uint16_t PROGMEM fn_actions[] = { diff --git a/keyboards/hbno2/matrix.c b/keyboards/hbno2/matrix.c index 036b8abc90ed..4d99ef67e453 100644 --- a/keyboards/hbno2/matrix.c +++ b/keyboards/hbno2/matrix.c @@ -66,9 +66,9 @@ static matrix_row_t matrix[MATRIX_ROWS]; // already changed in the last DEBOUNCE scans. static uint8_t debounce_matrix[MATRIX_ROWS * MATRIX_COLS]; -static matrix_row_t read_cols(uint8_t row); -static void unselect_rows(void); -static void select_row(uint8_t row); +static uint8_t read_rows(uint8_t col); +static void unselect_columns(void); +static void select_column(uint8_t col); static uint8_t mcp23018_reset_loop; @@ -97,22 +97,21 @@ void matrix_scan_kb(void) { inline uint8_t matrix_rows(void) { - return MATRIX_ROWS; + return MATRIX_COLS; } inline uint8_t matrix_cols(void) { - return MATRIX_COLS; + return MATRIX_ROWS; } void matrix_init(void) { // initialize row and col - mcp23018_status = init_mcp23018(); - unselect_rows(); + unselect_columns(); // initialize matrix state: all keys off for (uint8_t i=0; i < MATRIX_ROWS; i++) { @@ -122,8 +121,6 @@ void matrix_init(void) } } - DDRB = 1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4; - /* #ifdef DEBUG_MATRIX_SCAN_RATE */ /* matrix_timer = timer_read32(); */ /* matrix_scan_count = 0; */ @@ -136,10 +133,10 @@ void matrix_init(void) void matrix_power_up(void) { mcp23018_status = init_mcp23018(); - /* unselect_rows(); */ + unselect_columns(); // initialize matrix state: all keys off - for (uint8_t i=0; i < MATRIX_ROWS; i++) { + for (uint8_t i=0; i < MATRIX_COLS; i++) { matrix[i] = 0; } @@ -151,11 +148,11 @@ void matrix_power_up(void) { // Returns a matrix_row_t whose bits are set if the corresponding key should be // eligible to change in this scan. -matrix_row_t debounce_mask(uint8_t row) { +matrix_row_t debounce_mask(uint8_t col) { matrix_row_t result = 0; for (uint8_t j=0; j < MATRIX_COLS; ++j) { - if (debounce_matrix[row * MATRIX_COLS + j]) { - --debounce_matrix[row * MATRIX_COLS + j]; + if (debounce_matrix[col * MATRIX_COLS + j]) { + --debounce_matrix[col * MATRIX_COLS + j]; } else { result |= (1 << j); } @@ -165,17 +162,17 @@ matrix_row_t debounce_mask(uint8_t row) { // Report changed keys in the given row. Resets the debounce countdowns // corresponding to each set bit in 'change' to DEBOUNCE. -void debounce_report(matrix_row_t change, uint8_t row) { +void debounce_report(matrix_row_t change, uint8_t col) { for (uint8_t i = 0; i < MATRIX_COLS; ++i) { if (change & (1 << i)) { - debounce_matrix[row * MATRIX_COLS + i] = DEBOUNCE; + debounce_matrix[col * MATRIX_COLS + i] = DEBOUNCE; } } } uint8_t matrix_scan(void) { - matrix_print(); + /* matrix_print(); */ /* uint8_t data = 0; */ @@ -183,7 +180,7 @@ uint8_t matrix_scan(void) /* if (mcp23018_status) { */ /* goto out; */ /* } */ - + /* data = i2c_readNak(); */ /* out: */ @@ -203,27 +200,29 @@ uint8_t matrix_scan(void) } } -#ifdef DEBUG_MATRIX_SCAN_RATE - matrix_scan_count++; +/* #ifdef DEBUG_MATRIX_SCAN_RATE */ +/* matrix_scan_count++; */ - uint32_t timer_now = timer_read32(); - if (TIMER_DIFF_32(timer_now, matrix_timer)>1000) { - print("matrix scan frequency: "); - pdec(matrix_scan_count); - print("\n"); +/* uint32_t timer_now = timer_read32(); */ +/* if (TIMER_DIFF_32(timer_now, matrix_timer)>1000) { */ +/* print("matrix scan frequency: "); */ +/* pdec(matrix_scan_count); */ +/* print("\n"); */ - matrix_timer = timer_now; - matrix_scan_count = 0; - } -#endif +/* matrix_timer = timer_now; */ +/* matrix_scan_count = 0; */ +/* } */ +/* #endif */ for (uint8_t i = 0; i < MATRIX_ROWS; i++) { - select_row(i); + + select_column(i); matrix_row_t mask = debounce_mask(i); - matrix_row_t cols = (read_cols(i) & mask); - debounce_report(cols ^ matrix[i], i); - matrix[i] = cols; - unselect_rows(); + matrix_row_t rows = (read_rows(i) & mask) | (matrix[i] & ~mask); + debounce_report(rows ^ matrix[i], i); + matrix[i] = rows; + + unselect_columns(); } matrix_scan_quantum(); @@ -234,22 +233,21 @@ uint8_t matrix_scan(void) inline bool matrix_is_on(uint8_t row, uint8_t col) { - return (matrix[row] & ((matrix_row_t)1<> 3: %08b\n", (data & 0x80) >> 3); */ + /* xprintf("0xE0: %08b\n", 0xE0); */ + return ~(0xE0 | ((data & 0x80) >> 3) | (data & 0x0F)); } -static void unselect_rows(void) +static void unselect_columns(void) { - PORTB &= ~(1<<0 | 1<<1 | 1<<2 | 1<<3 | 1<<4); + mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out; + mcp23018_status = i2c_write(GPIOA); if (mcp23018_status) goto out; + mcp23018_status = i2c_write(0b11111111); if (mcp23018_status) goto out; + mcp23018_status = i2c_write(0b11111111); if (mcp23018_status) goto out; + +out: + i2c_stop(); } -static void select_row(uint8_t row) +static void select_column(uint8_t col) { - PORTB |= 1<= 6) { + data = ~(1<<(col - 6)); + port = GPIOA; + } + + // set col to low + mcp23018_status = i2c_start(I2C_ADDR_WRITE); if (mcp23018_status) goto out; + mcp23018_status = i2c_write(port); if (mcp23018_status) goto out; + mcp23018_status = i2c_write(data); + +out: + i2c_stop(); }