diff --git a/keyboards/frosty_flake/config.h b/keyboards/frosty_flake/config.h
index 9390feb949..2575a52b18 100644
--- a/keyboards/frosty_flake/config.h
+++ b/keyboards/frosty_flake/config.h
@@ -24,13 +24,19 @@ along with this program. If not, see .
#define VENDOR_ID 0xFEED
#define PRODUCT_ID 0x6060
#define DEVICE_VER 0x0001
-#define MANUFACTURER You
+#define MANUFACTURER Bathroom Epiphanies
#define PRODUCT frosty_flake
-#define DESCRIPTION A custom keyboard
+#define DESCRIPTION Frosty Flake controller for the CM Storm Quick Fire Rapid
+
+/*
+ * Frosty Flake Rev. 20140521 made by Bathroom Ephiphanies
+ * Schematic is available at https://deskthority.net/w/images/a/a4/Frosty_Flake_Schematics.pdf
+ *
+ */
/* key matrix size */
-#define MATRIX_ROWS 2
-#define MATRIX_COLS 3
+#define MATRIX_ROWS 8 // Row0 to Row7 in the schematic
+#define MATRIX_COLS 18 // ColA to ColR in the schematic
/*
* Keyboard Matrix Assignments
@@ -42,13 +48,13 @@ along with this program. If not, see .
* ROW2COL = ROW = Anode (+), COL = Cathode (-, marked on diode)
*
*/
-#define MATRIX_ROW_PINS { D0, D5 }
-#define MATRIX_COL_PINS { F1, F0, B0 }
-#define UNUSED_PINS
+//#define MATRIX_ROW_PINS { D5, D4, D6, D2, D1, D0 }
+//#define MATRIX_COL_PINS << n/a >>
+//#define UNUSED_PINS { B0, C4, D3 }
/* COL2ROW, ROW2COL, or CUSTOM_MATRIX */
-#define DIODE_DIRECTION COL2ROW
-
+//#define DIODE_DIRECTION << n/a >>
+
// #define BACKLIGHT_PIN B7
// #define BACKLIGHT_BREATHING
// #define BACKLIGHT_LEVELS 3
diff --git a/keyboards/frosty_flake/matrix.c b/keyboards/frosty_flake/matrix.c
new file mode 100644
index 0000000000..21b0d90885
--- /dev/null
+++ b/keyboards/frosty_flake/matrix.c
@@ -0,0 +1,167 @@
+//TODO(gabe): customize for frosty flake
+
+/*
+ Copyright 2014 Ralf Schmitt
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+*/
+
+#include
+#include
+#include
+#include
+#include "print.h"
+#include "debug.h"
+#include "util.h"
+#include "matrix.h"
+
+#ifndef DEBOUNCING_DELAY
+# define DEBOUNCING_DELAY 5
+#endif
+static uint8_t debouncing = DEBOUNCING_DELAY;
+
+static matrix_row_t matrix[MATRIX_ROWS];
+static matrix_row_t matrix_debouncing[MATRIX_ROWS];
+
+static uint8_t read_rows(void);
+static void select_col(uint8_t col);
+
+inline uint8_t matrix_rows(void) {
+ return MATRIX_ROWS;
+}
+
+inline uint8_t matrix_cols(void) {
+ return MATRIX_COLS;
+}
+
+/* Column pin configuration
+ *
+ * col: 0 1 2 3 4 5 6 7
+ * pin: PC7 PD5 PD3 PD1 PC2 PD6 PD4 PD2
+ *
+ * Rrr pin configuration
+ *
+ * These rrrs uses one 74HC154 4 to 16 bit demultiplexer (low
+ * active), together with 2 rrrs driven directly from the micro
+ * controller, to control the 18 rrrs. The rrrs are driven from
+ * pins B6,5,4,3,2,1,0.
+ */
+void matrix_init(void) {
+ DDRC &= ~0b10000100; // Row input pins
+ DDRD &= ~0b01111110;
+ PORTC |= 0b10000100;
+ PORTD |= 0b01111110;
+
+ DDRB |= 0b01111111; // Column output pins
+
+ for (uint8_t i=0; i < MATRIX_ROWS; i++) {
+ matrix[i] = 0;
+ matrix_debouncing[i] = 0;
+ }
+ matrix_init_quantum();
+}
+
+uint8_t matrix_scan(void) {
+ for (uint8_t col = 0; col < MATRIX_COLS; col++) {
+ select_col(col);
+ _delay_us(3);
+ uint8_t rows = read_rows();
+ for (uint8_t row = 0; row < MATRIX_ROWS; row++) {
+ bool prev_bit = matrix_debouncing[row] & ((matrix_row_t)1<