1// SPDX-License-Identifier: GPL-2.0-only 2/* 3 * Device tree for LEGO MINDSTORMS EV3 4 * 5 * Copyright (C) 2017 David Lechner <david@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 = <&>; 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: lcd-pins { 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