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 = <&amp>;
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