#include "matrix_manipulate.h"
#include <string.h>
-#if defined(CONTROLLER_IS_XWHATSIT_BEAMSPRING_REV_4)
-#define CAPSENSE_DAC_SCLK B1
-#define CAPSENSE_DAC_DIN B2
-#define CAPSENSE_DAC_SYNC_N B0
-#define CAPSENSE_DAC_MAX 1023
-
-#define CAPSENSE_SHIFT_DIN C4
-#define CAPSENSE_SHIFT_OE C6
-#define CAPSENSE_SHIFT_SHCP C5
-#define CAPSENSE_SHIFT_STCP C7
-#define CAPSENSE_SHIFT_STCP_IO _SFR_IO_ADDR(PORTC)
-#define CAPSENSE_SHIFT_STCP_BIT 7
-
-#define CAPSENSE_READ_ROWS_NUMBER_OF_BYTES_PER_SAMPLE 2
-#define CAPSENSE_READ_ROWS_PIN_1 _SFR_IO_ADDR(PIND)
-#define CAPSENSE_READ_ROWS_PIN_2 _SFR_IO_ADDR(PIND)
-#define CAPSENSE_READ_ROWS_ASM_INSTRUCTIONS "in %[dest_row_1], %[ioreg_row_1]\n\tin %[dest_row_2], %[ioreg_row_2]"
-#define CAPSENSE_READ_ROWS_STORE_TO_ARRAY_INSTRUCTIONS \
- "st %a[arr]+, %[dest_row_1]" "\n\t" \
- "st %a[arr]+, %[dest_row_2]"
-#define CAPSENSE_READ_ROWS_STORE_TO_ARRAY_INSTRUCTIONS_FAKE \
- "st %a[arr], %[dest_row_1]" "\n\t" \
- "st %a[arr], %[dest_row_2]"
-#define CAPSENSE_READ_ROWS_OUTPUT_CONSTRAINTS [dest_row_1] "=&r" (dest_row_1), [dest_row_2] "=&r" (dest_row_2)
-#define CAPSENSE_READ_ROWS_INPUT_CONSTRAINTS [ioreg_row_1] "I" (CAPSENSE_READ_ROWS_PIN_1), [ioreg_row_2] "I" (CAPSENSE_READ_ROWS_PIN_2)
-#define CAPSENSE_READ_ROWS_LOCAL_VARS uint8_t dest_row_1, dest_row_2
-#define CAPSENSE_READ_ROWS_VALUE (dest_row_1 & 0xf)
-#define CAPSENSE_READ_ROWS_EXTRACT_FROM_ARRAY do { dest_row_1 = array[p0++]; dest_row_2 = array[p0++]; } while (0)
-
-// Note: for now Beamspring reads PIND twice to match model F timings. We might change that in the future
-
-#define CAPSENSE_KEYMAP_ROW_TO_PHYSICAL_ROW(row) (row)
-#define CAPSENSE_PHYSICAL_ROW_TO_KEYMAP_ROW(row) (row)
-#ifndef CAPSENSE_KEYMAP_COL_TO_PHYSICAL_COL
-#define CAPSENSE_KEYMAP_COL_TO_PHYSICAL_COL(col) (col)
-#endif
-
-#define CAPSENSE_CONDUCTIVE_PLASTIC_IS_PULLED_UP_ON_KEYPRESS
-
-#elif defined(CONTROLLER_IS_XWHATSIT_MODEL_F_OR_WCASS_MODEL_F)
-
-#define CAPSENSE_DAC_SCLK B1
-#define CAPSENSE_DAC_DIN B2
-#define CAPSENSE_DAC_SYNC_N B0
-#define CAPSENSE_DAC_MAX 1023
-
-#define CAPSENSE_SHIFT_DIN D4
-#define CAPSENSE_SHIFT_OE D5
-#define CAPSENSE_SHIFT_SHCP D7
-#define CAPSENSE_SHIFT_STCP D6
-#define CAPSENSE_SHIFT_STCP_IO _SFR_IO_ADDR(PORTD)
-#define CAPSENSE_SHIFT_STCP_BIT 6
-
-#define CAPSENSE_READ_ROWS_NUMBER_OF_BYTES_PER_SAMPLE 2
-#define CAPSENSE_READ_ROWS_PIN_1 _SFR_IO_ADDR(PINC)
-#define CAPSENSE_READ_ROWS_PIN_2 _SFR_IO_ADDR(PIND)
-#define CAPSENSE_READ_ROWS_ASM_INSTRUCTIONS "in %[dest_row_1], %[ioreg_row_1]\n\tin %[dest_row_2], %[ioreg_row_2]"
-#define CAPSENSE_READ_ROWS_STORE_TO_ARRAY_INSTRUCTIONS \
- "st %a[arr]+, %[dest_row_1]" "\n\t" \
- "st %a[arr]+, %[dest_row_2]"
-#define CAPSENSE_READ_ROWS_STORE_TO_ARRAY_INSTRUCTIONS_FAKE \
- "st %a[arr], %[dest_row_1]" "\n\t" \
- "st %a[arr], %[dest_row_2]"
-#define CAPSENSE_READ_ROWS_OUTPUT_CONSTRAINTS [dest_row_1] "=&r" (dest_row_1), [dest_row_2] "=&r" (dest_row_2)
-#define CAPSENSE_READ_ROWS_INPUT_CONSTRAINTS [ioreg_row_1] "I" (CAPSENSE_READ_ROWS_PIN_1), [ioreg_row_2] "I" (CAPSENSE_READ_ROWS_PIN_2)
-#define CAPSENSE_READ_ROWS_LOCAL_VARS uint8_t dest_row_1, dest_row_2
-#define CAPSENSE_READ_ROWS_VALUE ((dest_row_1 >> 4) | (dest_row_2 << 4))
-#define CAPSENSE_READ_ROWS_EXTRACT_FROM_ARRAY do { dest_row_1 = array[p0++]; dest_row_2 = array[p0++]; } while (0)
-
-#define CAPSENSE_KEYMAP_ROW_TO_PHYSICAL_ROW(row) (7-(row))
-#define CAPSENSE_PHYSICAL_ROW_TO_KEYMAP_ROW(row) (7-(row))
-#ifndef CAPSENSE_KEYMAP_COL_TO_PHYSICAL_COL
-#define CAPSENSE_KEYMAP_COL_TO_PHYSICAL_COL(col) (col)
-#endif
-
-#define CAPSENSE_CONDUCTIVE_PLASTIC_IS_PUSHED_DOWN_ON_KEYPRESS
-
-#elif defined(CONTROLLER_IS_THROUGH_HOLE_BEAMSPRING) || defined(CONTROLLER_IS_THROUGH_HOLE_MODEL_F)
-
-#define CAPSENSE_DAC_MCP4921
-#define CAPSENSE_DAC_NCS F6
-#define CAPSENSE_DAC_SCK B1
-#define CAPSENSE_DAC_SDI B2
-#define CAPSENSE_DAC_MAX 4095
-
-#define CAPSENSE_SHIFT_DIN B2
-#define CAPSENSE_SHIFT_OE B6
-#define CAPSENSE_SHIFT_SHCP B1
-#define CAPSENSE_SHIFT_STCP F7
-#define CAPSENSE_SHIFT_STCP_IO _SFR_IO_ADDR(PORTF)
-#define CAPSENSE_SHIFT_STCP_BIT 7
-
-// Rows:
-// Physical position from left to right: (only the right-most are used for beamspring)
-// 1 2 3 4 5 6 7 8
-// TH schematic numbering (sense/row lines)
-// 8 6 7 5 4 3 2 1
-// F5, B5, F4, B4, D4, C6, D1, D0
-
-#if MATRIX_ROWS <= 4
-#define CAPSENSE_READ_ROWS_NUMBER_OF_BYTES_PER_SAMPLE 2
-#define CAPSENSE_READ_ROWS_PIN_1 _SFR_IO_ADDR(PINC)
-#define CAPSENSE_READ_ROWS_PIN_2 _SFR_IO_ADDR(PIND)
-#define CAPSENSE_READ_ROWS_ASM_INSTRUCTIONS "in %[dest_row_1], %[ioreg_row_1]\n\tin %[dest_row_2], %[ioreg_row_2]"
-#define CAPSENSE_READ_ROWS_STORE_TO_ARRAY_INSTRUCTIONS \
- "st %a[arr]+, %[dest_row_1]" "\n\t" \
- "st %a[arr]+, %[dest_row_2]"
-#define CAPSENSE_READ_ROWS_STORE_TO_ARRAY_INSTRUCTIONS_FAKE \
- "st %a[arr], %[dest_row_1]" "\n\t" \
- "st %a[arr], %[dest_row_2]"
-#define CAPSENSE_READ_ROWS_OUTPUT_CONSTRAINTS [dest_row_1] "=&r" (dest_row_1), [dest_row_2] "=&r" (dest_row_2)
-#define CAPSENSE_READ_ROWS_INPUT_CONSTRAINTS [ioreg_row_1] "I" (CAPSENSE_READ_ROWS_PIN_1), [ioreg_row_2] "I" (CAPSENSE_READ_ROWS_PIN_2)
-#define CAPSENSE_READ_ROWS_LOCAL_VARS uint8_t dest_row_1, dest_row_2
-#define CAPSENSE_READ_ROWS_VALUE (((dest_row_1 >> 4) & 0x04) | (dest_row_2 & 0x03) | ((dest_row_2 >> 1) & 0x08))
-#define CAPSENSE_READ_ROWS_EXTRACT_FROM_ARRAY do { dest_row_1 = array[p0++]; dest_row_2 = array[p0++]; } while (0)
-#else
-#define CAPSENSE_READ_ROWS_NUMBER_OF_BYTES_PER_SAMPLE 4
-#define CAPSENSE_READ_ROWS_PIN_1 _SFR_IO_ADDR(PINC)
-#define CAPSENSE_READ_ROWS_PIN_2 _SFR_IO_ADDR(PIND)
-#define CAPSENSE_READ_ROWS_PIN_3 _SFR_IO_ADDR(PINB)
-#define CAPSENSE_READ_ROWS_PIN_4 _SFR_IO_ADDR(PINF)
-#define CAPSENSE_READ_ROWS_ASM_INSTRUCTIONS "in %[dest_row_1], %[ioreg_row_1]\n\tin %[dest_row_2], %[ioreg_row_2]\n\tin %[dest_row_3], %[ioreg_row_3]\n\tin %[dest_row_4], %[ioreg_row_4]"
-#define CAPSENSE_READ_ROWS_STORE_TO_ARRAY_INSTRUCTIONS \
- "st %a[arr]+, %[dest_row_1]" "\n\t" \
- "st %a[arr]+, %[dest_row_2]" "\n\t" \
- "st %a[arr]+, %[dest_row_3]" "\n\t" \
- "st %a[arr]+, %[dest_row_4]"
-#define CAPSENSE_READ_ROWS_STORE_TO_ARRAY_INSTRUCTIONS_FAKE \
- "st %a[arr], %[dest_row_1]" "\n\t" \
- "st %a[arr], %[dest_row_2]" "\n\t" \
- "st %a[arr], %[dest_row_3]" "\n\t" \
- "st %a[arr], %[dest_row_4]"
-#define CAPSENSE_READ_ROWS_OUTPUT_CONSTRAINTS [dest_row_1] "=&r" (dest_row_1), [dest_row_2] "=&r" (dest_row_2), [dest_row_3] "=&r" (dest_row_3), [dest_row_4] "=&r" (dest_row_4)
-#define CAPSENSE_READ_ROWS_INPUT_CONSTRAINTS [ioreg_row_1] "I" (CAPSENSE_READ_ROWS_PIN_1), [ioreg_row_2] "I" (CAPSENSE_READ_ROWS_PIN_2), [ioreg_row_3] "I" (CAPSENSE_READ_ROWS_PIN_3), [ioreg_row_4] "I" (CAPSENSE_READ_ROWS_PIN_4)
-#define CAPSENSE_READ_ROWS_LOCAL_VARS uint8_t dest_row_1, dest_row_2, dest_row_3, dest_row_4
-#define CAPSENSE_READ_ROWS_VALUE (((dest_row_1 >> 4) & 0x04) | (dest_row_2 & 0x03) | ((dest_row_2 >> 1) & 0x08) | (dest_row_3 & 0x10) | ((dest_row_3 << 1) & 0x40) | ((dest_row_4 << 1) & 0x20) | ((dest_row_4 << 2) & 0x80))
-#define CAPSENSE_READ_ROWS_EXTRACT_FROM_ARRAY do { dest_row_1 = array[p0++]; dest_row_2 = array[p0++]; dest_row_3 = array[p0++]; dest_row_4 = array[p0++]; } while (0)
-#endif
-
-#define CAPSENSE_KEYMAP_ROW_TO_PHYSICAL_ROW(row) (MATRIX_ROWS-1-(row))
-#define CAPSENSE_PHYSICAL_ROW_TO_KEYMAP_ROW(row) (MATRIX_ROWS-1-(row))
-#ifndef CAPSENSE_KEYMAP_COL_TO_PHYSICAL_COL
-#define CAPSENSE_KEYMAP_COL_TO_PHYSICAL_COL(col) (col)
-#endif
-
-#if defined(CONTROLLER_IS_THROUGH_HOLE_BEAMSPRING)
-#define CAPSENSE_CONDUCTIVE_PLASTIC_IS_PULLED_UP_ON_KEYPRESS
-#else
-#define CAPSENSE_CONDUCTIVE_PLASTIC_IS_PUSHED_DOWN_ON_KEYPRESS
-#endif
-
-#else
-
-#ifndef CAPSENSE_DAC_SCLK
-#error "Please select controller type in config.h, or please define each macro that is defined when selecting a particular macro type in matrix.c"
-#endif
-#endif
-
-#ifndef CAPSENSE_KEYBOARD_SETTLE_TIME_US
-#error "Please define CAPSENSE_KEYBOARD_SETTLE_TIME_US in config.h"
-#endif
-#ifndef CAPSENSE_DAC_SETTLE_TIME_US
-#error "Please define CAPSENSE_DAC_SETTLE_TIME_US in config.h"
-#endif
-#ifndef CAPSENSE_HARDCODED_SAMPLE_TIME
-#error "Please define CAPSENSE_HARDCODED_SAMPLE_TIME in config.h"
-#endif
-
-#ifndef CAPSENSE_CAL_ENABLED
-#error "Please define CAPSENSE_CAL_ENABLED as 1/0 in config.h"
-#endif
-#ifndef CAPSENSE_CAL_DEBUG
-#error "Please define CAPSENSE_CAL_DEBUG as 1/0 in config.h"
-#endif
-#ifndef CAPSENSE_CAL_INIT_REPS
-#define CAPSENSE_CAL_INIT_REPS 16
-#endif
-#ifndef CAPSENSE_CAL_EACHKEY_REPS
-#define CAPSENSE_CAL_EACHKEY_REPS 16
-#endif
-#ifndef CAPSENSE_CAL_BINS
-#error "Please define CAPSENSE_CAL_BINS in config.h"
-#endif
-#ifndef CAPSENSE_CAL_THRESHOLD_OFFSET
-#error "Please define CAPSENSE_CAL_THRESHOLD_OFFSET in config.h"
-#endif
-
-#if (!defined(CAPSENSE_CONDUCTIVE_PLASTIC_IS_PULLED_UP_ON_KEYPRESS)) && (!defined(CAPSENSE_CONDUCTIVE_PLASTIC_IS_PUSHED_DOWN_ON_KEYPRESS))
-#error "Please specify whether the flyplate is pushed down or pulled up on keypress!"
-#endif
-
/* Notes on Expansion Header:
Pinout:
pin 5 = HEADER2 = D(igital)7 = PE6
*/
-#ifdef USING_SOLENOID_ENABLE_PIN
-// ^^ this must be defined in config.h if you are using and xwhatsit type solenoid
-#endif
-
+// USING_SOLENOID_ENABLE_PIN must be defined in config.h if you are using and xwhatsit type solenoid
static inline uint8_t read_rows(void)
{
#endif
-#define SHIFT_BITS ((CAPSENSE_KEYMAP_COL_TO_PHYSICAL_COL(MATRIX_COLS - 1) >= 16) ? 24 : 16)
+#define SHIFT_BITS (((CAPSENSE_KEYMAP_COL_TO_PHYSICAL_COL(MATRIX_COLS - 1) >= 16) || \
+ (CAPSENSE_KEYMAP_COL_TO_PHYSICAL_COL(0) >= 16)) ? 24 : 16)
void shift_select_nothing(void)
{
writePin(CAPSENSE_SHIFT_STCP, 0);
}
-void shift_data(uint32_t data)
+void shift_data(uint32_t data, int data_idle, int shcp_idle, int stcp_idle)
{
int i;
+ writePin(CAPSENSE_SHIFT_SHCP, 0);
+ writePin(CAPSENSE_SHIFT_STCP, 0);
for (i=SHIFT_BITS-1; i>=0; i--)
{
writePin(CAPSENSE_SHIFT_DIN, (data >> (SHIFT_BITS - 1)) & 1);
writePin(CAPSENSE_SHIFT_SHCP, 1);
- writePin(CAPSENSE_SHIFT_SHCP, 0);
+ if (!((i == 0) && (shcp_idle))) {
+ writePin(CAPSENSE_SHIFT_SHCP, 0);
+ }
data <<= 1;
}
writePin(CAPSENSE_SHIFT_STCP, 1);
- writePin(CAPSENSE_SHIFT_STCP, 0);
+ if (!stcp_idle) {
+ writePin(CAPSENSE_SHIFT_STCP, 0);
+ }
+ writePin(CAPSENSE_SHIFT_DIN, !!data_idle);
}
void shift_select_col_no_strobe(uint8_t col)
setPinOutput(CAPSENSE_SHIFT_OE);
setPinOutput(CAPSENSE_SHIFT_STCP);
setPinOutput(CAPSENSE_SHIFT_SHCP);
+ writePin(CAPSENSE_SHIFT_OE, 0);
writePin(CAPSENSE_SHIFT_STCP, 0);
writePin(CAPSENSE_SHIFT_SHCP, 0);
shift_select_nothing();
}
}
+void set_leds(int num_lock, int caps_lock, int scroll_lock)
+{
+ #if defined(LED_NUM_LOCK_PIN)
+ #if defined(LED_NUM_LOCK_ACTIVE_LOW)
+ writePin(LED_NUM_LOCK_PIN, !num_lock);
+ #else
+ writePin(LED_NUM_LOCK_PIN, num_lock);
+ #endif
+ #endif
+ #if defined(LED_CAPS_LOCK_PIN)
+ #if defined(LED_CAPS_LOCK_ACTIVE_LOW)
+ writePin(LED_CAPS_LOCK_PIN, !caps_lock);
+ #else
+ writePin(LED_CAPS_LOCK_PIN, caps_lock);
+ #endif
+ #endif
+ #if defined(LED_SCROLL_LOCK_PIN)
+ #if defined(LED_SCROLL_LOCK_ACTIVE_LOW)
+ writePin(LED_SCROLL_LOCK_PIN, !scroll_lock);
+ #else
+ writePin(LED_SCROLL_LOCK_PIN, scroll_lock);
+ #endif
+ #endif
+}
+
void real_keyboard_init_basic(void)
{
+ SETUP_UNUSED_PINS();
+
+ #if defined(LED_NUM_LOCK_PIN)
+ setPinOutput(LED_NUM_LOCK_PIN);
+ #endif
+ #if defined(LED_CAPS_LOCK_PIN)
+ setPinOutput(LED_CAPS_LOCK_PIN);
+ #endif
+ #if defined(LED_SCROLL_LOCK_PIN)
+ setPinOutput(LED_SCROLL_LOCK_PIN);
+ #endif
+ set_leds(0, 0, 0);
+
#ifndef NO_PRINT
uprintf("shift_init()");
#endif
#ifndef NO_PRINT
uprintf(" DONE\n");
#endif
+ SETUP_ROW_GPIOS();
#if CAPSENSE_CAL_ENABLED
calibration();
#else
dac_write_threshold(CAPSENSE_HARDCODED_THRESHOLD);
dac_write_threshold(CAPSENSE_HARDCODED_THRESHOLD);
#endif
- #if defined(CONTROLLER_IS_THROUGH_HOLE_BEAMSPRING)
+ #if defined(CONTROLLER_IS_THROUGH_HOLE_BEAMSPRING) || defined(CONTROLLER_IS_THROUGH_HOLE_MODEL_F)
// Disable on-board leds.
setPinOutput(D5);
writePin(D5, 1);
#endif
}
+
+bool led_update_kb(led_t led_state) {
+ bool res = led_update_user(led_state);
+ if(res) {
+ set_leds(led_state.num_lock, led_state.caps_lock, led_state.scroll_lock);
+ }
+ return res;
+}
+
void matrix_init_custom(void) {
+
+
//test_v2();
//tracking_test();
real_keyboard_init_basic();