• U-Boot在FL2440上移植(二)----支持NOR Flash


    <一>选择NOR flash型号

        我的开发板上的nor flash芯片是Intel的JS28F320(4MB)(1device=32blocks,1block=128MB

    fl2440默认是nandflash启动,norflash启动只需将跳线帽J5拔掉就可以了

       1. 把开发板的配置文件fl2440.h(/include/configs/fl2440.h)中关于flash的配置部分都删掉,换成下面的配置:

    #define CONFIG_NR_DRAM_BANKS     1           
    #define PHYS_SDRAM_1          0x30000000       
    #define PHYS_SDRAM_1_SIZE     0x04000000       
    #define PHYS_FLASH_1         0x00000000         
    #define CFG_FLASH_BASE       PHYS_FLASH_1
    #define CFG_MONITOR_BASE    TEXT_BASE
    #define FLASH_BASE0_PRELIM           PHYS_FLASH_1
    #define CONFIG_SYS_FLASH_PROTECTION    1
    #define CFG_MAX_FLASH_BANKS     1      
    #define CONFIG_SYS_FLASH_SIZE     0x00400000    
    #define CFG_MAX_FLASH_SECT     32    
    #define CFG_FLASH_ERASE_TOUT     (2*CONFIG_SYS_HZ)

    #define CONFIG_SYS_FLASH_WRITE_TOUT     (2*CONFIG_SYS_HZ)

    #define CFG_ENV_IS_IN_FLASH     1
    #define CFG_ENV_SIZE         0x20000       
    #define CFG_ENV_OFFSET      0x40000

    #define CONFIG_SYS_HZ                   1000

    #endif 

    如果出现   警告: “no newline at end of file" 只需在这段代码后加几个回车就可以了

    2. 把开发板目录下flash.c文件替换成下面的/board/cmi/下面的flash.c文件,然后删除这个write_short函数的申明和定义、删除write_buff函数。替换成下面的两个函数

    int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)
    {
       ulong cp, wp;
       ushort data;
       int l;
       int i, rc;

       wp = (addr & ~1);      

       if ((l = addr - wp) != 0)
       {
          data = 0;
          for (i=0, cp=wp; i<l; ++i, ++cp) {
           data = (data >> 8) | (*(uchar *)cp << 8);
          }
          for (; i<2 && cnt>0; ++i) {
         data = (data >> 8) | (*src++ << 8);
         --cnt;
         ++cp;
          }
          for (; cnt==0 && i<2; ++i, ++cp) {
         data = (data >> 8) | (*(uchar *)cp << 8);
          }

          if ((rc = write_word(info, wp, data)) != 0) {
         return (rc);
          }
          wp += 2;
       }

       while (cnt >= 2) {
          data = *((vu_short*)src);
          if ((rc = write_word(info, wp, data)) != 0) {
          return (rc);
          }
          src += 2;
          wp  += 2;
          cnt -= 2;
       }

       if (cnt == 0) {
          return ERR_OK;
       }

       data = 0;
       for (i=0, cp=wp; i<2 && cnt>0; ++i, ++cp) {
          data = (data >> 8) | (*src++ << 8);
          --cnt;
       }
       for (; i<2; ++i, ++cp) {
          data = (data >> 8) | (*(uchar *)cp << 8);
       }

       return write_word(info, wp, data);
    }

    static int write_word (flash_info_t *info, ulong dest, ushort data)
    {
       vu_short *addr = (vu_short *)dest, val;
       int rc = ERR_OK;
       int flag;

       if ((*addr & data) != data)
          return ERR_NOT_ERASED;

       flag = disable_interrupts();

       *addr = 0x50;

       *addr = 0x40;

       *addr = data;

       reset_timer_masked();

       while(((val = *addr) & 0x80) != 0x80)
       {
          if (get_timer_masked() > CONFIG_SYS_FLASH_WRITE_TOUT) {
          rc = ERR_TIMOUT;
          *addr = 0xB0;
          goto outahere;
          }
       }

       if(val & 0x1A) {       
          printf(" Flash write error x at address lx ",
               (int)val, (unsigned long)dest);
          if(val & (1<<3)) {
         printf("Voltage range error. ");
         rc = ERR_PROG_ERROR;
         goto outahere;
          }
          if(val & (1<<1)) {
         printf("Device protect error. ");
         rc = ERR_PROTECTED;
         goto outahere;
          }
          if(val & (1<<4)) {
         printf("Programming error. ");
         rc = ERR_PROG_ERROR;
         goto outahere;
          }
          rc = ERR_PROG_ERROR;
          goto outahere;
       }

    outahere:
       *addr = 0xFF;

       if (flag)
          enable_interrupts();

       return rc;
    }

       3. 修改board/fl2440/flash.c中函数申明:
    static ulong flash_get_size (vu_short *addr, flash_info_t *info);
    //static int write_short (flash_info_t *info, ulong dest, ushort data);
    static int write_word (flash_info_t *info, ulong dest, ushort data);
    static void flash_get_offsets (ulong base, flash_info_t *info);

        4. 修改flash.c文件中的一个宏定义:
    把:
    #define FLASH_BLOCK_SIZE        0x00010000
    改为:
    #define FLASH_BLOCK_SIZE        0x00020000

    <二>执行make fl2440config 和 make all将生成的U-Boot.bin烧入norflash

    NOR Flash常用命令 :查看NOR flash信息  flinfo

                        加/解写保护命令 protect

                        擦出命令    erase

                        读norflash     mm/cp

                        写norflash     cp 

  • 相关阅读:
    Gecko Bootloader的介绍(Silicon Labs)【一】
    使用模板新建ZigBee工程的方法
    代码控制ZigBee网络密钥的生成
    Ubuntu20编译最新版Android源码教程
    C和C++常用代码片段整理
    Java易错的知识点整理
    仿IntelliJ Darcula的Swing主题FlatLaf使用方法
    PuTTYTabManager汉化版
    WinSCP整合SecureCRT打开终端
    异想家博客图片批量压缩程序
  • 原文地址:https://www.cnblogs.com/wang-le/p/3278962.html
Copyright © 2020-2023  润新知