Failing to load Barebox Environment
Gaurav Singh
gausinghnsit at gmail.com
Fri Oct 1 07:10:25 EDT 2010
Hi all,
Well turns out my character device inode values were being overwritten
by the NAND buffer contents... this was because I have to change
NAND_MAX_PAGESIZE from 2048 to 4096 ! I have a NAND on my board where
Page size is 4096.
It is working fine now - no need for a seperate envfs_nand_load function.
Thanks
Regards
Gaurav
On Thu, Sep 30, 2010 at 12:09 PM, Gaurav Singh <gausinghnsit at gmail.com> wrote:
> 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 at 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/ |
>>
>
More information about the barebox
mailing list