| \ tag: Useful device related functions |
| \ |
| \ Copyright (C) 2003, 2004 Samuel Rydh |
| \ |
| \ See the file "COPYING" for further information about |
| \ the copyright and warranty status of this work. |
| \ |
| |
| |
| : parent ( phandle -- parent.phandle|0 ) |
| >dn.parent @ |
| ; |
| |
| \ ------------------------------------------------------------------- |
| \ property helpers |
| \ ------------------------------------------------------------------- |
| |
| : int-property ( value name-str name-len -- ) |
| rot encode-int 2swap property |
| ; |
| |
| \ ------------------------------------------------------------------------- |
| \ property utils |
| \ ------------------------------------------------------------------------- |
| |
| \ like property (except it takes a phandle as an argument) |
| : encode-property ( buf len propname propname-len phandle -- ) |
| dup 0= abort" null phandle" |
| |
| my-self >r 0 to my-self |
| active-package >r active-package! |
| |
| property |
| |
| r> active-package! |
| r> to my-self |
| ; |
| |
| \ ------------------------------------------------------------------- |
| \ device tree iteration |
| \ ------------------------------------------------------------------- |
| |
| : iterate-tree ( phandle -- phandle|0 ) |
| ?dup 0= if device-tree @ exit then |
| |
| \ children first |
| dup child if |
| child exit |
| then |
| |
| \ then peers |
| dup peer if |
| peer exit |
| then |
| |
| \ then peer of a parent |
| begin >dn.parent @ dup while |
| dup peer if peer exit then |
| repeat |
| ; |
| |
| : iterate-tree-begin ( -- first_node ) |
| device-tree @ |
| ; |
| |
| |
| \ ------------------------------------------------------------------- |
| \ device tree iteration |
| \ ------------------------------------------------------------------- |
| |
| : iterate-device-type ( lastph|0 type-str type-len -- 0|nextph ) |
| rot |
| begin iterate-tree ?dup while |
| >r |
| 2dup " device_type" r@ get-package-property if 0 0 then |
| dup 0> if 1- then |
| strcmp 0= if 2drop r> exit then |
| r> |
| repeat |
| 2drop 0 |
| ; |
| |
| \ ------------------------------------------------------------------- |
| \ device tree "cut and paste" |
| \ ------------------------------------------------------------------- |
| |
| \ add a subtree to the current device node |
| : link-nodes ( phandle -- ) |
| \ reparent phandle and peers |
| dup begin ?dup while |
| dup >dn.parent active-package ! |
| >dn.peer @ |
| repeat |
| |
| \ add to list of children |
| active-package >dn.child |
| begin dup @ while @ >dn.peer repeat dup . ! |
| ; |
| |
| : link-node ( phandle -- ) |
| 0 over >dn.peer ! |
| link-nodes |
| ; |