Adding Bad Wings Support (#20153)
This commit is contained in:
parent
0bb9eada83
commit
b1e6b3798a
10 changed files with 335 additions and 0 deletions
137
keyboards/hazel/bad_wings/matrix.c
Normal file
137
keyboards/hazel/bad_wings/matrix.c
Normal file
|
@ -0,0 +1,137 @@
|
|||
// Copyright 2022 @sadekbaroudi (Sadek Baroudi)
|
||||
// Copyright 2023 @jasonhazel (Jason Hazel)
|
||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||
|
||||
#include "quantum.h"
|
||||
#include "spi_master.h"
|
||||
#include <string.h> /* memset */
|
||||
#include <unistd.h> /* close */
|
||||
#include "quantum.h"
|
||||
#include "matrix.h"
|
||||
|
||||
#if (!defined(SHIFTREG_MATRIX_COL_CS))
|
||||
# error Missing shift register I/O pin definitions
|
||||
#endif
|
||||
|
||||
int matrixArraySize = SHIFTREG_ROWS * sizeof(matrix_row_t);
|
||||
matrix_row_t oldMatrix[SHIFTREG_ROWS];
|
||||
|
||||
#define SHIFTREG_OUTPUT_BITS 8
|
||||
pin_t rowPinsSR[SHIFTREG_ROWS] = MATRIX_ROW_PINS_SR;
|
||||
|
||||
// semaphore to make sure SPI doesn't get called multiple times
|
||||
static bool shiftRegisterSPILocked = false;
|
||||
|
||||
void semaphore_lock(bool value) {
|
||||
shiftRegisterSPILocked = value;
|
||||
}
|
||||
|
||||
bool semaphore_is_locked(void) {
|
||||
return shiftRegisterSPILocked;
|
||||
}
|
||||
|
||||
void sr_74hc595_spi_stop(void) {
|
||||
spi_stop();
|
||||
semaphore_lock(false);
|
||||
}
|
||||
|
||||
bool sr_74hc595_spi_start(void) {
|
||||
if (!spi_start(SHIFTREG_MATRIX_COL_CS, false, 0, SHIFTREG_DIVISOR)) {
|
||||
dprintf("74hc595 matrix: failed to start spi\n");
|
||||
sr_74hc595_spi_stop();
|
||||
return false;
|
||||
}
|
||||
|
||||
semaphore_lock(true);
|
||||
wait_us(1); // not sure if I need this
|
||||
return true;
|
||||
}
|
||||
|
||||
bool sr_74hc595_spi_send_byte(uint8_t data) {
|
||||
sr_74hc595_spi_start();
|
||||
writePinLow(SHIFTREG_MATRIX_COL_CS);
|
||||
matrix_io_delay();
|
||||
spi_write(data);
|
||||
matrix_io_delay();
|
||||
writePinHigh(SHIFTREG_MATRIX_COL_CS);
|
||||
sr_74hc595_spi_stop();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the entire shift register to be full of inactive bits
|
||||
*/
|
||||
void clearColumns(void) {
|
||||
uint8_t value = 0b00000000;
|
||||
sr_74hc595_spi_send_byte(value);
|
||||
}
|
||||
|
||||
void setColumn(int columnShift, bool test_run) {
|
||||
uint8_t columnShiftByte = ((uint8_t)1 << columnShift);
|
||||
if(test_run) {
|
||||
dprintf("byte sent: %d\n", columnShiftByte);
|
||||
}
|
||||
sr_74hc595_spi_send_byte(columnShiftByte);
|
||||
}
|
||||
|
||||
/*
|
||||
* override of the qmk intialization function
|
||||
*/
|
||||
void matrix_init_custom(void) {
|
||||
wait_ms(300);
|
||||
spi_init();
|
||||
// Set up the initial states for all the row pins
|
||||
for (int r = 0; r < SHIFTREG_ROWS; r++) {
|
||||
// Note: This needs to use the internal pull down resistors, and atmegas do *not* support that
|
||||
setPinInputLow(rowPinsSR[r]);
|
||||
}
|
||||
|
||||
// Set the CS to low by default, and specify as an output pin
|
||||
writePinHigh(SHIFTREG_MATRIX_COL_CS); // should be high when using SPI?
|
||||
setPinOutput(SHIFTREG_MATRIX_COL_CS);
|
||||
|
||||
// Since it's the init, deactivate all the columns. We'll activate once we get to the matrix scan
|
||||
clearColumns();
|
||||
}
|
||||
|
||||
bool matrix_scan_custom(matrix_row_t current_matrix[]) {
|
||||
// respect the semaphore
|
||||
if (semaphore_is_locked()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Keep track of if something was modified
|
||||
bool matrix_has_changed = false;
|
||||
|
||||
// reset the current matrix, as we'll be updating and comparing to the old matrix
|
||||
memset(current_matrix, 0, matrixArraySize);
|
||||
|
||||
|
||||
bool debug_output = false;
|
||||
// Loop through the columns, activating one at a time, and read the rows, and place in the new current_matrix
|
||||
for (int c = 0; c < SHIFTREG_COLS; c++) {
|
||||
if (debug_output) {
|
||||
dprintf("column iteration: %d\n", c);
|
||||
}
|
||||
setColumn(c, debug_output);
|
||||
matrix_io_delay();
|
||||
|
||||
for (int r = 0; r < SHIFTREG_ROWS; r++) {
|
||||
current_matrix[r] |= ((readPin(rowPinsSR[r]) ? 1 : 0) << c);
|
||||
}
|
||||
}
|
||||
|
||||
matrix_has_changed = memcmp(current_matrix, oldMatrix, matrixArraySize) != 0;
|
||||
memcpy(oldMatrix, current_matrix, matrixArraySize);
|
||||
|
||||
if (matrix_has_changed) {
|
||||
matrix_print();
|
||||
}
|
||||
|
||||
|
||||
// Deactivate all the columns for the next run.
|
||||
clearColumns();
|
||||
matrix_io_delay();
|
||||
|
||||
return matrix_has_changed;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue