[Keyboard] Update Gergo to use newer Ergodox Matrix code (#5703)
* [Keyboard] Update Gergo to use newer Ergodox Matrix code And update layout macros to be correct * Almost forgot the json file * Remove board specific defines for i2c timeout
This commit is contained in:
		
							parent
							
								
									ffd10d4116
								
							
						
					
					
						commit
						8faee5c9f6
					
				
					 12 changed files with 313 additions and 449 deletions
				
			
		|  | @ -29,10 +29,11 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>. | |||
| #include "print.h" | ||||
| #include "debug.h" | ||||
| #include "util.h" | ||||
| #include "debounce.h" | ||||
| #include "pointing_device.h" | ||||
| #include QMK_KEYBOARD_H | ||||
| #ifdef DEBUG_MATRIX_SCAN_RATE | ||||
| #include  "timer.h" | ||||
| #   include  "timer.h" | ||||
| #endif | ||||
| 
 | ||||
| #ifdef BALLER | ||||
|  | @ -117,12 +118,11 @@ static matrix_row_t raw_matrix[MATRIX_ROWS]; | |||
| // Debouncing: store for each key the number of scans until it's eligible to
 | ||||
| // change.  When scanning the matrix, ignore any changes in keys that have
 | ||||
| // 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 init_cols(void); | ||||
| static void unselect_rows(void); | ||||
| static void select_row(uint8_t row); | ||||
| static void         init_cols(void); | ||||
| static void         unselect_rows(void); | ||||
| static void         select_row(uint8_t row); | ||||
| static void enableInterrupts(void); | ||||
| 
 | ||||
| static uint8_t mcp23018_reset_loop; | ||||
|  | @ -134,11 +134,9 @@ uint32_t matrix_scan_count; | |||
| #endif | ||||
| 
 | ||||
| 
 | ||||
| __attribute__ ((weak)) | ||||
| void matrix_init_user(void) {} | ||||
| __attribute__ ((weak)) void matrix_init_user(void) {} | ||||
| 
 | ||||
| __attribute__ ((weak)) | ||||
| void matrix_scan_user(void) {} | ||||
| __attribute__ ((weak)) void matrix_scan_user(void) {} | ||||
| 
 | ||||
| __attribute__ ((weak)) | ||||
| void matrix_init_kb(void) { | ||||
|  | @ -150,39 +148,28 @@ void matrix_scan_kb(void) { | |||
|   matrix_scan_user(); | ||||
| } | ||||
| 
 | ||||
| inline | ||||
| uint8_t matrix_rows(void) | ||||
| { | ||||
|     return MATRIX_ROWS; | ||||
| } | ||||
| inline uint8_t matrix_rows(void) { return MATRIX_ROWS; } | ||||
| 
 | ||||
| inline | ||||
| uint8_t matrix_cols(void) | ||||
| { | ||||
|     return MATRIX_COLS; | ||||
| } | ||||
| inline uint8_t matrix_cols(void) { return MATRIX_COLS; } | ||||
| 
 | ||||
| 
 | ||||
| void matrix_init(void) | ||||
| { | ||||
| void matrix_init(void) { | ||||
|     // initialize row and col
 | ||||
|     mcp23018_status = init_mcp23018(); | ||||
|     unselect_rows(); | ||||
|     init_cols(); | ||||
| 
 | ||||
|     // initialize matrix state: all keys off
 | ||||
|     for (uint8_t i=0; i < MATRIX_ROWS; i++) { | ||||
|         matrix[i] = 0; | ||||
|         raw_matrix[i] = 0; | ||||
|         for (uint8_t j=0; j < MATRIX_COLS; ++j) { | ||||
|             debounce_matrix[i * MATRIX_COLS + j] = 0; | ||||
|         } | ||||
|     } | ||||
|   // initialize matrix state: all keys off
 | ||||
|   for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | ||||
|     matrix[i]     = 0; | ||||
|     raw_matrix[i] = 0; | ||||
|   } | ||||
| 
 | ||||
| #ifdef DEBUG_MATRIX_SCAN_RATE | ||||
|     matrix_timer = timer_read32(); | ||||
|     matrix_timer      = timer_read32(); | ||||
|     matrix_scan_count = 0; | ||||
| #endif | ||||
|     debounce_init(MATRIX_ROWS); | ||||
|     matrix_init_quantum(); | ||||
| } | ||||
| 
 | ||||
|  | @ -198,130 +185,120 @@ void matrix_power_up(void) { | |||
|     } | ||||
| 
 | ||||
| #ifdef DEBUG_MATRIX_SCAN_RATE | ||||
|     matrix_timer = timer_read32(); | ||||
|     matrix_timer      = timer_read32(); | ||||
|     matrix_scan_count = 0; | ||||
| #endif | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| // 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(matrix_row_t rawcols, uint8_t row) { | ||||
|   matrix_row_t result = 0; | ||||
|   matrix_row_t change = rawcols ^ raw_matrix[row]; | ||||
|   raw_matrix[row] = rawcols; | ||||
|   for (uint8_t i = 0; i < MATRIX_COLS; ++i) { | ||||
|     if (debounce_matrix[row * MATRIX_COLS + i]) { | ||||
|       --debounce_matrix[row * MATRIX_COLS + i]; | ||||
|     } else { | ||||
|       result |= (1 << i); | ||||
|     } | ||||
|     if (change & (1 << i)) { | ||||
|       debounce_matrix[row * MATRIX_COLS + i] = DEBOUNCE; | ||||
|     } | ||||
| // Reads and stores a row, returning
 | ||||
| // whether a change occurred.
 | ||||
| static inline bool store_raw_matrix_row(uint8_t index) { | ||||
|   matrix_row_t temp = read_cols(index); | ||||
|   if (raw_matrix[index] != temp) { | ||||
|     raw_matrix[index] = temp; | ||||
|     return true; | ||||
|   } | ||||
|   return result; | ||||
|   return false; | ||||
| } | ||||
| 
 | ||||
| matrix_row_t debounce_read_cols(uint8_t row) { | ||||
|   // Read the row without debouncing filtering and store it for later usage.
 | ||||
|   matrix_row_t cols = read_cols(row); | ||||
|   // Get the Debounce mask.
 | ||||
|   matrix_row_t mask = debounce_mask(cols, row); | ||||
|   // debounce the row and return the result.
 | ||||
|   return (cols & mask) | (matrix[row] & ~mask);; | ||||
| } | ||||
| 
 | ||||
| uint8_t matrix_scan(void) | ||||
| { | ||||
|   // TODO: Find what is trashing interrupts
 | ||||
|   enableInterrupts(); | ||||
| 
 | ||||
|   // First we handle the mouse inputs
 | ||||
|   #ifdef BALLER | ||||
|   uint8_t pBtn   = PINE & TRKBTN; | ||||
| uint8_t matrix_scan(void) { | ||||
|     // TODO: Find what is trashing interrupts
 | ||||
|     enableInterrupts(); | ||||
| 
 | ||||
|   #ifdef DEBUG_BALLER | ||||
|   // Compare to previous, mod report
 | ||||
|   if (tbUpCnt + tbDnCnt + tbLtCnt + tbRtCnt != 0) | ||||
|     xprintf("U: %d D: %d L: %d R: %d B: %d\n", tbUpCnt, tbDnCnt, tbLtCnt, tbRtCnt, (trkBtnState >> 6)); | ||||
|   #endif | ||||
|     // First we handle the mouse inputs
 | ||||
| #ifdef BALLER | ||||
|     uint8_t pBtn   = PINE & TRKBTN; | ||||
| 
 | ||||
|   // Modify the report
 | ||||
|   report_mouse_t pRprt = pointing_device_get_report(); | ||||
|     #ifdef DEBUG_BALLER | ||||
|     // Compare to previous, mod report
 | ||||
|     if (tbUpCnt + tbDnCnt + tbLtCnt + tbRtCnt != 0) | ||||
|         xprintf("U: %d D: %d L: %d R: %d B: %d\n", tbUpCnt, tbDnCnt, tbLtCnt, tbRtCnt, (trkBtnState >> 6)); | ||||
|     #endif | ||||
| 
 | ||||
|   // Scroll by default, move on layer
 | ||||
|   if (layer_state == 0) { | ||||
|     // Modify the report
 | ||||
|     report_mouse_t pRprt = pointing_device_get_report(); | ||||
| 
 | ||||
|     // Scroll by default, move on layer
 | ||||
|     if (layer_state == 0) { | ||||
| 		  pRprt.h += tbLtCnt * SCROLLSTEP; tbLtCnt = 0; | ||||
| 		  pRprt.h -= tbRtCnt * SCROLLSTEP; tbRtCnt = 0; | ||||
| 		  pRprt.v -= tbUpCnt * SCROLLSTEP; tbUpCnt = 0; | ||||
| 		  pRprt.v += tbDnCnt * SCROLLSTEP; tbDnCnt = 0; | ||||
|   } else { | ||||
|     } else { | ||||
| 		  pRprt.x -= tbLtCnt * TRKSTEP * (layer_state - 1); tbLtCnt = 0; | ||||
| 		  pRprt.x += tbRtCnt * TRKSTEP * (layer_state - 1); tbRtCnt = 0; | ||||
| 		  pRprt.y -= tbUpCnt * TRKSTEP * (layer_state - 1); tbUpCnt = 0; | ||||
| 		  pRprt.y += tbDnCnt * TRKSTEP * (layer_state - 1); tbDnCnt = 0; | ||||
|   } | ||||
|     } | ||||
| 
 | ||||
|   #ifdef DEBUG_BALLER | ||||
|   if (pRprt.x != 0 || pRprt.y != 0) | ||||
| 	xprintf("X: %d Y: %d\n", pRprt.x, pRprt.y); | ||||
|   #endif | ||||
| #ifdef DEBUG_BALLER | ||||
|     if (pRprt.x != 0 || pRprt.y != 0) | ||||
|         xprintf("X: %d Y: %d\n", pRprt.x, pRprt.y); | ||||
| #endif | ||||
| 
 | ||||
|   if ((pBtn != trkBtnState) && ((pBtn >> 6) == 0))  pRprt.buttons |= MOUSE_BTN1; | ||||
|   if ((pBtn != trkBtnState) && ((pBtn >> 6) == 1))  pRprt.buttons &= ~MOUSE_BTN1; | ||||
|     if ((pBtn != trkBtnState) && ((pBtn >> 6) == 0))  pRprt.buttons |= MOUSE_BTN1; | ||||
|     if ((pBtn != trkBtnState) && ((pBtn >> 6) == 1))  pRprt.buttons &= ~MOUSE_BTN1; | ||||
| 
 | ||||
|   // Save state, push update
 | ||||
|   if (pRprt.x != 0 || pRprt.y != 0 || pRprt.h != 0 || pRprt.v != 0 || (trkBtnState != pBtn)) | ||||
|     pointing_device_set_report(pRprt); | ||||
|     // Save state, push update
 | ||||
|     if (pRprt.x != 0 || pRprt.y != 0 || pRprt.h != 0 || pRprt.v != 0 || (trkBtnState != pBtn)) | ||||
|         pointing_device_set_report(pRprt); | ||||
| 
 | ||||
|   trkBtnState = pBtn; | ||||
|   #endif | ||||
|     trkBtnState = pBtn; | ||||
| #endif | ||||
| 
 | ||||
|   // Then the keyboard
 | ||||
|   if (mcp23018_status) { // if there was an error
 | ||||
|       if (++mcp23018_reset_loop == 0) { | ||||
|       // if (++mcp23018_reset_loop >= 1300) {
 | ||||
|           // since mcp23018_reset_loop is 8 bit - we'll try to reset once in 255 matrix scans
 | ||||
|           // this will be approx bit more frequent than once per second
 | ||||
|           print("trying to reset mcp23018\n"); | ||||
|           mcp23018_status = init_mcp23018(); | ||||
|           if (mcp23018_status) { | ||||
|               print("left side not responding\n"); | ||||
|           } else { | ||||
|               print("left side attached\n"); | ||||
|           } | ||||
|       } | ||||
|   } | ||||
|     // Then the keyboard
 | ||||
|     if (mcp23018_status) {  // if there was an error
 | ||||
|         if (++mcp23018_reset_loop == 0) { | ||||
|             // if (++mcp23018_reset_loop >= 1300) {
 | ||||
|             // since mcp23018_reset_loop is 8 bit - we'll try to reset once in 255 matrix scans
 | ||||
|             // this will be approx bit more frequent than once per second
 | ||||
|             print("trying to reset mcp23018\n"); | ||||
|             mcp23018_status = init_mcp23018(); | ||||
|             if (mcp23018_status) { | ||||
|                 print("left side not responding\n"); | ||||
|             } else { | ||||
|                 print("left side attached\n"); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| #ifdef DEBUG_MATRIX_SCAN_RATE | ||||
|     matrix_scan_count++; | ||||
| 
 | ||||
|     uint32_t timer_now = timer_read32(); | ||||
|     if (TIMER_DIFF_32(timer_now, matrix_timer)>1000) { | ||||
|     if (TIMER_DIFF_32(timer_now, matrix_timer) > 1000) { | ||||
|         print("matrix scan frequency: "); | ||||
|         pdec(matrix_scan_count); | ||||
|         print("\n"); | ||||
| 
 | ||||
|         matrix_timer = timer_now; | ||||
|         matrix_timer      = timer_now; | ||||
|         matrix_scan_count = 0; | ||||
|     } | ||||
| #endif | ||||
| 
 | ||||
|     bool changed = false; | ||||
|     for (uint8_t i = 0; i < MATRIX_ROWS_PER_SIDE; i++) { | ||||
|         select_row(i); | ||||
|         // and select on left hand
 | ||||
|         select_row(i + MATRIX_ROWS_PER_SIDE); | ||||
|         // select rows from left and right hands
 | ||||
|         uint8_t left_index = i; | ||||
|         uint8_t right_index = i + MATRIX_ROWS_PER_SIDE; | ||||
|         select_row(left_index); | ||||
|         select_row(right_index); | ||||
| 
 | ||||
|         // we don't need a 30us delay anymore, because selecting a
 | ||||
|         // left-hand row requires more than 30us for i2c.
 | ||||
| 
 | ||||
|         // grab cols from left hand
 | ||||
|         matrix[i] = debounce_read_cols(i); | ||||
|         // grab cols from right hand
 | ||||
|         matrix[i + MATRIX_ROWS_PER_SIDE] = debounce_read_cols(i + MATRIX_ROWS_PER_SIDE); | ||||
|         changed |= store_raw_matrix_row(left_index); | ||||
|         changed |= store_raw_matrix_row(right_index); | ||||
| 
 | ||||
|         unselect_rows(); | ||||
|     } | ||||
| 
 | ||||
|     debounce(raw_matrix, matrix, MATRIX_ROWS, changed); | ||||
|     matrix_scan_quantum(); | ||||
| 
 | ||||
|     enableInterrupts(); | ||||
| 
 | ||||
| #ifdef DEBUG_MATRIX | ||||
|  | @ -338,20 +315,11 @@ bool matrix_is_modified(void) // deprecated and evidently not called. | |||
|     return true; | ||||
| } | ||||
| 
 | ||||
| inline | ||||
| bool matrix_is_on(uint8_t row, uint8_t col) | ||||
| { | ||||
|     return (matrix[row] & ((matrix_row_t)1<<col)); | ||||
| } | ||||
| inline bool matrix_is_on(uint8_t row, uint8_t col) { return (matrix[row] & ((matrix_row_t)1 << col)); } | ||||
| 
 | ||||
| inline | ||||
| matrix_row_t matrix_get_row(uint8_t row) | ||||
| { | ||||
|     return matrix[row]; | ||||
| } | ||||
| inline matrix_row_t matrix_get_row(uint8_t row) { return matrix[row]; } | ||||
| 
 | ||||
| void matrix_print(void) | ||||
| { | ||||
| void matrix_print(void) { | ||||
|     print("\nr/c 0123456789ABCDEF\n"); | ||||
|     for (uint8_t row = 0; row < MATRIX_ROWS; row++) { | ||||
|         phex(row); print(": "); | ||||
|  | @ -360,8 +328,7 @@ void matrix_print(void) | |||
|     } | ||||
| } | ||||
| 
 | ||||
| uint8_t matrix_key_count(void) | ||||
| { | ||||
| uint8_t matrix_key_count(void) { | ||||
|     uint8_t count = 0; | ||||
|     for (uint8_t i = 0; i < MATRIX_ROWS; i++) { | ||||
|         count += bitpop16(matrix[i]); | ||||
|  | @ -370,8 +337,7 @@ uint8_t matrix_key_count(void) | |||
| } | ||||
| 
 | ||||
| // Remember this means ROWS
 | ||||
| static void  init_cols(void) | ||||
| { | ||||
| static void  init_cols(void) { | ||||
|     // init on mcp23018
 | ||||
|     // not needed, already done as part of init_mcp23018()
 | ||||
| 
 | ||||
|  | @ -380,17 +346,16 @@ static void  init_cols(void) | |||
|     PORTF |=  FMASK; | ||||
| } | ||||
| 
 | ||||
| static matrix_row_t read_cols(uint8_t row) | ||||
| { | ||||
| static matrix_row_t read_cols(uint8_t row) { | ||||
|     if (row < 7) { | ||||
|         if (mcp23018_status) { // if there was an error
 | ||||
|             return 0; | ||||
|         } else { | ||||
|             uint8_t data = 0; | ||||
|             mcp23018_status = i2c_start(I2C_ADDR_WRITE, ERGODOX_EZ_I2C_TIMEOUT);    if (mcp23018_status) goto out; | ||||
|             mcp23018_status = i2c_write(GPIOB, ERGODOX_EZ_I2C_TIMEOUT);             if (mcp23018_status) goto out; | ||||
|             mcp23018_status = i2c_start(I2C_ADDR_READ, ERGODOX_EZ_I2C_TIMEOUT);     if (mcp23018_status) goto out; | ||||
|             mcp23018_status = i2c_read_nack(ERGODOX_EZ_I2C_TIMEOUT);                if (mcp23018_status < 0) goto out; | ||||
|             mcp23018_status = i2c_start(I2C_ADDR_WRITE, I2C_TIMEOUT);    if (mcp23018_status) goto out; | ||||
|             mcp23018_status = i2c_write(GPIOB, I2C_TIMEOUT);             if (mcp23018_status) goto out; | ||||
|             mcp23018_status = i2c_start(I2C_ADDR_READ, I2C_TIMEOUT);     if (mcp23018_status) goto out; | ||||
|             mcp23018_status = i2c_read_nack(I2C_TIMEOUT);                if (mcp23018_status < 0) goto out; | ||||
|             data = ~((uint8_t)mcp23018_status); | ||||
|             mcp23018_status = I2C_STATUS_SUCCESS; | ||||
|         out: | ||||
|  | @ -440,9 +405,9 @@ static void select_row(uint8_t row) | |||
|         // select on mcp23018
 | ||||
|         if (mcp23018_status) { // do nothing on error
 | ||||
|         } else { // set active row low  : 0 // set other rows hi-Z : 1
 | ||||
|             mcp23018_status = i2c_start(I2C_ADDR_WRITE, ERGODOX_EZ_I2C_TIMEOUT);        if (mcp23018_status) goto out; | ||||
|             mcp23018_status = i2c_write(GPIOA, ERGODOX_EZ_I2C_TIMEOUT);                 if (mcp23018_status) goto out; | ||||
|             mcp23018_status = i2c_write(0xFF & ~(1<<row), ERGODOX_EZ_I2C_TIMEOUT);      if (mcp23018_status) goto out; | ||||
|             mcp23018_status = i2c_start(I2C_ADDR_WRITE, I2C_TIMEOUT);        if (mcp23018_status) goto out; | ||||
|             mcp23018_status = i2c_write(GPIOA, I2C_TIMEOUT);                 if (mcp23018_status) goto out; | ||||
|             mcp23018_status = i2c_write(0xFF & ~(1<<row), I2C_TIMEOUT);      if (mcp23018_status) goto out; | ||||
|         out: | ||||
|             i2c_stop(); | ||||
|         } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Drashna Jaelre
						Drashna Jaelre