如果没有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

U-boot-2009.08移植(三)支持Nor FLASH相关推荐

  1. s5pv210 uboot-2012-10移植(三) 之支持SPL

    s5pv210 uboot-2012-10移植(三) 之支持SPL 上次的uboot的BL1是自己实现的,今天就来让uboot-2012-10支持SPL功能,但不是完全用的uboot本身的代码,也不知 ...

  2. uboot研读笔记 | 04 - 移植uboot 2012.04到JZ2440(支持Nor Flash读写)

    项目开源地址:https://github.com/Mculover666/uboot-jz2440 0. 教程完整目录 00 - 嵌入式Linux系统中Bootloader的作用和基本运行原理 01 ...

  3. 我的log4net使用手册(转自 http://blog.csdn.net/lyjcn/archive/2009/08/11/4432833.aspx)

    1. log4net简介 log4net是.Net下一个非常优秀的开源日志记录组件.log4net记录日志的功能非常强大.它可以将日志分不同的等级,以不同的格式,输出到不同的媒介.Java平台下,它还 ...

  4. mini6410移植全攻略(3)--uboot移植之支持nand flansh启动(上)

    此篇文章是本人muge0913在上篇文章的基础上继续移植的,文章仅供技术交流请勿商用,转载请注明出处: http://blog.csdn.net/muge0913/article/details/71 ...

  5. uboot研读笔记 | 05 - 移植uboot 2012.04到JZ2440(支持Nand Flash读写)

    项目开源地址:https://github.com/Mculover666/uboot-jz2440 0. 教程完整目录 00 - 嵌入式Linux系统中Bootloader的作用和基本运行原理 01 ...

  6. Spring Boot 架构中的国际化支持实践—— Spring Boot 全球化解决方案

    背景 Spring Boot 主要通过 Maven 或 Gradle 这样的构建系统以继承方式添加依赖,同时继承了 Spring 框架中的优秀元素,减少了 Spring MVC 架构中的复杂配置,内置 ...

  7. [2009.08.09]博客园北京俱乐部活动暨《博客园精华集:Web标准之道》现场签售通知...

    <博客园精华集:Web标准之道>发售啦!!! 无论你是博客园的老人,还是初来乍到,这些人你是否或曾耳闻呢:TerryLee.Anytao.Cat Chen.Anders Liu.鸟食轩.L ...

  8. LeetCode 面试题 08.01. 三步问题 (动态规划)

    面试题 08.01. 三步问题 解法1(动态规划) 分析出递推式:f(n) = f(n - 1) + f(n - 2) + f(n - 3) class Solution {public int wa ...

  9. Leetcode 面试题 08.01. 三步问题

    Leetcode 面试题 08.01. 三步问题 1.问题分析 2.问题解决 3.总结 1.问题分析 题目链接:https://leetcode-cn.com/problems/three-steps ...

  10. 五、移植u-boot-2016.03到Jz2440之修改代码支持NOR Flash

    5. 移植u-boot-2016.03修改代码支持NOR Flash 从上一节把uboot烧写到NAND启动后,最后打印出Flash: 0 Bytes,如下图所示.我们的Jz2440开发板的NOR F ...

最新文章

  1. 计算机书籍-C++并发编程实战
  2. npoi上传xlsx文件,并读取数据
  3. Support:Tenjeafan@163.com
  4. OpenCV删除面积小的区域 实现图像二值化分割 标记连通区域
  5. leetcode 507. 完美数(Java版)
  6. [C++11]通过using定义基础类型和函数指针别名
  7. mysql如何选择多个表_从两个表mysql中选择多行
  8. 常州工学院计算机毕业论文多少字,研究常州工学院毕业论文(设计)系统快速使用指南.doc...
  9. 搞懂这三个指标,数据分析起码少费一半力
  10. 2021年软件开发的五大趋势,低代码/无代码得到了验证!
  11. java数据类型转换方向_java基础学习篇02(数据类型转换和基本面试题)
  12. Filmage Screen for Mac 专业录屏软件用这个就足够
  13. 基于MATLAB的QAM调制与解调系统设计
  14. excel自动换行_Excel教程:看完这篇,再也不为excel换行而烦恼
  15. 配音软件哪个好?这三款很火的配音软件,简直是短视频后期配音必备
  16. 操作系统总结(大全)
  17. android 小视频添加水印,安卓手机怎么给视频加水印 视频加水印的手机软件|微信小视频怎么加水印...
  18. 详解:一次HTTP请求的全过程
  19. idea构建gradle项目报错Could not target platform: ‘Java SE 14‘ using tool chain: ‘JDK 8 (1.8)‘.
  20. php.ini中文翻译版--转载

热门文章

  1. [MySQL学习]常用SQL语句大全总结
  2. 进程和线程的区别是什么
  3. Lodop横向打印,正向显示问题
  4. 区块链公链开发 区块链一条公链开发费用
  5. 稀疏矩阵的加法(用十字链表实现A=A+B)
  6. Photoshop---Wacom手绘板绘画画变成了拖动,根本不能画画
  7. RTX3060是什么级别显卡 RTX3060显卡什么水平
  8. UML顺序图(sequence diagram)
  9. java测试类写三角形_软件测试实验一——使用junit判断三角形
  10. 选择适合的Node js授权认证策略