本次移植参照《(原)uboot-2009.11移植手册(适用与Mirco2440,Mini2440,TQ2440).pdf》感谢作者!
u-boot默认是从nor flash启动,现在的u-boot里面是其他型号的nor flash我们需要的是SST39VF1601,DIY it!
修改控制台显示符: include/configs/mini2440.h
#define CONFIG_SYS_PROMPT “[u-boot@manpai]#”
#if 0 //注释掉下面两个类型的Nor Flash设置,因为不是我们所使用的型号
#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
然后我们添加我们自己的NOR FLASH芯片型号SST39VF1601:
/* addr of environment */
#endif
#define CONFIG_SST_39VF1601 1 //添加mini2440 开发板Nor Flash 设置
#if defined(CONFIG_SST_39VF1601)
#define PHYS_FLASH_SIZE 0x200000 // 我们开发板的Nor Flash 是2M
#define CONFIG_SYS_MAX_FLASH_SECT (512) // 根据SST39VF1601 的芯片手
册描述,对其进行操作有两种方式:块方式和扇区方式。现采用扇区方式(sector),1 secto r
= 2Kword = 4Kbyte,所以2M 的Nor Flash 共有512 个sector
#define CONFIG_ENV_ADDR (CONFIG_SYS_FLASH_BASE + 0x040000)
// 暂设置环境变量的首地址为 0x040000(即:256Kb)
#endif
在board/Samsung/mini2440/flash.c中定义这对NOR FLASH的初始化、擦除和写入。分别对应函数为flash_init、flash_erase、write_hword,为了得到对nor flash的支持我们需要对着三个函数进行修改(在flash.c文件中进行)
修改定义的部分:
对初始化函数(flash_init)进行修改:
#elif defined(CONFIG_AMD_LV800)
(AMD_MANUFACT & FLASH_VENDMASK) |
(AMD_ID_LV800B & FLASH_TYPEMASK);
#elif defined(CONFIG_SST_39VF1601) // 获取 norflash 的id
(SST_MANUFACT & FLASH_VENDMASK) |
(SST_ID_xF1601 & FLASH_TYPEMASK);
for (j = 0; j < flash_info [i].sector_count; j++) {
#if 0 //注释掉这一段
if (j <= 3) {
/* 1st one is 16 KB */
if (j == 0) {
flash_info[i].start[j] = flashbase + 0;
}
/* 2nd and 3rd are both 8 KB */
if ((j == 1) || (j == 2)) {
flash_info[i].start[j] = flashbase + 0x4000 + (j - 1) * 0x2000;
}
/* 4th 32 KB */
if (j == 3) {
flash_info[i].start[j] = flashbase + 0x8000;
}
} else {
flash_info[i].start[j] = flashbase + (j - 3) * MAIN_SECT_SIZE;
}
#endif
flash_info[i].start[j] = flashbase + j * MAIN_SECT_SIZE;// 这里主要是设置每个sector 的首地址,SST39VF1601每个sector 大小一样
}
// 修改flash_print_info 函数如下:
case (AMD_MANUFACT & FLASH_VENDMASK):
printf ("AMD: ");
break;
case (SST_MANUFACT & FLASH_VENDMASK): // 添加 SST39VF1601 的
printf ("SST: ");
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;
对擦除函数(flash_erase函数)的修改:
#if 0
if ((info->flash_id & FLASH_VENDMASK) !=
(AMD_MANUFACT & FLASH_VENDMASK)) {
return ERR_UNKNOWN_FLASH_VENDOR;
}
#endif
if ((info->flash_id & FLASH_VENDMASK) !=
(SST_MANUFACT & FLASH_VENDMASK)) {
return ERR_UNKNOWN_FLASH_VENDOR;
}
#if 0
/* wait until flash is ready */
chip = 0;
do {
result = *addr;
/* check timeout */
if (get_timer_masked () >
CONFIG_SYS_FLASH_ERASE_TOUT) {
MEM_FLASH_ADDR1 = CMD_READ_ARRAY;
chip = TMO;
break;
}
if (!chip
&& (result & 0xFFFF) & BIT_ERASE_DONE)
chip = READY;
if (!chip
&& (result & 0xFFFF) & BIT_PROGRAM_ERROR)
chip = ERR;
} while (!chip);
MEM_FLASH_ADDR1 = CMD_READ_ARRAY;
if (chip == ERR) {
rc = ERR_PROG_ERROR;
goto outahere;
}
if (chip == TMO) {
rc = ERR_TIMOUT;
goto outahere;
}
#endif
while (1)
{
if ((*addr & 0x40) != (*addr & 0x40))
continue;
if (*addr & 0x80)
{
rc = ERR_OK;
break;
}
}
// 修改write_hword函数如下:
MEM_FLASH_ADDR1 = CMD_UNLOCK1;
MEM_FLASH_ADDR2 = CMD_UNLOCK2;
//MEM_FLASH_ADDR1 = CMD_UNLOCK_BYPASS;
MEM_FLASH_ADDR1 = CMD_PROGRAM;
//*addr = CMD_PROGRAM;
*addr = data;
#if 0
/* wait until flash is ready */
chip = 0;
do {
result = *addr;
/* check timeout */
if (get_timer_masked () > CONFIG_SYS_FLASH_ERASE_TOUT) {
chip = ERR | TMO;
break;
}
if (!chip && ((result & 0x80) == (data & 0x80)))
chip = READY;
if (!chip && ((result & 0xFFFF) & BIT_PROGRAM_ERROR)) {
result = *addr;
if ((result & 0x80) == (data & 0x80))
chip = READY;
else
chip = ERR;
}
} while (!chip);
*addr = CMD_READ_ARRAY;
if (chip == ERR || *addr != data)
rc = ERR_PROG_ERROR;
#endif
while (1)
{
if ((*addr & 0x40) != (*addr & 0x40))
continue;
if ((*addr & 0x80) == (data & 0x80))
{
rc = ERR_OK;
break;
}
}
再次编译,利用supervivi下载到RAM中即可看到下面的界面,我们可以对其进行测试验证现在开发板是否对nor flash支持。
[u-boot@manpai]# flinfo //查看flash的扇区
[u-boot@manpai]# protect on 0x50000 +1000 //保护从0x50000~0x51000的区间
[u-boot@manpai]# protect off 0x5000 +0x1000 //取消保护
[u-boot@manpai]# erase 0x50000 +0x1000 //擦除区间数据
从界面上我们可以知道有一条警告信息打印出来,这是因为我们还没有设置环境变量到nor flash中,我们执行:
[u-boot@manpai]# saveenv