dtb_load.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /*
  2. * Copyright (c) 2006-2022, RT-Thread Development Team
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include "libfdt.h"
  7. #include <unistd.h>
  8. #include "dtb_node.h"
  9. extern int fdt_exec_status;
  10. rt_bool_t dtb_node_check(void *fdt)
  11. {
  12. return fdt_check_header(fdt) == 0 ? RT_TRUE : RT_FALSE;
  13. }
  14. void *dtb_node_load_from_fs(char *dtb_filename)
  15. {
  16. void *fdt = NULL;
  17. size_t dtb_sz;
  18. int fd = -1;
  19. if (dtb_filename == NULL)
  20. {
  21. fdt_exec_status = FDT_RET_GET_EMPTY;
  22. goto end;
  23. }
  24. fd = open(dtb_filename, O_RDONLY, 0);
  25. if (fd == -1)
  26. {
  27. rt_kprintf("File `%s' not found.\n", dtb_filename);
  28. fdt_exec_status = FDT_RET_GET_EMPTY;
  29. goto end;
  30. }
  31. dtb_sz = lseek(fd, 0, SEEK_END);
  32. if (dtb_sz > 0)
  33. {
  34. if ((fdt = (struct fdt_header *)malloc(sizeof(uint8_t) * dtb_sz)) == NULL)
  35. {
  36. fdt_exec_status = FDT_RET_NO_MEMORY;
  37. goto end;
  38. }
  39. lseek(fd, 0, SEEK_SET);
  40. read(fd, fdt, sizeof(uint8_t) * dtb_sz);
  41. if (dtb_node_check(fdt) == RT_FALSE)
  42. {
  43. free(fdt);
  44. }
  45. }
  46. end:
  47. if (fd != -1)
  48. {
  49. close(fd);
  50. }
  51. return fdt;
  52. }
  53. void *dtb_node_load_from_memory(void *dtb_ptr, rt_bool_t is_clone)
  54. {
  55. void *fdt = NULL;
  56. if (dtb_ptr == NULL)
  57. {
  58. fdt_exec_status = FDT_RET_GET_EMPTY;
  59. goto end;
  60. }
  61. if (dtb_node_check(dtb_ptr) == RT_FALSE)
  62. {
  63. fdt_exec_status = FDT_RET_GET_EMPTY;
  64. fdt = NULL;
  65. goto end;
  66. }
  67. if (is_clone)
  68. {
  69. size_t dtb_sz = fdt_totalsize(dtb_ptr);
  70. if (dtb_sz > 0)
  71. {
  72. if ((fdt = malloc(dtb_sz)) != NULL)
  73. {
  74. memcpy(fdt, dtb_ptr, dtb_sz);
  75. }
  76. else
  77. {
  78. fdt_exec_status = FDT_RET_NO_MEMORY;
  79. }
  80. }
  81. }
  82. else
  83. {
  84. fdt = dtb_ptr;
  85. }
  86. end:
  87. return fdt;
  88. }