• S3C2440移植uboot之支持NORFLASH


      上节S3C2440移植uboot之支持NAND启动修改了代码支持了NAND启动。这节我们分析uboo使其支持NORFLASH的操作。

    1.分析启动错误

      上一节启动uboot出现如下所示,我们搜索下错误代码Flash: 在这里插入图片描述
      上面的Flash: *** failed *** 是属于uboot第二阶段函数board_init_r()里的代码, 代码如下所示(位于arch/arm/lib/board.c):

    /*第二阶段*/
    void board_init_r(gd_t *id, ulong dest_addr)        //gd    uboot重定位地址
    {
         ... ...
      puts("Flash: ");                        //打印flash:
      flash_size = flash_init();                    //初始化nor_flash
      if (flash_size > 0)
      {
           ... ...
           print_size(flash_size, "
    ");            //打印nor_flash的大小
      }
      else
      {
        puts(failed);                //打印数组failed[]="*** failed ***
    ";
        hang();                        //进入while中,并打印: ### ERROR ### Please RESET the board ###     
      }
    #if defined(CONFIG_CMD_NAND)
           puts("NAND:  ");                                      //打印NAND:
           nand_init();                                               //初始化nand_flah
    ... ...
    }
    

      从上面代码看出, board_init_r()会来初始化nor,由于新的uboot不支持nor,所以flash_init()初始失败,然后打印一串错误代码后,等待复位.
      由于2440在nand启动时,会自动装载nand的前4k内容,所以不支持norflash,因为nor的前4k内容被nand占用.

    2.修改代码

      所以修改上面代码,避免nand启动一直卡住,将:

    else
    {
      puts(failed);                //打印数组failed[]="*** failed ***
    ";
      hang();                        //进入while中,并打印: ### ERROR ### Please RESET the board ###     
    }
    

      改为:

    else
    {
      puts("0  KB
    ");                //打印0 KB
    }
    

      在u-boot-2012.04.01driversmtdcfi_flash.c文件中增加定义

    #define _DEBUG 1
    #define DEBUG //调试模式
    

      打印如下调试信息
    在这里插入图片描述
    在这里插入图片描述
      然后使用nor启动新的uboot,打印出调试信息:
    在这里插入图片描述
      打印出norflash的厂家ID=0xC2,设备ID=0x2249,显然uboot匹配读出的ID没有成功.
      搜索JEDEC PROBE字段,找到位于board_init_r()->flash_init()->flash_detect_legacy():
    在这里插入图片描述
      如上图所示,该函数会进入board_init_r()->flash_init()->flash_detect_legacy()->jedec_flash_match(),里面会通过两个ID来匹配jedec_table[].

    3.在匹配数组中添加我们的NORFLASH

    接下来向jedec_table[]里添加norflash:MT29LV160DB(位于drivers/mtd/jedec_flash.c)
      参考手册如下
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

      修改后代码如下:

    /*MX29LV160DB*/
           {
           .mfr_id         = (u16)MX_MANUFACT,        //厂家ID0x00C200C2 (读nor,便是0xc2)
           .dev_id         = 0x2249,                          //设备ID
           .name           = "MXIC MX29LV160DB",
           .uaddr          = {
               [1] = MTD_UADDR_0x0555_0x02AA /* 数组[1]表示是16位nor,解锁地址为:0x555,0x2AA */
            },
           .DevSize        = SIZE_2MiB,
           .CmdSet         = P_ID_AMD_STD,
           .NumEraseRegions= 4,                      //4种不同的扇区规格
           .regions        = {
           ERASEINFO(16*1024, 1),
           ERASEINFO(8*1024, 2),
           ERASEINFO(32*1024, 1),
           ERASEINFO(64*1024, 31),
                              }
               },
    

    在这里插入图片描述
    在这里插入图片描述

      重新烧写看打印信息,出现这么一段ERROR:

    ERROR:too many flash sectors
    

      说flash的扇区太多了,搜索找到位于drivers/mtd/jedec_flash.c中:
    在这里插入图片描述
      显然是CONFIG_SYS_MAX_FLASH_SECT宏小于我们flash的扇区,所以打印ERROR。
      所以修改CONFIG_SYS_MAX_FLASH_SECT宏定义(位于include/configs/smdk2440.h),并去掉之前定义的DEBUG调试宏(位于u-boot-2012.04.01driversmtdcfi_flash.c)
    在这里插入图片描述

    在这里插入图片描述

    4.然后重新烧写

      输入flinfo命令(flash info),就能查看flash的信息了:
    在这里插入图片描述
      然后通过uboot命令,检测nor的读写是否正确:
    在这里插入图片描述
      查看内容
    在这里插入图片描述
    在这里插入图片描述
      往内存写数据
    在这里插入图片描述

    5.解决栈设置错误的问题

      拷贝的数据和源数据内容不同,可能是我们的栈设置有问题。
    (关于内存分布可以看这个图)内存分布
      由于之前重定位,清除bss之后栈一直指向30000000的位置,每调用一个函数栈应该会变化。由于我们的设置问题,导致栈一直卡在30000000的位置,所以拷贝数据后再比较源数据和目的数据就会出错。
    在这里插入图片描述

      修改start.s启动文件

    call_board_init_f:
    /*注意这里 ,把声明放文件开头编译会报错。只能放这里*/
    .globl base_sp
    base_sp:
    	.long 0
    
    	ldr	r0,=0x00000000
    	bl	board_init_f
    
    	/*unsigned int id 的值存在r0中,正好给board_init_r使用*/
    	ldr r1, =_TEXT_BASE
    	/*重新设置栈到之前的位置 指向原来addr_sp += 128;*/
    	ldr sp,base_sp  
    	/*调用第二阶段代码*/
    	bl	board_init_r
    

      在board.c中将之前的栈的地址传回来
    在这里插入图片描述
      同时在board.c中定义外部引用
    在这里插入图片描述

      重新烧写

    usb 1 30000000            //使用usb下载到SDRAM上,1表示一直下载,直到完成
                             //然后打开DNW,传输新的uboot.bin给usb
    protect off all           //关闭nor的写保护
    erase  0   +7FFFF      //擦除nor上的 0~7FFFF地址内容, (512k*1024-1)=+7FFF=擦除长度=512kb,要大于新的uboot.bin才行
    cp.b  30000000  0  80000         //将SDRAM上的新的uboot.bin,拷贝到nor上(烧写512K)
    
    protect off all    
    erase 80000 8ffff   /*擦除512K*/
    cp.b 32000000 80000 1000  /*从32000000拷贝1000字节数据到80000位置*/
    cmp.b 32000000 80000 1000  /*比较拷贝的数据是否相同*/
     
    

    在这里插入图片描述
      现在我们的NORFLASH就支持了NOR的操作。
      下一节S3C2440移植uboot之支持NANDFLASH操作我们将移植uboot支持NANDFLASH的操作。

    有任何问题,均可通过公告中的二维码联系我

  • 相关阅读:
    性能测试实战
    毕业以后读书报告(不定时更新)
    sqlalchemy.orm.exc.flusherror:错误解决
    Anaconda安装第三方模块
    关于BeanShell报错提示Error invoking bsh method
    jmeter函数和变量
    jmeter插件安装及使用
    doc
    doc
    doc
  • 原文地址:https://www.cnblogs.com/dongxb/p/14193363.html
Copyright © 2020-2023  润新知