9
0
Fork 0

ARM Samsung: add simple NAND barebox update handler

Signed-off-by: Michael Olbrich <m.olbrich@pengutronix.de>
Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
This commit is contained in:
Michael Olbrich 2015-02-25 17:48:42 +01:00 committed by Sascha Hauer
parent 920a49c81c
commit 0bdc1c5d11
5 changed files with 111 additions and 0 deletions

View File

@ -29,6 +29,7 @@
#include <asm/sections.h>
#include <io.h>
#include <gpio.h>
#include <mach/bbu.h>
#include <mach/iomux.h>
#include <mach/s3c-iomap.h>
#include <mach/devices-s3c24xx.h>
@ -317,6 +318,8 @@ static int mini2440_devices_init(void)
devfs_del_partition("env_raw");
devfs_add_partition("nand0", 0x40000, 0x20000, DEVFS_PARTITION_FIXED, "env_raw");
dev_add_bb_dev("env_raw", "env0");
s3c24x0_bbu_nand_register_handler();
#endif
s3c24xx_add_mci(&mci_data);
s3c24xx_add_fb(&s3c24x0_fb_data);

View File

@ -166,6 +166,12 @@ config S3C_NAND_BOOT
Add generic support to boot from NAND flash. Image loading will be
skipped if the code is running from NOR or already from SDRAM.
config BAREBOX_UPDATE_NAND_S3C24XX
bool
depends on BAREBOX_UPDATE
depends on S3C_NAND_BOOT
default y
endmenu
endif

View File

@ -8,4 +8,5 @@ obj-$(CONFIG_ARCH_S3C24xx) += gpio-s3c24x0.o clocks-s3c24xx.o mem-s3c24x0.o
obj-$(CONFIG_ARCH_S3C64xx) += gpio-s3c64xx.o clocks-s3c64xx.o mem-s3c64xx.o
obj-$(CONFIG_ARCH_S5PCxx) += gpio-s5pcxx.o clocks-s5pcxx.o mem-s5pcxx.o
pbl-$(CONFIG_ARCH_S5PCxx) += mem-s5pcxx.o
obj-$(CONFIG_BAREBOX_UPDATE_NAND_S3C24XX) += bbu-nand-s3c24x0.o
obj-$(CONFIG_S3C_LOWLEVEL_INIT) += $(obj-lowlevel-y)

View File

@ -0,0 +1,85 @@
/*
* Copyright (C) 2014 Michael Olbrich, Pengutronix
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* 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.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation.
*
*/
#include <common.h>
#include <malloc.h>
#include <bbu.h>
#include <fs.h>
#include <fcntl.h>
static int nand_update(struct bbu_handler *handler, struct bbu_data *data)
{
int fd, ret;
if (file_detect_type(data->image, data->len) != filetype_arm_barebox &&
!bbu_force(data, "Not an ARM barebox image"))
return -EINVAL;
ret = bbu_confirm(data);
if (ret)
return ret;
fd = open(data->devicefile, O_WRONLY);
if (fd < 0)
return fd;
debug("%s: eraseing %s from 0 to 0x%08x\n", __func__,
data->devicefile, data->len);
ret = erase(fd, data->len, 0);
if (ret) {
printf("erasing %s failed with %s\n", data->devicefile,
strerror(-ret));
goto err_close;
}
ret = write(fd, data->image, data->len);
if (ret < 0) {
printf("writing update to %s failed with %s\n", data->devicefile,
strerror(-ret));
goto err_close;
}
ret = 0;
err_close:
close(fd);
return ret;
}
/*
* Register a s3c24x0 update handler for NAND
*/
int s3c24x0_bbu_nand_register_handler(void)
{
struct bbu_handler *handler;
int ret;
handler = xzalloc(sizeof(*handler));
handler->devicefile = "/dev/nand0.barebox";
handler->name = "nand";
handler->handler = nand_update;
handler->flags = BBU_HANDLER_FLAG_DEFAULT;
ret = bbu_register_handler(handler);
if (ret)
free(handler);
return ret;
}

View File

@ -0,0 +1,16 @@
#ifndef __MACH_BBU_H
#define __MACH_BBU_H
#include <bbu.h>
#include <errno.h>
#ifdef CONFIG_BAREBOX_UPDATE_NAND_S3C24XX
int s3c24x0_bbu_nand_register_handler(void);
#else
static inline int s3c24x0_bbu_nand_register_handler(void)
{
return -ENOSYS;
}
#endif
#endif