@@ -33,190 +33,190 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33
33
34
34
static void usage (void )
35
35
{
36
- printf ("Usage:\n" );
37
- printf (" dtmerge [<options] <base dtb> <merged dtb> - [param=value] ...\n" );
38
- printf (" to apply a parameter to the base dtb (like dtparam)\n" );
39
- printf (" dtmerge [<options] <base dtb> <merged dtb> <overlay dtb> [param=value] ...\n" );
40
- printf (" to apply an overlay with parameters (like dtoverlay)\n" );
41
- printf (" where <options> is any of:\n" );
42
- printf (" -d Enable debug output\n" );
43
- printf (" -h Show this help message\n" );
44
- exit (1 );
36
+ printf ("Usage:\n" );
37
+ printf (" dtmerge [<options] <base dtb> <merged dtb> - [param=value] ...\n" );
38
+ printf (" to apply a parameter to the base dtb (like dtparam)\n" );
39
+ printf (" dtmerge [<options] <base dtb> <merged dtb> <overlay dtb> [param=value] ...\n" );
40
+ printf (" to apply an overlay with parameters (like dtoverlay)\n" );
41
+ printf (" where <options> is any of:\n" );
42
+ printf (" -d Enable debug output\n" );
43
+ printf (" -h Show this help message\n" );
44
+ exit (1 );
45
45
}
46
46
47
47
int main (int argc , char * * argv )
48
48
{
49
- const char * base_file ;
50
- const char * merged_file ;
51
- const char * overlay_file ;
52
- const char * compatible ;
53
- char * overlay_dir ;
54
- char * p ;
55
- DTBLOB_T * base_dtb ;
56
- DTBLOB_T * overlay_dtb ;
57
- int err ;
58
- int argn = 1 ;
59
- int max_dtb_size = 100000 ;
60
- int compatible_len ;
61
-
62
- while ((argn < argc ) && (argv [argn ][0 ] == '-' ))
63
- {
64
- const char * arg = argv [argn ++ ];
65
- if ((strcmp (arg , "-d" ) == 0 ) ||
66
- (strcmp (arg , "--debug" ) == 0 ))
67
- dtoverlay_enable_debug (1 );
68
- else if ((strcmp (arg , "-h" ) == 0 ) ||
69
- (strcmp (arg , "--help" ) == 0 ))
70
- usage ();
71
- else
72
- {
73
- printf ("* Unknown option '%s'\n" , arg );
74
- usage ();
75
- }
76
- }
77
-
78
- if (argc < (argn + 3 ))
79
- {
80
- usage ();
81
- }
82
-
83
- base_file = argv [argn ++ ];
84
- merged_file = argv [argn ++ ];
85
- overlay_file = argv [argn ++ ];
86
-
87
- base_dtb = dtoverlay_load_dtb (base_file , max_dtb_size );
88
- if (!base_dtb )
89
- {
90
- printf ("* failed to load '%s'\n" , base_file );
91
- return -1 ;
92
- }
93
-
94
- if (strnlen (overlay_file , DTOVERLAY_MAX_PATH ) == DTOVERLAY_MAX_PATH )
95
- {
96
- printf ("* overlay filename too long\n" );
97
- return -1 ;
98
- }
99
-
100
- overlay_dir = strdup (overlay_file );
101
- p = strrchr (overlay_dir , '/' );
102
- if (p )
103
- * p = 0 ;
104
- else
105
- overlay_dir = "." ;
106
-
107
- compatible = dtoverlay_get_property (base_dtb ,
108
- dtoverlay_find_node (base_dtb , "/" , 1 ),
109
- "compatible" , & compatible_len );
110
- dtoverlay_init_map (overlay_dir , compatible , compatible_len );
111
-
112
- err = dtoverlay_set_synonym (base_dtb , "i2c" , "i2c0" );
113
- err = dtoverlay_set_synonym (base_dtb , "i2c_arm" , "i2c0" );
114
- err = dtoverlay_set_synonym (base_dtb , "i2c_vc" , "i2c1" );
115
- err = dtoverlay_set_synonym (base_dtb , "i2c_baudrate" , "i2c0_baudrate" );
116
- err = dtoverlay_set_synonym (base_dtb , "i2c_arm_baudrate" , "i2c0_baudrate" );
117
- err = dtoverlay_set_synonym (base_dtb , "i2c_vc_baudrate" , "i2c1_baudrate" );
118
-
119
- if (strcmp (overlay_file , "-" ) == 0 )
120
- {
121
- overlay_dtb = base_dtb ;
122
- }
123
- else
124
- {
125
- char new_file [DTOVERLAY_MAX_PATH ];
126
- char * overlay_name ;
127
- const char * new_name ;
128
- char * p ;
129
- int len ;
130
-
131
- strcpy (new_file , overlay_file );
132
- overlay_name = strrchr (new_file , '/' );
133
- if (overlay_name )
134
- overlay_name ++ ;
135
- else
136
- overlay_name = new_file ;
137
- p = strrchr (overlay_name , '.' );
138
- if (p )
139
- * p = 0 ;
140
- new_name = dtoverlay_remap_overlay (overlay_name );
141
- if (new_name )
142
- {
143
- if (strcmp (overlay_name , new_name ))
144
- dtoverlay_debug ("mapped overlay '%s' to '%s'" , overlay_name , new_name );
145
-
146
- len = strlen (new_name );
147
- memmove (overlay_name , new_name , len );
148
- strcpy (overlay_name + len , ".dtbo" );
149
-
150
- overlay_dtb = dtoverlay_load_dtb (new_file , max_dtb_size );
151
- if (overlay_dtb )
152
- err = dtoverlay_fixup_overlay (base_dtb , overlay_dtb );
153
- else
154
- err = -1 ;
155
- }
156
- else
157
- {
158
- overlay_dtb = NULL ;
159
- err = -2 ;
160
- }
161
- }
162
-
163
- while (!err && (argn < argc ))
164
- {
165
- char * param_name = argv [argn ++ ];
166
- char * param_value = param_name + strcspn (param_name , "=" );
167
- const void * override_data ;
168
- int data_len ;
169
-
170
- if (* param_value == '=' )
171
- {
172
- * (param_value ++ ) = '\0' ;
173
- }
174
- else
175
- {
176
- /* This isn't a well-formed parameter assignment, but it can be
177
- treated as an assignment of true. */
178
- param_value = "true" ;
179
- }
180
-
181
- override_data = dtoverlay_find_override (overlay_dtb , param_name ,
182
- & data_len );
183
- if (override_data )
184
- {
185
- err = dtoverlay_apply_override (overlay_dtb , param_name ,
186
- override_data , data_len ,
187
- param_value );
188
- }
189
- else
190
- {
191
- override_data = dtoverlay_find_override (base_dtb , param_name , & data_len );
192
- if (override_data )
193
- {
194
- err = dtoverlay_apply_override (base_dtb , param_name ,
195
- override_data , data_len ,
196
- param_value );
197
- }
198
- else
199
- {
200
- printf ("* unknown param '%s'\n" , param_name );
201
- err = data_len ;
202
- }
203
- }
204
- }
205
-
206
- if (!err && (overlay_dtb != base_dtb ))
207
- {
208
- err = dtoverlay_merge_overlay (base_dtb , overlay_dtb );
209
-
210
- dtoverlay_free_dtb (overlay_dtb );
211
- }
212
-
213
- if (!err )
214
- {
215
- dtoverlay_pack_dtb (base_dtb );
216
- err = dtoverlay_save_dtb (base_dtb , merged_file );
217
- }
218
-
219
- dtoverlay_free_dtb (base_dtb );
220
-
221
- return err ;
49
+ const char * base_file ;
50
+ const char * merged_file ;
51
+ const char * overlay_file ;
52
+ const char * compatible ;
53
+ char * overlay_dir ;
54
+ char * p ;
55
+ DTBLOB_T * base_dtb ;
56
+ DTBLOB_T * overlay_dtb ;
57
+ int err ;
58
+ int argn = 1 ;
59
+ int max_dtb_size = 100000 ;
60
+ int compatible_len ;
61
+
62
+ while ((argn < argc ) && (argv [argn ][0 ] == '-' ))
63
+ {
64
+ const char * arg = argv [argn ++ ];
65
+ if ((strcmp (arg , "-d" ) == 0 ) ||
66
+ (strcmp (arg , "--debug" ) == 0 ))
67
+ dtoverlay_enable_debug (1 );
68
+ else if ((strcmp (arg , "-h" ) == 0 ) ||
69
+ (strcmp (arg , "--help" ) == 0 ))
70
+ usage ();
71
+ else
72
+ {
73
+ printf ("* Unknown option '%s'\n" , arg );
74
+ usage ();
75
+ }
76
+ }
77
+
78
+ if (argc < (argn + 3 ))
79
+ {
80
+ usage ();
81
+ }
82
+
83
+ base_file = argv [argn ++ ];
84
+ merged_file = argv [argn ++ ];
85
+ overlay_file = argv [argn ++ ];
86
+
87
+ base_dtb = dtoverlay_load_dtb (base_file , max_dtb_size );
88
+ if (!base_dtb )
89
+ {
90
+ printf ("* failed to load '%s'\n" , base_file );
91
+ return -1 ;
92
+ }
93
+
94
+ if (strnlen (overlay_file , DTOVERLAY_MAX_PATH ) == DTOVERLAY_MAX_PATH )
95
+ {
96
+ printf ("* overlay filename too long\n" );
97
+ return -1 ;
98
+ }
99
+
100
+ overlay_dir = strdup (overlay_file );
101
+ p = strrchr (overlay_dir , '/' );
102
+ if (p )
103
+ * p = 0 ;
104
+ else
105
+ overlay_dir = "." ;
106
+
107
+ compatible = dtoverlay_get_property (base_dtb ,
108
+ dtoverlay_find_node (base_dtb , "/" , 1 ),
109
+ "compatible" , & compatible_len );
110
+ dtoverlay_init_map (overlay_dir , compatible , compatible_len );
111
+
112
+ err = dtoverlay_set_synonym (base_dtb , "i2c" , "i2c0" );
113
+ err = dtoverlay_set_synonym (base_dtb , "i2c_arm" , "i2c0" );
114
+ err = dtoverlay_set_synonym (base_dtb , "i2c_vc" , "i2c1" );
115
+ err = dtoverlay_set_synonym (base_dtb , "i2c_baudrate" , "i2c0_baudrate" );
116
+ err = dtoverlay_set_synonym (base_dtb , "i2c_arm_baudrate" , "i2c0_baudrate" );
117
+ err = dtoverlay_set_synonym (base_dtb , "i2c_vc_baudrate" , "i2c1_baudrate" );
118
+
119
+ if (strcmp (overlay_file , "-" ) == 0 )
120
+ {
121
+ overlay_dtb = base_dtb ;
122
+ }
123
+ else
124
+ {
125
+ char new_file [DTOVERLAY_MAX_PATH ];
126
+ char * overlay_name ;
127
+ const char * new_name ;
128
+ char * p ;
129
+ int len ;
130
+
131
+ strcpy (new_file , overlay_file );
132
+ overlay_name = strrchr (new_file , '/' );
133
+ if (overlay_name )
134
+ overlay_name ++ ;
135
+ else
136
+ overlay_name = new_file ;
137
+ p = strrchr (overlay_name , '.' );
138
+ if (p )
139
+ * p = 0 ;
140
+ new_name = dtoverlay_remap_overlay (overlay_name );
141
+ if (new_name )
142
+ {
143
+ if (strcmp (overlay_name , new_name ))
144
+ dtoverlay_debug ("mapped overlay '%s' to '%s'" , overlay_name , new_name );
145
+
146
+ len = strlen (new_name );
147
+ memmove (overlay_name , new_name , len );
148
+ strcpy (overlay_name + len , ".dtbo" );
149
+
150
+ overlay_dtb = dtoverlay_load_dtb (new_file , max_dtb_size );
151
+ if (overlay_dtb )
152
+ err = dtoverlay_fixup_overlay (base_dtb , overlay_dtb );
153
+ else
154
+ err = -1 ;
155
+ }
156
+ else
157
+ {
158
+ overlay_dtb = NULL ;
159
+ err = -2 ;
160
+ }
161
+ }
162
+
163
+ while (!err && (argn < argc ))
164
+ {
165
+ char * param_name = argv [argn ++ ];
166
+ char * param_value = param_name + strcspn (param_name , "=" );
167
+ const void * override_data ;
168
+ int data_len ;
169
+
170
+ if (* param_value == '=' )
171
+ {
172
+ * (param_value ++ ) = '\0' ;
173
+ }
174
+ else
175
+ {
176
+ /* This isn't a well-formed parameter assignment, but it can be
177
+ treated as an assignment of true. */
178
+ param_value = "true" ;
179
+ }
180
+
181
+ override_data = dtoverlay_find_override (overlay_dtb , param_name ,
182
+ & data_len );
183
+ if (override_data )
184
+ {
185
+ err = dtoverlay_apply_override (overlay_dtb , param_name ,
186
+ override_data , data_len ,
187
+ param_value );
188
+ }
189
+ else
190
+ {
191
+ override_data = dtoverlay_find_override (base_dtb , param_name , & data_len );
192
+ if (override_data )
193
+ {
194
+ err = dtoverlay_apply_override (base_dtb , param_name ,
195
+ override_data , data_len ,
196
+ param_value );
197
+ }
198
+ else
199
+ {
200
+ printf ("* unknown param '%s'\n" , param_name );
201
+ err = data_len ;
202
+ }
203
+ }
204
+ }
205
+
206
+ if (!err && (overlay_dtb != base_dtb ))
207
+ {
208
+ err = dtoverlay_merge_overlay (base_dtb , overlay_dtb );
209
+
210
+ dtoverlay_free_dtb (overlay_dtb );
211
+ }
212
+
213
+ if (!err )
214
+ {
215
+ dtoverlay_pack_dtb (base_dtb );
216
+ err = dtoverlay_save_dtb (base_dtb , merged_file );
217
+ }
218
+
219
+ dtoverlay_free_dtb (base_dtb );
220
+
221
+ return err ;
222
222
}
0 commit comments