u-boot移植(十)---代码修改---支持nor flash

发布者:chenfengy818最新更新时间:2023-07-03 来源: elecfans关键字:u-boot  移植  nor  flash 手机看文章 扫描二维码
随时随地手机看文章

一、问题定位

  

  开发板重启后打印了2个提醒和一个错误,caches的提醒先不看,看看flash和nand下面的提醒,bad CRC,Using default enviroment,我们可以定位Using default enviroment定位到

代码位置,如下:  

  Env_common.c (common) 

  

  传入的参数应该是 !badCRC,再次定位函数set_default_env 看是在哪里调用此函数:

  

  

  

  

  

  基本上文件都在common文件夹下,有common中的调用和 dataflash,nand,sf,ubi。暂且不知道是哪个,要看看u-boot.dis中哪里调用了这个函数,再来定位了。

  通过u-boot.dis 可以知道,在几个函数中调用了 set_default_env 这个函数:


    • env_import:Env_common.c (common) 

    • env_relocate:Env_common.c (common)

    • do_env_default:Cmd_nvedit.c (common) 

二、代码分析

  搜索 Flash: 查看结果:

  

  与此相匹配的为 board_r.c 文件中。

  定位到 board_r.c(common)中的 initr_flash 函数。  

  此函数定义在第二阶段代码 board_init_r 函数中的 init_sequence_r 链表中:

  

2.1 initr_flash

  initr_flash 函数的代码解读如下:

 1 #if !defined(CONFIG_SYS_NO_FLASH)    //未定义CONFIG_SYS_NO_FLASH这个宏就执行此函数

 2 static int initr_flash(void)

 3 {

 4     ulong flash_size = 0;            //定义存储 flash 空间大小的变量

 5     bd_t *bd = gd->bd;                //定义板信息结构体

 6 

 7     puts("Flash: ");                //输出字符串 Flash: 

 8 

 9     if (board_flash_wp_on())        //此为空函数,返回0值,直接执行 else后面的语句

10         printf("Uninitialized - Write Protect Onn");

11     else

12         flash_size = flash_init();    //flash初始化

13 

14     print_size(flash_size, "");        //打印flash_size的大小

15 #ifdef CONFIG_SYS_FLASH_CHECKSUM    //此宏在 include/configs/jz2440.h 未定义 里面的一段代码不执行

16     /*

17     * Compute and print flash CRC if flashchecksum is set to 'y'

18     *

19     * NOTE: Maybe we should add some WATCHDOG_RESET()? XXX

20     */

21     if (getenv_yesno("flashchecksum") == 1) {

22         printf("  CRC: %08X", crc32(0,

23             (const unsigned char *) CONFIG_SYS_FLASH_BASE,

24             flash_size));

25     }

26 #endif /* CONFIG_SYS_FLASH_CHECKSUM */

27     putc('n');                        //换行

28 

29     /* update start of FLASH memory    */

30     /* CONFIG_SYS_FLASH_BASE 在 include/configs/jz2440.h中有定义

31      * #define CONFIG_SYS_FLASH_BASE    PHYS_FLASH_1

32      * #define PHYS_FLASH_1        0x00000000             // Flash Bank #0 

33      * 这里定义的宏的大小为0 则我们的CONFIG_SYS_FLASH_BASE 页的基地址为0

34      */

35 #ifdef CONFIG_SYS_FLASH_BASE        

36     bd->bi_flashstart = CONFIG_SYS_FLASH_BASE;    //bd->bi_flashstart = 0 从0地址开始执行

37 #endif

38     /* size of FLASH memory (final value) */

39     bd->bi_flashsize = flash_size;            //flash 的大小

40 

41 #if defined(CONFIG_SYS_UPDATE_FLASH_SIZE)

42     /* Make a update of the Memctrl. */

43     update_flash_size(flash_size);            //更新flash 的大小

44 #endif

45 

46 

47 #if defined(CONFIG_OXC) || defined(CONFIG_RMU)    //未定义,不执行

48     /* flash mapped at end of memory map */

49     bd->bi_flashoffset = CONFIG_SYS_TEXT_BASE + flash_size;

50     /* #define CONFIG_SYS_MONITOR_BASE    CONFIG_SYS_FLASH_BASE

51      * 从这里可以看出CONFIG_SYS_MONITOR_BASE与CONFIG_SYS_FLASH_BASE相等,

52      * 则执行宏内语句

53      */

54 #elif CONFIG_SYS_MONITOR_BASE == CONFIG_SYS_FLASH_BASE

55     bd->bi_flashoffset = monitor_flash_len;    /* reserved area for monitor */

56 #endif

57     return 0;

58 }

59 #endif


  标记红色的语句就是我们在执行的语句。可以看出在flash 初始化后就打印出了 flash空间大小。


  定位到 flash_init 中


2.2 flash_init  

  文件路径:Cfi_flash.c (driversmtd)


  先去掉不必要的宏,代码精简一下。


 1 unsigned long flash_init (void)

 2 {

 3     unsigned long size = 0;

 4     int i;

 5 

 6     /* Init: no FLASHes known */

 7     /* #define CONFIG_SYS_MAX_FLASH_BANKS    1 */

 8     /* include/configs/jz2440.h中有定义,为 1 */

 9     for (i = 0; i < CONFIG_SYS_MAX_FLASH_BANKS; ++i) {

10         flash_info[i].flash_id = FLASH_UNKNOWN;

11 

12         /* Optionally write flash configuration register */

13         cfi_flash_set_config_reg(cfi_flash_bank_addr(i),

14                      cfi_flash_config_reg(i));

15         /* 检测 flash

16          * flash_detect_legacy 是旧的检测策略

17          */

18         if (!flash_detect_legacy(cfi_flash_bank_addr(i), i))

19             flash_get_size(cfi_flash_bank_addr(i), i);

20         size += flash_info[i].size;

21         if (flash_info[i].flash_id == FLASH_UNKNOWN) {

22         }

23     }

24 

25     flash_protect_default();    //flash的默认保护

26     return (size);

27 }


  在第18行,看到 flash 检测,这里检测的是 flash 的信息和大小。可以进去看看源码


2.2.1 flash_detect_legacy

  源码位置:Cfi_flash.c (driversmtd) 


  1 #ifdef CONFIG_FLASH_CFI_LEGACY        // include/configs/jz2440.h 中有定义

  2 /* 读取flash 的产品信息 */

  3 static void flash_read_jedec_ids (flash_info_t * info)

  4 {

  5     info->manufacturer_id = 0;

  6     info->device_id       = 0;

  7     info->device_id2      = 0;

  8 

  9     switch (info->vendor) {

 10     case CFI_CMDSET_INTEL_PROG_REGIONS:

 11     case CFI_CMDSET_INTEL_STANDARD:

 12     case CFI_CMDSET_INTEL_EXTENDED:

 13         cmdset_intel_read_jedec_ids(info);

 14         break;

 15     case CFI_CMDSET_AMD_STANDARD:

 16     case CFI_CMDSET_AMD_EXTENDED:

 17         cmdset_amd_read_jedec_ids(info);

 18         break;

 19     default:

 20         break;

 21     }

 22 }

 23 

 24 /*-----------------------------------------------------------------------

 25  * Call board code to request info about non-CFI flash.

 26  * board_flash_get_legacy needs to fill in at least:

 27  * info->portwidth, info->chipwidth and info->interface for Jedec probing.

 28  */

 29 static int flash_detect_legacy(phys_addr_t base, int banknum)

 30 {

 31     flash_info_t *info = &flash_info[banknum];

 32 

 33     /*  获得旧的 flash 信息,返回值为 0 

 34      *     info->portwidth = FLASH_CFI_16BIT;  0x02

 35      *    info->chipwidth = FLASH_CFI_BY16;    0x02

 36      *    info->interface = FLASH_CFI_X16;    0x01

 37      */

 38     if (board_flash_get_legacy(base, banknum, info)) {

 39         /* board code may have filled info completely. If not, we

 40            use JEDEC ID probing. */

 41         if (!info->vendor) {

 42             int modes[] = {

 43                 CFI_CMDSET_AMD_STANDARD,

 44                 CFI_CMDSET_INTEL_STANDARD

 45             };

 46             int i;

 47 

 48             for (i = 0; i < ARRAY_SIZE(modes); i++) {

 49                 info->vendor = modes[i];

 50                 /* 映射物理地址 */

 51                 info->start[0] =

 52                     (ulong)map_physmem(base,

 53                                info->portwidth,

 54                                MAP_NOCACHE);

 55                 /* if中的语句不执行,前面已经设置 info->portwidth = FLASH_CFI_16BIT;*/

 56                 if (info->portwidth == FLASH_CFI_8BIT

 57                     && info->interface == FLASH_CFI_X8X16) {

 58                     info->addr_unlock1 = 0x2AAA;

 59                     info->addr_unlock2 = 0x5555;

 60                 } else {/* 执行else 中的语句,发送  0x5555 0x2aaa命令 */

[1] [2]
关键字:u-boot  移植  nor  flash 引用地址:u-boot移植(十)---代码修改---支持nor flash

上一篇:u-boot移植(十二)---代码修改---支持DM9000网卡
下一篇:u-boot移植(九)---代码修改---NAND

推荐阅读最新更新时间:2024-10-13 16:52

友善之臂 madplayer 移植过程补充
在看友善之臂 QQ2440的用户手册,其中的madplayer移植,自己试了试,在手册之外的一点东西,可能会对你有一点点的帮助。 www.linuxidc.com @linuxidc:~/creek/madplay/src-x86/libid3tag-0.15.1b$./configure --prefix=/home/creek/creek/madplay/target-x86/ 得到如下提示 configure: error: zlib.h was not found *** You must first install zlibz(libz) before you can build this package. *** If
[单片机]
友善之臂 madplayer <font color='red'>移植</font>过程补充
在MC68HC908GP32上移植μC/OS-II
在前几讲中,介绍了μC/OS-II的概念、工作机制,还介绍了μC/OS-II在Intel 80X86CPU上的移植,相信读者通信学习,已经对移植的过程和步骤有了一定的了解。ΜC/OS-II最初是为摩托罗拉68HC11系列单片机设计的。68HC11系列单片机有外部总线,可以外接RAM和ROM;而没有外部总线8位MCU。由于RAM容量的限制,移植就存在一定的困难;但对于有些8位的MCU,将μC/OS-II移植到MOTOROLA MC68H908GP32(以下简称GP32)上。 一、在GP32上移植μC/OS-11的主要问题 在第(4)讲中,介绍过要移植μC/OS-11,目标处理必须满足以下要求:
[嵌入式]
MBED移植日记:gpio_api移植(基于STM32F107RC)
本文是继MBED串口API移植的又一篇系列文章,前阵子忙着赶项目,移植完了却没来得及写成文章来分享,今天来补上,一来可以温故知新,二来也可以献出自己的一点微薄之力。写的不好,移植的也不一定好,请大家多多指教。本文的gpio_api模块与mbed官方的会有一些不同,原因是加入了我个人理解的一些东西。 一、关联文件 1、ierror.h /* ************************************************************** file: ierror.c date: 2016-8-15 ver : 1.00.00 *****************************
[单片机]
MSP430单片机Flash存储器的特性及应用
概述   以单片机为核心的仪表常要考虑发生突然掉电时的数据保存问题,一般有两种对策:一是用后备电源维持单片机持续工作,称为硬保护;另一种是在检测到掉电后,在电源完全失效前保护现场数据,上电后再恢复工作,称为软保护。本文主要讨论后者。   目前,设计掉电软保护功能时,数据存储介质常选用两类:一类是E2PROM,但写入时间较长,难以写入较多数据;另一类是带有后备电池的小容量SRAM构成的非易失性存储器,写入速度快,但增加了电路的复杂性。掉电电压的检测电路可用分立元件构成,也可用专用芯片来实现。前者增加了电路复杂性且降低了系统可靠性;后者增加了成本。   TI公司的Flash型单片机MSP430F11x1系列、MSP430F13x系列
[单片机]
DRAM价格滑落 三星被迫将产能转至Flash
5月29日消息,目前市场上主流512Mb DRAM现货价格已经滑落至每颗1.3美元。三星、海力士等国际存储大厂不得不采取产能转换战略,陆续将DRAM产能转至Flash。而我国台湾DRAM制造厂因为仅有DRAM单一产品线,因此只能被迫继续生产,将来恐怕只能是增加库存,有待市场回升时再售出。 封测厂看衰DRAM制造业后市的情况比较明显,联测科技总经理蔡宗哲表示,DRAM供过于求的情景将会延续到2008年底,而Flash产业则因高容量存储器需求攀升,预期产能供过于求的情况到2007年第4季就会改善。另外,美国研究机构iSuppli今天也表示,到2008年3月以前,全球DRAM销售将减缓。 据悉,DRAM产从3月起就开始低落,价格直线下
[焦点新闻]
linux 2.6.24.4在S3C2410上的移植(CS8900网卡驱动)(基于GEC2410)
SMDK2410配置默认使用的是DM9000A的网卡,因此我们需要修改成CS8900A的网卡驱动. 网上找到移植方法有两种方法,一种是将以前版本的cs8900.c驱动拿过来用,只要在配置中增加ARM_CS8900选项,这个代码网上有很多,拿过来试了以下,的确没问题. 另一种方法是修改2.6.24.4自带的cs89x0.c驱动,这个驱动没有2410的直接支持,我们需要修改. 这里采用第二种方法.参考了网上很多方法,将我的步骤整理如下,如有错误,欢迎指正. 1.内核配置菜单 由于cs89x0驱动依赖于NET_PCI,见drivers/net/Kconfig depends on NET_PCI && (ISA || M
[单片机]
linux 2.6.24.4在S3C2410上的<font color='red'>移植</font>(CS8900网卡驱动)(基于GEC2410)
Cypress与HI-TECH发布最新编译器,加倍PSoC器件的存储能力
Cypress半导体公司和HI-TECH Software日前宣布了一项新的编译技术,能够扩展动态可配置PSoC混合信号阵列的存储容量和性能。这款新的ANSI C编译器,即面向PSoC混合信号阵列的HI-TECH C PRO,开拓了HI-TECH的Omniscient Code Generation(全知代码生成,OCG)技术,能够从根本上降低PSoC的代码量。 PSoC混合信号阵列集成了可编程的模拟和混合功能,带有一个8位MCU内核,高达32KB闪存和高达2KB的SRAM。能够广泛用于成本敏感、空间受限的消费类应用,包括触摸屏接口、电动机控制以及近感探测及其它。PSoC设备能够进行动态重配,在相同硅片上执行多个独立的功能,因此
[应用]
uC/OS-II在凌阳单片机SPCE061A上的移植
引 言:   目前,实时操作系统已广泛应用于工业控制的各个领域。uC/OS-II作为一个实时内核,由于其源码公开、代码规范,广受开发人员的喜爱。SPCE061A是凌阳公司继u’nSPTM系列产品SPCE500A等之后新推出的一款16位单片机,内部集成A/D、D/A等多种接口电路,能很方便地嵌入工业控制的各种场合。更重要的是,其内嵌2K字的SRAM和32K的Flash ROM,因此,在不需要扩展外部存储器的情况下就可以实现uC/OS-II系统的移植。 1 uC/OS-II实时操作系统介绍   uC/OS-II是一种专门为微控制器设计的抢占式实时多任务操作系统,它以源代码的形式给出。其内核主要提供进程管理、时间管理、内存管理等服务。
[单片机]
uC/OS-II在凌阳单片机SPCE061A上的<font color='red'>移植</font>
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved