rtt更新

This commit is contained in:
2025-01-18 13:25:25 +08:00
parent c6a7554b51
commit d6009a0773
726 changed files with 103376 additions and 6270 deletions

View File

@@ -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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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)
{