const char *fdt_get_alias_namelen(const void *fdt, const char *name, int namelen) { int aliasoffset; aliasoffset = fdt_path_offset(fdt, "/aliases"); if (aliasoffset < 0) return NULL; return fdt_getprop_namelen(fdt, aliasoffset, name, namelen, NULL); }
int fdt_path_offset(const void *fdt, const char *path) { const char *end = path + strlen(path); const char *p = path; int offset = 0; FDT_CHECK_HEADER(fdt); /* see if we have an alias */ if (*path != '/') { const char *q; int aliasoffset = fdt_path_offset(fdt, "/aliases"); if (aliasoffset < 0) return -FDT_ERR_BADPATH; q = strchr(path, '/'); if (!q) q = end; p = fdt_getprop_namelen(fdt, aliasoffset, path, q - p, NULL); if (!p) return -FDT_ERR_BADPATH; offset = fdt_path_offset(fdt, p); p = q; } while (*p) { const char *q; while (*p == '/') p++; if (! *p) return offset; q = strchr(p, '/'); if (! q) q = end; offset = fdt_subnode_offset_namelen(fdt, offset, p, q-p); if (offset < 0) return offset; p = q; } return offset; }
/* * name: alias * namelen: alias 길이 */ const char *fdt_get_alias_namelen(const void *fdt, const char *name, int namelen) { int aliasoffset; // aliases에 정의된 alias가 있는지 찾아보고 alias offset을 가져옴 aliasoffset = fdt_path_offset(fdt, "/aliases"); // alias offset이 에러값이라면 NULL 리턴 if (aliasoffset < 0) return NULL; /* * alias offset이 유효하다면 * alias에 해당하는 property의 value를 가져옴 */ return fdt_getprop_namelen(fdt, aliasoffset, name, namelen, NULL); }
const void *fdt_getprop(const void *fdt, int nodeoffset, const char *name, int *lenp) { return fdt_getprop_namelen(fdt, nodeoffset, name, strlen(name), lenp); }