Re: [RFC] Device Tree Overlays Proposal (Was Re: capebus moving omap_devices to mach-omap2)

Pantelis Antoniou
2012-11-14T00:00:57Z

[-- Attachment #1: Type: text/plain, Size: 8545 bytes --]

Hi David,

Since this is getting to be too long-winded I went ahead a coded
something quick and dirty.

On Nov 14, 2012, at 1:30 AM, David Gibson wrote:

> On Tue, Nov 13, 2012 at 10:09:28AM +0200, Pantelis Antoniou wrote:
>> Hi David,
>>
>> On Nov 13, 2012, at 9:25 AM, David Gibson wrote:
>>
>>> On Mon, Nov 12, 2012 at 09:52:32AM -0700, Stephen Warren wrote:
>>>> On 11/12/2012 05:10 AM, Pantelis Antoniou wrote:
>>> [snip]
>>>>> Oh yes. In fact if one was to use a single kernel image for beagleboard
>>>>> and beaglebone, for the cape to work for both, it is required for it's
>>>>> dtb to be compatible.
>>>>
>>>> Well, as Grant pointed out, it's not actually strictly necessary for the
>>>> .dtb to be compatible; only the .dts /need/ be compatible, and the .dtb
>>>> can be generated at run-time using dtc for example.
>>>
>>> So, actually, I think a whole bunch of problems with phandle
>>> resolution disappear if we don't try to define an overlay .dtb format,
>>> or at least treat it only as a very shortlived object. A more precise
>>> proposal below. Note that this works more or less equally well with
>>> either the original overlay approach or the graft/graft-bundle
>>> proposal I made elsewhere.
>>>
>>> 1) We annotate the base tree with some extra label information for
>>> nodes which overlays are likely to want to reference by phandle. e.g.
>>>
>>> beaglebone_pic: interrupt-controller@XXXXX {
>>> ...
>>> phandle,symbolic-name = "beaglebone_pic";
>>> };
>>>
>>> We could extend dtc to (optionally?) auto-generate those properties
>>> from its existing label syntax. Not sure if that's a good idea or
>>> not yet. In any case, we compile this augmented base tree to .dtb as
>>> normal and boot our kernel with it.
>>>
>>
>> I'm fine with that. You can auto-generate when there's a label to a node.
>> The cape dt fragment will use the label name to reference a node.
>> More details below...
>>
>>> 2) The information for the capes/modules/whatever is
>>> distributed/packaged as .dts, never .dtb. When userspace detects the
>>> new module (or the user explicitly tells it, if it's not probeable) it
>>> picks up the correct dts and runs it through dtc in a special mode.
>>> In this mode dtc takes the existing base tree (from /proc/device-tree,
>>> say) as well as the new dts. In this mode, dtc allocates phandles for
>>> the new tree fragment so as not to collide with anything from the
>>> supplied base tree (as well as avoiding internal conflicts,
>>> obviously). It also allows node references to the base tree by using
>>> those label annotations from (1) to match symbolic names to the
>>> phandle values in the base tree.
>>>
>>
>> Not good to rely on userspace kicking off dtc and compiling from source.
>> Some capes/expansion boards might have your root fs device, for example
>> there is an eMMC cape coming up, while networking capes are common too.
>
> So? dtc can go in an initramfs, just like mdadm or whatever other
> tools are there.
>

Embedded systems aren't servers. Having an initramfs is one more thing that
can break, or require people to modify their build systems.

>> However I have a compromise.
>>
>> I agree that compiling from source can be an option for a runtime definable
>> cape, but for built-in capes we could do a bit better.
>>
>> In particular, I don't see any particular need to have a DT fragment
>> reference anything that dependent of the runtime device tree. It should
>> be possible to compile the DT fragment in kernel, against the generated
>> flattened device tree, producing a flattened DT fragment with the phandles
>> already resolved.
>
> Um..? Sorry, I can't parse that paragraph.
>

No need for runtime resolution for common use cases.

>> So the sequence could be something like this:
>>
>> $ dtc -O dtb -o am335x-bone.dtb -b 0 am335x-bone.dts -@ ${LAST_PHANDLE_FILE}
>> $ dtc -O dtbf -R am335x-bone.dtb -o weather-cape.dtb -b 0 weather-cape.dts -@ ${LAST_PHANDLE_FILE}
>> $ dtc -O dtbf -R am335x-bone.dtb -o geiger-cape.dtb -b 0 geiger-cape.dts -@ ${LAST_PHANDLE_FILE}
>>
>> The ${LAST_PHANDLE_FILE} can be updated with the last phandle value generated.
>>
>> Alternatively we could have a way to statically assign a phandle range
>> for well known capes. All the others will have to use the runtime compile
>> mechanism.
>> $ dtc -O dtb -o am335x-bone.dtb -b 0 am335x-bone.dts
>> $ dtc -O dtbf -R am335x-bone.dtb -o weather-cape.dtb -b 0 weather-cape.dts
>> $ dtc -O dtbf -R am335x-bone.dtb -o geiger-cape.dtb -b 0 geiger-cape.dts
>>
>> With the cape dtses having a /phandle-range/ statement at the top.
>>
>> This can work because the cape dts do not cross-reference each other, and
>> neither the boot dts references the capes.
>>
>> That way we can use request_firmware() pretty early in the boot sequence
>> and get the DT fragment we need even before user-space starts and root fs
>> has mounted. request_firmware() can locate the fragments in the kernel
>> image before rootfs.
>>
>> I don't know if this will cover all the cases Grant has in mind though.
>>
>> So just to make sure I got it right, this could work for our case.
>>
>> i2c2: i2c@4819c000 {
>> compatible = "ti,omap4-i2c";
>> #address-cells = <1>;
>> #size-cells = <0>;
>> ti,hwmods = "i2c3";
>> reg = <0x4819c000 0x1000>;
>> interrupt-parent = <&intc>;
>> interrupts = <30>;
>> status = "disabled";
>> };
>>
>> And in the cape definition (when compiled with the special mode I describe
>> below)
>>
>> / {
>> plugin-bundle;
>> compatible = "cco,weather-cape";
>> version = <00A0>;
>>
>> i2c2-graft = {
>> compatible = <dt,graft>;
>> graft-point = <&i2c2>;
>>
>> #address-cells = <1>;
>> #size-cells = <0>;
>>
>> /* Ambient light sensor */
>> tsl2550@39 {
>> compatible = "tsl,tsl2550";
>> reg = <0x39>;
>> };
>> };
>> };
>>
>> DTC when compiling in the special fragment mode will pick up that
>> &i2c2 can not be resolved and lookup the phandle on the main dtb.
>> That way, even 'phandle,symbolic-name = "i2c2";' is redundant.
>
> Well, no, because I'm assuming dtc fragment mode only has access to
> the base dtb, not the base dts, so labels will be gone from it, unless
> we add properties to preserve them especially. That's what the
> symbolic-name thing is about.
>

They can be easily included, as the patch shows.

>>> 3) The resulting partial .dtb for the module is highly specific to the
>>> base tree (which if the base tree was generated at runtime by firmware
>>> could even be specific to a particular boot). But that's ok, because
>>> we just spit it into the kernel, absolute phandle values and all, then
>>> throw it away. Next time we need the module info, we recompile it
>>> again.
>>>
>>>> Of course, relying on .dts compatibility rather than .dtb compatibility
>>>> might negatively impact the complexity of an initrd environment if we
>>>> end up loading overlays from there...
>>>
>>> Well, it does mean we'd need dtc in the initrd. But dtc has no
>>> library dependencies except libc, so that really shouldn't be too
>>> bad. In return we entirely avoid inventing a new phandle resolution
>>> protocol.
>>
>> Not every board boots with initrd; most embedded boards don't use it
>> at all. This way we make initrd a hard requirement.
>
> Well, not really. You can use initramfs, or you can assemble all the
> necessary dt fragents for boot into a complete dtb included with the
> kernel. Doing that involves pretty much the same sorts of things you
> need to do to statically configure a kernel for boot without
> initramfs.
>

You can't assemble the dtb without runtime probing of what's out there.

> --
> David Gibson | I'll have my music baroque, and my code
> david AT gibson.dropbear.id.au | minimalist, thank you. NOT _the_ _other_
> | _way_ _around_!
> http://www.ozlabs.org/~dgibson

Anyway, here's a small patch that shows that it is possible to do both fixups
and symbol tracking using relatively unmodified DT syntax. The only thing
new is the /plugin/; statement.

Also included two dumps of generated dtbs as well as the plugin dts.

Should be relatively simple to come up with a kernel loader and linker using
something similar like this.

Regards

-- Pantelis

[-- Attachment #2: dtc-symbols-fixups-test.patch --]
[-- Type: application/octet-stream, Size: 8758 bytes --]

commit 874ee3c0dceaf2735ebb82b4ad117108b6d2125b
Author: Pantelis Antoniou <panto@antoniou-consulting.com>
Date: Wed Nov 14 23:40:59 2012 +0200

Implement fixups and symbols

Introduce symbols and a fixup nodes in the root tree.

diff --git a/checks.c b/checks.c
index ee96a25..b1b87ed 100644
--- a/checks.c
+++ b/checks.c
@@ -459,20 +459,73 @@ static void fixup_phandle_references(struct check *c, struct node *dt,
struct marker *m = prop->val.markers;
struct node *refnode;
cell_t phandle;
+ int has_phandle_refs;
+
+ has_phandle_refs = 0;
+ for_each_marker_of_type(m, REF_PHANDLE) {
+ has_phandle_refs = 1;
+ break;
+ }
+
+ if (!has_phandle_refs)
+ return;

for_each_marker_of_type(m, REF_PHANDLE) {
assert(m->offset + sizeof(cell_t) <= prop->val.len);

refnode = get_node_by_ref(dt, m->ref);
- if (! refnode) {
+ if (! refnode && !dt->is_plugin) {
FAIL(c, "Reference to non-existent node or label \"%s\"\n",
- m->ref);
+ m->ref);
continue;
}

- phandle = get_node_phandle(dt, refnode);
+ if (! refnode) {
+ struct fixup *f, **fp;
+ struct fixup_entry *fe, **fep;
+
+ /* allocate fixup entry */
+ fe = xmalloc(sizeof(*fe));
+
+ fe->node = node;
+ fe->prop = prop;
+ fe->offset = m->offset;
+ fe->next = NULL;
+
+ /* search for an already existing fixup */
+ for_each_fixup(dt, f)
+ if (strcmp(f->ref, m->ref) == 0)
+ break;
+
+ /* no fixup found, add new */
+ if (f == NULL) {
+ f = xmalloc(sizeof(*f));
+ f->ref = m->ref;
+ f->entries = NULL;
+ f->next = NULL;
+
+ /* add it to the tree */
+ fp = &dt->fixups;
+ while (*fp)
+ fp = &((*fp)->next);
+ *fp = f;
+ }
+
+ /* and now append fixup entry */
+ fep = &f->entries;
+ while (*fep)
+ fep = &((*fep)->next);
+ *fep = fe;
+
+ /* mark the entry as unresolved */
+ phandle = 0xdeadbeef;
+ } else {
+ phandle = get_node_phandle(dt, refnode);
+ }
+
*((cell_t *)(prop->val.val + m->offset)) = cpu_to_fdt32(phandle);
}
+
}
ERROR(phandle_references, NULL, NULL, fixup_phandle_references, NULL,
&duplicate_node_names, &explicit_phandles);
@@ -651,6 +704,42 @@ static void check_obsolete_chosen_interrupt_controller(struct check *c,
}
TREE_WARNING(obsolete_chosen_interrupt_controller, NULL);

+static void check_auto_label_phandles(struct check *c, struct node *dt,
+ struct node *node)
+{
+ struct label *l;
+ struct symbol *s, **sp;
+ int has_label;
+
+ has_label = 0;
+ for_each_label(node->labels, l) {
+ has_label = 1;
+ break;
+ }
+
+ if (!has_label)
+ return;
+
+ /* force allocation of a phandle for this node */
+ (void)get_node_phandle(dt, node);
+
+ /* add the symbol */
+ for_each_label(node->labels, l) {
+
+ s = xmalloc(sizeof(*s));
+ s->label = l;
+ s->node = node;
+ s->next = NULL;
+
+ /* add it to the symbols list */
+ sp = &dt->symbols;
+ while (*sp)
+ sp = &((*sp)->next);
+ *sp = s;
+ }
+}
+NODE_WARNING(auto_label_phandles, NULL);
+
static struct check *check_table[] = {
&duplicate_node_names, &duplicate_property_names,
&node_name_chars, &node_name_format, &property_name_chars,
@@ -669,6 +758,8 @@ static struct check *check_table[] = {
&avoid_default_addr_size,
&obsolete_chosen_interrupt_controller,

+ &auto_label_phandles,
+
&always_fail,
};

diff --git a/dtc-lexer.l b/dtc-lexer.l
index 254d5af..2cef406 100644
--- a/dtc-lexer.l
+++ b/dtc-lexer.l
@@ -112,6 +112,11 @@ static int pop_input_file(void);
return DT_V1;
}

+<*>"/plugin/" {
+ DPRINT("Keyword: /plugin/\n");
+ return DT_PLUGIN;
+ }
+
<*>"/memreserve/" {
DPRINT("Keyword: /memreserve/\n");
BEGIN_DEFAULT();
diff --git a/dtc-parser.y b/dtc-parser.y
index f412460..e444acf 100644
--- a/dtc-parser.y
+++ b/dtc-parser.y
@@ -20,6 +20,7 @@

%{
#include <stdio.h>
+#include <inttypes.h>

#include "dtc.h"
#include "srcpos.h"
@@ -56,9 +57,11 @@ static unsigned char eval_char_literal(const char *s);
struct node *nodelist;
struct reserve_info *re;
uint64_t integer;
+ int is_plugin;
}

%token DT_V1
+%token DT_PLUGIN
%token DT_MEMRESERVE
%token DT_LSHIFT DT_RSHIFT DT_LE DT_GE DT_EQ DT_NE DT_AND DT_OR
%token DT_BITS
@@ -76,6 +79,7 @@ static unsigned char eval_char_literal(const char *s);

%type propdata
%type propdataprefix
+%type <is_plugin> plugindecl
%type <re> memreserve
%type <re> memreserves
%type <array> arrayprefix
@@ -106,10 +110,23 @@ static unsigned char eval_char_literal(const char *s);
%%

sourcefile:
- DT_V1 ';' memreserves devicetree
+ DT_V1 ';' plugindecl memreserves devicetree
{
- the_boot_info = build_boot_info($3, $4,
- guess_boot_cpuid($4));
+ $5->is_plugin = $3;
+ $5->is_root = 1;
+ the_boot_info = build_boot_info($4, $5,
+ guess_boot_cpuid($5));
+ }
+ ;
+
+plugindecl:
+ /* empty */
+ {
+ $$ = 0;
+ }
+ | DT_PLUGIN ';'
+ {
+ $$ = 1;
}
;

diff --git a/dtc.h b/dtc.h
index 3e42a07..2659142 100644
--- a/dtc.h
+++ b/dtc.h
@@ -133,6 +133,25 @@ struct label {
struct label *next;
};

+struct fixup_entry {
+ int offset;
+ struct node *node;
+ struct property *prop;
+ struct fixup_entry *next;
+};
+
+struct fixup {
+ char *ref;
+ struct fixup_entry *entries;
+ struct fixup *next;
+};
+
+struct symbol {
+ struct label *label;
+ struct node *node;
+ struct symbol *next;
+};
+
struct property {
int deleted;
char *name;
@@ -159,6 +178,11 @@ struct node {
int addr_cells, size_cells;

struct label *labels;
+
+ int is_root;
+ int is_plugin;
+ struct fixup *fixups;
+ struct symbol *symbols;
};

#define for_each_label_withdel(l0, l) \
@@ -182,6 +206,15 @@ struct node {
for_each_child_withdel(n, c) \
if (!(c)->deleted)

+#define for_each_fixup(n, f) \
+ for ((f) = (n)->fixups; (f); (f) = (f)->next)
+
+#define for_each_fixup_entry(f, fe) \
+ for ((fe) = (f)->entries; (fe); (fe) = (fe)->next)
+
+#define for_each_symbol(n, s) \
+ for ((s) = (n)->symbols; (s); (s) = (s)->next)
+
void add_label(struct label **labels, char *label);
void delete_labels(struct label **labels);

diff --git a/fdtdump.c b/fdtdump.c
index 207a46d..d4fa6d7 100644
--- a/fdtdump.c
+++ b/fdtdump.c
@@ -21,13 +21,23 @@ static void print_data(const char *data, int len)
{
int i;
const char *p = data;
+ const char *s;

/* no data, don't print */
if (len == 0)
return;

if (util_is_printable_string(data, len)) {
- printf(" = \"%s\"", (const char *)data);
+ printf(" = ");
+
+ s = data;
+ do {
+ printf("\"%s\"", s);
+ s += strlen(s) + 1;
+ if (s < data + len)
+ printf(", ");
+ } while (s < data + len);
+
} else if ((len % 4) == 0) {
printf(" = <");
for (i = 0; i < len; i += 4)
diff --git a/flattree.c b/flattree.c
index 665dad7..f250672 100644
--- a/flattree.c
+++ b/flattree.c
@@ -310,6 +310,81 @@ static void flatten_tree(struct node *tree, struct emitter *emit,
flatten_tree(child, emit, etarget, strbuf, vi);
}

+ /* add the symbol nodes */
+ if (tree->is_root) {
+ struct symbol *s;
+ int nameoff, vallen;
+
+ emit->beginnode(etarget, NULL);
+ emit->string(etarget, "@symbols@", 0);
+ emit->align(etarget, sizeof(cell_t));
+
+ for_each_symbol(tree, s) {
+
+ vallen = strlen(s->node->fullpath);
+
+ nameoff = stringtable_insert(strbuf, s->label->label);
+
+ emit->property(etarget, NULL);
+ emit->cell(etarget, vallen + 1);
+ emit->cell(etarget, nameoff);
+
+ if ((vi->flags & FTF_VARALIGN) && vallen >= 8)
+ emit->align(etarget, 8);
+
+ emit->string(etarget, s->node->fullpath, strlen(s->node->fullpath));
+ emit->align(etarget, sizeof(cell_t));
+ }
+
+ emit->endnode(etarget, NULL);
+ }
+
+ /* add the fixup nodes */
+ if (tree->is_root && tree->is_plugin) {
+ struct fixup *f;
+ struct fixup_entry *fe;
+ char *name, *s;
+ int namesz, nameoff, vallen;
+
+ emit->beginnode(etarget, NULL);
+ emit->string(etarget, "@fixups@", 0);
+ emit->align(etarget, sizeof(cell_t));
+
+ for_each_fixup(tree, f) {
+
+ namesz = 0;
+ for_each_fixup_entry(f, fe)
+ namesz += strlen(fe->node->fullpath) + 1 +
+ strlen(fe->prop->name) + 1 + 32;
+
+ name = xmalloc(namesz);
+
+ s = name;
+ for_each_fixup_entry(f, fe) {
+ snprintf(s, name + namesz - s, "%s:%s:%d",
+ fe->node->fullpath, fe->prop->name, fe->offset);
+ s += strlen(s) + 1;
+ }
+
+ nameoff = stringtable_insert(strbuf, f->ref);
+ vallen = s - name;
+
+ emit->property(etarget, NULL);
+ emit->cell(etarget, vallen);
+ emit->cell(etarget, nameoff);
+
+ if ((vi->flags & FTF_VARALIGN) && vallen >= 8)
+ emit->align(etarget, 8);
+
+ emit->string(etarget, name, vallen);
+ emit->align(etarget, sizeof(cell_t));
+
+ free(name);
+ }
+
+ emit->endnode(etarget, tree->labels);
+ }
+
emit->endnode(etarget, tree->labels);
}

[-- Attachment #3: geiger-cape.fdtdump --]
[-- Type: application/octet-stream, Size: 1914 bytes --]

/dts-v1/;
// magic: 0xd00dfeed
// totalsize: 0x577 (1399)
// off_dt_struct: 0x38
// off_dt_strings: 0x440
// off_mem_rsvmap: 0x28
// version: 17
// last_comp_version: 16
// boot_cpuid_phys: 0x0
// size_dt_strings: 0x137
// size_dt_struct: 0x408

/ {
compatible = "bone-geiger-cape";
board-name = "Geiger Cape";
version = "00A0", "00A1", "00A2";
pinctrl-names = "default";
pinctrl-0 = <0xdeadbeef>;
pwms = <0xdeadbeef 0x00000000 0x0007a120 0x00000000>;
pwm-names = "bone-geiger-cape";
pwm-frequency = <0x00004e20>;
pwm-duty-cycle = <0x0000003c>;
event-blink-delay = <0x0000001e>;
gpios = <0xdeadbeef 0x00000011 0x00000000>;
vsense-name = "AIN5";
vsense-scale = <0x000091cd>;
tscadc {
compatible = "ti-tscadc-dt";
ti,hwmods = "adc_tsc";
adc-channels = <0x00000008>;
linux,phandle = <0x00000001>;
phandle = <0x00000001>;
};
gpio-leds {
compatible = "gpio-leds";
pinctrl-names = "default";
pinctrl-0 = <0xdeadbeef>;
linux,phandle = <0x00000002>;
phandle = <0x00000002>;
geiger-led0 {
label = "geiger:green:usr0";
gpios = <0xdeadbeef 0x00000017 0x00000000>;
linux,default-trigger = "geiger-run";
default-state = "off";
};
geiger-led1 {
label = "geiger:red:usr1";
gpios = <0xdeadbeef 0x00000019 0x00000000>;
linux,default-trigger = "geiger-event";
default-state = "off";
};
};
@fixups@ {
bone_geiger_cape_pins = "/:pinctrl-0:0";
ehrpwm1 = "/:pwms:0";
gpio4 = "/:gpios:0";
bone_geiger_cape_led_pins = "/gpio-leds:pinctrl-0:0";
gpio3 = "/gpio-leds/geiger-led0:gpios:0", "/gpio-leds/geiger-led1:gpios:0";
};
@symbols@ {
tscadc = "/tscadc";
gpioleds1 = "/gpio-leds";
};
};

[-- Attachment #4: geiger-cape.dts --]
[-- Type: application/octet-stream, Size: 1342 bytes --]

/*
* Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
/dts-v1/;
/plugin/;

/ {
compatible = "bone-geiger-cape";

board-name = "Geiger Cape";
version = "00A0", "00A1", "00A2";

/* note that these can't be versioned... */
pinctrl-names = "default";
pinctrl-0 = <&bone_geiger_cape_pins>;

pwms = <&ehrpwm1 0 500000 0>;
pwm-names = "bone-geiger-cape";

pwm-frequency = <20000>; /* 20KHz */
pwm-duty-cycle = <60>; /* 60% */

event-blink-delay = <30>; /* 30ms */

gpios = <&gpio4 17 0>; /* pulse */

vsense-name = "AIN5"; /* analog vsense */
vsense-scale = <37325>; /* scaling */

tscadc: tscadc {
compatible = "ti-tscadc-dt";

ti,hwmods = "adc_tsc";

adc-channels = <8>;
};

gpioleds1: gpio-leds {
compatible = "gpio-leds";
pinctrl-names = "default";
pinctrl-0 = <&bone_geiger_cape_led_pins>;

geiger-led0 {
label = "geiger:green:usr0";
gpios = <&gpio3 23 0>;
linux,default-trigger = "geiger-run";
default-state = "off";
};

geiger-led1 {
label = "geiger:red:usr1";
gpios = <&gpio3 25 0>;
linux,default-trigger = "geiger-event";
default-state = "off";
};
};

};

[-- Attachment #5: am335x-bone.fdtdump --]
[-- Type: application/octet-stream, Size: 46791 bytes --]

/dts-v1/;
// magic: 0xd00dfeed
// totalsize: 0x5de6 (24038)
// off_dt_struct: 0x38
// off_dt_strings: 0x546c
// off_mem_rsvmap: 0x28
// version: 17
// last_comp_version: 16
// boot_cpuid_phys: 0x0
// size_dt_strings: 0x97a
// size_dt_struct: 0x5434

/ {
#address-cells = <0x00000001>;
#size-cells = <0x00000001>;
compatible = "ti,am335x-bone", "ti,am33xx";
model = "TI AM335x BeagleBone";
chosen {
};
aliases {
serial0 = "/ocp/serial@44e09000";
serial1 = "/ocp/serial@48022000";
serial2 = "/ocp/serial@48024000";
serial3 = "/ocp/serial@481a6000";
serial4 = "/ocp/serial@481a8000";
serial5 = "/ocp/serial@481aa000";
};
memory {
device_type = "memory";
reg = <0x80000000 0x10000000>;
};
cpus {
cpu@0 {
compatible = "arm,cortex-a8";
operating-points = <0x000afc80 0x00139b88 0x000927c0 0x0012b128 0x0007a120 0x00112a88 0x00043238 0x00112a88>;
voltage-tolerance = <0x00000002>;
clock-latency = <0x000493e0>;
cpu0-supply = <0x00000001>;
};
};
soc {
compatible = "ti,omap-infra";
mpu {
compatible = "ti,omap3-mpu";
ti,hwmods = "mpu";
};
};
pinmux@44e10800 {
compatible = "pinctrl-single";
reg = <0x44e10800 0x00000238>;
#address-cells = <0x00000001>;
#size-cells = <0x00000000>;
pinctrl-single,register-width = <0x00000020>;
pinctrl-single,function-mask = <0x0000007f>;
linux,phandle = <0x00000022>;
phandle = <0x00000022>;
pinmux_spi1_pins {
pinctrl-single,pins = <0x00000190 0x00000013 0x00000194 0x00000033 0x00000198 0x00000013 0x0000019c 0x00000013>;
linux,phandle = <0x00000008>;
phandle = <0x00000008>;
};
pinmux_lcd_pins {
pinctrl-single,pins = <0x000001a4 0x00000017 0x000001ac 0x00000017>;
linux,phandle = <0x00000021>;
phandle = <0x00000021>;
};
pinmux_gpevt_pins {
pinctrl-single,pins = <0x00000090 0x00000037>;
linux,phandle = <0x0000000b>;
phandle = <0x0000000b>;
};
pinmux_userled_pins {
pinctrl-single,pins = <0x00000054 0x00000007 0x00000058 0x00000017 0x0000005c 0x00000007 0x00000060 0x00000017>;
linux,phandle = <0x00000009>;
phandle = <0x00000009>;
};
pinmux_i2c2_pins {
pinctrl-single,pins = <0x00000178 0x00000073 0x0000017c 0x00000073>;
linux,phandle = <0x00000003>;
phandle = <0x00000003>;
};
pinmux_bone_dvi_cape_led_pins {
pinctrl-single,pins = <0x00000048 0x00000007 0x0000004c 0x00000007>;
linux,phandle = <0x00000013>;
phandle = <0x00000013>;
};
pinmux_bone_dvi_cape_dvi_00A0_pins {
pinctrl-single,pins = <0x0000001c 0x00000007 0x000000a0 0x00000008 0x000000a4 0x00000008 0x000000a8 0x00000008 0x000000ac 0x00000008 0x000000b0 0x00000008 0x000000b4 0x00000008 0x000000b8 0x00000008 0x000000bc 0x00000008 0x000000c0 0x00000008 0x000000c4 0x00000008 0x000000c8 0x00000008 0x000000cc 0x00000008 0x000000d0 0x00000008 0x000000d4 0x00000008 0x000000d8 0x00000008 0x000000dc 0x00000008 0x000000e0 0x00000000 0x000000e4 0x00000000 0x000000e8 0x00000000 0x000000ec 0x00000000>;
linux,phandle = <0x00000011>;
phandle = <0x00000011>;
};
pinmux_bone_dvi_cape_dvi_00A1_pins {
pinctrl-single,pins = <0x00000084 0x00000007 0x000000a0 0x00000008 0x000000a4 0x00000008 0x000000a8 0x00000008 0x000000ac 0x00000008 0x000000b0 0x00000008 0x000000b4 0x00000008 0x000000b8 0x00000008 0x000000bc 0x00000008 0x000000c0 0x00000008 0x000000c4 0x00000008 0x000000c8 0x00000008 0x000000cc 0x00000008 0x000000d0 0x00000008 0x000000d4 0x00000008 0x000000d8 0x00000008 0x000000dc 0x00000008 0x000000e0 0x00000000 0x000000e4 0x00000000 0x000000e8 0x00000000 0x000000ec 0x00000000>;
linux,phandle = <0x00000012>;
phandle = <0x00000012>;
};
pinmux_bone_geiger_cape_led_pins {
pinctrl-single,pins = <0x000000e4 0x00000007 0x000000ec 0x00000007>;
linux,phandle = <0x00000017>;
phandle = <0x00000017>;
};
pinmux_bone_geiger_cape_pins {
pinctrl-single,pins = <0x00000048 0x00000006 0x0000019c 0x00000037>;
linux,phandle = <0x00000014>;
phandle = <0x00000014>;
};
pinmux_bone_lcd3_cape_led_00A0_pins {
pinctrl-single,pins = <0x00000048 0x00000007 0x0000004c 0x00000007>;
linux,phandle = <0x0000001a>;
phandle = <0x0000001a>;
};
pinmux_bone_lcd3_cape_lcd_pins {
pinctrl-single,pins = <0x000000a0 0x00000008 0x000000a4 0x00000008 0x000000a8 0x00000008 0x000000ac 0x00000008 0x000000b0 0x00000008 0x000000b4 0x00000008 0x000000b8 0x00000008 0x000000bc 0x00000008 0x000000c0 0x00000008 0x000000c4 0x00000008 0x000000c8 0x00000008 0x000000cc 0x00000008 0x000000d0 0x00000008 0x000000d4 0x00000008 0x000000d8 0x00000008 0x000000dc 0x00000008 0x000000e0 0x00000000 0x000000e4 0x00000000 0x000000e8 0x00000000 0x000000ec 0x00000000>;
linux,phandle = <0x00000018>;
phandle = <0x00000018>;
};
pinmux_bone_lcd3_cape_keys_00A0_pins {
pinctrl-single,pins = <0x00000040 0x0000002f 0x00000044 0x0000002f 0x000001a4 0x0000002f 0x00000078 0x0000002f 0x00000164 0x0000002f>;
linux,phandle = <0x0000001b>;
phandle = <0x0000001b>;
};
pinmux_pwm_bl_pins {
pinctrl-single,pins = <0x0000004c 0x00000006>;
linux,phandle = <0x0000001f>;
phandle = <0x0000001f>;
};
pinmux_weather_cape_w1_pins {
pinctrl-single,pins = <0x0000000c 0x00000037>;
linux,phandle = <0x0000001e>;
phandle = <0x0000001e>;
};
};
ocp {
compatible = "simple-bus";
#address-cells = <0x00000001>;
#size-cells = <0x00000001>;
ranges;
ti,hwmods = "l3_main";
interrupt-controller@48200000 {
compatible = "ti,omap2-intc";
interrupt-controller;
#interrupt-cells = <0x00000001>;
ti,intc-size = <0x00000080>;
reg = <0x48200000 0x00001000>;
linux,phandle = <0x00000002>;
phandle = <0x00000002>;
};
edma@49000000 {
compatible = "ti,edma3";
ti,hwmods = "tpcc", "tptc0", "tptc1", "tptc2";
reg = <0x49000000 0x00010000 0x44e10f90 0x00000010>;
interrupt-parent = <0x00000002>;
interrupts = <0x0000000c 0x0000000d 0x0000000e>;
#dma-cells = <0x00000001>;
dma-channels = <0x00000040>;
ti,edma-regions = <0x00000004>;
ti,edma-slots = <0x00000100>;
ti,edma-reserved-channels = <0x00000000 0x00000002 0x0000000e 0x00000002 0x0000001a 0x00000006 0x00000030 0x00000004 0x00000038 0x00000008>;
ti,edma-reserved-slots = <0x00000000 0x00000002 0x0000000e 0x00000002 0x0000001a 0x00000006 0x00000030 0x00000004 0x00000038 0x00000008 0x00000040 0x0000007f>;
ti,edma-queue-tc-map = <0x00000000 0x00000000 0x00000001 0x00000001 0x00000002 0x00000002>;
ti,edma-queue-priority-map = <0x00000000 0x00000000 0x00000001 0x00000001 0x00000002 0x00000002>;
ti,edma-default-queue = <0x00000000>;
ti,edma-xbar-event-map = <0x00000020 0x0000000c>;
linux,phandle = <0x00000004>;
phandle = <0x00000004>;
};
gpio@44e07000 {
compatible = "ti,omap4-gpio";
ti,hwmods = "gpio1";
gpio-controller;
#gpio-cells = <0x00000002>;
interrupt-controller;
#interrupt-cells = <0x00000001>;
reg = <0x44e07000 0x00001000>;
interrupt-parent = <0x00000002>;
interrupts = <0x00000060>;
linux,phandle = <0x0000001c>;
phandle = <0x0000001c>;
};
gpio@4804c000 {
compatible = "ti,omap4-gpio";
ti,hwmods = "gpio2";
gpio-controller;
#gpio-cells = <0x00000002>;
interrupt-controller;
#interrupt-cells = <0x00000001>;
reg = <0x4804c000 0x00001000>;
interrupt-parent = <0x00000002>;
interrupts = <0x00000062>;
linux,phandle = <0x0000000a>;
phandle = <0x0000000a>;
};
gpio@481ac000 {
compatible = "ti,omap4-gpio";
ti,hwmods = "gpio3";
gpio-controller;
#gpio-cells = <0x00000002>;
interrupt-controller;
#interrupt-cells = <0x00000001>;
reg = <0x481ac000 0x00001000>;
interrupt-parent = <0x00000002>;
interrupts = <0x00000020>;
linux,phandle = <0x0000000c>;
phandle = <0x0000000c>;
};
gpio@481ae000 {
compatible = "ti,omap4-gpio";
ti,hwmods = "gpio4";
gpio-controller;
#gpio-cells = <0x00000002>;
interrupt-controller;
#interrupt-cells = <0x00000001>;
reg = <0x481ae000 0x00001000>;
interrupt-parent = <0x00000002>;
interrupts = <0x0000003e>;
linux,phandle = <0x00000016>;
phandle = <0x00000016>;
};
serial@44e09000 {
compatible = "ti,omap3-uart";
ti,hwmods = "uart1";
clock-frequency = <0x02dc6c00>;
reg = <0x44e09000 0x00002000>;
interrupt-parent = <0x00000002>;
interrupts = <0x00000048>;
status = "okay";
linux,phandle = <0x00000023>;
phandle = <0x00000023>;
};
serial@48022000 {
compatible = "ti,omap3-uart";
ti,hwmods = "uart2";
clock-frequency = <0x02dc6c00>;
reg = <0x48022000 0x00002000>;
interrupt-parent = <0x00000002>;
interrupts = <0x00000049>;
status = "disabled";
linux,phandle = <0x00000024>;
phandle = <0x00000024>;
};
serial@48024000 {
compatible = "ti,omap3-uart";
ti,hwmods = "uart3";
clock-frequency = <0x02dc6c00>;
reg = <0x48024000 0x00002000>;
interrupt-parent = <0x00000002>;
interrupts = <0x0000004a>;
status = "disabled";
linux,phandle = <0x00000025>;
phandle = <0x00000025>;
};
serial@481a6000 {
compatible = "ti,omap3-uart";
ti,hwmods = "uart4";
clock-frequency = <0x02dc6c00>;
reg = <0x481a6000 0x00002000>;
interrupt-parent = <0x00000002>;
interrupts = <0x0000002c>;
status = "disabled";
linux,phandle = <0x00000026>;
phandle = <0x00000026>;
};
serial@481a8000 {
compatible = "ti,omap3-uart";
ti,hwmods = "uart5";
clock-frequency = <0x02dc6c00>;
reg = <0x481a8000 0x00002000>;
interrupt-parent = <0x00000002>;
interrupts = <0x0000002d>;
status = "disabled";
linux,phandle = <0x00000027>;
phandle = <0x00000027>;
};
serial@481aa000 {
compatible = "ti,omap3-uart";
ti,hwmods = "uart6";
clock-frequency = <0x02dc6c00>;
reg = <0x481aa000 0x00002000>;
interrupt-parent = <0x00000002>;
interrupts = <0x0000002e>;
status = "disabled";
linux,phandle = <0x00000028>;
phandle = <0x00000028>;
};
i2c@44e0b000 {
compatible = "ti,omap4-i2c";
#address-cells = <0x00000001>;
#size-cells = <0x00000000>;
ti,hwmods = "i2c1";
reg = <0x44e0b000 0x00001000>;
interrupt-parent = <0x00000002>;
interrupts = <0x00000046>;
status = "okay";
clock-frequency = <0x00061a80>;
linux,phandle = <0x00000029>;
phandle = <0x00000029>;
tps@24 {
reg = <0x00000024>;
compatible = "ti,tps65217";
linux,phandle = <0x00000019>;
phandle = <0x00000019>;
regulators {
#address-cells = <0x00000001>;
#size-cells = <0x00000000>;
regulator@0 {
reg = <0x00000000>;
regulator-compatible = "dcdc1";
regulator-always-on;
linux,phandle = <0x0000002a>;
phandle = <0x0000002a>;
};
regulator@1 {
reg = <0x00000001>;
regulator-compatible = "dcdc2";
regulator-name = "vdd_mpu";
regulator-min-microvolt = <0x000e1d48>;
regulator-max-microvolt = <0x001437c8>;
regulator-boot-on;
regulator-always-on;
linux,phandle = <0x00000001>;
phandle = <0x00000001>;
};
regulator@2 {
reg = <0x00000002>;
regulator-compatible = "dcdc3";
regulator-name = "vdd_core";
regulator-min-microvolt = <0x000e1d48>;
regulator-max-microvolt = <0x00118c30>;
regulator-boot-on;
regulator-always-on;
linux,phandle = <0x0000002b>;
phandle = <0x0000002b>;
};
regulator@3 {
reg = <0x00000003>;
regulator-compatible = "ldo1";
regulator-always-on;
linux,phandle = <0x0000002c>;
phandle = <0x0000002c>;
};
regulator@4 {
reg = <0x00000004>;
regulator-compatible = "ldo2";
regulator-always-on;
linux,phandle = <0x0000002d>;
phandle = <0x0000002d>;
};
regulator@5 {
reg = <0x00000005>;
regulator-compatible = "ldo3";
regulator-min-microvolt = <0x001b7740>;
regulator-max-microvolt = <0x00325aa0>;
regulator-always-on;
linux,phandle = <0x00000005>;
phandle = <0x00000005>;
};
regulator@6 {
reg = <0x00000006>;
regulator-compatible = "ldo4";
regulator-always-on;
linux,phandle = <0x0000002e>;
phandle = <0x0000002e>;
};
};
};
baseboard_eeprom@50 {
compatible = "at,24c256";
reg = <0x00000050>;
linux,phandle = <0x0000002f>;
phandle = <0x0000002f>;
};
};
i2c@4802a000 {
compatible = "ti,omap4-i2c";
#address-cells = <0x00000001>;
#size-cells = <0x00000000>;
ti,hwmods = "i2c2";
reg = <0x4802a000 0x00001000>;
interrupt-parent = <0x00000002>;
interrupts = <0x00000047>;
status = "disabled";
linux,phandle = <0x00000030>;
phandle = <0x00000030>;
};
i2c@4819c000 {
compatible = "ti,omap4-i2c";
#address-cells = <0x00000001>;
#size-cells = <0x00000000>;
ti,hwmods = "i2c3";
reg = <0x4819c000 0x00001000>;
interrupt-parent = <0x00000002>;
interrupts = <0x0000001e>;
status = "okay";
pinctrl-names = "default";
pinctrl-0 = <0x00000003>;
clock-frequency = <0x000186a0>;
linux,phandle = <0x0000001d>;
phandle = <0x0000001d>;
cape_eeprom_0@54 {
compatible = "at,24c256";
reg = <0x00000054>;
linux,phandle = <0x0000000d>;
phandle = <0x0000000d>;
};
cape_eeprom_1@55 {
compatible = "at,24c256";
reg = <0x00000055>;
linux,phandle = <0x0000000e>;
phandle = <0x0000000e>;
};
cape_eeprom_2@56 {
compatible = "at,24c256";
reg = <0x00000056>;
linux,phandle = <0x0000000f>;
phandle = <0x0000000f>;
};
cape_eeprom_3@57 {
compatible = "at,24c256";
reg = <0x00000057>;
linux,phandle = <0x00000010>;
phandle = <0x00000010>;
};
};
mmc@48060000 {
compatible = "ti,omap3-hsmmc";
ti,hwmods = "mmc1";
ti,dual-volt;
ti,needs-special-reset;
ti,needs-special-hs-handling;
dmas = <0x00000004 0x00000018 0x00000004 0x00000019>;
dma-names = "tx", "rx";
vmmc-supply = <0x00000005>;
linux,phandle = <0x00000031>;
phandle = <0x00000031>;
};
mmc@481d8000 {
compatible = "ti,omap3-hsmmc";
ti,hwmods = "mmc2";
ti,needs-special-reset;
ti,needs-special-hs-handling;
dmas = <0x00000004 0x00000002 0x00000004 0x00000003>;
dma-names = "tx", "rx";
status = "disabled";
vmmc-supply = <0x00000005>;
bus-width = <0x00000004>;
ti,non-removable;
linux,phandle = <0x00000032>;
phandle = <0x00000032>;
};
mmc@47810000 {
compatible = "ti,omap3-hsmmc";
ti,hwmods = "mmc3";
ti,needs-special-reset;
ti,needs-special-hs-handling;
status = "disabled";
linux,phandle = <0x00000033>;
phandle = <0x00000033>;
};
phy0 {
compatible = "nop-xceiv-usb";
linux,phandle = <0x00000006>;
phandle = <0x00000006>;
};
phy1 {
compatible = "nop-xceiv-usb";
linux,phandle = <0x00000007>;
phandle = <0x00000007>;
};
usb_otg_hs {
compatible = "ti,musb-am33xx";
ti,hwmods = "usb_otg_hs";
multipoint = <0x00000001>;
num-eps = <0x00000010>;
ram-bits = <0x0000000c>;
port0-mode = <0x00000003>;
port1-mode = <0x00000001>;
power = <0x000000fa>;
usb0-phy = <0x00000006>;
usb1-phy = <0x00000007>;
linux,phandle = <0x00000034>;
phandle = <0x00000034>;
};
rtc {
compatible = "ti,da830-rtc";
ti,hwmods = "rtc";
};
spi@48030000 {
compatible = "ti,omap4-mcspi";
ti,hwmods = "spi0";
#address-cells = <0x00000001>;
#size-cells = <0x00000000>;
reg = <0x48030000 0x00000400>;
interrupt-parent = <0x00000002>;
interrupt = <0x00000041>;
dmas = <0x00000004 0x00000010 0x00000004 0x00000011 0x00000004 0x00000012 0x00000004 0x00000013>;
dma-names = "tx0", "rx0", "tx1", "rx1";
ti,spi-num-cs = <0x00000002>;
status = "disabled";
linux,phandle = <0x00000035>;
phandle = <0x00000035>;
};
spi@481a0000 {
compatible = "ti,omap4-mcspi";
ti,hwmods = "spi1";
#address-cells = <0x00000001>;
#size-cells = <0x00000000>;
reg = <0x481a0000 0x00000400>;
interrupt-parent = <0x00000002>;
interrupt = <0x0000007d>;
dmas = <0x00000004 0x0000002a 0x00000004 0x0000002b 0x00000004 0x0000002c 0x00000004 0x0000002d>;
dma-names = "tx0", "rx0", "tx1", "rx1";
ti,spi-num-cs = <0x00000002>;
status = "disabled";
pinctrl-names = "default";
pinctrl-0 = <0x00000008>;
linux,phandle = <0x00000020>;
phandle = <0x00000020>;
};
wdt@44e35000 {
compatible = "ti,omap3-wdt";
ti,hwmods = "wd_timer2";
reg = <0x44e35000 0x00001000>;
interrupt-parent = <0x00000002>;
interrupts = <0x0000005b>;
linux,phandle = <0x00000036>;
phandle = <0x00000036>;
};
ethernet@4A100000 {
compatible = "ti,cpsw";
ti,hwmods = "cpgmac0";
cpdma_channels = <0x00000008>;
host_port_no = <0x00000000>;
cpdma_reg_ofs = <0x00000800>;
cpdma_sram_ofs = <0x00000a00>;
ale_reg_ofs = <0x00000d00>;
ale_entries = <0x00000400>;
host_port_reg_ofs = <0x00000108>;
hw_stats_reg_ofs = <0x00000900>;
bd_ram_ofs = <0x00002000>;
bd_ram_size = <0x00002000>;
no_bd_ram = <0x00000000>;
rx_descs = <0x00000040>;
mac_control = <0x00000020>;
slaves = <0x00000002>;
reg = <0x4a100000 0x00000800 0x4a101200 0x00000100 0x4a101000 0x00000100>;
#address-cells = <0x00000001>;
#size-cells = <0x00000001>;
interrupt-parent = <0x00000002>;
interrupts = <0x00000028 0x00000029 0x0000002a 0x0000002b>;
ranges;
linux,phandle = <0x00000037>;
phandle = <0x00000037>;
slave@0 {
slave_reg_ofs = <0x00000208>;
sliver_reg_ofs = <0x00000d80>;
mac-address = [00 00 00 00 00 00];
phy_id = "4a101000.mdio:00";
linux,phandle = <0x00000038>;
phandle = <0x00000038>;
};
slave@1 {
slave_reg_ofs = <0x00000308>;
sliver_reg_ofs = <0x00000dc0>;
mac-address = [00 00 00 00 00 00];
phy_id = "4a101000.mdio:01";
linux,phandle = <0x00000039>;
phandle = <0x00000039>;
};
mdio@4a101000 {
compatible = "ti,davinci_mdio";
#address-cells = <0x00000001>;
#size-cells = <0x00000000>;
ti,hwmods = "davinci_mdio";
bus_freq = <0x000f4240>;
reg = <0x4a101000 0x00000100>;
linux,phandle = <0x0000003a>;
phandle = <0x0000003a>;
};
};
ehrpwm@48300200 {
compatible = "ti,omap2-ehrpwm";
reg = <0x48300200 0x00000100 0x48300000 0x00000010>;
interrupt-parent = <0x00000002>;
interrupt = <0x00000056 0x0000003a>;
ti,hwmods = "ehrpwm0";
#pwm-cells = <0x00000003>;
status = "disabled";
linux,phandle = <0x0000003b>;
phandle = <0x0000003b>;
};
ehrpwm@48302200 {
compatible = "ti,omap2-ehrpwm";
reg = <0x48302200 0x00000100 0x48302000 0x00000010>;
interrupt-parent = <0x00000002>;
interrupt = <0x00000057 0x0000003b>;
ti,hwmods = "ehrpwm1";
#pwm-cells = <0x00000003>;
status = "okay";
linux,phandle = <0x00000015>;
phandle = <0x00000015>;
};
ehrpwm@48304200 {
compatible = "ti,omap2-ehrpwm";
reg = <0x48304200 0x00000100 0x48304000 0x00000010>;
interrupt-parent = <0x00000002>;
interrupt = <0x00000027 0x0000003c>;
ti,hwmods = "ehrpwm2";
#pwm-cells = <0x00000003>;
status = "disabled";
linux,phandle = <0x0000003c>;
phandle = <0x0000003c>;
};
ecap@48300100 {
compatible = "ti,omap2-ecap";
reg = <0x48300100 0x00000080 0x48300000 0x00000010>;
interrupt-parent = <0x00000002>;
interrupt = <0x0000001f>;
ti,hwmods = "ecap0";
#pwm-cells = <0x00000003>;
status = "disabled";
linux,phandle = <0x0000003d>;
phandle = <0x0000003d>;
};
ecap@48302100 {
compatible = "ti,omap2-ecap";
reg = <0x48302100 0x00000080 0x48302000 0x00000010>;
interrupt-parent = <0x00000002>;
interrupt = <0x0000002f>;
ti,hwmods = "ecap1";
#pwm-cells = <0x00000003>;
status = "disabled";
linux,phandle = <0x0000003e>;
phandle = <0x0000003e>;
};
ecap@48304100 {
compatible = "ti,omap2-ecap";
reg = <0x48304100 0x00000080 0x48304000 0x00000010>;
interrupt-parent = <0x00000002>;
interrupt = <0x0000003d>;
ti,hwmods = "ecap2";
#pwm-cells = <0x00000003>;
status = "disabled";
linux,phandle = <0x0000003f>;
phandle = <0x0000003f>;
};
gpio-leds {
compatible = "gpio-leds";
pinctrl-names = "default";
pinctrl-0 = <0x00000009>;
led0 {
label = "beaglebone:green:usr0";
gpios = <0x0000000a 0x00000015 0x00000000>;
linux,default-trigger = "heartbeat";
default-state = "off";
};
led1 {
label = "beaglebone:green:usr1";
gpios = <0x0000000a 0x00000016 0x00000000>;
linux,default-trigger = "mmc0";
default-state = "off";
};
led2 {
label = "beaglebone:green:usr2";
gpios = <0x0000000a 0x00000017 0x00000000>;
linux,default-trigger = "cpu0";
default-state = "off";
};
led3 {
label = "beaglebone:green:usr3";
gpios = <0x0000000a 0x00000018 0x00000000>;
default-state = "off";
linux,default-trigger = "mmc1";
};
};
gpevt {
compatible = "gpevt";
pinctrl-names = "default";
pinctrl-0 = <0x0000000b>;
dmas = <0x00000004 0x0000000c>;
dma-names = "gpioevt";
gpio-evt = <0x0000000c 0x00000002 0x00000000>;
};
};
capebus@0 {
compatible = "bone-capebus";
slots = <0x0000000d 0x0000000e 0x0000000f 0x00000010>;
linux,phandle = <0x00000040>;
phandle = <0x00000040>;
cape@0 {
compatible = "bone-generic-cape";
board-name = "BeagleBone DVI-D CAPE";
linux,phandle = <0x00000041>;
phandle = <0x00000041>;
version@00A0 {
version = "00A0";
dvi {
compatible = "da8xx-dt";
pinctrl-names = "default";
pinctrl-0 = <0x00000011>;
ti,hwmods = "lcdc";
disp-pll = <0x2160ec00>;
panel-type = "1024x768@60";
powerdn-gpio = <0x0000000a 0x00000007 0x00000000>;
};
};
version@00A1 {
version = "00A1", "01";
dvi {
compatible = "da8xx-dt";
pinctrl-names = "default";
pinctrl-0 = <0x00000012>;
ti,hwmods = "lcdc";
disp-pll = <0x2160ec00>;
panel-type = "1024x768@60";
powerdn-gpio = <0x0000000a 0x0000001f 0x00000000>;
};
};
gpio-leds {
compatible = "gpio-leds";
pinctrl-names = "default";
pinctrl-0 = <0x00000013>;
dvi-led0 {
label = "dvi:green:usr0";
gpios = <0x0000000a 0x00000012 0x00000000>;
linux,default-trigger = "heartbeat";
default-state = "off";
};
dvi-led1 {
label = "dvi:green:usr1";
gpios = <0x0000000a 0x00000013 0x00000000>;
linux,default-trigger = "mmc0";
default-state = "off";
};
};
};
cape@1 {
compatible = "bone-geiger-cape";
board-name = "Geiger Cape";
pinctrl-names = "default";
pinctrl-0 = <0x00000014>;
pwms = <0x00000015 0x00000000 0x0007a120 0x00000000>;
pwm-names = "bone-geiger-cape";
pwm-frequency = <0x00004e20>;
pwm-duty-cycle = <0x0000003c>;
event-blink-delay = <0x0000001e>;
gpios = <0x00000016 0x00000011 0x00000000>;
vsense-name = "AIN5";
vsense-scale = <0x000091cd>;
linux,phandle = <0x00000042>;
phandle = <0x00000042>;
tscadc {
compatible = "ti-tscadc-dt";
ti,hwmods = "adc_tsc";
adc-channels = <0x00000008>;
};
gpio-leds {
compatible = "gpio-leds";
pinctrl-names = "default";
pinctrl-0 = <0x00000017>;
geiger-led0 {
label = "geiger:green:usr0";
gpios = <0x0000000c 0x00000017 0x00000000>;
linux,default-trigger = "geiger-run";
default-state = "off";
};
geiger-led1 {
label = "geiger:red:usr1";
gpios = <0x0000000c 0x00000019 0x00000000>;
linux,default-trigger = "geiger-event";
default-state = "off";
};
};
};
cape@2 {
compatible = "bone-generic-cape";
board-name = "BeagleBone LCD3 CAPE";
linux,phandle = <0x00000043>;
phandle = <0x00000043>;
lcd3 {
compatible = "da8xx-dt";
pinctrl-names = "default";
pinctrl-0 = <0x00000018>;
ti,hwmods = "lcdc";
disp-pll = <0x00f42400>;
panel-type = "CDTech_S035Q01";
};
tscadc {
compatible = "ti-tscadc-dt";
ti,hwmods = "adc_tsc";
tsc-wires = <0x00000004>;
tsc-x-plate-resistance = <0x000000c8>;
tsc-steps = <0x00000006>;
adc-channels = <0x00000004>;
};
version@00A0 {
version = "00A0";
backlight {
compatible = "tps65217-backlight";
isel = <0x00000001>;
fdim = <0x000000c8>;
tps = <0x00000019>;
brightness = <0x00000064>;
};
gpio-leds {
compatible = "gpio-leds";
pinctrl-names = "default";
pinctrl-0 = <0x0000001a>;
lcd3-led0 {
label = "lcd3:green:usr0";
gpios = <0x0000000a 0x00000012 0x00000000>;
linux,default-trigger = "heartbeat";
default-state = "off";
};
lcd3-led1 {
label = "lcd3:green:usr1";
gpios = <0x0000000a 0x00000013 0x00000000>;
linux,default-trigger = "cpu0";
default-state = "off";
};
};
gpio_keys {
compatible = "gpio-keys";
pinctrl-names = "default";
pinctrl-0 = <0x0000001b>;
#address-cells = <0x00000001>;
#size-cells = <0x00000000>;
button@1 {
debounce_interval = <0x00000032>;
linux,code = <0x00000069>;
label = "left";
gpios = <0x0000000a 0x00000010 0x00000000>;
gpio-key,wakeup;
autorepeat;
};
button@2 {
debounce_interval = <0x00000032>;
linux,code = <0x0000006a>;
label = "right";
gpios = <0x0000000a 0x00000011 0x00000000>;
gpio-key,wakeup;
autorepeat;
};
button@3 {
debounce_interval = <0x00000032>;
linux,code = <0x00000067>;
label = "up";
gpios = <0x00000016 0x00000013 0x00000000>;
gpio-key,wakeup;
autorepeat;
};
button@4 {
debounce_interval = <0x00000032>;
linux,code = <0x0000006c>;
label = "down";
gpios = <0x0000000a 0x0000001c 0x00000000>;
gpio-key,wakeup;
autorepeat;
};
button@5 {
debounce_interval = <0x00000032>;
linux,code = <0x0000001c>;
label = "enter";
gpios = <0x0000001c 0x00000007 0x00000000>;
gpio-key,wakeup;
};
};
};
};
cape@3 {
compatible = "bone-lcd7-cape";
board-name = "BeagleBone LCD7 CAPE";
linux,phandle = <0x00000044>;
phandle = <0x00000044>;
lcd7 {
compatible = "da8xx-dt";
pinctrl-names = "default";
pinctrl-0 = <0x00000018>;
ti,hwmods = "lcdc";
disp-pll = <0x03938700>;
panel-type = "TFC_S9700RTWV35TR_01B";
};
tscadc {
compatible = "ti-tscadc-dt";
ti,hwmods = "adc_tsc";
tsc-wires = <0x00000004>;
tsc-x-plate-resistance = <0x000000c8>;
tsc-steps = <0x00000006>;
adc-channels = <0x00000004>;
};
version@00A0 {
version = "00A0";
backlight {
compatible = "tps65217-backlight";
isel = <0x00000001>;
fdim = <0x000000c8>;
tps = <0x00000019>;
brightness = <0x00000064>;
};
gpio-leds {
compatible = "gpio-leds";
pinctrl-names = "default";
pinctrl-0 = <0x0000001a>;
lcd3-led0 {
label = "lcd3:green:usr0";
gpios = <0x0000000a 0x00000012 0x00000000>;
linux,default-trigger = "heartbeat";
default-state = "off";
};
lcd3-led1 {
label = "lcd3:green:usr1";
gpios = <0x0000000a 0x00000013 0x00000000>;
linux,default-trigger = "cpu0";
default-state = "off";
};
};
gpio_keys {
compatible = "gpio-keys";
pinctrl-names = "default";
pinctrl-0 = <0x0000001b>;
#address-cells = <0x00000001>;
#size-cells = <0x00000000>;
button@1 {
debounce_interval = <0x00000032>;
linux,code = <0x00000069>;
label = "left";
gpios = <0x0000000a 0x00000010 0x00000000>;
gpio-key,wakeup;
autorepeat;
};
button@2 {
debounce_interval = <0x00000032>;
linux,code = <0x0000006a>;
label = "right";
gpios = <0x0000000a 0x00000011 0x00000000>;
gpio-key,wakeup;
autorepeat;
};
button@3 {
debounce_interval = <0x00000032>;
linux,code = <0x00000067>;
label = "up";
gpios = <0x00000016 0x00000013 0x00000000>;
gpio-key,wakeup;
autorepeat;
};
button@4 {
debounce_interval = <0x00000032>;
linux,code = <0x0000006c>;
label = "down";
gpios = <0x0000000a 0x0000001c 0x00000000>;
gpio-key,wakeup;
autorepeat;
};
button@5 {
debounce_interval = <0x00000032>;
linux,code = <0x0000001c>;
label = "enter";
gpios = <0x0000001c 0x00000007 0x00000000>;
gpio-key,wakeup;
};
};
};
};
cape@4 {
compatible = "bone-generic-cape";
board-name = "BeagleBone Weather CAPE";
linux,phandle = <0x00000045>;
phandle = <0x00000045>;
i2c2-devices {
compatible = "i2c-dt";
#address-cells = <0x00000001>;
#size-cells = <0x00000000>;
parent = <0x0000001d>;
tsl2550@39 {
compatible = "tsl,tsl2550";
reg = <0x00000039>;
};
sht21@40 {
compatible = "sensiron,sht21";
reg = <0x00000040>;
};
bmp085@77 {
compatible = "bosch,bmp085";
reg = <0x00000077>;
};
};
onewire@0 {
compatible = "w1-gpio";
pinctrl-names = "default";
pinctrl-0 = <0x0000001e>;
status = "okay";
gpios = <0x0000000a 0x00000003 0x00000000>;
};
};
cape@5 {
compatible = "bone-generic-cape";
board-name = "Adafruit 1.8 Cape";
linux,phandle = <0x00000046>;
phandle = <0x00000046>;
backlight {
compatible = "pwm-backlight";
pinctrl-names = "default";
pinctrl-0 = <0x0000001f>;
pwms = <0x00000015 0x00000001 0x0007a120 0x00000000>;
pwm-names = "st7735fb";
brightness-levels = <0x00000000 0x00000001 0x00000002 0x00000003 0x00000004 0x00000005 0x00000006 0x00000007 0x00000008 0x00000009 0x0000000a 0x0000000b 0x0000000c 0x0000000d 0x0000000e 0x0000000f 0x00000010 0x00000011 0x00000012 0x00000013 0x00000014 0x00000015 0x00000016 0x00000017 0x00000018 0x00000019 0x0000001a 0x0000001b 0x0000001c 0x0000001d 0x0000001e 0x0000001f 0x00000020 0x00000021 0x00000022 0x00000023 0x00000024 0x00000025 0x00000026 0x00000027 0x00000028 0x00000029 0x0000002a 0x0000002b 0x0000002c 0x0000002d 0x0000002e 0x0000002f 0x00000030 0x00000031 0x00000032 0x00000033 0x00000034 0x00000035 0x00000036 0x00000037 0x00000038 0x00000039 0x0000003a 0x0000003b 0x0000003c 0x0000003d 0x0000003e 0x0000003f 0x00000040 0x00000041 0x00000042 0x00000043 0x00000044 0x00000045 0x00000046 0x00000047 0x00000048 0x00000049 0x0000004a 0x0000004b 0x0000004c 0x0000004d 0x0000004e 0x0000004f 0x00000050 0x00000051 0x00000052 0x00000053 0x00000054 0x00000055 0x00000056 0x00000057 0x00000058 0x00000059 0x0000005a 0x0000005b 0x0000005c 0x0000005d 0x0000005e 0x0000005f 0x00000060 0x00000061 0x00000062 0x00000063 0x00000064>;
default-brightness-level = <0x00000032>;
};
spi1-devices {
compatible = "spi-dt";
#address-cells = <0x00000001>;
#size-cells = <0x00000000>;
parent = <0x00000020>;
lcd@0 {
compatible = "adafruit,tft-lcd-1.8-red", "sitronix,st7735";
spi-max-frequency = <0x007a1200>;
reg = <0x00000000>;
spi-cpol;
spi-cpha;
pinctrl-names = "default";
pinctrl-0 = <0x00000021>;
st7735-rst = <0x00000016 0x00000013 0x00000000>;
st7735-dc = <0x00000016 0x00000015 0x00000000>;
};
};
};
};
@symbols@ {
am3358_pinmux = "/pinmux@44e10800";
spi1_pins = "/pinmux@44e10800/pinmux_spi1_pins";
lcd_pins = "/pinmux@44e10800/pinmux_lcd_pins";
gpevt_pins = "/pinmux@44e10800/pinmux_gpevt_pins";
userled_pins = "/pinmux@44e10800/pinmux_userled_pins";
i2c2_pins = "/pinmux@44e10800/pinmux_i2c2_pins";
bone_dvi_cape_led_pins = "/pinmux@44e10800/pinmux_bone_dvi_cape_led_pins";
bone_dvi_cape_dvi_00A0_pins = "/pinmux@44e10800/pinmux_bone_dvi_cape_dvi_00A0_pins";
bone_dvi_cape_dvi_00A1_pins = "/pinmux@44e10800/pinmux_bone_dvi_cape_dvi_00A1_pins";
bone_geiger_cape_led_pins = "/pinmux@44e10800/pinmux_bone_geiger_cape_led_pins";
bone_geiger_cape_pins = "/pinmux@44e10800/pinmux_bone_geiger_cape_pins";
bone_lcd3_cape_led_00A0_pins = "/pinmux@44e10800/pinmux_bone_lcd3_cape_led_00A0_pins";
bone_lcd3_cape_lcd_pins = "/pinmux@44e10800/pinmux_bone_lcd3_cape_lcd_pins";
bone_lcd3_cape_keys_00A0_pins = "/pinmux@44e10800/pinmux_bone_lcd3_cape_keys_00A0_pins";
pwm_bl_pins = "/pinmux@44e10800/pinmux_pwm_bl_pins";
weather_cape_w1_pins = "/pinmux@44e10800/pinmux_weather_cape_w1_pins";
intc = "/ocp/interrupt-controller@48200000";
edma = "/ocp/edma@49000000";
gpio1 = "/ocp/gpio@44e07000";
gpio2 = "/ocp/gpio@4804c000";
gpio3 = "/ocp/gpio@481ac000";
gpio4 = "/ocp/gpio@481ae000";
uart1 = "/ocp/serial@44e09000";
uart2 = "/ocp/serial@48022000";
uart3 = "/ocp/serial@48024000";
uart4 = "/ocp/serial@481a6000";
uart5 = "/ocp/serial@481a8000";
uart6 = "/ocp/serial@481aa000";
i2c0 = "/ocp/i2c@44e0b000";
tps = "/ocp/i2c@44e0b000/tps@24";
dcdc1_reg = "/ocp/i2c@44e0b000/tps@24/regulators/regulator@0";
dcdc2_reg = "/ocp/i2c@44e0b000/tps@24/regulators/regulator@1";
dcdc3_reg = "/ocp/i2c@44e0b000/tps@24/regulators/regulator@2";
ldo1_reg = "/ocp/i2c@44e0b000/tps@24/regulators/regulator@3";
ldo2_reg = "/ocp/i2c@44e0b000/tps@24/regulators/regulator@4";
ldo3_reg = "/ocp/i2c@44e0b000/tps@24/regulators/regulator@5";
ldo4_reg = "/ocp/i2c@44e0b000/tps@24/regulators/regulator@6";
baseboard_eeprom = "/ocp/i2c@44e0b000/baseboard_eeprom@50";
i2c1 = "/ocp/i2c@4802a000";
i2c2 = "/ocp/i2c@4819c000";
cape_eeprom_0 = "/ocp/i2c@4819c000/cape_eeprom_0@54";
cape_eeprom_1 = "/ocp/i2c@4819c000/cape_eeprom_1@55";
cape_eeprom_2 = "/ocp/i2c@4819c000/cape_eeprom_2@56";
cape_eeprom_3 = "/ocp/i2c@4819c000/cape_eeprom_3@57";
mmc1 = "/ocp/mmc@48060000";
mmc2 = "/ocp/mmc@481d8000";
mmc3 = "/ocp/mmc@47810000";
usb0_phy = "/ocp/phy0";
usb1_phy = "/ocp/phy1";
usb_otg_hs = "/ocp/usb_otg_hs";
spi0 = "/ocp/spi@48030000";
spi1 = "/ocp/spi@481a0000";
wdt2 = "/ocp/wdt@44e35000";
mac = "/ocp/ethernet@4A100000";
cpsw_emac0 = "/ocp/ethernet@4A100000/slave@0";
cpsw_emac1 = "/ocp/ethernet@4A100000/slave@1";
davinci_mdio = "/ocp/ethernet@4A100000/mdio@4a101000";
ehrpwm0 = "/ocp/ehrpwm@48300200";
ehrpwm1 = "/ocp/ehrpwm@48302200";
ehrpwm2 = "/ocp/ehrpwm@48304200";
ecap0 = "/ocp/ecap@48300100";
ecap1 = "/ocp/ecap@48302100";
ecap2 = "/ocp/ecap@48304100";
capebus = "/capebus@0";
bone_dvi_cape = "/capebus@0/cape@0";
bone_geiger_cape = "/capebus@0/cape@1";
bone_lcd3_cape = "/capebus@0/cape@2";
bone_lcd7_cape = "/capebus@0/cape@3";
bone_weather_cape = "/capebus@0/cape@4";
bone_adafruit_cape = "/capebus@0/cape@5";
};
};