love_lin

love_lin

1个粉丝

22

问答

0

专栏

1

资料

love_lin  发布于  2016-05-09 16:38:27
采纳率 0%
22个问答
9582

【已解决】uboot spi flash crc错误

 
本帖最后由 love_lin 于 2016-5-31 08:59 编辑

各位大神们,谁有遇到uboot 启动CRC校验一直错误,我用的spi flash 是:MX25L(256/257)35(E/F)
我来回答
回答14个
时间排序
认可量排序

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-05-09 16:40:28
认可0
错误log放上来, 不然不好判断

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-05-09 16:41:01
认可0
本帖最后由 ngswfx 于 2016-5-9 16:58 编辑

最后动作,加上env保存

我遇到过一次,不过是自己代码里面保存env的时候,保存代码没对。

不知你做了哪些动作。如果是启动后,saveenv,下载启动还CRC错误的话,估计flash异常了。

代码里面必须:都要执行
env_crc_update();
saveenv();

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-05-09 16:54:56
认可0
本帖最后由 ngswfx 于 2016-5-9 17:16 编辑

2片flash,呵呵,没搞过

看着像nand部分报的。


成都魏星

0个粉丝

18

问答

0

专栏

0

资料

成都魏星 2016-05-09 16:54:58
认可0
用工具重新烧一次就解决了哈

zhuangweiye

8个粉丝

0

问答

0

专栏

0

资料

zhuangweiye 2016-05-09 16:56:38
认可0
这个问题是老问题

是uboot的env的地址和实际使用时该地址被覆盖导致的

楼主可以去看一下两个地址,
一个是u-boot编译中env的地址是多少
另一个是在烧写时,uboot后面烧写的东西(比如uImage)的起始地址

如果出现地址覆盖,就会出现楼主的问题

love_lin

1个粉丝

22

问答

0

专栏

1

资料

love_lin 2016-05-09 17:05:24
认可0
本帖最后由 love_lin 于 2016-5-9 17:07 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=29758&ptid=11261]zhuangweiye 发表于 2016-5-9 16:40[/url]
错误log放上来, 不然不好判断[/quote]

这是uboot调试代码,和效果图:,我觉得是不是读写出问题?我把写入后马上读出来,两个值就不一样了。
[code]int sf_saveenv(void)
{
        u32 saved_size, saved_offset;
        char *saved_buffer = NULL;
        u32 sector = 1;
        int ret;
        u_int32_t erase_length;
        struct mtd_info_ex *spiflash_info = get_spiflash_info();

        if (!env_flash) {
                puts("Environment SPI flash not initialized\n");
                return 1;
        }

        /* Is the sector larger than the env (i.e. embedded) */
        if (CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE) {
                saved_size = CONFIG_ENV_SECT_SIZE - CONFIG_ENV_SIZE;
                saved_offset = CONFIG_ENV_OFFSET + CONFIG_ENV_SIZE;
                saved_buffer = malloc(saved_size);
                if (!saved_buffer) {
                        ret = 1;
                        goto done;
                }
                ret = spi_flash_read(env_flash, saved_offset, saved_size, saved_buffer);
                if (ret)
                        goto done;
        }

        if (CONFIG_ENV_SIZE > CONFIG_ENV_SECT_SIZE) {
                sector = CONFIG_ENV_SIZE / CONFIG_ENV_SECT_SIZE;
                if (CONFIG_ENV_SIZE % CONFIG_ENV_SECT_SIZE)
                        sector++;
        }

        erase_length = (sector * CONFIG_ENV_SECT_SIZE);
        if (erase_length < spiflash_info->erasesize)
        {
                printf("Warning: Erase size 0x%08x smaller than one "        \
                        "erase block 0x%08x\n", erase_length, spiflash_info->erasesize);
                printf("         Erasing 0x%08x instead\n", spiflash_info->erasesize);
                erase_length = spiflash_info->erasesize;
        }
        printf("Erasing SPI flash, offset 0x%08x size %s ...",
                CONFIG_ENV_OFFSET, ultohstr(erase_length));
        ret = spi_flash_erase(env_flash, CONFIG_ENV_OFFSET, erase_length);
        if (ret)
                goto done;

        printf("done\nWriting to SPI flash, offset 0x%08x size %s ...",
                CONFIG_ENV_OFFSET, ultohstr(CONFIG_ENV_SIZE));
       
        printf("-->write crc : %d\n",env_ptr->crc);
        ret = spi_flash_write(env_flash, CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE, env_ptr);
        if (ret)
                goto done;
/*debug */
        env_ptr->crc = 0;
        ret = spi_flash_read(env_flash, CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE, env_ptr);
        if (ret)
                printf("read err\n");
        else
                printf("-->read crc : %d \n",env_ptr->crc);
/*debug */


        if (CONFIG_ENV_SECT_SIZE > CONFIG_ENV_SIZE) {
                ret = spi_flash_write(env_flash, saved_offset, saved_size, saved_buffer);
                if (ret)
                        goto done;
        }

        ret = 0;
        puts("done\n");

done:
        if (saved_buffer)
                free(saved_buffer);
        return ret;
}

void sf_env_relocate_spec(void)
{
        int ret;

        env_flash = spi_flash_probe(CONFIG_ENV_SPI_BUS, CONFIG_ENV_SPI_CS,
                        CONFIG_ENV_SPI_MAX_HZ, CONFIG_ENV_SPI_MODE);
        if (!env_flash)
                goto err_probe;
        ret = spi_flash_read(env_flash, CONFIG_ENV_OFFSET, CONFIG_ENV_SIZE, env_ptr);
        if (ret)
                goto err_read;
/*debug */
        uint32_t retcrc = 0;
        retcrc = crc32(0, env_ptr->data, ENV_SIZE);
        printf("==>start crc: %d\n",env_ptr->crc);
        printf("==>crc32 retval: %d\n",retcrc);
        if (retcrc != env_ptr->crc)
                goto err_crc;
/*debug */

/*       
        if (crc32(0, env_ptr->data, ENV_SIZE) != env_ptr->crc)
                goto err_crc;
*/
        gd->env_valid = 1;

        return;

err_read:
        spi_flash_free(env_flash);
        env_flash = NULL;
err_probe:
err_crc:
        puts("*** Warning - bad CRC, using default environment\n\n");

        set_default_env();
}[/code]

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-05-09 17:19:19
认可0
本帖最后由 ngswfx 于 2016-5-9 17:22 编辑

代码的事:

代码里面:都要执行
/////先保存各种变量
env_crc_update();   计算校验
saveenv();   //写入数据以及校验


估计被改到不该改的地方了。怎么连sa的代码部分都不行了。

love_lin

1个粉丝

22

问答

0

专栏

1

资料

love_lin 2016-05-09 17:22:56
认可0
本帖最后由 love_lin 于 2016-5-9 17:24 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=29766&ptid=11261]zhuangweiye 发表于 2016-5-9 16:56[/url]
这个问题是老问题

是uboot的env的地址和实际使用时该地址被覆盖导致的
[/quote]

跟地址没太大关系,我烧的地址也足够uboot用的,我是从一个spi flash(S25FL256S)换成(MX25L(256/257)35(E/F))这个型号的,前面的型号很正常,启动如图:我不太清楚这两个型号有何区别?芯片手册没看太懂。

ngswfx

2个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-05-09 17:41:26
认可0
本帖最后由 ngswfx 于 2016-5-9 17:50 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=29774&ptid=11261]love_lin 发表于 2016-5-9 17:22[/url]
跟地址没太大关系,我烧的地址也足够uboot用的,我是从一个spi flash(S25FL256S)换成(MX25L(256/257 ...[/quote]

超出我做过的范围了。

不得其解。

如果是64K问题,U-boot应该启动不了才对,都检测出64K了。研究一下那个配置DDR SPIflash的xlm文档吧。看看那些参数需要调整的。

看信息是,CRC写失败了。那Uboot又是怎么烧进去的。:sleepy:

你不会写好芯片,才焊接的吧,如果这样,那就是电路问题了。SPI就那么几条腿,还区分写入腿,读取腿不成?:lol

查了一下,还真区分:

(1)MOSI – 主器件数据输出,从器件数据输入
(2)MISO – 主器件数据输入,从器件数据输出
///////////////////////////////////////////////////////////////////////猜测,你的片子坏了,哈哈:lol

======================================等高手吧

kenneth197

0个粉丝

16

问答

0

专栏

17

资料

kenneth197 2016-05-09 19:33:55
认可0
env 的前4个字节保存的是crc,如楼上哥们要update crc 写下去读出来才能校验通过

love_lin

1个粉丝

22

问答

0

专栏

1

资料

love_lin 2016-05-10 08:18:39
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=29791&ptid=11261]kenneth197 发表于 2016-5-9 19:33[/url]
env 的前4个字节保存的是crc,如楼上哥们要update crc 写下去读出来才能校验通过[/quote]

我试试,那能帮我看看[url]http://www.ebaina.com/bbs/forum.php?mod=viewthread&tid=9713#lastpost[/url]这个链接吗?他的情况是和我一样的,但我没看懂他们的解决办法。

hisi3518C

0个粉丝

3

问答

0

专栏

0

资料

hisi3518C 2016-05-11 17:51:13
认可0
他不就是改了excel表和uboot吗,还没看懂醉了,

yuyun7858

0个粉丝

1

问答

0

专栏

0

资料

yuyun7858 2017-05-10 10:15:13
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=29943&ptid=11261]hisi3518C 发表于 2016-5-11 17:51[/url]
他不就是改了excel表和uboot吗,还没看懂醉了,[/quote]

你也是醉了!

asdf12345

0个粉丝

0

问答

0

专栏

0

资料

asdf12345 2017-12-29 21:04:39
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=29774&ptid=11261]love_lin 发表于 2016-5-9 17:22[/url]
跟地址没太大关系,我烧的地址也足够uboot用的,我是从一个spi flash(S25FL256S)换成(MX25L(256/257 ...[/quote]

你好 我遇到的问题跟你一样,你解决了吗 ?
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区