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