rtt更新
This commit is contained in:
@@ -333,8 +333,6 @@ static int ofw_prop_index_of_string(struct rt_ofw_prop *prop, const char *string
|
||||
|
||||
static rt_int32_t ofw_strcasecmp(const char *cs, const char *ct)
|
||||
{
|
||||
extern rt_int32_t strcasecmp(const char *cs, const char *ct);
|
||||
|
||||
return rt_strcasecmp(cs, ct);
|
||||
}
|
||||
|
||||
@@ -1412,7 +1410,7 @@ struct rt_ofw_node *rt_ofw_append_child(struct rt_ofw_node *parent, const char *
|
||||
}
|
||||
}
|
||||
|
||||
return np;
|
||||
return rt_ofw_node_get(np);
|
||||
}
|
||||
|
||||
rt_err_t rt_ofw_append_prop(struct rt_ofw_node *np, const char *name, int length, void *value)
|
||||
|
@@ -37,6 +37,12 @@ static rt_phandle _phandle_max;
|
||||
static rt_size_t _root_size_cells;
|
||||
static rt_size_t _root_addr_cells;
|
||||
|
||||
#ifdef ARCH_CPU_64BIT
|
||||
#define MIN_BIT 16
|
||||
#else
|
||||
#define MIN_BIT 8
|
||||
#endif
|
||||
|
||||
const char *rt_fdt_node_name(const char *full_name)
|
||||
{
|
||||
const char *node_name = strrchr(full_name, '/');
|
||||
@@ -85,15 +91,15 @@ rt_uint64_t rt_fdt_translate_address(void *fdt, int nodeoffset, rt_uint64_t addr
|
||||
|
||||
if (parent >= 0)
|
||||
{
|
||||
ranges = fdt_getprop(fdt, nodeoffset, "ranges", &length);
|
||||
ranges = fdt_getprop(fdt, parent, "ranges", &length);
|
||||
}
|
||||
|
||||
if (ranges && length > 0)
|
||||
{
|
||||
local.addr_cells = fdt_address_cells(fdt, nodeoffset);
|
||||
local.size_cells = fdt_size_cells(fdt, nodeoffset);
|
||||
cpu.addr_cells = fdt_io_addr_cells(fdt, nodeoffset);
|
||||
cpu.size_cells = fdt_io_size_cells(fdt, nodeoffset);
|
||||
local.addr_cells = fdt_address_cells(fdt, parent);
|
||||
local.size_cells = fdt_size_cells(fdt, parent);
|
||||
cpu.addr_cells = fdt_io_addr_cells(fdt, parent);
|
||||
cpu.size_cells = fdt_io_size_cells(fdt, parent);
|
||||
|
||||
group_len = local.addr_cells + cpu.addr_cells + local.size_cells;
|
||||
|
||||
@@ -105,7 +111,7 @@ rt_uint64_t rt_fdt_translate_address(void *fdt, int nodeoffset, rt_uint64_t addr
|
||||
|
||||
if (local.addr <= address && local.addr + local.size > address)
|
||||
{
|
||||
ret += address - cpu.addr;
|
||||
ret = address - local.addr + cpu.addr;
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -247,9 +253,9 @@ static rt_err_t fdt_reserved_memory_reg(int nodeoffset, const char *uname)
|
||||
|
||||
rt_bool_t is_nomap = fdt_getprop(_fdt, nodeoffset, "no-map", RT_NULL) ? RT_TRUE : RT_FALSE;
|
||||
base = rt_fdt_translate_address(_fdt, nodeoffset, base);
|
||||
rt_memblock_reserve_memory(uname, base, base + size, is_nomap);
|
||||
|
||||
len -= t_len;
|
||||
rt_memblock_reserve_memory(fdt_get_name(_fdt, nodeoffset, RT_NULL),
|
||||
base, base + size, is_nomap);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -358,11 +364,11 @@ static rt_err_t fdt_scan_memory(void)
|
||||
|
||||
if (!err)
|
||||
{
|
||||
LOG_I("Memory node(%d) ranges: %p - %p%s", no, base, base + size, "");
|
||||
LOG_I("Memory node(%d) ranges: 0x%.*lx - 0x%.*lx%s", no, MIN_BIT, base, MIN_BIT, base + size, "");
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG_W("Memory node(%d) ranges: %p - %p%s", no, base, base + size, " unable to record");
|
||||
LOG_W("Memory node(%d) ranges: 0x%.*lx - 0x%.*lx%s", no, MIN_BIT, base, MIN_BIT, base + size, " unable to record");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -793,6 +799,55 @@ rt_err_t rt_fdt_scan_chosen_stdout(void)
|
||||
return err;
|
||||
}
|
||||
|
||||
rt_err_t rt_fdt_bootargs_select(const char *key, int index, const char **out_result)
|
||||
{
|
||||
rt_err_t err;
|
||||
|
||||
if (key && index >= 0 && out_result)
|
||||
{
|
||||
int offset = fdt_path_offset(_fdt, "/chosen");
|
||||
|
||||
if (offset >= 0)
|
||||
{
|
||||
int len, key_len = rt_strlen(key);
|
||||
const char *bootargs = fdt_getprop(_fdt, offset, "bootargs", &len), *end;
|
||||
|
||||
end = bootargs + len;
|
||||
err = -RT_EEMPTY;
|
||||
|
||||
for (int i = 0; bootargs < end; ++i)
|
||||
{
|
||||
bootargs = rt_strstr(bootargs, key);
|
||||
|
||||
if (!bootargs)
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
bootargs += key_len;
|
||||
|
||||
if (i == index)
|
||||
{
|
||||
*out_result = bootargs;
|
||||
|
||||
err = -RT_EOK;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
err = -RT_ERROR;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
err = -RT_EINVAL;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
static void system_node_init_flag(struct rt_ofw_node *np)
|
||||
{
|
||||
if (np)
|
||||
|
@@ -407,6 +407,75 @@ rt_uint64_t rt_ofw_translate_address(struct rt_ofw_node *np, const char *range_t
|
||||
return cpu_addr;
|
||||
}
|
||||
|
||||
rt_uint64_t rt_ofw_reverse_address(struct rt_ofw_node *np, const char *range_type, rt_uint64_t address)
|
||||
{
|
||||
rt_uint64_t bus_addr = address;
|
||||
|
||||
if (!range_type)
|
||||
{
|
||||
range_type = "ranges";
|
||||
}
|
||||
|
||||
rt_ofw_foreach_parent_node(np)
|
||||
{
|
||||
rt_ssize_t len;
|
||||
struct rt_ofw_prop *prop;
|
||||
struct bus_ranges *ranges = RT_NULL;
|
||||
|
||||
prop = rt_ofw_get_prop(np, range_type, &len);
|
||||
|
||||
if (!prop || !len)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
for (int i = 0; i < RT_ARRAY_SIZE(_bus_ranges); ++i)
|
||||
{
|
||||
if (!_bus_ranges[i])
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if (_bus_ranges[i]->np == np)
|
||||
{
|
||||
ranges = _bus_ranges[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!ranges)
|
||||
{
|
||||
ranges = ofw_bus_ranges(np, prop);
|
||||
}
|
||||
|
||||
if (ranges)
|
||||
{
|
||||
for (int i = 0; i < ranges->nr; ++i)
|
||||
{
|
||||
rt_uint64_t parent_addr = ranges->parent_addr[i];
|
||||
rt_uint64_t child_size = ranges->child_size[i];
|
||||
|
||||
if (address >= parent_addr && address < parent_addr + child_size)
|
||||
{
|
||||
bus_addr = ranges->child_addr[i] + (address - parent_addr);
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
bus_addr = ~0ULL;
|
||||
}
|
||||
|
||||
rt_ofw_node_put(np);
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return bus_addr;
|
||||
}
|
||||
|
||||
#ifdef ARCH_CPU_64BIT
|
||||
#define ofw_address_cpu_cast(np, address) (void *)(address)
|
||||
#else
|
||||
|
@@ -69,6 +69,12 @@ struct ofw_obj_cmp_list
|
||||
|
||||
static const struct ofw_obj_cmp_list ofw_obj_cmp_list[] =
|
||||
{
|
||||
#ifdef RT_USING_CLK
|
||||
{ "#clock-cells", RT_CLK_NODE_OBJ_NAME, sizeof(struct rt_clk_node) },
|
||||
#endif
|
||||
#ifdef RT_USING_RESET
|
||||
{ "#reset-cells", RT_RESET_CONTROLLER_OBJ_NAME, sizeof(struct rt_reset_controller) },
|
||||
#endif
|
||||
{ "#power-domain-cells", RT_POWER_DOMAIN_PROXY_OBJ_NAME, sizeof(struct rt_dm_power_domain_proxy) },
|
||||
{ "#power-domain-cells", RT_POWER_DOMAIN_OBJ_NAME, sizeof(struct rt_dm_power_domain) },
|
||||
};
|
||||
@@ -103,14 +109,14 @@ static struct rt_object *ofw_parse_object(struct rt_ofw_node *np, const char *ce
|
||||
{
|
||||
item = &ofw_obj_cmp_list[i];
|
||||
|
||||
if (!rt_strcmp(item->cells_name, cells_name))
|
||||
{
|
||||
ret_obj = obj;
|
||||
break;
|
||||
}
|
||||
|
||||
if (!rt_strncmp(item->obj_name, obj->name, RT_NAME_MAX))
|
||||
{
|
||||
if (!rt_strcmp(item->cells_name, cells_name))
|
||||
{
|
||||
ret_obj = obj;
|
||||
break;
|
||||
}
|
||||
|
||||
obj = (struct rt_object *)((rt_ubase_t)obj + item->obj_size);
|
||||
break;
|
||||
}
|
||||
@@ -134,7 +140,7 @@ struct rt_object *rt_ofw_parse_object(struct rt_ofw_node *np, const char *obj_na
|
||||
if (np && (test_obj = rt_ofw_data(np)) && cells_name)
|
||||
{
|
||||
/* The composite object is rare, so we try to find this object as much as possible at once. */
|
||||
if (obj_name && rt_strcmp(test_obj->name, obj_name))
|
||||
if (obj_name && !rt_strcmp(test_obj->name, obj_name))
|
||||
{
|
||||
obj = test_obj;
|
||||
}
|
||||
@@ -386,6 +392,11 @@ const char *rt_ofw_bootargs_select(const char *key, int index)
|
||||
{
|
||||
*(char *)ch++ = '\0';
|
||||
}
|
||||
if (*ch == '\0')
|
||||
{
|
||||
/* space in the end */
|
||||
--bootargs_nr;
|
||||
}
|
||||
--ch;
|
||||
}
|
||||
|
||||
@@ -636,7 +647,14 @@ void rt_ofw_node_dump_dts(struct rt_ofw_node *np, rt_bool_t sibling_too)
|
||||
struct fdt_info *header = (struct fdt_info *)np->name;
|
||||
struct fdt_reserve_entry *rsvmap = header->rsvmap;
|
||||
|
||||
rt_kprintf("/dts-v%x/;\n\n", fdt_version(header->fdt));
|
||||
/*
|
||||
* Shall be present to identify the file as a version 1 DTS
|
||||
* (dts files without this tag will be treated by dtc
|
||||
* as being in the obsolete version 0, which uses
|
||||
* a different format for integers in addition to
|
||||
* other small but incompatible changes).
|
||||
*/
|
||||
rt_kprintf("/dts-v1/;\n\n");
|
||||
|
||||
for (int i = header->rsvmap_nr - 1; i >= 0; --i)
|
||||
{
|
||||
|
Reference in New Issue
Block a user