Home | History | Annotate | Line # | Download | only in dts
      1 // SPDX-License-Identifier: GPL-2.0-only
      2 /*
      3  * Device tree for LEGO MINDSTORMS EV3
      4  *
      5  * Copyright (C) 2017 David Lechner <david (a] lechnology.com>
      6  */
      7 
      8 /dts-v1/;
      9 #include <dt-bindings/gpio/gpio.h>
     10 #include <dt-bindings/input/linux-event-codes.h>
     11 #include <dt-bindings/pwm/pwm.h>
     12 
     13 #include "da850.dtsi"
     14 
     15 / {
     16 	compatible = "lego,ev3", "ti,da850";
     17 	model = "LEGO MINDSTORMS EV3";
     18 
     19 	aliases {
     20 		serial1 = &serial1;
     21 	};
     22 
     23 	memory@c0000000 {
     24 		device_type = "memory";
     25 		reg = <0xc0000000 0x04000000>;
     26 	};
     27 
     28 	/*
     29 	 * The buttons on the EV3 are mapped to keyboard keys.
     30 	 */
     31 	gpio_keys {
     32 		compatible = "gpio-keys";
     33 		label = "EV3 Brick Buttons";
     34 		pinctrl-names = "default";
     35 		pinctrl-0 = <&button_bias>;
     36 
     37 		center {
     38 			label = "Center";
     39 			linux,code = <KEY_ENTER>;
     40 			gpios = <&gpio 29 GPIO_ACTIVE_HIGH>;
     41 		};
     42 
     43 		left {
     44 			label = "Left";
     45 			linux,code = <KEY_LEFT>;
     46 			gpios = <&gpio 102 GPIO_ACTIVE_HIGH>;
     47 		};
     48 
     49 		back {
     50 			label = "Back";
     51 			linux,code = <KEY_BACKSPACE>;
     52 			gpios = <&gpio 106 GPIO_ACTIVE_HIGH>;
     53 		};
     54 
     55 		right {
     56 			label = "Right";
     57 			linux,code = <KEY_RIGHT>;
     58 			gpios = <&gpio 124 GPIO_ACTIVE_HIGH>;
     59 		};
     60 
     61 		down {
     62 			label = "Down";
     63 			linux,code = <KEY_DOWN>;
     64 			gpios = <&gpio 126 GPIO_ACTIVE_HIGH>;
     65 		};
     66 
     67 		up {
     68 			label = "Up";
     69 			linux,code = <KEY_UP>;
     70 			gpios = <&gpio 127 GPIO_ACTIVE_HIGH>;
     71 		};
     72 	};
     73 
     74 	/*
     75 	 * The EV3 has two built-in bi-color LEDs behind the buttons.
     76 	 */
     77 	leds {
     78 		compatible = "gpio-leds";
     79 
     80 		left_green {
     81 			label = "led0:green:brick-status";
     82 			/* GP6[13] */
     83 			gpios = <&gpio 103 GPIO_ACTIVE_HIGH>;
     84 			linux,default-trigger = "default-on";
     85 		};
     86 
     87 		right_red {
     88 			label = "led1:red:brick-status";
     89 			/* GP6[7] */
     90 			gpios = <&gpio 108 GPIO_ACTIVE_HIGH>;
     91 			linux,default-trigger = "default-on";
     92 		};
     93 
     94 		left_red {
     95 			label = "led0:red:brick-status";
     96 			/* GP6[12] */
     97 			gpios = <&gpio 109 GPIO_ACTIVE_HIGH>;
     98 			linux,default-trigger = "default-on";
     99 		};
    100 
    101 		right_green {
    102 			label = "led1:green:brick-status";
    103 			/* GP6[14] */
    104 			gpios = <&gpio 110 GPIO_ACTIVE_HIGH>;
    105 			linux,default-trigger = "default-on";
    106 		};
    107 	};
    108 
    109 	/*
    110 	 * The EV3 is powered down by turning off the main 5V supply.
    111 	 */
    112 	gpio-poweroff {
    113 		compatible = "gpio-poweroff";
    114 		gpios = <&gpio 107 GPIO_ACTIVE_LOW>;
    115 	};
    116 
    117 	sound {
    118 		compatible = "pwm-beeper";
    119 		pinctrl-names = "default";
    120 		pinctrl-0 = <&ehrpwm0b_pins>;
    121 		pwms = <&ehrpwm0 1 1000000 0>;
    122 		amp-supply = <&amp>;
    123 	};
    124 
    125 	cvdd: regulator0 {
    126 		compatible = "regulator-fixed";
    127 		regulator-name = "cvdd";
    128 		regulator-min-microvolt = <1200000>;
    129 		regulator-max-microvolt = <1200000>;
    130 		regulator-always-on;
    131 		regulator-boot-on;
    132 	};
    133 
    134 	/*
    135 	 * This is a 5V current limiting regulator that is shared by USB,
    136 	 * the sensor (input) ports, the motor (output) ports and the A/DC.
    137 	 */
    138 	vcc5v: regulator1 {
    139 		compatible = "regulator-fixed";
    140 		regulator-name = "vcc5v";
    141 		regulator-min-microvolt = <5000000>;
    142 		regulator-max-microvolt = <5000000>;
    143 		gpio = <&gpio 101 0>;
    144 		over-current-gpios = <&gpio 99 GPIO_ACTIVE_LOW>;
    145 		enable-active-high;
    146 		regulator-boot-on;
    147 	};
    148 
    149 	/*
    150 	 * This is a simple voltage divider on VCC5V to provide a 2.5V
    151 	 * reference signal to the ADC.
    152 	 */
    153 	adc_ref: regulator2 {
    154 		compatible = "regulator-fixed";
    155 		regulator-name = "adc ref";
    156 		regulator-min-microvolt = <2500000>;
    157 		regulator-max-microvolt = <2500000>;
    158 		regulator-boot-on;
    159 		vin-supply = <&vcc5v>;
    160 	};
    161 
    162 	/*
    163 	 * This is the amplifier for the speaker.
    164 	 */
    165 	amp: regulator3 {
    166 		compatible = "regulator-fixed";
    167 		regulator-name = "amp";
    168 		gpio = <&gpio 111 GPIO_ACTIVE_HIGH>;
    169 		enable-active-high;
    170 	};
    171 
    172 	/*
    173 	 * The EV3 can use 6-AA batteries or a rechargeable Li-ion battery pack.
    174 	 */
    175 	battery {
    176 		compatible = "lego,ev3-battery";
    177 		io-channels = <&adc 4>, <&adc 3>;
    178 		io-channel-names = "voltage", "current";
    179 		rechargeable-gpios = <&gpio 136 GPIO_ACTIVE_LOW>;
    180 	};
    181 
    182 	bt_slow_clk: bt-clock {
    183 		pinctrl-names = "default";
    184 		pinctrl-0 = <&ecap2_pins>, <&bt_clock_bias>;
    185 		compatible = "pwm-clock";
    186 		#clock-cells = <0>;
    187 		clock-frequency = <32768>;
    188 		pwms = <&ecap2 0 30518 0>;
    189 	};
    190 
    191 	/* ARM local RAM */
    192 	memory@ffff0000 {
    193 		compatible = "syscon", "simple-mfd";
    194 		reg = <0xffff0000 0x2000>; /* 8k */
    195 
    196 		/*
    197 		 * The I2C bootloader looks for this magic value to either
    198 		 * boot normally or boot into a firmware update mode.
    199 		 */
    200 		reboot-mode {
    201 			compatible = "syscon-reboot-mode";
    202 			offset = <0x1ffc>;
    203 			mode-normal = <0x00000000>;
    204 			mode-loader = <0x5555aaaa>;
    205 		};
    206 	};
    207 };
    208 
    209 &ref_clk {
    210 	clock-frequency = <24000000>;
    211 };
    212 
    213 &cpu {
    214 	cpu-supply = <&cvdd>;
    215 };
    216 
    217 /* since we have a fixed regulator, we can't run at these points */
    218 &opp_100 {
    219 	status = "disabled";
    220 };
    221 
    222 &opp_200 {
    223 	status = "disabled";
    224 };
    225 
    226 /*
    227  * The SoC is actually the 456MHz version, but because of the fixed regulator
    228  * This is the fastest we can go.
    229  */
    230 &opp_375 {
    231 	status = "okay";
    232 };
    233 
    234 &pmx_core {
    235 	status = "okay";
    236 
    237 	ev3_lcd_pins: pinmux_lcd {
    238 		pinctrl-single,bits = <
    239 			/* SIMO, CLK */
    240 			0x14 0x00100100 0x00f00f00
    241 		>;
    242 	};
    243 };
    244 
    245 &pinconf {
    246 	status = "okay";
    247 
    248 	/* Buttons have external pulldown resistors */
    249 	button_bias: button-bias-groups {
    250 		disable {
    251 			groups = "cp5", "cp24", "cp25", "cp28";
    252 			bias-disable;
    253 		};
    254 	};
    255 
    256 	bt_clock_bias: bt-clock-bias-groups {
    257 		disable {
    258 			groups = "cp2";
    259 			bias-disable;
    260 		};
    261 	};
    262 
    263 	bt_pic_bias: bt-pic-bias-groups {
    264 		disable {
    265 			groups = "cp20";
    266 			bias-disable;
    267 		};
    268 	};
    269 };
    270 
    271 /* Input port 1 */
    272 &serial1 {
    273 	status = "okay";
    274 	pinctrl-names = "default";
    275 	pinctrl-0 = <&serial1_rxtx_pins>;
    276 };
    277 
    278 &serial2 {
    279 	pinctrl-names = "default";
    280 	pinctrl-0 = <&serial2_rxtx_pins>, <&serial2_rtscts_pins>, <&bt_pic_bias>;
    281 	status = "okay";
    282 
    283 	bluetooth {
    284 		compatible = "ti,cc2560";
    285 		clocks = <&bt_slow_clk>;
    286 		clock-names = "ext_clock";
    287 		enable-gpios = <&gpio 73 GPIO_ACTIVE_HIGH>;
    288 		max-speed = <2000000>;
    289 		nvmem-cells = <&bdaddr>;
    290 		nvmem-cell-names = "bd-address";
    291 	};
    292 };
    293 
    294 &rtc0 {
    295 	status = "okay";
    296 };
    297 
    298 &i2c0 {
    299 	status = "okay";
    300 	clock-frequency = <400000>;
    301 	pinctrl-names = "default";
    302 	pinctrl-0 = <&i2c0_pins>;
    303 
    304 	/*
    305 	 * EEPROM contains the first stage bootloader, HW ID and Bluetooth MAC.
    306 	 */
    307 	eeprom@50 {
    308 		compatible = "microchip,24c128", "atmel,24c128";
    309 		pagesize = <64>;
    310 		read-only;
    311 		reg = <0x50>;
    312 		#address-cells = <1>;
    313 		#size-cells = <1>;
    314 
    315 		bdaddr: bdaddr@3f06 {
    316 			reg = <0x3f06 0x06>;
    317 		};
    318 	};
    319 };
    320 
    321 &wdt {
    322 	status = "okay";
    323 };
    324 
    325 &mmc0 {
    326 	status = "okay";
    327 	max-frequency = <50000000>;
    328 	bus-width = <4>;
    329 	cd-gpios = <&gpio 94 GPIO_ACTIVE_LOW>;
    330 	pinctrl-names = "default";
    331 	pinctrl-0 = <&mmc0_pins>;
    332 };
    333 
    334 &spi0 {
    335 	status = "okay";
    336 	pinctrl-names = "default";
    337 	pinctrl-0 = <&spi0_pins>, <&spi0_cs0_pin>, <&spi0_cs3_pin>;
    338 
    339 	flash@0 {
    340 		compatible = "n25q128a13", "jedec,spi-nor";
    341 		reg = <0>;
    342 		spi-max-frequency = <50000000>;
    343 		ti,spi-wdelay = <8>;
    344 
    345 		/* Partitions are based on the official firmware from LEGO */
    346 		partitions {
    347 			compatible = "fixed-partitions";
    348 			#address-cells = <1>;
    349 			#size-cells = <1>;
    350 
    351 			partition@0 {
    352 				label = "U-Boot";
    353 				reg = <0 0x40000>;
    354 			};
    355 
    356 			partition@40000 {
    357 				label = "U-Boot Env";
    358 				reg = <0x40000 0x10000>;
    359 			};
    360 
    361 			partition@50000 {
    362 				label = "Kernel";
    363 				reg = <0x50000 0x200000>;
    364 			};
    365 
    366 			partition@250000 {
    367 				label = "Filesystem";
    368 				reg = <0x250000 0xa50000>;
    369 			};
    370 
    371 			partition@cb0000 {
    372 				label = "Storage";
    373 				reg = <0xcb0000 0x2f0000>;
    374 			};
    375 		};
    376 	};
    377 
    378 	adc: adc@3 {
    379 		compatible = "ti,ads7957";
    380 		reg = <3>;
    381 		#io-channel-cells = <1>;
    382 		spi-max-frequency = <1000000>;
    383 		ti,spi-wdelay = <63>;
    384 		vref-supply = <&adc_ref>;
    385 	};
    386 };
    387 
    388 &spi1 {
    389 	status = "okay";
    390 	pinctrl-0 = <&ev3_lcd_pins>;
    391 	pinctrl-names = "default";
    392 	cs-gpios = <&gpio 44 GPIO_ACTIVE_LOW>;
    393 
    394 	display@0{
    395 		compatible = "lego,ev3-lcd";
    396 		reg = <0>;
    397 		spi-max-frequency = <10000000>;
    398 		a0-gpios = <&gpio 43 GPIO_ACTIVE_HIGH>;
    399 		reset-gpios = <&gpio 80 GPIO_ACTIVE_HIGH>;
    400 	};
    401 };
    402 
    403 &ecap2 {
    404 	status = "okay";
    405 };
    406 
    407 &ehrpwm0 {
    408 	status = "okay";
    409 };
    410 
    411 &gpio {
    412 	status = "okay";
    413 
    414 	/* Don't pull down battery voltage adc io channel */
    415 	batt_volt_en {
    416 		gpio-hog;
    417 		gpios = <6 GPIO_ACTIVE_HIGH>;
    418 		output-high;
    419 	};
    420 
    421 	/* Don't impede Bluetooth clock signal */
    422 	bt_clock_en {
    423 		gpio-hog;
    424 		gpios = <5 GPIO_ACTIVE_HIGH>;
    425 		input;
    426 	};
    427 
    428 	/*
    429 	 * There is a PIC microcontroller for interfacing with an Apple MFi
    430 	 * chip. This interferes with normal Bluetooth operation, so we need
    431 	 * to make sure it is turned off. Note: The publicly available
    432 	 * schematics from LEGO don't show that these pins are connected to
    433 	 * anything, but they are present in the source code from LEGO.
    434 	 */
    435 
    436 	bt_pic_en {
    437 		gpio-hog;
    438 		gpios = <51 GPIO_ACTIVE_HIGH>;
    439 		output-low;
    440 	};
    441 
    442 	bt_pic_rst {
    443 		gpio-hog;
    444 		gpios = <78 GPIO_ACTIVE_HIGH>;
    445 		output-high;
    446 	};
    447 
    448 	bt_pic_cts {
    449 		gpio-hog;
    450 		gpios = <87 GPIO_ACTIVE_HIGH>;
    451 		input;
    452 	};
    453 };
    454 
    455 &usb_phy {
    456 	status = "okay";
    457 };
    458 
    459 &usb0 {
    460 	status = "okay";
    461 };
    462 
    463 &usb1 {
    464 	status = "okay";
    465 	vbus-supply = <&vcc5v>;
    466 };
    467