#include #include #include #include "hal.h" #include "timer.h" #include "wait.h" #include "print.h" #include "matrix.h" /* * Matt3o's WhiteFox * Column pins are input with internal pull-down. Row pins are output and strobe with high. * Key is high or 1 when it turns on. * * col: { PTD0, PTD1, PTD4, PTD5, PTD6, PTD7, PTC1, PTC2 } * row: { PTB2, PTB3, PTB18, PTB19, PTC0, PTC8, PTC9, PTC10, PTC11 } */ /* matrix state(1:on, 0:off) */ static matrix_row_t matrix[MATRIX_ROWS]; static matrix_row_t matrix_debouncing[MATRIX_ROWS]; static bool debouncing = false; static uint16_t debouncing_time = 0; void matrix_init(void) { //debug_matrix = true; /* Column(sense) */ palSetPadMode(GPIOD, 0, PAL_MODE_INPUT_PULLDOWN); palSetPadMode(GPIOD, 1, PAL_MODE_INPUT_PULLDOWN); palSetPadMode(GPIOD, 4, PAL_MODE_INPUT_PULLDOWN); palSetPadMode(GPIOD, 5, PAL_MODE_INPUT_PULLDOWN); palSetPadMode(GPIOD, 6, PAL_MODE_INPUT_PULLDOWN); palSetPadMode(GPIOD, 7, PAL_MODE_INPUT_PULLDOWN); palSetPadMode(GPIOC, 1, PAL_MODE_INPUT_PULLDOWN); palSetPadMode(GPIOC, 2, PAL_MODE_INPUT_PULLDOWN); /* Row(strobe) */ palSetPadMode(GPIOB, 2, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOB, 3, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOB, 18, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOB, 19, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOC, 0, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOC, 8, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOC, 9, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOC, 10, PAL_MODE_OUTPUT_PUSHPULL); palSetPadMode(GPIOC, 11, PAL_MODE_OUTPUT_PUSHPULL); memset(matrix, 0, MATRIX_ROWS * sizeof(matrix_row_t)); memset(matrix_debouncing, 0, MATRIX_ROWS * sizeof(matrix_row_t)); matrix_init_quantum(); } uint8_t matrix_scan(void) { for (int row = 0; row < MATRIX_ROWS; row++) { matrix_row_t data = 0; // strobe row switch (row) { case 0: palSetPad(GPIOB, 2); break; case 1: palSetPad(GPIOB, 3); break; case 2: palSetPad(GPIOB, 18); break; case 3: palSetPad(GPIOB, 19); break; case 4: palSetPad(GPIOC, 0); break; case 5: palSetPad(GPIOC, 8); break; case 6: palSetPad(GPIOC, 9); break; case 7: palSetPad(GPIOC, 10); break; case 8: palSetPad(GPIOC, 11); break; } wait_us(20); // need wait to settle pin state // read col data: { PTD0, PTD1, PTD4, PTD5, PTD6, PTD7, PTC1, PTC2 } data = ((palReadPort(GPIOC) & 0x06UL) << 5) | ((palReadPort(GPIOD) & 0xF0UL) >> 2) | (palReadPort(GPIOD) & 0x03UL); // un-strobe row switch (row) { case 0: palClearPad(GPIOB, 2); break; case 1: palClearPad(GPIOB, 3); break; case 2: palClearPad(GPIOB, 18); break; case 3: palClearPad(GPIOB, 19); break; case 4: palClearPad(GPIOC, 0); break; case 5: palClearPad(GPIOC, 8); break; case 6: palClearPad(GPIOC, 9); break; case 7: palClearPad(GPIOC, 10); break; case 8: palClearPad(GPIOC, 11); break; } if (matrix_debouncing[row] != data) { matrix_debouncing[row] = data; debouncing = true; debouncing_time = timer_read(); } } if (debouncing && timer_elapsed(debouncing_time) > DEBOUNCE) { for (int row = 0; row < MATRIX_ROWS; row++) { matrix[row] = matrix_debouncing[row]; } debouncing = false; } matrix_scan_quantum(); return 1; } bool matrix_is_on(uint8_t row, uint8_t col) { return (matrix[row] & (1<
cluecard keyboard firmware
======================

## Quantum MK Firmware

For the full Quantum feature list, see [the parent readme.md](/doc/readme.md).

## Building

Download or clone the whole firmware and navigate to the keyboards/cluecard folder. Once your dev env is setup, you'll be able to type `make` to generate your .hex - you can then use the Teensy Loader to program your .hex file.

Depending on which keymap you would like to use, you will have to compile slightly differently.

### Default

To build with the default keymap, simply run `make default`.

### Other Keymaps

Several version of keymap are available in advance but you are recommended to define your favorite layout yourself. To define your own keymap create a folder with the name of your keymap in the keymaps folder, and see keymap documentation (you can find in top readme.md) and existant keymap files.

To build the firmware binary hex file with a keymap just do `make` with a keymap like this:

```
$ make [default|jack|<name>]
```

Keymaps follow the format **__keymap.c__** and are stored in folders in the `keymaps` folder, eg `keymaps/my_keymap/`