FL2440的U-boot-2009.08移植(三)支持Nor FLASH

如果没有Nor FLASH的同学可以跳过这一章节,直接进行下一张节。如果遇到什么问题,一般都是你没有定义那个宏之类的,这个问题可以很好的额解决。

修改norflash(nor fhash型号:JS28F320)的配置,把include/configs/fl2440.h中关于“Physical Memory Map”和“FLASH and environment organization”的配置都删掉,换成下面的配置:

  • /*-----------------------------------------------------------------------
     * Physical Memory Map
     */
    #define CONFIG_NR_DRAM_BANKS 1   /* we have 1 bank of DRAM */
    #define PHYS_SDRAM_1 0x30000000 /* SDRAM Bank #1 */
    #define PHYS_SDRAM_1_SIZE 0x04000000 /* 64 MB */

    #define PHYS_FLASH_1 0x00000000 /* Flash Bank #1 */
    #define CONFIG_SYS_FLASH_BASE PHYS_FLASH_1
    #define CONFIG_SYS_MONITOR_BASE   TEXT_BASE
    #define FLASH_BASE0_PRELIM        PHYS_FLASH_1

    /*-----------------------------------------------------------------------
     * FLASH and environment organization
     */
    #if 0
    #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

    #define CONFIG_SYS_MAX_FLASH_BANKS 1/* max number of memory banks */
    #define CONFIG_JS2_8F320  1
    #define CONFIG_SYS_FLASH_PROTECTION   1
    #define CONFIG_SYS_FLASH_SIZE    0x00400000    /*4 MB*/
    #define CONFIG_SYS_MAX_FLASH_SECT    32         /*max number of sectors on one chip*/

  • /* timeout values are in ticks */
    #define CONFIG_SYS_FLASH_ERASE_TOUT(2*CONFIG_SYS_HZ) /* Timeout for Flash Erase */
    #define CONFIG_SYS_FLASH_WRITE_TOUT(2*CONFIG_SYS_HZ) /* Timeout for Flash Write */

    #defineCONFIG_ENV_IS_IN_FLASH1
    #define CONFIG_ENV_SIZE0x40000/*
    Total Size of Environment Sector,这是256K的环境变量储存空间 */
    #define CONFIG_ENV_OFFSET  0x100000  //在以后的内核分区中环境变量分区的OFFSET值要与此一致
    #endif/* __CONFIG_H */

修改board/samsung/fl2440/lowlevel_init.S文件中SDARM刷新参数

  #define REFCNT   1258

修改flash型号相关文件,用board/cmi/flash.c文件替换board/samsung/ofl2440/flash.c文件,使uboot支持Intel的JS28F320型号nor fhash.

打开board/samsung/fl2440/flash.c文件,修改:

  1. 把:
    #define FLASH_BLOCK_SIZE        0x00010000
    改为:
    #define FLASH_BLOCK_SIZE        0x00020000
  2. 把声明:
    static  int    write_short   (flash_info_t *info, ulong dest, ushort data);//并删除这个函数体
    改为:
    static    int      write_word     (flash_info_t *info, ulong dest, ushort data);  
  3. 删除write_buff和write_short两个函数,用下面两个函数代替:
    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);        /* get lower word aligned address */

       /*
        * handle unaligned start bytes
        */
       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;
       }

       /*
        * handle word aligned part
        */
       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;
       }

       /*
        * handle unaligned tail bytes
        */
       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);
    }

    /*
     * Write 16 bit (short) to flash
     */

    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;

       /* Check if Flash is (sufficiently) erased , fix by kavin*/
       if ((*addr & data) != data)
          return ERR_NOT_ERASED;

       /*
        * Disable interrupts which might cause a timeout
        * here. Remember that our exception vectors are
        * at address 0 in the flash, and we don't want a
        * (ticker) exception to happen while the flash
        * chip is in programming mode.
        */
       flag = disable_interrupts();

       /* clear status register command */
       *addr = 0x50;

       /* program set-up command */
       *addr = 0x40;

       /* latch address/data */
       *addr = data;

       /* arm simple, non interrupt dependent timer */
       reset_timer_masked();

       /* wait while polling the status register */
       while(((val = *addr) & 0x80) != 0x80)
       {
          if (get_timer_masked() > CONFIG_SYS_FLASH_WRITE_TOUT) {
          rc = ERR_TIMOUT;
          /* suspend program command */
          *addr = 0xB0;
          goto outahere;
          }
       }

       if(val & 0x1A) {        /* check for error */
          printf("\nFlash write error %02x at address %08lx\n",
               (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:
       /* read array command */
       *addr = 0xFF;

       if (flag)
          enable_interrupts();

       return rc;
    }

到目前为止我们还不能用tftp来下载文件,因为我们还没有移植DM9000网卡。

至此,uboot就能完会支持从nor flash启动,编译生成新的u-boot.bin并通过DNW的USB线下载到SDRAM中运行,便可看到u-boot检测到了我们的flash。用flinfo命令可以看 到具体的块信息,还可以用flash的各种命令对flash进行操作,从而实现这块nor flash驱动的完全支持。烧写当然也是没问题的了,把需要烧写的文件下载到SDRAM中后,用cp.b命令就可以了。

下面大该分析一下这个驱动文件的函数调用,此flash.c文件中有如下几个函数:

static ulong  flash_get_size         (vu_short *addr, flash_info_t *info);
static void     flash_get_offsets     (ulong base, flash_info_t *info);
static int        write_word (flash_info_t *info, ulong dest, ushort data)

unsigned long flash_init (void)
void flash_print_info  (flash_info_t *info)
int flash_erase (flash_info_t *info, int s_first, int s_last)
int flash_real_protect(flash_info_t *info, long sector, int prot)
int write_buff (flash_info_t *info, uchar *src, ulong addr, ulong cnt)

      1.u-boot启动只会用到flash.c文件中的flash_init函数,正如上面所述;
      2.以static修饰的3个函数只在flash.c文件中被调用;
      3.最后面的4个函数会被/common/cmd_flash.c文件中的函数调用,以实现u-boot下的各种命令操作。

 附:若用JLINK下载u-boot.bin到nor flash 中,需要把/include/configs/fl2440.h 中定义的以下这个宏注释掉:

       /* #define CONFIG_SKIP_RELOCATE_UBOOT    1  */   注释掉u-boo才能初始化CPU

时间: 2024-08-21 02:49:10

FL2440的U-boot-2009.08移植(三)支持Nor FLASH的相关文章

Spring Boot与Docker(三):构建你的第一个微服务和相关容器以及容器的连接

本文讲的是Spring Boot与Docker(三):构建你的第一个微服务和相关容器以及容器的连接,[编者的话]本篇是<使用Spring Boot和Docker构建微服务架构>系列的第三篇,本篇我们将会准备开始构建一个员工对象微服务.原文作者为3Pillar环球旗下美国Adbanced技术集团的总监Dan Greene,Dan有十八年的软件设计和开发经验,包括在电子商务.B2B集成.空间分析.SOA架构.大数据以及云计算等领域的软件产品架构经验,他是AWS认证解决方案架构师,在3Pillar之

硕思闪客精灵MX 2005三斧“肢解”Flash

硕思闪客精灵MX 2005是一款著名的Flash反编译软件,它不仅可以直接捕获网页中的Flash动画;还可以将Flash动画进行"肢解",为我们创作Flash作品提供素材:还能将Flash动画还原成Fla格式,这样就可以使用Macromedia公司的Flash重新进行加工处理,下面就为大家介绍它的"三斧"绝招. 软件名称:硕思闪客精灵MX 2005 授权方式:共享软件 软件大小:3830 KB 第一斧 擒拿Flash 在安装了闪客精灵2005后,将自动安装一个名为&

FL2440的U-boot-2009.08移植(五)uboot架构中NAND Flash驱动修改

移植NAND花了我一下午的时间才把他弄明白,解决错误的途中,我也学到了更多的东西,希望大家自己要尝试亲手移植,不要老是用别人的补丁文件,自己你懂手做了才真正是你的东西.       分析了一下Uboot中Nandflash的驱动,u-boot-2009.08使用的是和Linux内核一样的MTD(内存技术设备)架构.在Uboot下对Nand的支持体现在命令行下实现对nand flash的操作,为:nand info,nand device,nand read,nand write,nand ere

FL2440的U-boot-2009.08移植(四) 支持DM900网卡

这一部分虽然移植起来简单,但是当我自己去分析的时候确实折腾了接近两天的时间,真的伤不起啊.虽然说网上对于uboot移植的DM9000A网卡的移植的资料很多,移植过程也很简单,总的来说主要就是设置一下头文件/include/configs/fl2440.h 中宏的定义和drivers/net/dm9000x.c中网卡的函数的修改,和在board/samsung/fl2440/fl2440.c中增加关于网卡的初始化.  打开/include/configs/fl2440.h: 注释掉下面语句: #d

FL2440 Linux kernel + yaffs2根文件移植过程(一)

本文全过程为自己亲自试验,成功移植了一个最基本功能的Kernel.根文件系统,现在将这个一耗时.耗精力 的过程写下来,希望对遇到相同问题的朋友们有所帮助! 平台:飞凌FL2440             windows xp sp2             vmware 6.5.build-203739              ubuntu 9.10              交叉编译器: 4.3.2              内核:linux-2.6.28.7.tar.bz2        

FL2440 Linux kernel + yaffs2根文件移植过程(二)

上一篇文章中Kernel移植基本上没有什么大的问题,除了几处需要更改外(已经注明) make zImage后,内核生成成功,下面是关于yaffs2根文件的移植,移植过程蜿蜒曲折,现现将成功移植过程讲解,后附过程与问题. 一.移植过程(成功) busybox-1.19.4 cross3.4.1(FL2440关盘里的交叉编译器) 1. 下载busybox-1.19.4.tar.bz2,地址是 http://busybox.net/downloads      下载busybox-1.19.4-udh

2009:游戏三巨头的碰撞

首先登场的是微软,会场内一片翠绿,鱼贯而出的数款大作令现场生机勃勃. 随着<摇滚乐队:甲壳虫乐队>宣传片的开场,这个音乐系列游戏似乎又迎来了一个新的高峰.随后,微软一口气公开了10部大作,其中包括托尼·霍克领衔的滑板系列最新作<托尼·霍克 驾驭>以及独特的滑板型体感控制器.Infinity Ward的<使命召唤:现代战争2>.Square Enix的<最终幻想ⅩⅢ>.育碧的扛鼎之作<分裂细胞 断罪>.逼真至极的赛车巨作<Forza 3>

了解WEB页面工具语言XML(三)支持工具

web|xml|页面 三.支持XML的公司和它们的开发工具 尽管XML还处在开发阶段,其标准正在由W3C组织制定,但是已经有许多公司表示全力支持XML,并开发了不少XML工具.Adobe公司的FrameMaker可以用来书写XML文档.Microsoft公司推出的IE 4.0已经可以显示.处理和编辑XML文档,Microsoft公司作出承诺,要在下一个版本的Office 软件如MS Word.Excel中支持XML. Netscape.Sun公司也不甘寂寞,纷纷表示要在他们的Web工具中支持XM

了解WEB页面工具语言XML(三)支持工具_XML/RSS

三.支持XML的公司和它们的开发工具 尽管XML还处在开发阶段,其标准正在由W3C组织制定,但是已经有许多公司表示全力支持XML,并开发了不少XML工具.Adobe公司的FrameMaker可以用来书写XML文档.Microsoft公司推出的IE 4.0已经可以显示.处理和编辑XML文档,Microsoft公司作出承诺,要在下一个版本的Office 软件如MS Word.Excel中支持XML. Netscape.Sun公司也不甘寂寞,纷纷表示要在他们的Web工具中支持XML.除了这些著名的公司