Browse Source

PR: Use GPIO functions, remove default cfg overrides.

pull/6455/head
Andrew Mass 4 years ago
parent
commit
673e5024b7
4 changed files with 45 additions and 86 deletions
  1. +0
    -17
      keyboards/handwired/ergodox_mass/config.h
  2. +13
    -41
      keyboards/handwired/ergodox_mass/ergodox_mass.c
  3. +8
    -0
      keyboards/handwired/ergodox_mass/keymaps/default/keymap.c
  4. +24
    -28
      keyboards/handwired/ergodox_mass/matrix.c

+ 0
- 17
keyboards/handwired/ergodox_mass/config.h View File

@ -29,20 +29,3 @@
#define MATRIX_ROWS 12 // Three GPX chips per side, two banks per chip
#define MATRIX_COLS 8 // 8 pins per GPX bank
#define UNUSED_PINS { E6, B7, D0, D1, D2, D3, D5, D4, D6, D7, B4, B5, B6, C6, C7, F7 }
// Feature disable options - these options are also useful to firmware size reduction.
//#define NO_DEBUG
//#define NO_PRINT
//#define NO_ACTION_LAYER
//#define NO_ACTION_TAPPING
#define NO_ACTION_ONESHOT
//#define NO_ACTION_MACRO
#define NO_ACTION_FUNCTION
// Mousekey Settings
#define MOUSEKEY_DELAY 100
#define MOUSEKEY_INTERVAL 50
#define MOUSEKEY_MAX_SPEED 10
#define MOUSEKEY_TIME_TO_MAX 10
#define MOUSEKEY_WHEEL_MAX_SPEED 8
#define MOUSEKEY_WHEEL_TIME_TO_MAX 40

+ 13
- 41
keyboards/handwired/ergodox_mass/ergodox_mass.c View File

@ -31,32 +31,9 @@ const keypos_t hand_swap_config[MATRIX_ROWS][MATRIX_COLS] = {
{ {7,4}, {6,4}, {5,4}, {4,4}, {3,4}, {2,4}, {1,4}, {0,4} },
};
// Pin index in PORTF for each of the LEDs
uint8_t LED_MASK[5] = { (1<<0), (1<<1), (1<<4), (1<<5), (1<<6) };
const pin_t LED_PINS[5] = { F0, F1, F4, F5, F6 };
uint32_t scanCount = 0;
/**
* Custom LED functions
*/
void mass_led_on(uint8_t idx) {
if (idx >= 5)
return;
PORTF |= LED_MASK[idx];
}
void mass_led_off(uint8_t idx) {
if (idx >= 5)
return;
PORTF &= ~LED_MASK[idx];
}
void mass_led_toggle(uint8_t idx) {
if (idx >= 5)
return;
PORTF ^= LED_MASK[idx];
}
static uint32_t scanCount = 0;
/**
* QMK keyboard callback functions
@ -67,29 +44,26 @@ layer_state_t layer_state_set_kb(layer_state_t state) {
// Set layer LEDs based on new layer state
for (uint8_t i = 0; i <= 2; ++i)
mass_led_off(i);
uint8_t bit = biton32(state);
if (bit <= 2)
mass_led_on(bit);
writePinLow(LED_PINS[i]);
uint8_t layer = get_highest_layer(state);
if (layer <= 2)
writePinHigh(LED_PINS[layer]);
return layer_state_set_user(state);
}
bool process_record_kb(uint16_t keycode, keyrecord_t *record) {
if (record->event.pressed)
mass_led_on(3);
else
mass_led_off(3);
//uprintf("RECORD %u\n", keycode);
writePin(LED_PINS[3], record->event.pressed);
return process_record_user(keycode, record);
}
void matrix_init_kb(void) {
// Set all LEDs as outputs & initialize them to off
for (uint8_t i = 0; i <= 4; ++i) {
DDRF |= LED_MASK[i];
mass_led_off(i);
setPinOutput(LED_PINS[i]);
writePinLow(LED_PINS[i]);
}
// Set layer LEDs based on default layer state
@ -100,11 +74,9 @@ void matrix_init_kb(void) {
}
void matrix_scan_kb(void) {
++scanCount;
// Blink LED4
if (scanCount % 1000 == 0)
mass_led_toggle(4);
if (++scanCount % 1000 == 0)
writePin(LED_PINS[4], ! readPin(LED_PINS[4]));
matrix_scan_user();
}

+ 8
- 0
keyboards/handwired/ergodox_mass/keymaps/default/keymap.c View File

@ -15,6 +15,14 @@
*/
#include QMK_KEYBOARD_H
// Mousekey Settings
#define MOUSEKEY_DELAY 100
#define MOUSEKEY_INTERVAL 50
#define MOUSEKEY_MAX_SPEED 10
#define MOUSEKEY_TIME_TO_MAX 10
#define MOUSEKEY_WHEEL_MAX_SPEED 8
#define MOUSEKEY_WHEEL_TIME_TO_MAX 40
/**
* Misc Info
*


+ 24
- 28
keyboards/handwired/ergodox_mass/matrix.c View File

@ -16,6 +16,7 @@
#include "matrix.h"
#include "debounce.h"
#include "quantum.h"
typedef enum {
R0 = 0,
@ -26,10 +27,15 @@ typedef enum {
L2 = 5
} GPIOChip_t;
#define SS B0
#define SCK B1
#define SDO B2
#define SDI B3
// Forward declarations
void spi_init(void);
uint8_t spi_send(uint8_t byte);
uint8_t gpx_control_byte(GPIOChip_t idx, uint8_t read);
uint8_t gpx_control_byte(GPIOChip_t idx, bool read);
uint16_t gpx_read_reg(GPIOChip_t idx, uint8_t addr);
void gpx_write_reg(GPIOChip_t idx, uint8_t addr, uint16_t val);
@ -88,7 +94,7 @@ void matrix_scan_user(void) {
inline
bool matrix_is_on(uint8_t row, uint8_t col) {
return (deb_matrix[row] & ((matrix_row_t)1<col));
return (deb_matrix[row] & (matrix_row_t)(1 << col));
}
inline
@ -103,7 +109,6 @@ void matrix_print(void) {}
* Initialize the matrix reading circuitry. Called once at the start
*/
void matrix_init(void) {
// Initialize all switches to off
for (uint8_t i = 0; i < MATRIX_ROWS; ++i) {
raw_matrix[i] = 0;
deb_matrix[i] = 0;
@ -111,7 +116,6 @@ void matrix_init(void) {
debounce_init(MATRIX_ROWS);
// Initialize SPI bus
spi_init();
// Initialize all GPIO expanders
@ -132,11 +136,10 @@ uint8_t matrix_scan(void) {
bool rawChanged = false;
for (int i = R0; i <= L2; ++i) {
// A bank upper 8 bits, B bank lower 8 bits
// A Bank: Upper 8 bits, odd matrix rows
// B Bank: Lower 8 bits, even matrix rows
uint16_t gpio = gpx_read_reg(i, GPX_GPIO);
// Even matrix rows are bank B, odd are bank A
rawChanged |= (raw_matrix[i*2] != (gpio & 0xFF));
raw_matrix[i*2] = gpio & 0xFF;
@ -159,11 +162,11 @@ void spi_init(void) {
PRR0 &= ~(1<<2); // PRSPI
// Initialize SPI pins
DDRB |= (1<<0); // SS
PORTB |= (1<<0); // SS
DDRB |= (1<<1); // SCK
DDRB |= (1<<2); // SDO
DDRB &= ~(1<<3); // SDI
setPinOutput(SS);
writePinHigh(SS);
setPinOutput(SCK);
setPinOutput(SDO);
setPinInput(SDI);
// Initialize SPCR register
SPCR &= ~(1<<7); // SPIE (No interrupts)
@ -182,23 +185,16 @@ void spi_init(void) {
*/
uint8_t spi_send(uint8_t byte) {
// Write byte to SPI register
SPDR = byte;
// Wait for transmission
while (!(SPSR & (1<<7)));
// Read response
uint8_t resp = SPDR;
return resp;
while (!(SPSR & (1<<7))); // Wait for transmission
return SPDR;
}
/**
* GPIO expander fucntions
*/
uint8_t gpx_control_byte(GPIOChip_t idx, uint8_t read) {
uint8_t gpx_control_byte(GPIOChip_t idx, bool read) {
uint8_t control = 0b01000000;
switch (idx) {
case R0: control |= 0b0010; break;
@ -214,25 +210,25 @@ uint8_t gpx_control_byte(GPIOChip_t idx, uint8_t read) {
}
uint16_t gpx_read_reg(GPIOChip_t idx, uint8_t addr) {
PORTB &= ~(1<<0);
writePinLow(SS);
spi_send(gpx_control_byte(idx, 1));
spi_send(gpx_control_byte(idx, true));
spi_send(addr);
uint8_t resp1 = spi_send(0x00);
uint8_t resp2 = spi_send(0x00);
PORTB |= (1<<0);
writePinHigh(SS);
return resp1 << 8 | resp2;
}
void gpx_write_reg(GPIOChip_t idx, uint8_t addr, uint16_t val) {
PORTB &= ~(1<<0);
writePinLow(SS);
spi_send(gpx_control_byte(idx, 0));
spi_send(gpx_control_byte(idx, false));
spi_send(addr);
spi_send((val >> 8) & 0xFF);
spi_send(val & 0xFF);
PORTB |= (1<<0);
writePinHigh(SS);
}

Loading…
Cancel
Save