| // SPDX-License-Identifier: GPL-2.0-only |
| /* |
| * Device tree for LEGO MINDSTORMS EV3 |
| * |
| * Copyright (C) 2017 David Lechner <david@lechnology.com> |
| */ |
| |
| /dts-v1/; |
| #include <dt-bindings/gpio/gpio.h> |
| #include <dt-bindings/input/linux-event-codes.h> |
| #include <dt-bindings/pwm/pwm.h> |
| |
| #include "da850.dtsi" |
| |
| / { |
| compatible = "lego,ev3", "ti,da850"; |
| model = "LEGO MINDSTORMS EV3"; |
| |
| aliases { |
| serial1 = &serial1; |
| }; |
| |
| memory@c0000000 { |
| device_type = "memory"; |
| reg = <0xc0000000 0x04000000>; |
| }; |
| |
| /* |
| * The buttons on the EV3 are mapped to keyboard keys. |
| */ |
| gpio_keys { |
| compatible = "gpio-keys"; |
| label = "EV3 Brick Buttons"; |
| pinctrl-names = "default"; |
| pinctrl-0 = <&button_bias>; |
| |
| center { |
| label = "Center"; |
| linux,code = <KEY_ENTER>; |
| gpios = <&gpio 29 GPIO_ACTIVE_HIGH>; |
| }; |
| |
| left { |
| label = "Left"; |
| linux,code = <KEY_LEFT>; |
| gpios = <&gpio 102 GPIO_ACTIVE_HIGH>; |
| }; |
| |
| back { |
| label = "Back"; |
| linux,code = <KEY_BACKSPACE>; |
| gpios = <&gpio 106 GPIO_ACTIVE_HIGH>; |
| }; |
| |
| right { |
| label = "Right"; |
| linux,code = <KEY_RIGHT>; |
| gpios = <&gpio 124 GPIO_ACTIVE_HIGH>; |
| }; |
| |
| down { |
| label = "Down"; |
| linux,code = <KEY_DOWN>; |
| gpios = <&gpio 126 GPIO_ACTIVE_HIGH>; |
| }; |
| |
| up { |
| label = "Up"; |
| linux,code = <KEY_UP>; |
| gpios = <&gpio 127 GPIO_ACTIVE_HIGH>; |
| }; |
| }; |
| |
| /* |
| * The EV3 has two built-in bi-color LEDs behind the buttons. |
| */ |
| leds { |
| compatible = "gpio-leds"; |
| |
| left_green { |
| label = "led0:green:brick-status"; |
| /* GP6[13] */ |
| gpios = <&gpio 103 GPIO_ACTIVE_HIGH>; |
| linux,default-trigger = "default-on"; |
| }; |
| |
| right_red { |
| label = "led1:red:brick-status"; |
| /* GP6[7] */ |
| gpios = <&gpio 108 GPIO_ACTIVE_HIGH>; |
| linux,default-trigger = "default-on"; |
| }; |
| |
| left_red { |
| label = "led0:red:brick-status"; |
| /* GP6[12] */ |
| gpios = <&gpio 109 GPIO_ACTIVE_HIGH>; |
| linux,default-trigger = "default-on"; |
| }; |
| |
| right_green { |
| label = "led1:green:brick-status"; |
| /* GP6[14] */ |
| gpios = <&gpio 110 GPIO_ACTIVE_HIGH>; |
| linux,default-trigger = "default-on"; |
| }; |
| }; |
| |
| /* |
| * The EV3 is powered down by turning off the main 5V supply. |
| */ |
| gpio-poweroff { |
| compatible = "gpio-poweroff"; |
| gpios = <&gpio 107 GPIO_ACTIVE_LOW>; |
| }; |
| |
| sound { |
| compatible = "pwm-beeper"; |
| pinctrl-names = "default"; |
| pinctrl-0 = <&ehrpwm0b_pins>; |
| pwms = <&ehrpwm0 1 1000000 0>; |
| amp-supply = <&>; |
| }; |
| |
| cvdd: regulator0 { |
| compatible = "regulator-fixed"; |
| regulator-name = "cvdd"; |
| regulator-min-microvolt = <1200000>; |
| regulator-max-microvolt = <1200000>; |
| regulator-always-on; |
| regulator-boot-on; |
| }; |
| |
| /* |
| * This is a 5V current limiting regulator that is shared by USB, |
| * the sensor (input) ports, the motor (output) ports and the A/DC. |
| */ |
| vcc5v: regulator1 { |
| compatible = "regulator-fixed"; |
| regulator-name = "vcc5v"; |
| regulator-min-microvolt = <5000000>; |
| regulator-max-microvolt = <5000000>; |
| gpio = <&gpio 101 0>; |
| over-current-gpios = <&gpio 99 GPIO_ACTIVE_LOW>; |
| enable-active-high; |
| regulator-boot-on; |
| }; |
| |
| /* |
| * This is a simple voltage divider on VCC5V to provide a 2.5V |
| * reference signal to the ADC. |
| */ |
| adc_ref: regulator2 { |
| compatible = "regulator-fixed"; |
| regulator-name = "adc ref"; |
| regulator-min-microvolt = <2500000>; |
| regulator-max-microvolt = <2500000>; |
| regulator-boot-on; |
| vin-supply = <&vcc5v>; |
| }; |
| |
| /* |
| * This is the amplifier for the speaker. |
| */ |
| amp: regulator3 { |
| compatible = "regulator-fixed"; |
| regulator-name = "amp"; |
| gpio = <&gpio 111 GPIO_ACTIVE_HIGH>; |
| enable-active-high; |
| }; |
| |
| /* |
| * The EV3 can use 6-AA batteries or a rechargeable Li-ion battery pack. |
| */ |
| battery { |
| compatible = "lego,ev3-battery"; |
| io-channels = <&adc 4>, <&adc 3>; |
| io-channel-names = "voltage", "current"; |
| rechargeable-gpios = <&gpio 136 GPIO_ACTIVE_LOW>; |
| }; |
| |
| bt_slow_clk: bt-clock { |
| pinctrl-names = "default"; |
| pinctrl-0 = <&ecap2_pins>, <&bt_clock_bias>; |
| compatible = "pwm-clock"; |
| #clock-cells = <0>; |
| clock-frequency = <32768>; |
| pwms = <&ecap2 0 30518 0>; |
| }; |
| |
| /* ARM local RAM */ |
| memory@ffff0000 { |
| compatible = "syscon", "simple-mfd"; |
| reg = <0xffff0000 0x2000>; /* 8k */ |
| |
| /* |
| * The I2C bootloader looks for this magic value to either |
| * boot normally or boot into a firmware update mode. |
| */ |
| reboot-mode { |
| compatible = "syscon-reboot-mode"; |
| offset = <0x1ffc>; |
| mode-normal = <0x00000000>; |
| mode-loader = <0x5555aaaa>; |
| }; |
| }; |
| }; |
| |
| &ref_clk { |
| clock-frequency = <24000000>; |
| }; |
| |
| &cpu { |
| cpu-supply = <&cvdd>; |
| }; |
| |
| /* since we have a fixed regulator, we can't run at these points */ |
| &opp_100 { |
| status = "disabled"; |
| }; |
| |
| &opp_200 { |
| status = "disabled"; |
| }; |
| |
| /* |
| * The SoC is actually the 456MHz version, but because of the fixed regulator |
| * This is the fastest we can go. |
| */ |
| &opp_375 { |
| status = "okay"; |
| }; |
| |
| &pmx_core { |
| status = "okay"; |
| |
| ev3_lcd_pins: lcd-pins { |
| pinctrl-single,bits = < |
| /* SIMO, CLK */ |
| 0x14 0x00100100 0x00f00f00 |
| >; |
| }; |
| }; |
| |
| &pinconf { |
| status = "okay"; |
| |
| /* Buttons have external pulldown resistors */ |
| button_bias: button-bias-groups { |
| disable { |
| groups = "cp5", "cp24", "cp25", "cp28"; |
| bias-disable; |
| }; |
| }; |
| |
| bt_clock_bias: bt-clock-bias-groups { |
| disable { |
| groups = "cp2"; |
| bias-disable; |
| }; |
| }; |
| |
| bt_pic_bias: bt-pic-bias-groups { |
| disable { |
| groups = "cp20"; |
| bias-disable; |
| }; |
| }; |
| }; |
| |
| /* Input port 1 */ |
| &serial1 { |
| status = "okay"; |
| pinctrl-names = "default"; |
| pinctrl-0 = <&serial1_rxtx_pins>; |
| }; |
| |
| &serial2 { |
| pinctrl-names = "default"; |
| pinctrl-0 = <&serial2_rxtx_pins>, <&serial2_rtscts_pins>, <&bt_pic_bias>; |
| status = "okay"; |
| |
| bluetooth { |
| compatible = "ti,cc2560"; |
| clocks = <&bt_slow_clk>; |
| clock-names = "ext_clock"; |
| enable-gpios = <&gpio 73 GPIO_ACTIVE_HIGH>; |
| max-speed = <2000000>; |
| nvmem-cells = <&bdaddr>; |
| nvmem-cell-names = "bd-address"; |
| }; |
| }; |
| |
| &rtc0 { |
| status = "okay"; |
| }; |
| |
| &i2c0 { |
| status = "okay"; |
| clock-frequency = <400000>; |
| pinctrl-names = "default"; |
| pinctrl-0 = <&i2c0_pins>; |
| |
| /* |
| * EEPROM contains the first stage bootloader, HW ID and Bluetooth MAC. |
| */ |
| eeprom@50 { |
| compatible = "microchip,24c128", "atmel,24c128"; |
| pagesize = <64>; |
| read-only; |
| reg = <0x50>; |
| #address-cells = <1>; |
| #size-cells = <1>; |
| |
| bdaddr: bdaddr@3f06 { |
| reg = <0x3f06 0x06>; |
| }; |
| }; |
| }; |
| |
| &wdt { |
| status = "okay"; |
| }; |
| |
| &mmc0 { |
| status = "okay"; |
| max-frequency = <50000000>; |
| bus-width = <4>; |
| cd-gpios = <&gpio 94 GPIO_ACTIVE_LOW>; |
| pinctrl-names = "default"; |
| pinctrl-0 = <&mmc0_pins>; |
| }; |
| |
| &spi0 { |
| status = "okay"; |
| pinctrl-names = "default"; |
| pinctrl-0 = <&spi0_pins>, <&spi0_cs0_pin>, <&spi0_cs3_pin>; |
| |
| flash@0 { |
| compatible = "n25q128a13", "jedec,spi-nor"; |
| reg = <0>; |
| spi-max-frequency = <50000000>; |
| ti,spi-wdelay = <8>; |
| |
| /* Partitions are based on the official firmware from LEGO */ |
| partitions { |
| compatible = "fixed-partitions"; |
| #address-cells = <1>; |
| #size-cells = <1>; |
| |
| partition@0 { |
| label = "U-Boot"; |
| reg = <0 0x40000>; |
| }; |
| |
| partition@40000 { |
| label = "U-Boot Env"; |
| reg = <0x40000 0x10000>; |
| }; |
| |
| partition@50000 { |
| label = "Kernel"; |
| reg = <0x50000 0x200000>; |
| }; |
| |
| partition@250000 { |
| label = "Filesystem"; |
| reg = <0x250000 0xa50000>; |
| }; |
| |
| partition@cb0000 { |
| label = "Storage"; |
| reg = <0xcb0000 0x2f0000>; |
| }; |
| }; |
| }; |
| |
| adc: adc@3 { |
| compatible = "ti,ads7957"; |
| reg = <3>; |
| #io-channel-cells = <1>; |
| spi-max-frequency = <1000000>; |
| ti,spi-wdelay = <63>; |
| vref-supply = <&adc_ref>; |
| }; |
| }; |
| |
| &spi1 { |
| status = "okay"; |
| pinctrl-0 = <&ev3_lcd_pins>; |
| pinctrl-names = "default"; |
| cs-gpios = <&gpio 44 GPIO_ACTIVE_LOW>; |
| |
| display@0 { |
| compatible = "lego,ev3-lcd"; |
| reg = <0>; |
| spi-max-frequency = <10000000>; |
| a0-gpios = <&gpio 43 GPIO_ACTIVE_HIGH>; |
| reset-gpios = <&gpio 80 GPIO_ACTIVE_HIGH>; |
| }; |
| }; |
| |
| &ecap2 { |
| status = "okay"; |
| }; |
| |
| &ehrpwm0 { |
| status = "okay"; |
| }; |
| |
| &gpio { |
| status = "okay"; |
| |
| /* Don't pull down battery voltage adc io channel */ |
| batt_volt_en { |
| gpio-hog; |
| gpios = <6 GPIO_ACTIVE_HIGH>; |
| output-high; |
| }; |
| |
| /* Don't impede Bluetooth clock signal */ |
| bt_clock_en { |
| gpio-hog; |
| gpios = <5 GPIO_ACTIVE_HIGH>; |
| input; |
| }; |
| |
| /* |
| * There is a PIC microcontroller for interfacing with an Apple MFi |
| * chip. This interferes with normal Bluetooth operation, so we need |
| * to make sure it is turned off. Note: The publicly available |
| * schematics from LEGO don't show that these pins are connected to |
| * anything, but they are present in the source code from LEGO. |
| */ |
| |
| bt_pic_en { |
| gpio-hog; |
| gpios = <51 GPIO_ACTIVE_HIGH>; |
| output-low; |
| }; |
| |
| bt_pic_rst { |
| gpio-hog; |
| gpios = <78 GPIO_ACTIVE_HIGH>; |
| output-high; |
| }; |
| |
| bt_pic_cts { |
| gpio-hog; |
| gpios = <87 GPIO_ACTIVE_HIGH>; |
| input; |
| }; |
| }; |
| |
| &usb_phy { |
| status = "okay"; |
| }; |
| |
| &usb0 { |
| status = "okay"; |
| }; |
| |
| &usb1 { |
| status = "okay"; |
| vbus-supply = <&vcc5v>; |
| }; |