/*
 * Copyright (c) 2020 The ZMK Contributors
 *
 * SPDX-License-Identifier: MIT
 */

/dts-v1/;
#include <st/f0/stm32f072Xb.dtsi>
#include <st/f0/stm32f072c(8-b)tx-pinctrl.dtsi>
#include <dt-bindings/led/led.h>

#include <dt-bindings/zmk/matrix_transform.h>

#include "bdn9_rev2-layouts.dtsi"

&physical_layout0 {
    transform = <&matrix_transform0>;
};

/ {
    model = "Keeb.io BDN9 rev2";
    compatible = "keebio,bdn9", "st,stm32f072";

    chosen {
        zephyr,sram = &sram0;
        zephyr,flash = &flash0;
        zmk,underglow = &led_strip;
        zmk,physical-layout = &physical_layout0;
        zmk,kscan = &kscan0;
    };

    matrix_transform0: matrix_transform_0 {
        compatible = "zmk,matrix-transform";
        columns = <3>;
        rows = <3>;
        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)
        >;
    };

    kscan0: kscan_0 {
        compatible = "zmk,kscan-gpio-direct";

        input-gpios
            = <&gpiob 12 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
            , <&gpiob 5  (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
            , <&gpiob 6  (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
            , <&gpiob 14 (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
            , <&gpiob 4  (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
            , <&gpiob 7  (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
            , <&gpioa 3  (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
            , <&gpiof 1  (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
            , <&gpiof 0  (GPIO_ACTIVE_LOW | GPIO_PULL_UP)>
            ;
    };

    left_encoder: encoder_left {
        compatible = "alps,ec11";
        a-gpios = <&gpioa 4 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
        b-gpios = <&gpioa 8 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
        steps = <80>;
        status = "disabled";
    };
    mid_encoder: encoder_mid {
        compatible = "alps,ec11";
        a-gpios = <&gpioa 9 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
        b-gpios = <&gpioa 10 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
        steps = <80>;
        status = "disabled";
    };
    right_encoder: encoder_right {
        compatible = "alps,ec11";
        a-gpios = <&gpioa 15 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
        b-gpios = <&gpiob 3 (GPIO_ACTIVE_HIGH | GPIO_PULL_UP)>;
        steps = <80>;
        status = "disabled";
    };

    sensors: sensors {
        compatible = "zmk,keymap-sensors";
        status = "disabled";
        sensors = <>;
        triggers-per-rotation = <20>;
    };
};

&spi2 {
    status = "okay";
    pinctrl-0 = <&spi2_sck_pb13 &spi2_mosi_pb15>;
    pinctrl-names = "default";

    led_strip: ws2812@0 {
        compatible = "worldsemi,ws2812-spi";

        /* SPI */
        reg = <0>; /* ignored, but necessary for SPI bindings */
        spi-max-frequency = <4000000>;

        /* WS2812 */
        chain-length = <9>;
        spi-one-frame = <0x70>;
        spi-zero-frame = <0x40>;

        color-mapping = <LED_COLOR_ID_GREEN LED_COLOR_ID_RED LED_COLOR_ID_BLUE>;
    };
};

&clk_hsi {
    status = "okay";
};

&pll {
    status = "okay";
    prediv = <1>;
    mul = <6>;
    clocks = <&clk_hsi>;
};

&rcc {
    clocks = <&pll>;
    clock-frequency = <DT_FREQ_M(48)>;
    ahb-prescaler = <1>;
    apb1-prescaler = <1>;
};

zephyr_udc0: &usb {
    status = "okay";
    pinctrl-0 = <&usb_dm_pa11 &usb_dp_pa12>;
    pinctrl-names = "default";

    // Overridden to lower RAM usage.
    num-bidir-endpoints = <4>;
};

&rtc {
    status = "okay";
};

&flash0 {
    /*
     * For more information, see:
     * http://docs.zephyrproject.org/latest/guides/dts/index.html#flash-partitions
     */
    partitions {
        compatible = "fixed-partitions";
        #address-cells = <1>;
        #size-cells = <1>;

        /* Set 6Kb of storage at the end of the 128Kb of flash */
        storage_partition: partition@1e800 {
            reg = <0x0001e800 0x00001800>;
        };
    };
};
