fdt_test.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include <rtthread.h>
  2. #include "dtb_node.h"
  3. int dtb_test()
  4. {
  5. void *fdt;
  6. if ((fdt = dtb_node_load_from_fs("vexpress-v2p-ca9.dtb")) != RT_NULL)
  7. {
  8. struct dtb_node *dtb_node_list = dtb_node_get_dtb_list(fdt);
  9. if (dtb_node_list != RT_NULL)
  10. {
  11. struct dtb_node *serial0 = dtb_node_get_dtb_node_by_path(dtb_node_list, "/smb@4000000/motherboard/iofpga@7,00000000/uart@9000");
  12. struct dtb_node *cpu = dtb_node_get_dtb_node_by_path(dtb_node_list, "/cpus");
  13. struct dtb_node *user1 = dtb_node_get_dtb_node_by_path(dtb_node_list, "/smb@4000000/motherboard/leds/user1");
  14. if (serial0 != RT_NULL)
  15. {
  16. int property_size;
  17. rt_uint32_t u32_value;
  18. rt_uint32_t *u32_ptr;
  19. char *str_ptr;
  20. rt_kprintf("name = %s\n", serial0->name);
  21. rt_kputs("reg = <");
  22. for_each_property_cell(serial0, "reg", u32_value, u32_ptr, property_size)
  23. {
  24. rt_kprintf("0x%x,", u32_value);
  25. }
  26. rt_kputs("\b>;\n");
  27. rt_kputs("compatible = ");
  28. for_each_property_string(serial0, "compatible", str_ptr, property_size)
  29. {
  30. rt_kprintf("\"%s\",", str_ptr);
  31. }
  32. rt_kputs("\b;\n");
  33. }
  34. if (cpu != RT_NULL)
  35. {
  36. struct dtb_node *cpu_child = cpu;
  37. rt_kprintf("\nname = %s\n", cpu->name);
  38. for_each_node_child(cpu_child)
  39. {
  40. rt_kprintf("path = %s\n", cpu_child->path);
  41. }
  42. }
  43. if (user1 != RT_NULL)
  44. {
  45. struct dtb_node *user = user1;
  46. rt_kprintf("\nname = %s, lable = %s\n", user1->name, dtb_node_get_dtb_node_property(user1, "label", RT_NULL));
  47. for_each_node_sibling(user)
  48. {
  49. rt_kprintf("name = %s, lable = %s\n", user->name, dtb_node_get_dtb_node_property(user, "label", RT_NULL));
  50. }
  51. }
  52. }
  53. dtb_node_free_dtb_list(dtb_node_list);
  54. }
  55. if ((fdt = dtb_node_load_from_fs("bcm2711-rpi-4-b.dtb")) != RT_NULL)
  56. {
  57. struct dtb_node *dtb_node_list = dtb_node_get_dtb_list(fdt);
  58. if (dtb_node_list != RT_NULL)
  59. {
  60. struct dtb_node *bt_pins;
  61. int memreserve_size;
  62. struct dtb_memreserve *memreserve;
  63. bt_pins = dtb_node_get_dtb_node_by_name_DFS(dtb_node_list, "bt_pins");
  64. bt_pins = dtb_node_get_dtb_node_by_name_BFS(dtb_node_list, bt_pins->name);
  65. bt_pins = dtb_node_get_dtb_node_by_phandle_DFS(dtb_node_list, bt_pins->handle);
  66. bt_pins = dtb_node_get_dtb_node_by_phandle_BFS(dtb_node_list, bt_pins->handle);
  67. memreserve = dtb_node_get_dtb_memreserve(bt_pins, &memreserve_size);
  68. if (memreserve_size > 0)
  69. {
  70. int i;
  71. for (i = 0; i < memreserve_size; ++i)
  72. {
  73. rt_kputs("\n/memreserve/\t");
  74. if (IN_64BITS_MODE)
  75. {
  76. rt_kprintf("0x%016x 0x%016x;", memreserve[i].address, memreserve[i].size);
  77. }
  78. else
  79. {
  80. rt_kprintf("0x%08x%08x 0x%08x%08x;", memreserve[i].address, memreserve[i].size);
  81. }
  82. }
  83. }
  84. if (bt_pins != RT_NULL)
  85. {
  86. int property_size;
  87. rt_uint8_t u8_value;
  88. rt_uint8_t *u8_ptr;
  89. rt_kprintf("\n\nphandle = <0x%x>\n", bt_pins->handle);
  90. rt_kprintf("name = %s\n", bt_pins->name);
  91. rt_kprintf("path = %s\n", bt_pins->path);
  92. rt_kputs("brcm,pins = [");
  93. for_each_property_byte(bt_pins, "brcm,pins", u8_value, u8_ptr, property_size)
  94. {
  95. rt_kprintf("%02x ", u8_value);
  96. }
  97. rt_kputs("\b]\n");
  98. }
  99. }
  100. dtb_node_free_dtb_list(dtb_node_list);
  101. }
  102. return 0;
  103. }
  104. MSH_CMD_EXPORT(dtb_test, dtb API test);
  105. int dtb_dump(int argc, char** argv)
  106. {
  107. struct dtb_node *dtb_root_node = get_dtb_node_head();
  108. if(argc == 1)
  109. {
  110. if (dtb_root_node != RT_NULL)
  111. {
  112. dtb_node_get_dts_dump(dtb_root_node);
  113. }
  114. }
  115. else
  116. {
  117. rt_kprintf("invailed parameter\n");
  118. }
  119. return 0;
  120. }
  121. MSH_CMD_EXPORT(dtb_dump, dtb dump from mem);