移植uboot(识别nor flash及重设栈)

识别nor flash:   

board.c中board_init_r()有下面代码:

puts("Flash: ");
...
flash_size = flash_init();
flash_size = flash_init();是对nor flash的识别,nand 启动的话,根本无法识别nor flash,会导致调用下面代码挂死。

puts(failed);
hang();
    nor 启动的话,由于没对本开发板的nor 的支持,一样卡死,修改flash_init()使之支持本开发板的nor修改board.c不让uboot进入hang()挂死,修改drivers/mtd/Cfi_flash.c,定义#define _DEBUG 1 #define DEBUG 1(要同时定义这两个才能打印调试信息),使输出调试信息。
    重新编译烧写,比较flash 的输出信息与nor 芯片手册信息找出原因。

部分输出信息:
Flash: fwc addr (null) cmd f0 00f0 16bit x 16 bit
fwc addr 0000aaaa cmd aa 00aa 16bit x 16 bit
fwc addr 00005554 cmd 55 0055 16bit x 16 bit
fwc addr 0000aaaa cmd 90 0090 16bit x 16 bit
fwc addr (null) cmd f0 00f0 16bit x 16 bit
JEDEC PROBE: ID c2 2249 0
fwc addr (null) cmd ff 00ff 16bit x 16 bit
fwc addr (null) cmd 90 0090 16bit x 16 bit
fwc addr (null) cmd ff 00ff 16bit x 16 bit
JEDEC PROBE: ID 13 ea00 0
0 KB
NAND:  No NAND device found!!!
0 MiB

芯片手册中芯片信息:
Notes:
1. Device ID : MX29LV160DT: 22C4; MX29LV160DB: 2249.
2. For sector protect verify result, XX00h/00h means sector is not protected, XX01h/01h means sector has been
protected.
3. Sector Protect command is valid during Vhv at RESET# pin, Vih at A1 pin and Vil at A0, A6 pins. The last Bus
cyc is for protect verify.
4. It is not allowed to adopt any other code which is not in the above command definition table.

输出的调试信息源码:Cfi_flash.c:

debug("JEDEC PROBE: ID %x %x %x\n",
	info->manufacturer_id,
	info->device_id,
	info->device_id2);
if (jedec_flash_match(info, info->start[0]))
	break;
else
	unmap_physmem((void *)info->start[0],MAP_NOCACHE);
    读出信息成功,匹配失败,原因是struct amd_flash_info jedec_table[]结构体数组里面没有对MX29LV160DB的支持,要添加
一个成员以支持它。
    jedec_flash.c的jedec_flash_match()函数中把读出的芯片信息和jedec_table[]数组成员匹配:

/*-----------------------------------------------------------------------
 * match jedec ids against table. If a match is found, fill flash_info entry
 */
int jedec_flash_match(flash_info_t *info, ulong base)
{
	int ret = 0;
	int i;
	ulong mask = 0xFFFF;
	if (info->chipwidth == 1)
		mask = 0xFF;

	for (i = 0; i < ARRAY_SIZE(jedec_table); i++) {
		if ((jedec_table[i].mfr_id & mask) == (info->manufacturer_id & mask) &&
		    (jedec_table[i].dev_id & mask) == (info->device_id & mask)) {
			fill_info(info, &jedec_table[i], base);
			ret = 1;
			break;
		}
	}
	return ret;
}
    在jedec_table[]结构体数组里面添加对MX29LV160DB的支持:
static const struct amd_flash_info jedec_table[] = {
#ifdef CONFIG_SYS_FLASH_LEGACY_256Kx8
	{
		.mfr_id		= (u16)SST_MANUFACT,
		.dev_id		= SST39LF020,
		.name		= "SST 39LF020",
		.uaddr		= {
			[0] = MTD_UADDR_0x5555_0x2AAA /* x8 */
		},
		.DevSize	= SIZE_256KiB,
		.CmdSet		= P_ID_AMD_STD,
		.NumEraseRegions= 1,
		.regions	= {
			ERASEINFO(0x01000,64),
		}
	},
	
	......
#endif	
	//在最后根据MX29LV160DB芯片手册Page5:添加此项支持MX29LV160DB
	{
		.mfr_id		= (u16)MX_MANUFACT, //	厂家id
		.dev_id		= 0x2249,	// 设备id
		.name		= "MX29LV160DB",
		.uaddr		= {	//解锁地址,对NOR的地址
			[1] = MTD_UADDR_0x0555_0x02AA /* x16 */	//这里为什么只设置[1]项
		},	//是[1] = MTD_UADDR_0x0555_0x02AA,不是[1] = MTD_UADDR_0x555_0x2AA,因enum uaddr数组中并未	                //支持此项
		.DevSize	= SIZE_1MiB,
		.CmdSet		= P_ID_AMD_STD,
		.NumEraseRegions= 4,//擦除块类型个数。
		.regions	= //{擦除块数组,ERASEINFO(0x01000,64)表示大小为0x01000的擦除块有64块
			ERASEINFO(16*1024,1),
			ERASEINFO(8 *1024,2),
			ERASEINFO(32*1024,1),
			ERASEINFO(64*1024,31),
		}
	},
};
芯片手册Page5参考信息:
 Sector Structure
- 16K-Byte x 1, 8K-Byte x 2, 32K-Byte x 1, 64K-Byte x 31

修改smdk2440.h 128行: #define CONFIG_SYS_MAX_FLASH_SECT (19)  改为一个合适的值。(否则会输出too many flash sectors提示) 如改为:#define CONFIG_SYS_MAX_FLASH_SECT (128)



修改栈设置的bug:

    之前设置的栈是在在start.S中设置为 sp = 30000f80,这个栈地址比较低,栈内存可能不够用,第二阶段应重新设置栈。
栈的位置根据C代码来确定,设置再尽可能高的地方,可引用C里提供的一个存放着地址的变量来设置,具体是addr_sp变量
start.S中怎么引用这个C变量?如下:
第二阶段重新设置栈 :
start.S中声明一个用来存放栈地址的全局变量:
.globa base_sp
base_sp:
.long 0

board.c board_init_f()最后面(跳转调用第二阶段代码 bl board_init_r之前)引用这个全局变量,对其赋值。
引用前需要先声明:extern ulong base_sp
引用,对其赋值:base_sp = addr_sp;

start.S中再使用这个在C里赋了值的base_sp来设置栈,sp指向SDRAM的较高地址处(addr_sp,紧接着加载完内核后的地址)。
ldr r1,_TEXT_BASE
ldr sp,base_sp //添加这行,重设栈地址
bl board_init_r




  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值