9
0
Fork 0

introduce common bootstrap code

This will allow to have a generic code to create different bootstrap

As example
Barebox as TI Xloader
Barebox as AT91 Bootstrap

Signed-off-by: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Jean-Christophe PLAGNIOL-VILLARD 2013-01-22 15:40:43 +01:00 committed by Sascha Hauer
parent 345dd51467
commit df132b9d78
8 changed files with 232 additions and 0 deletions

34
include/bootstrap.h Normal file
View File

@ -0,0 +1,34 @@
/*
* Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnio@jcrosoft.com>
*
* Under GPLv2
*/
#ifndef __BOOSTRAP_H__
#define __BOOSTRAP_H__
#define bootstrap_err(fmt, arg...) printf(fmt, ##arg)
void bootstrap_boot(int (*func)(void), bool barebox);
#ifdef CONFIG_BOOTSTRAP_DEVFS
void* bootstrap_read_devfs(char *devname, bool use_bb, int offset,
int default_size, int max_size);
#else
static inline void* bootstrap_read_devfs(char *devname, bool use_bb, int offset,
int default_size, int max_size)
{
return NULL;
}
#endif
#ifdef CONFIG_BOOTSTRAP_DISK
void* bootstrap_read_disk(char *devname, char *fstype);
#else
static inline void* bootstrap_read_disk(char *devname, char *fstype)
{
return NULL;
}
#endif
#endif /* __BOOSTRAP_H__ */

View File

@ -52,4 +52,6 @@ config LIBMTD
source lib/gui/Kconfig
source lib/bootstrap/Kconfig
endmenu

View File

@ -1,3 +1,4 @@
obj-$(CONFIG_BOOTSTRAP) += bootstrap/
obj-y += ctype.o
obj-y += rbtree.o
obj-y += display_options.o

13
lib/bootstrap/Kconfig Normal file
View File

@ -0,0 +1,13 @@
menuconfig BOOTSTRAP
bool "Library bootstrap routines "
depends on SHELL_NONE
if BOOTSTRAP
config BOOTSTRAP_DEVFS
bool "devfs support"
config BOOTSTRAP_DISK
bool "disk support"
endif

3
lib/bootstrap/Makefile Normal file
View File

@ -0,0 +1,3 @@
obj-y += common.o
obj-$(CONFIG_BOOTSTRAP_DEVFS) += devfs.o
obj-$(CONFIG_BOOTSTRAP_DISK) += disk.o

24
lib/bootstrap/common.c Normal file
View File

@ -0,0 +1,24 @@
/*
* Copyright (C) 2011 Sascha Hauer, Pengutronix
* Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnio@jcrosoft.com>
*
* Under GPLv2
*/
#include <common.h>
#include <bootstrap.h>
#include <filetype.h>
void bootstrap_boot(int (*func)(void), bool barebox)
{
if (!func)
return;
if (barebox && !is_barebox_head((void*)func))
return;
shutdown_barebox();
func();
while (1);
}

118
lib/bootstrap/devfs.c Normal file
View File

@ -0,0 +1,118 @@
/*
* Copyright (C) 2011 Sascha Hauer, Pengutronix
* Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnio@jcrosoft.com>
*
* Under GPLv2
*/
#include <common.h>
#include <partition.h>
#include <nand.h>
#include <driver.h>
#include <linux/mtd/mtd.h>
#include <fcntl.h>
#include <filetype.h>
#include <sizes.h>
#include <errno.h>
#include <malloc.h>
#include <bootstrap.h>
#if defined(CONFIG_ARM) || defined(CONFIG_MIPS)
#if defined(CONFIG_ARM)
#define BAREBOX_HEAD_SIZE ARM_HEAD_SIZE
#define BAREBOX_HEAD_SIZE_OFFSET ARM_HEAD_SIZE_OFFSET
#elif defined(CONFIG_MIPS)
#define BAREBOX_HEAD_SIZE MIPS_HEAD_SIZE
#define BAREBOX_HEAD_SIZE_OFFSET MIPS_HEAD_SIZE_OFFSET
#endif
static void *read_image_head(const char *name)
{
void *header = xmalloc(BAREBOX_HEAD_SIZE);
struct cdev *cdev;
int ret;
cdev = cdev_open(name, O_RDONLY);
if (!cdev) {
bootstrap_err("failed to open partition\n");
return NULL;
}
ret = cdev_read(cdev, header, BAREBOX_HEAD_SIZE, 0, 0);
cdev_close(cdev);
if (ret != BAREBOX_HEAD_SIZE) {
bootstrap_err("failed to read from partition\n");
return NULL;
}
return header;
}
static unsigned int get_image_size(void *head)
{
unsigned int ret = 0;
unsigned int *psize = head + BAREBOX_HEAD_SIZE_OFFSET;
if (is_barebox_head(head))
ret = *psize;
debug("Detected barebox image size %u\n", ret);
return ret;
}
#else
static void *read_image_head(const char *name)
{
return NULL;
}
static unsigned int get_image_size(void *head)
{
return 0;
}
#endif
void* bootstrap_read_devfs(char *devname, bool use_bb, int offset,
int default_size, int max_size)
{
int ret;
int size = 0;
void *to, *header;
struct cdev *cdev;
char *partname = "x";
devfs_add_partition(devname, offset, max_size, DEVFS_PARTITION_FIXED, partname);
if (use_bb) {
dev_add_bb_dev(partname, "bbx");
partname = "bbx";
}
header = read_image_head(partname);
if (header) {
size = get_image_size(header);
if (!size)
bootstrap_err("%s: failed to get image size\n", devname);
}
if (!size) {
size = default_size;
bootstrap_err("%s: failed to detect barebox and it's image size so use %d\n",
devname, size);
}
to = xmalloc(size);
cdev = cdev_open(partname, O_RDONLY);
if (!cdev) {
bootstrap_err("%s: failed to open %s\n", devname, partname);
return NULL;
}
ret = cdev_read(cdev, to, size, 0, 0);
if (ret != size) {
bootstrap_err("%s: failed to read from %s\n", devname, partname);
return NULL;
}
return to;
}

37
lib/bootstrap/disk.c Normal file
View File

@ -0,0 +1,37 @@
/*
* Copyright (C) 2011 Sascha Hauer, Pengutronix
* Copyright (C) 2012 Jean-Christophe PLAGNIOL-VILLARD <plagnio@jcrosoft.com>
*
* Under GPLv2
*/
#include <common.h>
#include <fs.h>
#include <fcntl.h>
#include <sizes.h>
#include <errno.h>
#include <malloc.h>
#include <bootstrap.h>
void* bootstrap_read_disk(char *dev, char *fstype)
{
int ret;
void *buf;
int len;
char *path = "/";
ret = mount(dev, fstype, path);
if (ret) {
bootstrap_err("mounting %s failed with %d\n", dev, ret);
return NULL;
}
buf = read_file("/barebox.bin", &len);
if (!buf) {
bootstrap_err("could not read barebox.bin from %s\n", dev);
umount(path);
return NULL;
}
return buf;
}