5、移植UBOOT之支持Nor Flash

上一节:4、移植UBOOT之支持nand启动

下一节:6、移植UBOOT之支持Nand Flash

1、分析启动时Flash: *** failed ***错误

上一节启动uboot出现如下所示,我们搜索下错误代码Flash:
在这里插入图片描述
上面的Flash: *** failed *** 是属于uboot第二阶段函数board_init_r()里的代码,代码如下所示,位于arch/arm/lib/board.c

/*第二阶段*/
void board_init_r(gd_t *id, ulong dest_addr)        //gd    uboot重定位地址
{
     ... ...
  puts("Flash: ");                        //打印flash:
  flash_size = flash_init();                    //初始化nor_flash
  if (flash_size > 0)
  {
       ... ...
       print_size(flash_size, "\n");            //打印nor_flash的大小
  }
  else
  {
    puts(failed);                //打印数组failed[]="*** failed ***\n";
    hang();                        //进入while中,并打印: ### ERROR ### Please RESET the board ###     
  }
#if defined(CONFIG_CMD_NAND)
       puts("NAND:  ");                                      //打印NAND:
       nand_init();                                               //初始化nand_flah
... ...
}

从上面代码看出,board_init_r()会来初始化nor,由于新的uboot不支持nor,所以flash_init()初始失败,然后打印一串错误代码后等待复位。

由于2440在nand启动时,会自动装载nand的前4k内容,所以不支持nor flash,因为nor的前4k内容被nand占用。

2、修改nor 初始化的代码

为了避免nand启动一直卡住,board.c中修改为:
在这里插入图片描述
因为hang就是卡死,所以将其去掉:
在这里插入图片描述
在下列函数中打印如下信息:

board_init_r
	flash_init
		flash_get_size

在这里插入图片描述
其中debug:
在这里插入图片描述
在这里插入图片描述
根据_DEBUGu-boot-2012.04.01\drivers\mtd\cfi_flash.c文件中增加定义:
在这里插入图片描述
编译:make
把服务器上的u-boot.bin传回pc上;

usb 1 30000000,再使用dnw下载u-boot.bin
protect off all :去除nor flash 的写保护
erase 0 7FFFF0(开始地址)7FFFF(结束地址)共512k
cp.b 30000000 0 80000 :把程序烧写到0地址,烧写大小为0x80000

程序出错:
在这里插入图片描述
打印出nor flash的厂家ID=0xC2,设备ID=0x2249,显然uboot匹配读出的ID没有成功。
搜索JEDEC PROBE字段,找到位于board_init_r()->flash_init()->flash_detect_legacy():
在这里插入图片描述
如上图所示,该函数会进入board_init_r()->flash_init()->flash_detect_legacy()->jedec_flash_match(),里面会通过两个ID来匹配jedec_table[]

3、在数组jedec_table[]里添加nor flash

修改u-boot-2012.04.01\drivers\mtd\jedec_flash.c中的jedec_table[]数组,参考手册如下:
在这里插入图片描述
在这里插入图片描述
jedec_table[]数组最后加上如下内容:
在这里插入图片描述

  • 其中的NumEraseRegions是擦除区域:
    擦除区域只有一种:NumEraseRegions = 1
    擦除区域只有两种:NumEraseRegions = 2
    我们有4种。
    在这里插入图片描述
  • 其中:regions表示每一种擦除区域有多少个块。
    我们使用的nor flash扇区结构如下:
    在这里插入图片描述
    下面8字就是16字节,即16K有1种;8K有2种。。。。
    在这里插入图片描述
    如大小为16*1024的共有1块;
    如大小为8*1024的共有2块;
    。。。

重新编译下载烧写:
在这里插入图片描述
出现错误:ERROR:too many flash sectors,说flash的扇区太多了,搜索找到位于drivers/mtd/jedec_flash.c中:
在这里插入图片描述
显然是CONFIG_SYS_MAX_FLASH_SECT宏小于我们flash的扇区,所以打印ERROR。

修改:u-boot-2012.04.01\include\configs\smdk2440.h 中宏CONFIG_SYS_MAX_FLASH_SECT的大小:
在这里插入图片描述
所以修改CONFIG_SYS_MAX_FLASH_SECT宏定义(位于include/configs/smdk2440.h),并去掉之前定义的DEBUG调试宏(位于u-boot-2012.04.01\drivers\mtd\cfi_flash.c)
在这里插入图片描述

4、重新烧写nor flash

再次编译:make
把服务器上的u-boot.bin传回pc上;

usb 1 30000000,再使用dnw下载u-boot.bin
protect off all :去除nor flash 的写保护
erase 0 7FFFF0(开始地址)7FFFF(结束地址)共512k
cp.b 30000000 0 80000 :把程序烧写到0地址,烧写大小为0x80000

在这里插入图片描述
其中RO表示uboot在软件层面指定当前地址为只读,可以使用protect off all去除。
然后通过uboot命令,检测nor的读写是否正确:
在这里插入图片描述
查看内容:
在这里插入图片描述
在这里插入图片描述
往内存写数据:
在这里插入图片描述
使用0x32000000地址再次烧写,数据正确。
在这里插入图片描述

5、重新设置栈

拷贝的数据和源数据内容不同,可能是我们的栈设置有问题。

由于之前重定位,清除bss之后栈一直指向30000000的位置,每调用一个函数栈应该会变化。由于我们的设置问题,导致栈一直卡在30000000的位置,所以拷贝数据后再比较源数据和目的数据就会出错。

board_init_faddr_sp就是栈的地址
在这里插入图片描述
那么在c程序中用到汇编中定义的变量如下图:
在这里插入图片描述
其中汇编中定义_bss_end_ofs变量,在c程序中直接使用。

修改start.S启动文件:添加全局变量
在这里插入图片描述
board_init_f函数中:声明base_sp
在这里插入图片描述
在调用第二阶段代码之前重新设置栈:
在这里插入图片描述
board_init_f函数中将之前的栈的地址传回来:
在这里插入图片描述
再次make时出现报错:
在这里插入图片描述
include\configs\smdk2440.h中屏蔽CONFIG_YAFFS2
在这里插入图片描述
重新烧写测试:

usb 1 30000000            //使用usb下载到SDRAM上,1表示一直下载,直到完成
                         //然后打开DNW,传输新的uboot.bin给usb
protect off all           //关闭nor的写保护
erase  0   +7FFFF      //擦除nor上的 0~7FFFF地址内容, (512k*1024-1)=+7FFF=擦除长度=512kb,要大于新的uboot.bin才行
cp.b  30000000  0  80000         //将SDRAM上的新的uboot.bin,拷贝到nor上(烧写512K)

protect off all    
erase 80000 8ffff   /*擦除512K*/
cp.b 32000000 80000 1000  /*从32000000拷贝1000字节数据到80000位置*/
cmp.b 32000000 80000 1000  /*比较拷贝的数据是否相同*/

现在nor flash就支持了nor的操作了。
在这里插入图片描述
上一节:4、移植UBOOT之支持nand启动

下一节:6、移植UBOOT之支持Nand Flash

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值