jsoltren/XMIT build fixes for macOS
[jackhill/qmk/firmware.git] / keyboards / xwhatsit / matrix.c
index fa67367..70a380a 100644 (file)
 #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:
@@ -236,10 +45,7 @@ pin 4 = HEADER4 = RXI        = PD2
 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)
 {
@@ -319,7 +125,8 @@ void dac_write_threshold(uint16_t value)
 
 #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)
 {
@@ -334,18 +141,25 @@ 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)
@@ -372,6 +186,7 @@ void shift_init(void)
     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();
@@ -815,8 +630,46 @@ void calibration(void)
     }
 }
 
+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
@@ -829,6 +682,7 @@ void real_keyboard_init_basic(void)
     #ifndef NO_PRINT
     uprintf(" DONE\n");
     #endif
+    SETUP_ROW_GPIOS();
     #if CAPSENSE_CAL_ENABLED
     calibration();
     #else
@@ -836,7 +690,7 @@ void real_keyboard_init_basic(void)
     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);
@@ -850,7 +704,18 @@ void real_keyboard_init_basic(void)
     #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();