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

/dts-v1/;

#include <raspberrypi/rpi_pico/rp2040.dtsi>
#include <arm/raspberrypi/rp2040-boot-mode-retention.dtsi>

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

#include <layouts/common/65percent/ansi.dtsi>

/ {

    chosen {
        zephyr,sram = &sram0;
        zephyr,flash = &flash0;
        zephyr,flash-controller = &ssi;
        zephyr,code-partition = &code_partition;
        zmk,kscan = &kscan0;
        zmk,physical-layout = &layout_65_ansi;
    };

    default_transform: keymap_transform_0 {
        compatible = "zmk,matrix-transform";
        columns = <15>;
        rows = <5>;

//  ------- Switch Matrix ----------
//
//  Column     0 |   1 |   2 |   3 |   4 |   5 |   6 |   7 |   8 |   9 |  10 |  11 |  12 |  13 |  14 |
//          ==========================================================================================
//  Row 0 ||  S0 |  S1 |  S2 |  S3 |  S4 |  S5 |  S6 |  S7 |  S8 |  S9 | S10 | S11 | S12 | S13 | S14 |
//  Row 1 ||  S0 |  S1 |  S2 |  S3 |  S4 |  S5 |  S6 |  S7 |  S8 |  S9 | S10 | S11 | S12 | S13 | S14 |
//  Row 2 ||  S0 |  S1 |  S2 |  S3 |  S4 |  S5 |  S6 |  S7 |  S8 |  S9 | S10 | S11 | S12 |     | S13 |
//  Row 3 ||  S0 |  S1 |  S2 |  S3 |  S4 |  S5 |  S6 |  S7 |  S8 |  S9 | S10 | S11 |     | S12 | S13 |
//  Row 4 ||  S0 |  S1 |  S2 |     |     |     |  S3 |     |  S4 |  S5 | S6  |     | S7  | S8  | S9  |
//     -----------------------------------------------------------------------------------
//
        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(0,12) RC(0,13) RC(0,14)
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(1,12) RC(1,13) RC(1,14)
RC(2,0) 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(2,11) RC(2,12)          RC(2,14)
RC(3,0) RC(3,1) RC(3,2) RC(3,3) RC(3,4) RC(3,5) RC(3,6) RC(3,7) RC(3,8) RC(3,9) RC(3,10) RC(3,11)          RC(3,13) RC(3,14)
RC(4,0) RC(4,1) RC(4,2)                         RC(4,6)         RC(4,8) RC(4,9) RC(4,10)          RC(4,12) RC(4,13) RC(4,14)
        >;
    };

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

        diode-direction = "col2row";
        row-gpios
            = <&gpio0 29 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
            , <&gpio0 28 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
            , <&gpio0 27 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
            , <&gpio0 26 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
            , <&gpio0 22 (GPIO_ACTIVE_HIGH | GPIO_PULL_DOWN)>
            ;
        col-gpios
            = <&gpio0 25 GPIO_ACTIVE_HIGH>
            , <&gpio0 24 GPIO_ACTIVE_HIGH>
            , <&gpio0 23 GPIO_ACTIVE_HIGH>
            , <&gpio0 1  GPIO_ACTIVE_HIGH>
            , <&gpio0 7  GPIO_ACTIVE_HIGH>
            , <&gpio0 21 GPIO_ACTIVE_HIGH>
            , <&gpio0 20 GPIO_ACTIVE_HIGH>
            , <&gpio0 19 GPIO_ACTIVE_HIGH>
            , <&gpio0 18 GPIO_ACTIVE_HIGH>
            , <&gpio0 17 GPIO_ACTIVE_HIGH>
            , <&gpio0 16 GPIO_ACTIVE_HIGH>
            , <&gpio0 15 GPIO_ACTIVE_HIGH>
            , <&gpio0 14 GPIO_ACTIVE_HIGH>
            , <&gpio0 13 GPIO_ACTIVE_HIGH>
            , <&gpio0 12 GPIO_ACTIVE_HIGH>
            ;
    };
};

&flash0 {
    reg = <0x10000000 DT_SIZE_M(16)>;

    partitions {
        compatible = "fixed-partitions";
        #address-cells = <1>;
        #size-cells = <1>;

        /* Reserved memory for the second stage bootloader */
        second_stage_bootloader: partition@0 {
            reg = <0x00000000 0x100>;
            read-only;
        };

        /*
         * Usable flash. Starts at 0x100, after the bootloader. The partition
         * size is 16MB minus the 0x100 bytes taken by the bootloader.
         */
        code_partition: partition@100 {
            reg = <0x100 (DT_SIZE_M(16) - 0x100)>;
            read-only;
        };
    };
};

&timer {
  status = "okay";
};

&rtc {
    clocks = <&clocks RPI_PICO_CLKID_CLK_RTC>;
    status = "okay";
};

zephyr_udc0: &usbd {
  status = "okay";
};

&vreg {
    regulator-always-on;
    regulator-allowed-modes = <REGULATOR_RPI_PICO_MODE_NORMAL>;
};

&gpio0 {
    status = "okay";
};

&layout_65_ansi {
    transform = <&default_transform>;
};
