sessyargc.jp ответа было достаточно; однако, просто для полноты, я хотел предложить немного кода на C, который я использовал для распечатки некоторой базовой информации о дереве из драйвера:
#include <linux/of_device.h>
#include <linux/of_platform.h>
...
print_device_tree_node(of_find_node_by_path("/"), 0);
...
static void print_device_tree_node(struct device_node *node, int depth) {
int i = 0;
struct device_node *child;
struct property *properties;
char indent[255] = "";
for(i = 0; i < depth * 3; i++) {
indent[i] = ' ';
}
indent[i] = '\0';
++depth;
for_each_child_of_node(node, child) {
printk(KERN_INFO "%s{ name = %s\n", indent, child->name);
printk(KERN_INFO "%s type = %s\n", indent, child->type);
for (properties = child->properties; properties != NULL; properties = properties->next) {
printk(KERN_INFO "%s %s (%d)\n", indent, properties->name, properties->length);
}
print_device_tree_node(child, depth);
printk(KERN_INFO "%s}\n", indent);
}
}
Хотелось бы знать, как определить каждый тип свойств, чтобы я мог форматировать значение и выводить его правильно. Есть предложения?
Наконец, вот оригинальный фрагмент, слегка измененный так:
char *path = "/fpga_dt@c0000000";
struct device_node *dt_node;
const u32 *property;
int len;
dt_node = of_find_node_by_path(path);
if (!dt_node) {
printk(KERN_ERR "(E) Failed to find device-tree node: %s\n", path);
return -ENODEV;
}
printk(KERN_INFO "(I) Found device-tree node. Now retrieving property.\n");
property = of_get_property(dt_node, "reg", &len);
printk(KERN_INFO "(I) len=%d\n", len);
printk(KERN_INFO "(I) reg[0]=0x%08lX\n", (unsigned long) property[0]);
printk(KERN_INFO "(I) reg[1]=0x%08lX\n", (unsigned long) property[1]);
printk(KERN_INFO "(I) reg[2]=0x%08lX\n", (unsigned long) property[2]);
printk(KERN_INFO "(I) reg[3]=0x%08lX\n", (unsigned long) property[3]);
Ошибка сегмента произошла на некоторых путях дерева устройств. Видимо, произошла какая-то ошибка типо. В конечном итоге я исправил проблему, исследуя корневой путь, а затем некоторые другие базовые узлы (например, / cpu0, / memory и т. Д.), И, наконец, я смог проверить свою fpga. Я не уверен, что действительно изменилось, но теперь я могу правильно ссылаться на узел дерева устройств моей ПЛИС, используя приведенный выше код.
Спасибо за помощь! :)