とあるエンジニアの備忘log
2014年5月28日水曜日
Device Tree アクセス関数まとめ (DTC & U-Boot)
Device Tree Compiler や U-Boot に入っている Device Tree アクセス関数をまとめました。 ### `_fdt_nodename_eq` (fdt_ro.c:17) static int _fdt_nodename_eq(const void *fdt, int offset, const char *s, int len) DTB `fdt` の DT structure の先頭から `offset` の位置の文字列(`0` または `@` で終端されている)と 文字列 `s` (長さ `len`) を比較し、 一致すれば `1` を、一致しなければ `0` を返す。 ### `fdt_string` (fdt_ro.c:78) const char *fdt_string(const void *fdt, int stroffset) DTB `fdt` の DT strings の先頭から `stroffset` の位置の文字列へのポインタを返す。 ### `_fdt_string_eq` (fdt_ro.c:83) static int _fdt_string_eq(const void *fdt, int stroffset, const char *s, int len) DTB `fdt` の DT strings の先頭から `stroffset` の位置の文字列と、 文字列 `s` (長さ `len`) を比較する。 長さも、文字列も一致すれば `1` を、それ以外は `0` を返す。 `strcmp` と論理が逆なので注意する。 ### `_nextprop` (fdt_ro.c:108) static int _nextprop(const void *fdt, int offset) DTB `fdt` の DT structure の先頭から `offset` の位置のタグを調べ、プロパティならば `offset` を返す。 それ以外は負のエラーコードを返す。 ### `fdt_subnode_offset_namelen` (fdt_ro.c:132) int fdt_subnode_offset_namelen(const void *fdt, int offset, const char *name, int namelen) DTB `fdt` の DT structure の先頭から `offset` 位置 (ノード先頭を指していないといけない)のノードから見て、 1つ下の階層のサブノードのうち、ノード名 `name` (長さ `namelen`) のものを探す。 見つかれば、そのサブノードのオフセット位置を返し、見つからなかったり、エラーの場合は負のエラーコードを返す。 ### `fdt_subnode_offset` (fdt_ro.c:151) int fdt_subnode_offset(const void *fdt, int parentoffset, const char *name) DTB `fdt` の DT structure の先頭から `offset` 位置 (ノード先頭をさしていないといけない)のノードから見て、 1つ下の階層のサブノードのうち、ノード名 `name` のものを探す。 見つかれば、そのサブノードのオフセット位置を返し、見つからなかったり、エラーの場合は負のエラーコードを返す。 ### `fdt_path_offset` (fdt_ro.c:157) int fdt_path_offset(const void *fdt, const char *path) DTB `fdt` から `path` のパスのノードを探し、そのオフセット位置を返す。 見つからない場合や、エラーの場合は負のエラーコードを返す。 `path` が `'/'` で始まらない場合はエイリアスとみなされる。 ### `fdt_get_name` (fdt_ro.c:201) const char *fdt_get_name(const void *fdt, int nodeoffset, int *len) DTB `fdt` の DT structure の先頭から `nodeoffset` 位置 (ノード先頭を指していないといけない) のノードの名前を返す。 `len` に `NULL` 以外が与えられていると、ノード名の長さを詰めて返す。 エラーの場合は、`NULL` を返し、 `len` には負のエラーコードを詰める。 ### `fdt_first_property_offset` (fdt_ro.c:221) int fdt_first_property_offset(const void *fdt, int nodeoffset) DTB `fdt` の DT structure の先頭から `nodeoffset` 位置 (ノード先頭を指していないといけない) の最初のプロパティ位置のオフセットを返す。 見つからないときや、エラーの場合は負のエラーコードを返す。 ### `fdt_get_property_by_offset` (fdt_ro.c:239) const struct fdt_property *fdt_get_property_by_offset(const void *fdt, int offset, int *lenp) DTB `fdt` の DT structure の先頭から `offset` 位置がプロパティ先頭かを確認し、 プロパティならば、そのポインタを返し、 `lenp` (に `NULL` 以外が与えられていれば)にプロパティ値の長さを詰める。 プロパティでなければ、`NULL` を返し、`lenp` には エラーコードを詰める。 ### `fdt_get_property_namelen` (fdt_ro.c:260) const struct fdt_property *fdt_get_property_namelen(const void *fdt, int offset, const char *name, int namelen, int *lenp) DTB `fdt` の DT structure の先頭から `offset` 位置 (ノード先頭を指していないといけない) のノードからプロパティ名が `name` (長さ `namelen`)のものを探し、見つかれば、そのプロパティへのポインタを返し、 `lenp` (に`NULL` 以外が与えられていれば)にプロパティ値の長さを詰める。 見つからない場合やエラーの場合は、`NULL` を返し、`lenp` にエラーコードを詰める。 ### `fdt_get_property` (fdt_ro.c:284) const struct fdt_property *fdt_get_property(const void *fdt, int nodeoffset, const char *name, int *lenp) DTB `fdt` の DT structure の先頭から `offset` 位置 (ノード先頭を指していないといけない) のノードからプロパティ名が `name` のものを探し、見つかれば、そのプロパティへのポインタを返し、 `lenp` (に`NULL` 以外が与えられていれば)にプロパティ値の長さを詰める。 見つからない場合やエラーの場合は、`NULL` を返し、`lenp` にエラーコードを詰める。 ### `fdt_getprop_namelen` (fdt_ro.c:251) const void *fdt_getprop_namelen(const void *fdt, int nodeoffset, const char *name, int namelen, int *lenp) DTB `fdt` の DT structure の先頭から `offset` 位置 (ノード先頭を指していないといけない) のノードからプロパティ名が `name` (長さ `namelen`)のものを探し、見つかれば、そのプロパティの値へのポインタを返し、 `lenp` (に`NULL` 以外が与えられていれば)にプロパティ値の長さを詰める。 見つからない場合やエラーの場合は、`NULL` を返し、`lenp` にエラーコードを詰める ### `fdt_getprop_by_offset` (fdt_ro.c:265) const void *fdt_getprop_by_offset(const void *fdt, int offset, const char **namep, int *lenp) DTB `fdt` の DT structure の先頭から `offset` 位置 (プロパティ先頭を指していないといけない) のプロパティの値へのポインタを返す。 `namep` に `NULL` 以外が与えられていれば、プロパティ名を詰め、 `lenp` に `NULL` が与えられていれば、プロパティ値の長さを詰める。 エラーのときは、 `NULL` を返し、 `lenp` に (`NULL`以外が与えられていれば、エラーコードを詰める) ### `fdt_getprop` (fdt_ro.c:276) const void *fdt_getprop(const void *fdt, int nodeoffset, const char *name, int *lenp) DTB `fdt` の DT structure の先頭から `offset` 位置 (ノード先頭を指していないといけない) のノードからプロパティ名が `name` のものを探し、見つかれば、そのプロパティの値へのポインタを返し、 `lenp` (に`NULL` 以外が与えられていれば)にプロパティ値の長さを詰める。 見つからない場合やエラーの場合は、`NULL` を返し、`lenp` にエラーコードを詰める ### `fdt_get_phandle (fdt_ro.c:282)` uint32_t fdt_get_phandle(const void *fdt, int nodeoffset) DTB `fdt` の DT structure の先頭から `offset` 位置 (ノード先頭を指していないといけない) のノードからプロパティ "phandle" の値を返す。 "phandle" が見つからない場合は、 "linux,phandle" の値を返す。 見つからない場合は `0` を返す。 ### `fdt_get_alias_namelen` (fdt_ro.c:299) const char *fdt_get_alias_namelen(const void *fdt, const char *name, int namelen) ノード `name` の別名(エイリアス)を文字列として返す。 エイリアスは `"/aliases"` ノードに格納されているので、そのノードからプロパティ名 `name` (長さ `namelen`) のものを探し、そのプロパティ値を返す。 見つからない場合は `NULL` を返す。 ### `fdt_supernode_atdepth_offset` (fdt_ro.c:368) int fdt_supernode_atdepth_offset(const void *fdt, int nodeoffset, int supernodedepth, int *nodedepth) DTB `fdt` の DT structure の先頭から `nodeoffset` 位置 (ノード先頭を指していないといけない)のノード の親(直接の親とは限らない)のうち、 `supernodedepth` の深さのもののオフセットを返す。 見つからない場合は、負のエラーコードを返す。 `nodedepth` に `NULL` 以外が与えられていれば、自身の階層の深さを詰める。 ### `fdt_node_depth` (fdt_ro.c:404) int fdt_node_depth(const void *fdt, int nodeoffset) DTB `fdt` の DT structure の先頭から `nodeoffset` 位置 (ノード先頭を指していないといけない)のノード の深さを返す。 エラーの場合は、負のエラーコードを返す。 ### `int fdt_parent_offset(const void *fdt, int nodeoffset)` (fdt_ro.c:416) int fdt_parent_offset(const void *fdt, int nodeoffset) DTB `fdt` の DT structure の先頭から `nodeoffset` 位置 (ノード先頭を指していないといけない)のノード の直接の親ノードのオフセット位置を返す。 エラーの場合は、負のエラーコードを返す。 ### `fdt_node_offset_by_prop_value` (fdt_ro.c:425) int fdt_node_offset_by_prop_value(const void *fdt, int startoffset, const char *propname, const void *propval, int proplen) DTB `fdt` の DT structure 領域の `startoffset` 位置から検索開始し、 プロパティ名 `propname` と プロパティ値 `propval` の組み合わせを持つノードが見つかると そのノードへのオフセットを返す。 見つからない場合やエラーの場合は、負のエラーコードを返す。 ### `fdt_node_offset_by_phandle` (fdt_ro.c:452) int fdt_node_offset_by_phandle(const void *fdt, uint32_t phandle) DTB `fdt` の DT structure の先頭から探索し、phandle `phadle` を持つノードを返す。 見つからない場合や、エラーの場合は、府のエラー番号を返す。nodeoffset` 位置 (ノード先頭を指していないといけない)のノード の直接の親ノードのオフセット位置を返す。 ### `fdt_stringlist_contains` (rdt_ro.c:477) int fdt_stringlist_contains(const char *strlist, int listlen, const char *str) 1つまたはそれ以上の文字列の連結 `strlist` (長さ `listlen`) 中に、文字列 `str` が含まれていれば `1`を、それ以外は `0` を返す。 ### `fdt_node_check_compatible` (rdt_ro.c:570) int fdt_node_check_compatible(const void *fdt, int nodeoffset, const char *compatible) DTB `fdt` の DT structure の先頭から `offset` 位置 (ノード先頭を指していないといけない) のノードから `"compatible"` という名前のプロパティを探し、その値中に文字列 `compatible` があれば(compatible であれば)、`0` を返す。 compatible でない場合は、 `1` を返す。 ノードが `"compatible"` というプロパティを持たない場合や、その他エラーの場合は、負のエラーコードを返す。 ### `fdt_node_offset_by_compatible` (fdt_ro.c:585) int fdt_node_offset_by_compatible(const void *fdt, int startoffset, const char *compatible) DTB `fdt` の DT structure 領域の `startoffset` 位置から検索開始し、 `compatible` に対して compatible なノードを返す。 見つからなかったり、エラーの場合は、負のエラーコードを返す。 ### `fdt_offset_ptr` (fdt.c:77) const void *fdt_offset_ptr(const void *fdt, int offset, unsigned int len) DTB `fdt` の DT structure の先頭から `offset` バイト目の位置のポインタを返す。 DT structure 領域をオーバーランしないかチェックするため、アクセスする長さを `len` に与える。 ### `fdt_next_tag` (fdt.c:93) uint32_t fdt_next_tag(const void *fdt, int startoffset, int *nextoffset) DTB `fdt` の DT structure の先頭から `startoffset` バイト目にあるタグを返す。 戻り値は `FDT_BEGIN_NODE`, `FDT_END_NODE`, `FDT_PROP`, `FDT_END`, `FDT_NOP`。 `FDT_END` は DT structure の最後に達したか、エラーを意味する。 次のタグの位置を `nextoffset` に詰める。エラー終了の場合は `nextoffset` にエラーコードを詰める。 ### `_fdt_check_node_offset` (fdt.c:143) int _fdt_check_node_offset(const void *fdt, int offset) DTB `fdt` の DT structure の先頭から `offset` バイト目がノードの先頭かをチェックする。 ノード先頭であれば、次のタグの `offset` 値を返し、それ以外は `-FDT_ERR_BADOFFSET` を返す。 ### `_fdt_check_prop_offset` (fdt.c:152) int _fdt_check_prop_offset(const void *fdt, int offset) DTB `fdt` の DT structure の先頭から `offset` バイト目がプロパティの先頭かをチェックする。 プロパティの先頭であれば、次のタグの `offset` 値を返し、それ以外は `-FDT_ERR_BADOFFSET` を返す。 ### `fdt_next_node` (fdt.c:120) int fdt_next_node(const void *fdt, int offset, int *depth) DTB `fdt` の DT structure の先頭から `offset` バイト目 (ノードを指していないといけない)から探索を開始し、次のノードを探す。 見つかれば、そのノードのオフセット位置を返す。 `depth` に `NULL` 以外が与えられていれば、階層を降りたり昇ったりするたびに、 `depth` を増減させる。 これは、繰り返し探索するときに、現在の階層の深さを記憶するのに使われる。 `depth` が負になるとそれ以上探索しない。 DT structure の終端に達した時や、見つからないとき、エラーの時は負のエラーコードを返す。 ### `fdt_first_subnode` (fdt.c:160) int fdt_first_subnode(const void *fdt, int offset) DTB `fdt` の DT structure の先頭から `offset` バイト目 (ノードを指していないといけない)から探索を開始し、最初のサブノードを探す。 見つかれば、そのノードのオフセットを位置を返す。見つからないときは、 `-FDT_ERR_NOTFOUND' を返す。 ### `fdt_next_subnode` (fdt.c:171) int fdt_next_subnode(const void *fdt, int offset) DTB `fdt` の DT structure の先頭から `offset` バイト目 (ノードを指していないといけない)から探索を開始し、次のサブノードを探す。 見つかれば、そのノードのオフセットを位置を返す。見つからないときは、 `-FDT_ERR_NOTFOUND' を返す。 ### `_fdt_find_string` (fdt.c:229) const char *_fdt_find_string(const char *strtab, int tabsize, const char *s) 1つまたはそれ以上の文字列の連結 `strtab` (長さ `tabsize`) 中に、文字列 `s` が含まれているか検索する。 見つかると、そのポインタ位置を返す。見つからない場合は `NULL` を返す。 ### `_fdt_blocks_misordered` (fdt_rw.c:58) static int _fdt_blocks_misordered(const void *fdt, int mem_rsv_size, int struct_size) DTB `fdt` の構造を再構築する必要があるか判定する。 FDB の構造は常に Mermory Reserve Map, DT structure, DT strings の順に並んでいる必要がある。 `mem_rsv_size` には Memory Reserve Map のサイズ、`struct_size` には DT structure のサイズを渡す。 Mermory Reserve Map が DT structure 領域にオーバーラップしないか、 DT structuret が DT strings 領域にオーバーラップしないか、さらには DT strings の最後が DTB 全体のサイズを超えないかをチェックする。 再構築の必要があれば、`1`、それ以外は `0` を返す。 ### `_fdt_splice` (fdt_rw.c:97) _fdt_splice(void *fdt, void *splicepoint, int oldlen, int newlen) DTB `fdt` のポインタ位置 `splicepoint` から始まる、長さ `oldlen` 分のデータを、長さ `newlen` に変更するために、隙間を拡張したり、詰めたりする。 成功すると `0`、失敗すると負のエラーコードを返す。 ### `_fdt_splice_struct` (fdt_rw.c:123) static int _fdt_splice_struct(void *fdt, void *p, int oldlen, int newlen) DTB `fdt` のポインタ位置 `splicepoint` から始まる、長さ `oldlen` 分のデータを、長さ `newlen` に変更するために、隙間を拡張したり、詰めたりする。 さらに、DT structuret のサイズと、DT strings へのオフセットのヘッダー情報を更新する。 成功すると `0`、失敗すると負のエラーコードを返す。 ### `_fdt_splice_string` (fdt_rw.c:137) static int _fdt_splice_string(void *fdt, int newlen) DTB `fdt` の DT strings の末尾に、長さ `newlen` 分のスペースを確保し、 DT strings サイズのヘッダー情報を更新する。 成功すると `0`、失敗すると負のエラーコードを返す。 ### `_fdt_find_add_string` (fdt_rw.c:150) static int _fdt_find_add_string(void *fdt, const char *s) DTB `fdt` の DT strings 領域を検索し、文字列 `s` が見つかれば、そこへのオフセットを返す。 見つからない場合は、DT strings 領域の末尾に追加し、オフセットを返す。 失敗すると負のエラーコードを返す。 ### `_fdt_resize_property` (fdt_rw.c:205) static int _fdt_resize_property(void *fdt, int nodeoffset, const char *name, int len, struct fdt_property **prop) DTB `fdt` の DT structuret の先頭から `nodeoffset` 位置 (ノード先頭を指していないといけない) のノードからプロパティ名が `name` のものを探し、そのプロパティの長さを `len` にリサイズし、 `prop` にそのプロパティのポインタを返す。 成功すれば `0`、失敗すれば負のエラーコードを返す。 ### `_fdt_add_property` (fdt_rw.c:223) static int _fdt_add_property(void *fdt, int nodeoffset, const char *name, int len, struct fdt_property **prop) DTB `fdt` の DT structuret の先頭から `nodeoffset` 位置(ノード先頭を指していないといけない) のノードに新しいプロパティ (プロパティ名 `name`、プロパティ値の長さ `len`)を追加する。 同名のプロパティがすでに存在しているかはチェックしない。 追加したプロパティへのポインタを `prop` に詰めて返す。 ### `fdt_setprop` (fdt_rw.c:274) int fdt_setprop(void *fdt, int nodeoffset, const char *name, const void *val, int len) DTB `fdt` の DT structuret の先頭から `nodeoffset` 位置(ノード先頭を指していないといけない) のノードの `name` というプロパティの値を `val` (長さ `len`) に書き変える。 `name` という名前のプロパティがまだ存在していない場合は新しく追加する。 成功すれば `0` を返し、失敗すれば負のエラーコードを返す。 ### `fdt_add_subnode_namelen` (fdt_rw.c:334) int fdt_add_subnode_namelen(void *fdt, int parentoffset, const char *name, int namelen) DTB `fdt` の DT structuret の先頭から `parentoffset` 位置(ノード先頭を指していないといけない)のノードに 名前 `name` (長さ `namelen`) のサブノードを追加する。 サブノードは、親ノードのプロパティの直後に追加される。 すでに同名のサブノードが存在する場合は失敗する。 成功すると、追加されたサブノードへのオフセットを返す。失敗すると、負のエラーコードを返す。 ### `fdt_add_subnode` (fdt_rw.c:375) int fdt_add_subnode(void *fdt, int parentoffset, const char *name) DTB `fdt` の DT structuret の先頭から `parentoffset` 位置(ノード先頭を指していないといけない)のノードに 名前 `name` のサブノードを追加する。 サブノードは、親ノードのプロパティの直後に追加される。 すでに同名のサブノードが存在する場合は失敗する。 成功すると、追加されたサブノードへのオフセットを返す。失敗すると、負のエラーコードを返す。 ### `_fdt_packblocks` (fdt_rw.c:394) static void _fdt_packblocks(const char *old, char *new, int mem_rsv_size, int struct_size) アドレス `old` 上の DTB をアドレス `new` 上に再構築する。 新しい DTB の Memory Reserve Map サイズは `mem_rsv_size` に、 DT structuret サイズは `struct_size` となる。 ### `fdt_open_into` (fdt_rw.c:416) int fdt_open_into(const void *fdt, void *buf, int bufsize) DTB `fdt` をバッファ `buf` (サイズ `bufsize`) に読み出す。 通常は、そのままコピーされるだけだが、必要があるときには `_fdt_packblocks` 関数を呼び出して、リフォーマットする。 ### `fdt_pack` (fdt_rw.c:480) int fdt_pack(void *fdt) DTB `fdt` の余分な Memory Reserve Map 領域を詰めて、再パッキングする。
0 件のコメント:
コメントを投稿
次の投稿
前の投稿
ホーム
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿