9
0
Fork 0

sandbox: add support to pass dtb to barebox

Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Marc Kleine-Budde 2015-03-03 13:14:47 +01:00 committed by Sascha Hauer
parent 1b756f5226
commit 09d343e941
5 changed files with 117 additions and 1 deletions

View File

@ -1,5 +1,6 @@
config SANDBOX
bool
select OFTREE
default y
config ARCH_TEXT_BASE

View File

@ -3,5 +3,6 @@ obj-y += clock.o
obj-y += hostfile.o
obj-y += console.o
obj-y += devices.o
obj-y += dtb.o
extra-y += barebox.lds

67
arch/sandbox/board/dtb.c Normal file
View File

@ -0,0 +1,67 @@
/*
* Copyright (c) 2013 Sascha Hauer <s.hauer@pengutronix.de>, Pengutronix
* Copyright (c) 2015 Marc Kleine-Budde <mkl@pengutronix.de>, Pengutronix
*
* See file CREDITS for list of people who contributed to this
* project.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2
* as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
*/
#include <common.h>
#include <init.h>
#include <of.h>
#include <mach/linux.h>
#include <linux/err.h>
static const void *dtb;
int barebox_register_dtb(const void *new_dtb)
{
if (dtb)
return -EBUSY;
dtb = new_dtb;
return 0;
}
static int of_sandbox_init(void)
{
struct device_node *root;
int ret;
if (dtb) {
root = of_unflatten_dtb(dtb);
} else {
root = of_new_node(NULL, NULL);
ret = of_property_write_u32(root, "#address-cells", 2);
if (ret)
return ret;
ret = of_property_write_u32(root, "#size-cells", 1);
if (ret)
return ret;
}
if (IS_ERR(root))
return PTR_ERR(root);
of_set_root_node(root);
of_fix_tree(root);
if (IS_ENABLED(CONFIG_OFDEVICE))
of_probe();
return 0;
}
core_initcall(of_sandbox_init);

View File

@ -20,6 +20,8 @@ int linux_execve(const char * filename, char *const argv[], char *const envp[]);
int barebox_register_console(char *name_template, int stdinfd, int stdoutfd);
int barebox_register_dtb(const void *dtb);
struct linux_console_data {
int stdinfd;
int stdoutfd;

View File

@ -265,6 +265,42 @@ err_out:
return -1;
}
static int add_dtb(const char *file)
{
struct stat s;
void *dtb = NULL;
int fd;
fd = open(file, O_RDONLY);
if (fd < 0) {
perror("open");
goto err_out;
}
if (fstat(fd, &s)) {
perror("fstat");
goto err_out;
}
dtb = mmap(NULL, s.st_size, PROT_READ, MAP_SHARED, fd, 0);
if (dtb == MAP_FAILED) {
perror("mmap");
goto err_out;
}
if (barebox_register_dtb(dtb))
goto err_out;
return 0;
err_out:
if (dtb)
munmap(dtb, s.st_size);
if (fd > 0)
close(fd);
return -1;
}
static void print_usage(const char*);
static struct option long_options[] = {
@ -272,6 +308,7 @@ static struct option long_options[] = {
{"malloc", 1, 0, 'm'},
{"image", 1, 0, 'i'},
{"env", 1, 0, 'e'},
{"dtb", 1, 0, 'd'},
{"stdout", 1, 0, 'O'},
{"stdin", 1, 0, 'I'},
{"xres", 1, 0, 'x'},
@ -279,7 +316,7 @@ static struct option long_options[] = {
{0, 0, 0, 0},
};
static const char optstring[] = "hm:i:e:O:I:x:y:";
static const char optstring[] = "hm:i:e:d:O:I:x:y:";
int main(int argc, char *argv[])
{
@ -308,6 +345,13 @@ int main(int argc, char *argv[])
break;
case 'e':
break;
case 'd':
ret = add_dtb(optarg);
if (ret) {
printf("Failed to load dtb: '%s'\n", optarg);
exit(1);
}
break;
case 'O':
fd = open(optarg, O_WRONLY);
if (fd < 0) {
@ -408,6 +452,7 @@ static void print_usage(const char *prgname)
" and thus are used as the default environment.\n"
" An empty file generated with dd will do to get started\n"
" with an empty environment.\n"
" -d, --dtb=<file> Map a device tree binary blob (dtb) into barebox.\n"
" -O, --stdout=<file> Register a file as a console capable of doing stdout.\n"
" <file> can be a regular file or a FIFO.\n"
" -I, --stdin=<file> Register a file as a console capable of doing stdin.\n"