From 2b4d5dd7d9271dd520d9143a9bc5d95db08921a3 Mon Sep 17 00:00:00 2001
From: Carlos Filoteo <filoxo@users.noreply.github.com>
Date: Sun, 13 Mar 2022 23:51:55 -0600
Subject: [PATCH] feat(shields): Add elephant42 Shield Support (#1009)

* Initial Elephant42 implementation

* Add underglow feature

* Fix keymap

* Copy corne defconfig for OLED and LED

* Fix matrix positions

* Add nice_nano_v2.overlay

* Usability improvements to keymap

* Update LED length

* Delete nice_nano v1 overlay

* Remove unused conf files

* Add copyright/license headers

* PR feedback

* Try fixing formatting again

* Minor format

* More missed tabs

* Format
---
 .../shields/elephant42/Kconfig.defconfig      | 55 +++++++++++++++++
 app/boards/shields/elephant42/Kconfig.shield  |  8 +++
 .../elephant42/boards/nice_nano_v2.overlay    | 28 +++++++++
 app/boards/shields/elephant42/elephant42.conf |  6 ++
 app/boards/shields/elephant42/elephant42.dtsi | 60 +++++++++++++++++++
 .../shields/elephant42/elephant42.keymap      | 55 +++++++++++++++++
 .../shields/elephant42/elephant42.zmk.yml     | 14 +++++
 .../elephant42/elephant42_left.overlay        | 18 ++++++
 .../elephant42/elephant42_right.overlay       | 22 +++++++
 9 files changed, 266 insertions(+)
 create mode 100644 app/boards/shields/elephant42/Kconfig.defconfig
 create mode 100644 app/boards/shields/elephant42/Kconfig.shield
 create mode 100644 app/boards/shields/elephant42/boards/nice_nano_v2.overlay
 create mode 100644 app/boards/shields/elephant42/elephant42.conf
 create mode 100644 app/boards/shields/elephant42/elephant42.dtsi
 create mode 100644 app/boards/shields/elephant42/elephant42.keymap
 create mode 100644 app/boards/shields/elephant42/elephant42.zmk.yml
 create mode 100644 app/boards/shields/elephant42/elephant42_left.overlay
 create mode 100644 app/boards/shields/elephant42/elephant42_right.overlay

diff --git a/app/boards/shields/elephant42/Kconfig.defconfig b/app/boards/shields/elephant42/Kconfig.defconfig
new file mode 100644
index 00000000..db2fa230
--- /dev/null
+++ b/app/boards/shields/elephant42/Kconfig.defconfig
@@ -0,0 +1,55 @@
+# Copyright (c) 2021 The ZMK Contributors
+# SPDX-License-Identifier: MIT
+
+if SHIELD_ELEPHANT42_LEFT
+
+config ZMK_KEYBOARD_NAME
+    default "Elephant42"
+
+config ZMK_SPLIT_BLE_ROLE_CENTRAL
+    default y
+
+endif
+
+if SHIELD_ELEPHANT42_LEFT || SHIELD_ELEPHANT42_RIGHT
+
+config ZMK_SPLIT
+	default y
+ 
+if ZMK_DISPLAY
+
+config I2C
+	default y
+
+config SSD1306
+	default y
+
+config SSD1306_REVERSE_MODE
+	default y
+
+endif # ZMK_DISPLAY
+
+if LVGL
+
+config LVGL_HOR_RES_MAX
+	default 128
+
+config LVGL_VER_RES_MAX
+	default 32
+
+config LVGL_VDB_SIZE
+	default 64
+
+config LVGL_DPI
+	default 148
+
+config LVGL_BITS_PER_PIXEL
+	default 1
+
+choice LVGL_COLOR_DEPTH
+	default LVGL_COLOR_DEPTH_1
+endchoice
+
+endif # LVGL
+
+endif
\ No newline at end of file
diff --git a/app/boards/shields/elephant42/Kconfig.shield b/app/boards/shields/elephant42/Kconfig.shield
new file mode 100644
index 00000000..25841868
--- /dev/null
+++ b/app/boards/shields/elephant42/Kconfig.shield
@@ -0,0 +1,8 @@
+# Copyright (c) 2021 The ZMK Contributors
+# SPDX-License-Identifier: MIT
+
+config SHIELD_ELEPHANT42_LEFT
+    def_bool $(shields_list_contains,elephant42_left)
+
+config SHIELD_ELEPHANT42_RIGHT
+    def_bool $(shields_list_contains,elephant42_right)
\ No newline at end of file
diff --git a/app/boards/shields/elephant42/boards/nice_nano_v2.overlay b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay
new file mode 100644
index 00000000..6cd5de8c
--- /dev/null
+++ b/app/boards/shields/elephant42/boards/nice_nano_v2.overlay
@@ -0,0 +1,28 @@
+&spi1 {
+	compatible = "nordic,nrf-spim";
+	/* Cannot be used together with i2c0. */
+	status = "okay";
+	mosi-pin = <6>;
+	// Unused pins, needed for SPI definition, but not used by the ws2812 driver itself.
+	sck-pin = <5>;
+	miso-pin = <7>;
+
+	led_strip: ws2812@0 {
+		compatible = "worldsemi,ws2812-spi";
+		label = "WS2812";
+		/* SPI */
+		reg = <0>; /* ignored, but necessary for SPI bindings */
+		spi-max-frequency = <4000000>;
+
+		/* WS2812 */
+		chain-length = <27>; /* There are per-key RGB and the LAST 6 are underglow */
+		spi-one-frame = <0x70>;
+		spi-zero-frame = <0x40>;
+	};
+};
+
+/ {
+	chosen {
+		zmk,underglow = &led_strip;
+	};
+};
\ No newline at end of file
diff --git a/app/boards/shields/elephant42/elephant42.conf b/app/boards/shields/elephant42/elephant42.conf
new file mode 100644
index 00000000..1b41763f
--- /dev/null
+++ b/app/boards/shields/elephant42/elephant42.conf
@@ -0,0 +1,6 @@
+# Uncomment the following lines to enable the Elephant42 RGB Underglow
+# CONFIG_ZMK_RGB_UNDERGLOW=y
+# CONFIG_WS2812_STRIP=y
+
+# Uncomment the following line to enable the Elephant42 OLED Display
+# CONFIG_ZMK_DISPLAY=y
\ No newline at end of file
diff --git a/app/boards/shields/elephant42/elephant42.dtsi b/app/boards/shields/elephant42/elephant42.dtsi
new file mode 100644
index 00000000..e2b708ca
--- /dev/null
+++ b/app/boards/shields/elephant42/elephant42.dtsi
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2021 The ZMK Contributors
+ *
+ * SPDX-License-Identifier: MIT
+ */
+ 
+#include <dt-bindings/zmk/matrix_transform.h>
+
+/ {
+    chosen {
+        zmk,kscan = &kscan0;
+        zmk,matrix_transform = &default_transform;
+    };
+
+    default_transform: keymap_transform_0 {
+        compatible = "zmk,matrix-transform";
+        columns = <12>;
+        rows = <4>;
+        map = <
+RC(0,0) RC(0,1) RC(0,2) RC(0,3) RC(0,4) RC(0,5)                 RC(0,6) RC(0,7) RC(0,8) RC(0,9) RC(0,10) RC(0,11)
+RC(1,0) RC(1,1) RC(1,2) RC(1,3) RC(1,4) RC(1,5)                 RC(1,6) RC(1,7) RC(1,8) RC(1,9) RC(1,10) RC(1,11)
+        RC(2,1) RC(2,2) RC(2,3) RC(2,4) RC(2,5)                 RC(2,6) RC(2,7) RC(2,8) RC(2,9) RC(2,10)
+                        RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9)
+        >;
+    };
+
+    kscan0: kscan {
+        compatible = "zmk,kscan-gpio-matrix";
+        label = "KSCAN";
+
+        diode-direction = "col2row";
+        row-gpios
+            = <&pro_micro 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+            , <&pro_micro 5 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+            , <&pro_micro 6 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+            , <&pro_micro 7 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
+            ;
+
+    }; 
+};
+
+&pro_micro_i2c {
+	status = "okay";
+
+	oled: ssd1306@3c {
+		compatible = "solomon,ssd1306fb";
+		reg = <0x3c>;
+		label = "DISPLAY";
+		width = <128>;
+		height = <32>;
+		segment-offset = <0>;
+		page-offset = <0>;
+		display-offset = <0>;
+		multiplex-ratio = <31>;
+		segment-remap;
+		com-invdir;
+		com-sequential;
+		prechargep = <0x22>;
+	};
+};
\ No newline at end of file
diff --git a/app/boards/shields/elephant42/elephant42.keymap b/app/boards/shields/elephant42/elephant42.keymap
new file mode 100644
index 00000000..8594c117
--- /dev/null
+++ b/app/boards/shields/elephant42/elephant42.keymap
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2021 The ZMK Contributors
+ *
+ * SPDX-License-Identifier: MIT
+ */
+ 
+#include <behaviors.dtsi>
+#include <dt-bindings/zmk/keys.h>
+#include <dt-bindings/zmk/bt.h>
+#include <dt-bindings/zmk/outputs.h>
+
+#define LOWR 1
+#define RAIS 2
+#define ADJT 3
+
+/ {
+  keymap {
+    compatible = "zmk,keymap";
+
+    default_layer {
+      bindings = <
+  &lt ADJT ESC  &kp Q &kp W &kp E     &kp R    &kp T                          &kp Y     &kp U    &kp I     &kp O   &kp P    &kp DEL 
+  &mt LCTRL TAB &kp A &kp S &kp D     &kp F    &kp G                          &kp H     &kp J    &kp K     &kp L   &kp SEMI &kp SQT
+                &kp Z &kp X &kp C     &kp V    &kp B                          &kp N     &kp M    &kp COMMA &kp DOT &kp FSLH
+                            &kp LSHFT &mo LOWR &kp LGUI &kp BSPC    &kp SPACE &kp ENTER &mo RAIS &kp LALT
+      >;
+    };
+
+    lower {
+      bindings = <
+  &kp GRAVE &kp N1 &kp N2 &kp N3 &kp N4 &kp N5                         &kp N6   &kp N7   &kp N8 &kp N9    &kp N0 &kp C_PLAY_PAUSE
+  &trans    &trans &trans &trans &trans &trans                         &kp LEFT &kp DOWN &kp UP &kp RIGHT &trans &trans
+            &trans &trans &trans &trans &kp LBKT                       &kp RBKT &trans   &trans &trans    &trans
+                                 &trans &trans &trans &trans    &trans &trans   &trans   &trans
+      >;
+    };
+    raise {
+      bindings = <
+  &kp TILDE &trans &trans &trans &trans &trans                          &trans   &trans &trans &kp MINUS &kp EQUAL &kp C_PLAY_PAUSE
+  &trans    &trans &trans &trans &trans &trans                          &trans   &trans &trans &trans    &trans    &kp BSLH
+            &trans &trans &trans &trans &kp LBKT                        &kp RBKT &trans &trans &trans    &trans
+                                 &trans &trans &trans &trans    &trans  &trans   &trans &trans
+      >;
+    };
+
+    adjust {
+      bindings = <
+  &trans &bt BT_NXT &bt BT_PRV &trans       &trans &bt BT_CLR              &trans &trans &trans &trans &trans &trans
+  &trans &trans     &trans     &trans       &trans &trans                  &trans &trans &trans &trans &trans &trans
+         &trans     &trans     &trans       &trans &trans                  &trans &trans &trans &trans &trans
+                               &out OUT_TOG &trans &trans &trans    &trans &trans &trans &trans
+      >;
+    };
+  };
+};
\ No newline at end of file
diff --git a/app/boards/shields/elephant42/elephant42.zmk.yml b/app/boards/shields/elephant42/elephant42.zmk.yml
new file mode 100644
index 00000000..60eb3777
--- /dev/null
+++ b/app/boards/shields/elephant42/elephant42.zmk.yml
@@ -0,0 +1,14 @@
+file_format: "1"
+id: elephant42
+name: Elephant42
+type: shield
+url: https://github.com/illness072/elephant42
+requires: [pro_micro]
+exposes: [i2c_oled]
+features:
+  - keys
+  - display
+  - underglow
+siblings:
+  - elephant42_left
+  - elephant42_right
diff --git a/app/boards/shields/elephant42/elephant42_left.overlay b/app/boards/shields/elephant42/elephant42_left.overlay
new file mode 100644
index 00000000..72fe2251
--- /dev/null
+++ b/app/boards/shields/elephant42/elephant42_left.overlay
@@ -0,0 +1,18 @@
+/*
+ * Copyright (c) 2021 The ZMK Contributors
+ *
+ * SPDX-License-Identifier: MIT
+ */
+ 
+#include "elephant42.dtsi"
+
+&kscan0 {
+    col-gpios
+        = <&pro_micro 21 GPIO_ACTIVE_HIGH>
+        , <&pro_micro 20 GPIO_ACTIVE_HIGH>
+        , <&pro_micro 19 GPIO_ACTIVE_HIGH>
+        , <&pro_micro 18 GPIO_ACTIVE_HIGH>
+        , <&pro_micro 15 GPIO_ACTIVE_HIGH>
+        , <&pro_micro 14 GPIO_ACTIVE_HIGH>
+        ;
+};
\ No newline at end of file
diff --git a/app/boards/shields/elephant42/elephant42_right.overlay b/app/boards/shields/elephant42/elephant42_right.overlay
new file mode 100644
index 00000000..35bd5895
--- /dev/null
+++ b/app/boards/shields/elephant42/elephant42_right.overlay
@@ -0,0 +1,22 @@
+/*
+ * Copyright (c) 2021 The ZMK Contributors
+ *
+ * SPDX-License-Identifier: MIT
+ */
+ 
+#include "elephant42.dtsi"
+
+&default_transform {
+    col-offset = <6>;
+};
+
+&kscan0 {
+    col-gpios
+        = <&pro_micro 14 GPIO_ACTIVE_HIGH>
+        , <&pro_micro 15 GPIO_ACTIVE_HIGH>
+        , <&pro_micro 18 GPIO_ACTIVE_HIGH>
+        , <&pro_micro 19 GPIO_ACTIVE_HIGH>
+        , <&pro_micro 20 GPIO_ACTIVE_HIGH>
+        , <&pro_micro 21 GPIO_ACTIVE_HIGH>
+        ;
+};