添加NOR FLASH到U-BOOT(附图)

      本次移植参照《(原)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

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值