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

发布时间:2023-06-08  

选择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       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("nFlash write error x at address lxn",
           (int)val, (unsigned long)dest);
      if(val & (1<<3)) {
     printf("Voltage range error.n");
     rc = ERR_PROG_ERROR;
     goto outahere;
      }
      if(val & (1<<1)) {
     printf("Device protect error.n");
     rc = ERR_PROTECTED;
     goto outahere;
      }
      if(val & (1<<4)) {
     printf("Programming error.n");
     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 


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

相关文章

    华硕100系主板将全面支持Kaby Lake处理器;近日,华硕宣布旗下所有100系主板将全面支持新一代英特尔Kaby Lake处理器。只需经过简便的UEFI BIOS更新,华硕100系主板......
    BIOS是什么?(2024-03-11)
    BIOS界面。 微星主板BIOS 华硕主板BIOS 以上展示的两款新的BIOS界面,虽然加入了一些新的功能(比如可以调节风扇转速等),但是......
    实在找不到直接万能的某宝也可入手。肯定有人会担心用转接卡是否会影响性能?下面我们会继续探讨。 然后接着就是解决一个技术难题,给老主板刷上一个加入支持NVMe模块的改版“BIOS”。其实厂商为老主板......
    厂商的保修售后如何。 今天所选的品牌都是大众主流零售品牌,一些专做代工或者OEM之类的这里就不提啦~ ●华硕主板:一年换新三年保修 部分型号保五年! 作为世界级的一线品牌,华硕主板的售后也是非常给力的,一些......
    Digitimes的数据显示,2022年全球前四大主板制造商总出货相比2021年减少了1000多万张,同比跌幅均超两位数。 具体来说,华硕主板......
    华擎也良心:100系主板全线支持Intel Kaby Lake;微星、华硕之后,华擎今天也宣布,旗下100系列芯片组主板将全线支持Intel下一代处理器Kaby Lake,只需升级BIOS即可......
    -49 2x16GB 的高速,搭配第13代Intel® Core™ i9-13900K处理器与 ASUS ROG MAXIMUS Z790 Apex主板BIOS版本为0702,于AIDA64测试......
    Intel最强14nm!7代酷睿Kaby Lake上市时间、价格曝光;技嘉、华擎、华硕等主板商已经陆续向100系主板分发新BIOS,使后者得以支持全新的第七代酷睿处理器,代号Kaby Lake,这都......
    手持设备、Habana Labs 的 Gaudi2 AI 加速器以及华硕主板中的 Sony DualShock 4 游戏手柄、传感器和风扇的支持。而且这个新内核还包括呼叫深度跟踪,以帮......
    中的文件,例如华硕、华擎等主板在UEFI BIOS环境下更新BIOS就可以直接读取U盘中的BIOS及其他文件,另外新的UEFI主板基本都提供了截屏功能,这些截屏图片都可以存储在U盘当中。 UEFI还有......

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>