U-boot-2014.04移植到MINI2440(5) Nor FLASH 读写支持移植

发布者:耿高良最新更新时间:2022-06-22 来源: eefocus关键字:U-boot  移植  MINI2440  Nor  FLASH  读写 手机看文章 扫描二维码
随时随地手机看文章

MINI2440有一个2M的NOR FLASH,NOR FLASH在MINI2440上其实是一个容量较小的ROM,不过它比NAND要好的地方在于可以执行代码。当开关打在nor的时候,就选择从NOR FLASH启动,NOR FLASH是直接映射到0x00000000地址上开始工作的。关于nor和nand的区别以及在mini2440上启动时候的差别请参看CSDN上的帖子,分析的挺好,这里不赘述了。


一.追踪cfi_flash.c和jedec_flash.c找出nor 型号


后面的移植工作参照网上大牛对tq2440的u-boot-2014.04的移植方法,在此对他们的工作表示感谢。


因为我们现在要在u-boot里面添加进去对我们板子上的nor flash的读写支持,


根据文件名,我查了下什么是cfi,什么是jedec,找到如下描述:


CFI为公共Flash接口[CommonFlash Interface], 用来帮助程序从Flash芯片中获取操作方式信息。


       JEDEC用来帮助程序读取Flash的制造商ID和设备ID,以确定Flash的大小和算法。


       首先在jedec_flash.c中添加mini2440的nor flash型号的内容。查阅mini2440用户手册知道mini2440使用的的nor flash型号为:SST39VF1602(AMD29LV160DB)与此引脚兼容。我们看到在jedec_flash.c的第47行:


#define SST39LF160    0x2782


#define SST39VF1601 0x234b


#define SST39LF512    0x00D4


       同时与之兼容的AMD29LV160DB在第34行:


#define AM29LV160DT      0x22C4


#define AM29LV160DB     0x2249


#define AM29F017D    0x003D


       但是我们在第一篇帖子启动的时候,最后出现的错误提示:


       FLASH:***failed***


       这里应该是FLASH部分出错了,我们在这两个文件里面追踪一下错误,打开DEBUG调试宏,可以看到调试信息。在两个文件头文件之前,记住一定要是头文件之前,打开DEBUG宏。


       /* The DEBUG define must be before commonto enable debugging */


/*#define DEBUG*/


       加入当前在u-boot的源码目录下,执行以下指令:


       cd drivers/mtd/


       vim jedec_flash.c


       在头文件之前:defineDEBUG


       另一个文件也是同样的操作,然后保存退出。重新回到源码目录重新编译。


生成的u-boot拷贝到tftpboot下。


tftp 0x30008000 u-boot.bin


go 0x30008000


结果出现如下信息:


U-Boot 2014.04 (Aug 24 2015 - 14:19:35)


CPUID: 32440001


FCLK:      400MHz


HCLK:      100MHz


PCLK:       50MHz


DRAM:  64 MiB


WARNING: Caches not enabled


Flash: fwc addr 00000000 cmd f0 00f0 16bit x16 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 00000000 cmd f0 00f0 16bit x 16 bit


JEDEC PROBE: ID f0 ea00 0


fwc addr 00000000 cmd ff 00ff 16bit x 16 bit


fwc addr 00000000 cmd 90 0090 16bit x 16 bit


fwc addr 00000000 cmd ff 00ff 16bit x 16 bit


JEDEC PROBE: ID 90 ea00 0


*** failed ***


### ERROR ### Please RESET the board ###


       u-boot探测到的 norflash型号我们的列表里没有,ea00。难道是因为没有从norflash启动的原因,为此我在自己的nor flash里面烧写一个u-boot,然后从nor 启动再将编译好的u-boot按照上面的方法下载进去试试。


       这时候打印信息如下:


U-Boot 2014.04 (Aug 24 2015 - 14:19:35)


 


CPUID: 32440001


FCLK:     400 MHz


HCLK:     100 MHz


PCLK:      50 MHz


DRAM: 64 MiB


WARNING: Caches not enabled


Flash: fwc addr 00000000 cmd f0 00f0 16bit x 16 bit


fwc addr 0000aaaa cmd aa 00aa 16bit x 16bit


fwc addr 00005554 cmd 55 0055 16bit x 16bit


fwc addr 0000aaaa cmd 90 0090 16bit x 16bit


fwc addr 00000000 cmd f0 00f0 16bit x 16bit


JEDEC PROBE: ID 1 2249 0


fwc addr 00000000 cmd ff 00ff 16bit x 16bit


fwc addr 00000000 cmd 90 0090 16bit x 16bit


fwc addr 00000000 cmd ff 00ff 16bit x 16bit


JEDEC PROBE: ID 14 ea00 0


*** failed ***


### ERROR ### Please RESET the board ###


       我们探测到了自己的norflash的device_id为2249,和我们的AM29LV160DB是匹配的。但是他还是提示出错误,FLASH:***failed****


使用grep “FLASH:”* -nR搜索,程序定位在arch/arm/lib/board.c


第557行:


puts("Flash: ");


 


flash_size = flash_init();


if (flash_size > 0)


{


******


} else {           //557行


              puts(failed);


              hang();


       }


       也就是说,如果flash_size>0,才会进去,否则就输出failed,而flash_size=flash_init(),也就是说flash_init()出了问题,切过去。


       flash_init()函数在文件cfi_flash.c里面,在第2332行:


      


unsignedlong  flash_init (void)


{


       unsigned long size = 0;


       int i;


 


#ifdefCONFIG_SYS_FLASH_PROTECTION


       /* read environment from EEPROM */


       char s[64];


       getenv_f("unlock", s,sizeof(s));


#endif


 


       /* Init: no FLASHes known */


       for (i = 0; i

              flash_info[i].flash_id =FLASH_UNKNOWN;


 


              /* Optionally write flashconfiguration register */


              cfi_flash_set_config_reg(cfi_flash_bank_addr(i),


                                    cfi_flash_config_reg(i));


 


              if(!flash_detect_legacy(cfi_flash_bank_addr(i), i))


                     flash_get_size(cfi_flash_bank_addr(i),i);


              size += flash_info[i].size;


              if (flash_info[i].flash_id ==FLASH_UNKNOWN) {


#ifndef CONFIG_SYS_FLASH_QUIET_TEST


                     printf ("## Unknownflash on Bank %d "


                            "- Size =0x%08lx = %ld MBn",


                            i+1,flash_info[i].size,


                            flash_info[i].size>> 20);


#endif /*CONFIG_SYS_FLASH_QUIET_TEST */


              }


#ifdefCONFIG_SYS_FLASH_PROTECTION


              else if ((s != NULL) &&(strcmp(s, "yes") == 0)) {


                     /*


                      * Only the U-Boot image and it's environment


                      * is protected, all other sectors are


                      * unprotected (unlocked) if flash hardware


                      * protection is used(CONFIG_SYS_FLASH_PROTECTION)


                      * and the environment variable"unlock" is


                      * set to "yes".


                      */


                     if(flash_info[i].legacy_unlock) {


                            int k;


 


                            /*


                             * Disable legacy_unlock temporarily,


                             * since flash_real_protect would


                             * relock all other sectors again


                             * otherwise.


                             */


                            flash_info[i].legacy_unlock= 0;


 


                            /*


                             * Legacy unlocking (e.g. Intel J3) ->


                             * unlock only one sector. This will


                             * unlock all sectors.


                             */


                            flash_real_protect(&flash_info[i], 0, 0);


 


                            flash_info[i].legacy_unlock= 1;


 


                            /*


                             * Manually mark other sectors as


                             * unlocked (unprotected)


                             */


                            for (k = 1; k

                                   flash_info[i].protect[k]= 0;


                     } else {


                            /*


                             * No legancy unlocking -> unlock allsectors


                             */


                            flash_protect(FLAG_PROTECT_CLEAR,

[1] [2] [3]
关键字:U-boot  移植  MINI2440  Nor  FLASH  读写 引用地址:U-boot-2014.04移植到MINI2440(5) Nor FLASH 读写支持移植

上一篇:U-boot-2014.04移植到MINI2440(7) nand flash datasheet及arm9控制寄存器分析
下一篇:ARM AMBA AHB-LITE协议理解

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved