@ -30,8 +30,14 @@ int quiet; /* Level of quietness */
int reservenum; /* Number of memory reservation slots */
int reservenum; /* Number of memory reservation slots */
int minsize; /* Minimum blob size */
int minsize; /* Minimum blob size */
int padsize; /* Additional padding to blob */
int padsize; /* Additional padding to blob */
int alignsize; /* Additional padding to blob accroding to the alignsize */
int phandle_format = PHANDLE_BOTH; /* Use linux,phandle or phandle properties */
int phandle_format = PHANDLE_BOTH; /* Use linux,phandle or phandle properties */
static int is_power_of_2(int x)
{
return (x > 0) && ((x & (x - 1)) == 0);
}
static void fill_fullpaths(struct node *tree, const char *prefix)
static void fill_fullpaths(struct node *tree, const char *prefix)
{
{
struct node *child;
struct node *child;
@ -53,7 +59,7 @@ static void fill_fullpaths(struct node *tree, const char *prefix)
#define FDT_VERSION(version) _FDT_VERSION(version)
#define FDT_VERSION(version) _FDT_VERSION(version)
#define _FDT_VERSION(version) #version
#define _FDT_VERSION(version) #version
static const char usage_synopsis[] = "dtc [options] <input file>";
static const char usage_synopsis[] = "dtc [options] <input file>";
static const char usage_short_opts[] = "qI:O:o:V:d:R:S:p:fb:i:H:sW:E:hv";
static const char usage_short_opts[] = "qI:O:o:V:d:R:S:p:a:fb:i:H:sW:E:hv";
static struct option const usage_long_opts[] = {
static struct option const usage_long_opts[] = {
{"quiet", no_argument, NULL, 'q'},
{"quiet", no_argument, NULL, 'q'},
{"in-format", a_argument, NULL, 'I'},
{"in-format", a_argument, NULL, 'I'},
@ -64,6 +70,7 @@ static struct option const usage_long_opts[] = {
{"reserve", a_argument, NULL, 'R'},
{"reserve", a_argument, NULL, 'R'},
{"space", a_argument, NULL, 'S'},
{"space", a_argument, NULL, 'S'},
{"pad", a_argument, NULL, 'p'},
{"pad", a_argument, NULL, 'p'},
{"align", a_argument, NULL, 'a'},
{"boot-cpu", a_argument, NULL, 'b'},
{"boot-cpu", a_argument, NULL, 'b'},
{"force", no_argument, NULL, 'f'},
{"force", no_argument, NULL, 'f'},
{"include", a_argument, NULL, 'i'},
{"include", a_argument, NULL, 'i'},
@ -91,6 +98,7 @@ static const char * const usage_opts_help[] = {
"\n\tMake space for <number> reserve map entries (for dtb and asm output)",
"\n\tMake space for <number> reserve map entries (for dtb and asm output)",
"\n\tMake the blob at least <bytes> long (extra space)",
"\n\tMake the blob at least <bytes> long (extra space)",
"\n\tAdd padding to the blob of <bytes> long (extra space)",
"\n\tAdd padding to the blob of <bytes> long (extra space)",
"\n\tMake the blob align to the <bytes> (extra space)",
"\n\tSet the physical boot cpu",
"\n\tSet the physical boot cpu",
"\n\tTry to produce output even if the input tree has errors",
"\n\tTry to produce output even if the input tree has errors",
"\n\tAdd a path to search for include files",
"\n\tAdd a path to search for include files",
@ -169,6 +177,7 @@ int main(int argc, char *argv[])
reservenum = 0;
reservenum = 0;
minsize = 0;
minsize = 0;
padsize = 0;
padsize = 0;
alignsize = 0;
while ((opt = util_getopt_long()) != EOF) {
while ((opt = util_getopt_long()) != EOF) {
switch (opt) {
switch (opt) {
@ -196,6 +205,12 @@ int main(int argc, char *argv[])
case 'p':
case 'p':
padsize = strtol(optarg, NULL, 0);
padsize = strtol(optarg, NULL, 0);
break;
break;
case 'a':
alignsize = strtol(optarg, NULL, 0);
if (!is_power_of_2(alignsize))
die("Invalid argument \"%d\" to -a option\n",
optarg);
break;
case 'f':
case 'f':
force = true;
force = true;
break;
break;