移植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




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章