dtb_load.c 1.9 KB

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