将u-boot 2012.04.01移植到JZ2440开发板
让u-boot支持自己的开发板比较简单,因为norflash的接口跟内存很相似,我们不需要自己实现NORFLASH的操作集,u-boot中含有norfalsh的操作集
我们要做的工作就是根据自己开发板上的norflash的特性,在u-boot的norflash的匹配表中加入自己的norflash的数据u-boot中 board_init_r函数中的flash_init用来对norflash进行初始化,这个函数在u-boot中位置参见http://blog.csdn.net/r21nn/article/details/73718514
如下代码分别用新老两种方法检测norflash,如果用旧的方法检测失败,则使用新方法检测,如果就的方法检测成功,则不使用新方法
在移植时,我们使用旧方法检测到norflash,即新方法没有机会执行
if (!flash_detect_legacy(cfi_flash_bank_addr(i), i))
flash_get_size(cfi_flash_bank_addr(i), i);
flash_detect_legacy中有如下代码
if (board_flash_get_legacy(base, banknum, info)) {
if (!info->vendor) {
int modes[] = {
CFI_CMDSET_AMD_STANDARD,
CFI_CMDSET_INTEL_STANDARD
};
int i;
for (i = 0; i < sizeof(modes) / sizeof(modes[0]); i++) {
info->vendor = modes[i];
info->start[0] =
(ulong)map_physmem(base,
info->portwidth,
MAP_NOCACHE);
if (info->portwidth == FLASH_CFI_8BIT
&& info->interface == FLASH_CFI_X8X16) {
info->addr_unlock1 = 0x2AAA;
info->addr_unlock2 = 0x5555;
} else {
info->addr_unlock1 = 0x5555;
info->addr_unlock2 = 0x2AAA;
}
flash_read_jedec_ids(info); /*读取noflash的相关信息*/
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])) /*将读取到的信息和u-boot中norflash的信息表匹配,看读取到的norflash是否被支持*/
break;
else
unmap_physmem((void *)info->start[0],
MAP_NOCACHE);
}
}
我们要做的工作就是,如果我们开发板的norflash信息在u-boot的jedec_table表里没有,那么我们应该添加一项,使得u-boot支持我们开发板上的u-boot
在jedec_table的末尾添加如下一项
{
.mfr_id = (u16)MX_MANUFACT, /*厂家ID*/
.dev_id = 0x2249, /*设备ID*/
.name = "MXIC MX29LV160DB(NOR FLASH)", /*名字*/
.uaddr = {
[1] = MTD_UADDR_0x0555_0x02AA /* x16 */ /*解锁地址,16位的使用[1],8位的使用[0]*/
},
.DevSize = SIZE_2MiB, /*总大小*/
.CmdSet = P_ID_AMD_STD, /*操作集*/
.NumEraseRegions= 4, /*块的种类*/
.regions = { /*如下4行为具体的4中块大小和个数*/
ERASEINFO(16*1024, 1),
ERASEINFO(8*1024, 2),
ERASEINFO(32*1024, 1),
ERASEINFO(64*1024, 31),
}
关于怎样填充上述部分的内容,我们要参考具体norflash的数据手册,并参考jedec_table的其他条项进行填写
MX29LV160DT/B数据手册中有如下内容
Sector Structure
- 16K-Byte x 1, 8K-Byte x 2, 32K-Byte x 1, 64K-Byte x 31
Notes:
1. Device ID : MX29LV160DT: 22C4; MX29LV160DB: 2249.