/*
 * Copyright (c) 2023 Panasonic Industrial Devices Europe GmbH
 *
 * SPDX-License-Identifier: Apache-2.0
 */
#include "pan1783_cpuapp_common-pinctrl.dtsi"
#include <zephyr/dt-bindings/input/input-event-codes.h>

/ {

	chosen {
		zephyr,console = &uart0;
		zephyr,shell-uart = &uart0;
		zephyr,uart-mcumgr = &uart0;
		zephyr,bt-mon-uart = &uart0;
		zephyr,bt-c2h-uart = &uart0;
		zephyr,bt-hci-ipc = &ipc0;
		nordic,802154-spinel-ipc = &ipc0;
		zephyr,ieee802154 = &ieee802154;
	};

	leds {
		compatible = "gpio-leds";
		evb_led1: evb_led_1 {
			gpios = <&gpio0 28 GPIO_ACTIVE_LOW>;
			label = "LED1 on EVB";
		};
		evb_led2: evb_led_2 {
			gpios = <&gpio0 29 GPIO_ACTIVE_LOW>;
			label = "LED2 on EVB";
		};
		evb_led3: evb_led_3 {
			gpios = <&gpio0 30 GPIO_ACTIVE_LOW>;
			label = "LED3 on EVB";
		};
		evb_led4: evb_led_4 {
			gpios = <&gpio0 31 GPIO_ACTIVE_LOW>;
			label = "LED4 on EVB";
		};
	};

	pwmleds {
		compatible = "pwm-leds";
		pwm_evb_led1: pwm_evb_led_1 {
			pwms = <&pwm0 0 PWM_MSEC(20) PWM_POLARITY_INVERTED>;
		};
	};

	buttons {
		compatible = "gpio-keys";
		evb_sw1: evb_sw_1 {
			gpios = <&gpio0 23 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
			label = "SW1 on EVB";
			zephyr,code = <INPUT_KEY_0>;
		};
		evb_sw2: evb_sw_2 {
			gpios = <&gpio0 24 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
			label = "SW2 on EVB";
			zephyr,code = <INPUT_KEY_1>;
		};
		evb_sw3: evb_sw_3 {
			gpios = <&gpio0 8 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
			label = "SW3 on EVB";
			zephyr,code = <INPUT_KEY_2>;
		};
		evb_sw4: evb_sw_4 {
			gpios = <&gpio0 9 (GPIO_PULL_UP | GPIO_ACTIVE_LOW)>;
			label = "SW4 on EVB";
			zephyr,code = <INPUT_KEY_3>;
		};
	};

	mikrobus_header: mikrobus-connector {
		compatible = "mikro-bus";
		#gpio-cells = <2>;
		gpio-map-mask = <0xffffffff 0xffffffc0>;
		gpio-map-pass-thru = <0 0x3f>;
		gpio-map =	<0 0 &gpio0 4 0>,	/* AN */
				/* Not a GPIO*/		/* RST */
				<2 0 &gpio1 12 0>,	/* CS */
				<3 0 &gpio1 15 0>,	/* SCK */
				<4 0 &gpio1 14 0>,	/* MISO */
				<5 0 &gpio1 13 0>,	/* MOSI */
							/* +3.3V */
							/* GND */
				<6 0 &gpio1 7 0>,	/* PWM */
				<7 0 &gpio1 4 0>,	/* INT */
				<8 0 &gpio1 0 0>,	/* RX */
				<9 0 &gpio1 1 0>,	/* TX */
				<10 0 &gpio1 3 0>,	/* SCL */
				<11 0 &gpio1 2 0>;	/* SDA */
							/* +5V */
							/* GND */
	};

	arduino_header: connector {
		compatible = "arduino-header-r3";
		#gpio-cells = <2>;
		gpio-map-mask = <0xffffffff 0xffffffc0>;
		gpio-map-pass-thru = <0 0x3f>;
		gpio-map = <0 0 &gpio0 4 0>,	/* A0 */
			   <1 0 &gpio0 5 0>,	/* A1 */
			   <2 0 &gpio0 6 0>,	/* A2 */
			   <3 0 &gpio0 7 0>,	/* A3 */
			   <4 0 &gpio0 25 0>,	/* A4 */
			   <5 0 &gpio0 26 0>,	/* A5 */
			   <6 0 &gpio1 0 0>,	/* D0 */
			   <7 0 &gpio1 1 0>,	/* D1 */
			   <8 0 &gpio1 4 0>,	/* D2 */
			   <9 0 &gpio1 5 0>,	/* D3 */
			   <10 0 &gpio1 6 0>,	/* D4 */
			   <11 0 &gpio1 7 0>,	/* D5 */
			   <12 0 &gpio1 8 0>,	/* D6 */
			   <13 0 &gpio1 9 0>,	/* D7 */
			   <14 0 &gpio1 10 0>,	/* D8 */
			   <15 0 &gpio1 11 0>,	/* D9 */
			   <16 0 &gpio1 12 0>,	/* D10 */
			   <17 0 &gpio1 13 0>,	/* D11 */
			   <18 0 &gpio1 14 0>,	/* D12 */
			   <19 0 &gpio1 15 0>,	/* D13 */
			   <20 0 &gpio1 2 0>,	/* D14 */
			   <21 0 &gpio1 3 0>;	/* D15 */
	};

	arduino_adc: analog-connector {
		compatible = "arduino,uno-adc";
		#io-channel-cells = <1>;
		io-channel-map = <0 &adc 0>,	/* A0 = P0.4 = AIN0 */
				 <1 &adc 1>,	/* A1 = P0.5 = AIN1 */
				 <2 &adc 2>,	/* A2 = P0.6 = AIN2 */
				 <3 &adc 3>,	/* A3 = P0.7 = AIN3 */
				 <4 &adc 4>,	/* A4 = P0.25 = AIN4 */
				 <5 &adc 5>;	/* A5 = P0.26 = AIN5 */
	};

	gpio_fwd: nrf-gpio-forwarder {
		compatible = "nordic,nrf-gpio-forwarder";
		status = "disabled";
		uart {
			gpios = <&gpio0 20 0>, <&gpio0 22 0>, <&gpio0 11 0>, <&gpio0 10 0>;
		};
	};

	/* These aliases are provided for compatibility with samples */
	aliases {
		led0 = &evb_led1;
		led1 = &evb_led2;
		led2 = &evb_led3;
		led3 = &evb_led4;
		pwm-led0 = &pwm_evb_led1;
		sw0 = &evb_sw1;
		sw1 = &evb_sw2;
		sw2 = &evb_sw3;
		sw3 = &evb_sw4;
		bootloader-led0 = &evb_led1;
		mcuboot-button0 = &evb_sw1;
		mcuboot-led0 = &evb_led1;
		watchdog0 = &wdt0;
		spi-flash0 = &mx25r64;
	};
};

&adc {
	status = "okay";
};

&gpiote {
	status = "okay";
};

&gpio0 {
	status = "okay";
};

&gpio1 {
	status = "okay";
};

&i2c1 {
	compatible = "nordic,nrf-twim";
	status = "okay";
	pinctrl-0 = <&i2c1_default>;
	pinctrl-1 = <&i2c1_sleep>;
	pinctrl-names = "default", "sleep";
};

&uart0 {
	status = "okay";
	current-speed = <115200>;
	pinctrl-0 = <&uart0_default>;
	pinctrl-1 = <&uart0_sleep>;
	pinctrl-names = "default", "sleep";
};

&pwm0 {
	status = "okay";
	pinctrl-0 = <&pwm0_default>;
	pinctrl-1 = <&pwm0_sleep>;
	pinctrl-names = "default", "sleep";
};

&qspi {
	status = "okay";
	pinctrl-0 = <&qspi_default>;
	pinctrl-1 = <&qspi_sleep>;
	pinctrl-names = "default", "sleep";
	mx25r64: mx25r6435f@0 {
		compatible = "nordic,qspi-nor";
		reg = <0>;
		/* MX25R64 supports only pp and pp4io */
		writeoc = "pp4io";
		/* MX25R64 supports all readoc options */
		readoc = "read4io";
		sck-frequency = <8000000>;
		jedec-id = [ c2 28 17  ];
		sfdp-bfp = [
			e5 20 f1 ff ff ff ff 03 44 eb 08 6b 08 3b 04 bb
			ee ff ff ff ff ff 00 ff ff ff 00 ff 0c 20 0f 52
			10 d8 00 ff 23 72 f5 00 82 ed 04 cc 44 83 68 44
			30 b0 30 b0 f7 c4 d5 5c 00 be 29 ff f0 d0 ff ff
		];
		size = <67108864>;
		has-dpd;
		t-enter-dpd = <10000>;
		t-exit-dpd = <35000>;
	};
};

arduino_serial: &uart1 {
	compatible = "nordic,nrf-uarte";
	current-speed = <115200>;
	pinctrl-0 = <&uart1_default>;
	pinctrl-1 = <&uart1_sleep>;
	pinctrl-names = "default", "sleep";
};

arduino_i2c: &i2c1 {};

arduino_spi: &spi4 {
	compatible = "nordic,nrf-spim";
	status = "okay";
	cs-gpios = <&arduino_header 16 GPIO_ACTIVE_LOW>; /* D10 */
	pinctrl-0 = <&spi4_default>;
	pinctrl-1 = <&spi4_sleep>;
	pinctrl-names = "default", "sleep";
};

&flash0 {

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

		boot_partition: partition@0 {
			label = "mcuboot";
			reg = <0x00000000 0x00010000>;
		};
		slot0_partition: partition@10000 {
			label = "image-0";
		};
		slot1_partition: partition@80000 {
			label = "image-1";
		};
		/* 0xf0000 to 0xf7fff reserved for TF-M partitions */
		storage_partition: partition@f8000 {
			label = "storage";
			reg = <0x000f8000 0x00008000>;
		};
	};
};

&ieee802154 {
	status = "okay";
};

zephyr_udc0: &usbd {
	compatible = "nordic,nrf-usbd";
	status = "okay";
};

/ {

	reserved-memory {
		#address-cells = <1>;
		#size-cells = <1>;
		ranges;

		sram0_image: image@20000000 {
			/* Zephyr image(s) memory */
		};

		sram0_s: image_s@20000000 {
			/* Secure image memory */
		};
	};
};

/* Include partition configuration file */
#include "pan1783_cpuapp_partition_conf.dtsi"
