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