forked from mirrors/qmk_userspace
		
	Add docs for 'CUSTOM_MATRIX = lite' (#7906)
* Add some docs to cover 'CUSTOM_MATRIX = lite' * Apply suggestions from code review Co-Authored-By: fauxpark <fauxpark@gmail.com> * Add 'SRC += matrix.c' docs * Update docs/custom_matrix.md Co-Authored-By: fauxpark <fauxpark@gmail.com> Co-authored-by: fauxpark <fauxpark@gmail.com>
This commit is contained in:
		
					parent
					
						
							
								d11238f748
							
						
					
				
			
			
				commit
				
					
						6e710426a4
					
				
			
		
					 3 changed files with 110 additions and 1 deletions
				
			
		| 
						 | 
					@ -105,6 +105,7 @@
 | 
				
			||||||
  * [I2C Driver](i2c_driver.md)
 | 
					  * [I2C Driver](i2c_driver.md)
 | 
				
			||||||
  * [WS2812 Driver](ws2812_driver.md)
 | 
					  * [WS2812 Driver](ws2812_driver.md)
 | 
				
			||||||
  * [GPIO Controls](internals_gpio_control.md)
 | 
					  * [GPIO Controls](internals_gpio_control.md)
 | 
				
			||||||
 | 
					  * [Custom Matrix](custom_matrix.md)
 | 
				
			||||||
  * [Proton C Conversion](proton_c_conversion.md)
 | 
					  * [Proton C Conversion](proton_c_conversion.md)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
* For a Deeper Understanding
 | 
					* For a Deeper Understanding
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										108
									
								
								docs/custom_matrix.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								docs/custom_matrix.md
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,108 @@
 | 
				
			||||||
 | 
					# Custom Matrix
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QMK provides a mechanism to supplement or replace the default matrix scanning routine with your own code.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The reasons to use this feature include:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					* Extra hardware between the keyboard's switches and MCU pins
 | 
				
			||||||
 | 
					  * I/O multiplexer
 | 
				
			||||||
 | 
					  * Line decoder
 | 
				
			||||||
 | 
					* Irregular switch matrix
 | 
				
			||||||
 | 
					  * Simultaneous use of `COL2ROW` and `ROW2COL`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Prerequisites
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Implementing custom matrix usually involves compilation of an additional source file. It is recommended that for consistency, this file is called `matrix.c`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Add a new file to your keyboard directory:
 | 
				
			||||||
 | 
					```text
 | 
				
			||||||
 | 
					keyboards/<keyboard>/matrix.c
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					And to configure compilation for the new file, add this to your `rules.mk`:
 | 
				
			||||||
 | 
					```make
 | 
				
			||||||
 | 
					SRC += matrix.c
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## 'lite'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Provides a default implementation for various scanning functions, reducing the boilerplate code when implementing custom matrix.
 | 
				
			||||||
 | 
					To configure it, add this to your `rules.mk`:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```make
 | 
				
			||||||
 | 
					CUSTOM_MATRIX = lite
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					And implement the following functions in a `matrix.c` file in your keyboard folder:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```c
 | 
				
			||||||
 | 
					void matrix_init_custom(void) {
 | 
				
			||||||
 | 
					    // TODO: initialize hardware here
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					bool matrix_scan_custom(matrix_row_t current_matrix[]) {
 | 
				
			||||||
 | 
					    bool matrix_has_changed = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // TODO: add matrix scanning routine here
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return matrix_has_changed;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					## Full Replacement
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					When more control over the scanning routine is required, you can choose to implement the full scanning routine.
 | 
				
			||||||
 | 
					To configure it, add this to your rules.mk:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```make
 | 
				
			||||||
 | 
					CUSTOM_MATRIX = yes
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					And implement the following functions in a `matrix.c` file in your keyboard folder:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```c
 | 
				
			||||||
 | 
					matrix_row_t matrix_get_row(uint8_t row) {
 | 
				
			||||||
 | 
					    // TODO: return the requested row data
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void matrix_print(void) {
 | 
				
			||||||
 | 
					    // TODO: use print() to dump the current matrix state to console
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void matrix_init(void) {
 | 
				
			||||||
 | 
					    // TODO: initialize hardware and global matrix state here
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Unless hardware debouncing - Init the configured debounce routine
 | 
				
			||||||
 | 
					    debounce_init(MATRIX_ROWS);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // This *must* be called for correct keyboard behavior
 | 
				
			||||||
 | 
					    matrix_init_quantum();
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uint8_t matrix_scan(void) {
 | 
				
			||||||
 | 
					    bool matrix_has_changed = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // TODO: add matrix scanning routine here
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Unless hardware debouncing - use the configured debounce routine
 | 
				
			||||||
 | 
					    debounce(raw_matrix, matrix, MATRIX_ROWS, changed);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // This *must* be called for correct keyboard behavior
 | 
				
			||||||
 | 
					    matrix_scan_quantum();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return matrix_has_changed;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					And also provide defaults for the following callbacks:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					```c
 | 
				
			||||||
 | 
					__attribute__((weak)) void matrix_init_kb(void) { matrix_init_user(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__attribute__((weak)) void matrix_scan_kb(void) { matrix_scan_user(); }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__attribute__((weak)) void matrix_init_user(void) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					__attribute__((weak)) void matrix_scan_user(void) {}
 | 
				
			||||||
 | 
					```
 | 
				
			||||||
| 
						 | 
					@ -135,7 +135,7 @@ As there is no standard split communication driver for ARM-based split keyboards
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`CUSTOM_MATRIX`
 | 
					`CUSTOM_MATRIX`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
Lets you replace the default matrix scanning routine with your own code. You will need to provide your own implementations of matrix_init() and matrix_scan().
 | 
					Lets you replace the default matrix scanning routine with your own code. For further details, see the [Custom Matrix page](custom_matrix.md).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
`DEBOUNCE_TYPE`
 | 
					`DEBOUNCE_TYPE`
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue