mail archive of the barebox mailing list
 help / color / mirror / Atom feed
From: Gaurav Singh <gausinghnsit@gmail.com>
To: Juergen Beisert <jbe@pengutronix.de>,
	Sascha Hauer <s.hauer@pengutronix.de>
Cc: barebox@lists.infradead.org
Subject: Re: Failing to load Barebox Environment
Date: Thu, 30 Sep 2010 12:09:22 +0530	[thread overview]
Message-ID: <AANLkTikrna=mcBoayqbAezJdvuo1oUhs3XEUrf+W3kpA@mail.gmail.com> (raw)
In-Reply-To: <201009291123.19306.jbe@pengutronix.de>

Hi Sascha, Juergen,
I did a rather crude workaround for this. Copied the NAND partition
containing the environment from NAND on startup into a file using
run_command.
run_command("cp /dev/env0 /env_temp",0);
then
envfs_load("/env_temp", "/env")

This is working fine.
I think - overall the enfs_load logic has to be tweaked for NAND devices.

Now I wrote a new enfs_nand_load function - This basically reads a
Page of NAND (which works fine if my env file is less than 4096 :))
into the buffer and manipulates it to prepare the Environment
correctly. So basically we can read the entire environment partition
from NAND in one go and then manipulate it to prepare the env in RAM.

int envfs_nand_load(char *filename, char *dir)
{
        struct envfs_super* super;
        void *buf = NULL, *buf_free = NULL;
        int envfd;
        int fd, ret = 0;
        char *str, *tmp;
        int namelen_full;
        unsigned long size;

        envfd = open(filename, O_RDONLY);
        if (envfd < 0) {
                printf("Open %s %s\n", filename, errno_str());
                return -1;
        }
        /* Reading a Page into Buf */
        size = ENVFS_32(4096);
        buf = xzalloc(size);
        buf_free = buf;
        printf("1\n");
        ret = read(envfd, buf, size);
        if (ret < size) {
                perror("read");
                ret = errno;
                goto out;
        }

        super = (struct envfs_super *)buf;

        if ( ENVFS_32(super->magic) != ENVFS_MAGIC) {
                printf("envfs: wrong magic on %s\n", filename);
                ret = -EIO;
                goto out;
        }

        if (crc32(0, (unsigned char *)super, sizeof(struct envfs_super) - 4)
                   != ENVFS_32(super->sb_crc)) {
                printf("wrong crc on env superblock\n");
                ret = -EIO;
                goto out;
        }

        void *buf2;
        size = ENVFS_32(super->size);
        /* Rest on ENV except Superblock to be kept in buf2 */
        buf2 = (void *)((char *)buf + sizeof(struct envfs_super));

        if (crc32(0, (unsigned char *)buf2, size)
                     != ENVFS_32(super->crc)) {
                printf("wrong crc on env\n");
                ret = -EIO;
                goto out;
        }

        while (size) {
                struct envfs_inode *inode;
                uint32_t inode_size, inode_namelen;

                inode = (struct envfs_inode *)buf2;

                if (ENVFS_32(inode->magic) != ENVFS_INODE_MAGIC) {
                        printf("envfs: wrong magic on %s\n", filename);
                        ret = -EIO;
                        goto out;
                }
                inode_size = ENVFS_32(inode->size);
                inode_namelen = ENVFS_32(inode->namelen);

                debug("loading %s size %d namelen %d\n", inode->data,
                        inode_size, inode_namelen);

                str = concat_path_file(dir, inode->data);
                tmp = strdup(str);
                make_directory(dirname(tmp));
                free(tmp);

                fd = open(str, O_WRONLY | O_CREAT | O_TRUNC, 0644);
                free(str);
                if (fd < 0) {
                        printf("Open %s\n", errno_str());
                        ret = fd;
                        goto out;
                }

                namelen_full = PAD4(inode_namelen);
                ret = write(fd, buf2 + namelen_full + sizeof(struct
envfs_inode),
                                inode_size);
                if (ret < inode_size) {
                        perror("write");
                        ret = errno;
                        close(fd);
                        goto out;
                }

                close(fd);

                buf2 += PAD4(inode_namelen) + PAD4(inode_size) +
                                sizeof(struct envfs_inode);
                size -= PAD4(inode_namelen) + PAD4(inode_size) +
                                sizeof(struct envfs_inode);
        }

        ret = 0;
out:
        close(envfd);
        if (buf_free)
                free(buf_free);
        return ret;
}




On Wed, Sep 29, 2010 at 2:53 PM, Juergen Beisert <jbe@pengutronix.de> wrote:
> Juergen Beisert wrote:
>> Just a note:
>>
>> You configure:
>> > >> devfs_add_partition("nand0", 0x00000, 0x200000, PARTITION_FIXED,
>> > >> "self_raw"); dev_add_bb_dev("self_raw", "self0");
>> > >> devfs_add_partition("nand0", 0x200000, 0x200000, PARTITION_FIXED,
>> > >> "env_raw"); dev_add_bb_dev("env_raw", "env0");
>>
>> And then:
>> > EVB2065> addpart /dev/nand0 4M(barebox)ro,2M(kernel)ro,-(root)
>>
>> Both must match!
>>
>> Try instead:
>>
>> EVB2065> addpart /dev/nand0 256k(barebox)ro,256k(env),2M(kernel)ro,-(root)
>>
>> jbe
>
> Ups, sorry: 0x200000 != 256k (didn't count the '0' right...)
>
> EVB2065> addpart /dev/nand0 2M(barebox)ro,2M(env),2M(kernel)ro,-(root)
>
> jbe
>
> --
> Pengutronix e.K.                              | Juergen Beisert             |
> Linux Solutions for Science and Industry      | Phone: +49-8766-939 228     |
> Vertretung Sued/Muenchen, Germany             | Fax:   +49-5121-206917-5555 |
> Amtsgericht Hildesheim, HRA 2686              | http://www.pengutronix.de/  |
>

_______________________________________________
barebox mailing list
barebox@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/barebox

  parent reply	other threads:[~2010-09-30  6:39 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-09-29  6:50 Gaurav Singh
2010-09-29  7:29 ` Juergen Beisert
2010-09-29  7:48 ` Sascha Hauer
2010-09-29  9:01   ` Gaurav Singh
2010-09-29  9:08     ` Juergen Beisert
2010-09-29  9:14       ` Gaurav Singh
2010-09-29  9:23       ` Juergen Beisert
2010-09-29 10:03         ` Gaurav Singh
2010-09-29 10:08           ` Gaurav Singh
2010-09-30  6:39         ` Gaurav Singh [this message]
2010-10-01 11:10           ` Gaurav Singh

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='AANLkTikrna=mcBoayqbAezJdvuo1oUhs3XEUrf+W3kpA@mail.gmail.com' \
    --to=gausinghnsit@gmail.com \
    --cc=barebox@lists.infradead.org \
    --cc=jbe@pengutronix.de \
    --cc=s.hauer@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox