一、问题定位
开发板重启后打印了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命令 */
上一篇:u-boot移植(十二)---代码修改---支持DM9000网卡
下一篇:u-boot移植(九)---代码修改---NAND
推荐阅读最新更新时间:2024-10-13 16:52
设计资源 培训 开发板 精华推荐
- LT3686 的典型应用 - 采用 3mm-3mm DFN 封装的 37V/1.2A 降压型稳压器
- 使用 Cypress Semiconductor 的 S6AP413A5AGN1C000 的参考设计
- WF111 Wi-Fi模块典型应用
- L7805C 开关稳压器的典型应用
- STM32f103_BLDC驱动器
- 具有目标数据输出的汽车级 77GHz 雷达模块参考设计
- DM160222、CAP1126 评估套件为评估和开发各种电容式触摸感应应用提供了一个简单的平台
- 用于ST25DV04K动态NFC / RFID标签IC的开发套件,具有快速传输模式功能
- 用于两相、±6A 单 VTT 输出的 LTC3634IUFD 降压稳压器的典型应用电路
- 使用 L5970D/L5973D 6 至 24 VDC 输入 1W LED 驱动器的高强度应用电路
- 有奖直播 | ST25 NFC新产品及应用方案介绍 报名中
- 新年测评活动!ST NUCLEO-H743ZI“佩奇”待测,快来申请年后第一波测评!
- 答题赢奖:日图科技低功耗测试系统介绍
- 有奖直播:当代物联网智能天线设计趋势
- 免费下载Vishay最新汽车解决方案
- 【在线研讨会】ADI RadioVerse™技术与集成DPD算法的RF收发器AD9375
- Microchip有奖问答 | 新品 MCU 独立于内核的外设(CIP)技术解密
- 6月19日上午10:00直播:大大通助你解锁新一代ADAS技术
- 4小时实战+剖析:TI工程师教你快速上手 各种无线产品开发 (限量$14售CC1352R1无线开发板,助你参与动手实验)