http://blog.csdn.net/fzu_dianzi/article/details/7109209

10 篇文章 0 订阅
该博客主要记录和总结我在工作中遇到的问题和积累的经验。如有错误之处,谢请指正。共享资源,欢迎转载:http://blog.csdn.net/fzu_dianzi一、环境目标板:mini2440u-boot版本:u-boot-2009.08交叉编译器:arm-linux-gcc-4.3.2操作系统:Linux(Ubuntu-11.10)二、目的从上一节的成果我们观察到Flash的信息不正确,mini2440板子上为2M的Nor Flash(型号为SST39VF1601),还有就是提示*** Warning - bad CRC, using default environment的警告。本节,笔者主要完成这2项的修改工作。三、修改Flash配置1、 修改命令行前的名字这个一般是在.h文件里面定义,首先笔者查找了include/configs/mini2440.h。在115行找到如下语句#define CONFIG_SYS_PROMPT "SMDK2410 # " /* Monitor Command Prompt */我们将其修改为#define CONFIG_SYS_PROMPT "mini2440/care # " /* Monitor Command Prompt */2、 修改flash部分代码使用source insight 阅读源代码,我们可以找到Flash:512KB的打印信息所对应的函数位置。lib_arm/board.c [214行] void display_flash_config (ulongsize)函数找到调用该函数的地方,在本文件329行[cpp] view plaincopy#ifndef CONFIG_SYS_NO_FLASH /* configure available FLASH banks */ display_flash_config (flash_init ()); #endif /* CONFIG_SYS_NO_FLASH * flash_init()函数定义在board/samsung/mini2440/flash.c[cpp] view plaincopy flash_info[i].flash_id = #if defined(CONFIG_AMD_LV400) (AMD_MANUFACT & FLASH_VENDMASK) | (AMD_ID_LV400B & FLASH_TYPEMASK); #elif defined(CONFIG_AMD_LV800) (AMD_MANUFACT & FLASH_VENDMASK) | (AMD_ID_LV800B & FLASH_TYPEMASK); #else #error "Unknown flash configured" #endif CONFIG_AMD_LV400并不是mini2440的NorFlash id。接下来,我们修改mini2440.h关于NorFlash 的一些定义include/configs/mini2440.h#if 0#define CONFIG_AMD_LV400 1 /*uncomment this if you have a LV400 flash */ #define CONFIG_AMD_LV800 1 /*uncomment this if you have a LV800 flash */#endif在176行后添加[cpp] view plaincopy#define CONFIG_SST_39VF1601 1 #define PHYS_FLASH_SIZE 0x200000 //2m NorFlash #define CONFIG_SYS_MAX_FLASH_SECT (512) //扇区大小,一扇区4k #define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x040000) 修改board/samsung/mini2440/flash.c norflash的参数宏定义[cpp] view plaincopy#define MAIN_SECT_SIZE 0x1000 /* 4 KB */ #define MEM_FLASH_ADDR1 (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x00005555 << 1))) #define MEM_FLASH_ADDR2 (*(volatile u16 *)(CONFIG_SYS_FLASH_BASE + (0x00002AAA << 1))) 修改flash_init()函数[cpp] view plaincopy#if defined(CONFIG_AMD_LV400) (AMD_MANUFACT & FLASH_VENDMASK) | (AMD_ID_LV400B & FLASH_TYPEMASK); #elif defined(CONFIG_AMD_LV800) (AMD_MANUFACT & FLASH_VENDMASK) | (AMD_ID_LV800B & FLASH_TYPEMASK); #elif defined(CONFIG_SST_39VF1601) //添加CONFIG_SST_39VF1601 定义 (SST_MANUFACT & FLASH_VENDMASK) | (SST_ID_xF1601 & FLASH_TYPEMASK); #else #error "Unknown flash configured" #endif [cpp] view plaincopyfor (j = 0; j < flash_info[i].sector_count; j++) { flash_info[i].start[j] = flashbase + j * MAIN_SECT_SIZE; } 修改flash_print_info函数[cpp] view plaincopyswitch (info->flash_id & FLASH_VENDMASK) { case (AMD_MANUFACT & FLASH_VENDMASK): printf ("AMD: "); break; case (SST_MANUFACT & FLASH_VENDMASK): //添加SST39VF1601 printf ("SST: "); break; default: printf ("Unknown Vendor "); break; } switch (info->flash_id & FLASH_TYPEMASK) { case (AMD_ID_LV400B & FLASH_TYPEMASK): printf ("1x Amd29LV400BB (4Mbit)\n"); break; case (AMD_ID_LV800B & FLASH_TYPEMASK): printf ("1x Amd29LV800BB (8Mbit)\n"); break; case (SST_ID_xF1601 & FLASH_TYPEMASK): //添加SST39VF1601的 printf ("1x SST39VF1610 (16Mbit)\n"); break; default: printf ("Unknown Chip Type\n"); goto Done; break; } 修改flash_erase函数将[cpp] view plaincopyif ((info->flash_id & FLASH_VENDMASK) != (AMD_MANUFACT & FLASH_VENDMASK)) { return ERR_UNKNOWN_FLASH_VENDOR; } 修改为[cpp] view plaincopyif ((info->flash_id & FLASH_VENDMASK) != (SST_MANUFACT & FLASH_VENDMASK)) { return ERR_UNKNOWN_FLASH_VENDOR; } 将以下代码删掉/* wait until flash is ready */ chip= 0;开始 至if (chip == TMO) {rc = ERR_TIMOUT;goto outahere;}然后添加[cpp] view plaincopywhile (1) { if ((*addr & 0x40) != (*addr & 0x40)) continue; if (*addr & 0x80) { rc = ERR_OK; break; } } 修改write_hword函数[cpp] view plaincopyMEM_FLASH_ADDR1 = CMD_UNLOCK1; MEM_FLASH_ADDR2 = CMD_UNLOCK2; MEM_FLASH_ADDR1 = CMD_PROGRAM; //*addr = CMD_PROGRAM; *addr = data; 将从 /*wait until flash is ready */ chip= 0;开始至 if(chip == ERR || *addr != data) rc= ERR_PROG_ERROR;这段代码删掉,并添加下面代码[cpp] view plaincopywhile (1) { if ((*addr & 0x40) != (*addr & 0x40)) continue; if ((*addr & 0x80) == (data & 0x80)) { rc = ERR_OK; break; } } 3、 成果将编译生成的u-boot.bin烧写到NorFlash。证明该阶段关于Flash的修改成功,并且命令行前的名字也成功修改了。四、*** Warning- bad CRC, using default environment将这段语句作为关键词,使用sourceinsight进行搜索,发现这个警告的出现是和环境变量有关。u-boot stage2的入口函数在lib_arm/board.c 的start_armboot函数。该函数主要进行一系列的初始化。我们找到环境变量初始化的函数。 /*initialize environment */ env_relocate();通过分析得知,如果是readenv读取环境变量失败,那么就会使用默认的环境变量。如果即使数据读的对了,但是crc32校验失败,那么也是使用默认环境变量。我们执行一下u-boot的:saveenv命令,将环境变量设置到Nor Flash中。这里附上一篇介绍该解决方法的文章,里面详细阐述了分析过程。【已解决】*** Warning - bad CRC or NAND,using default environment
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值