Uboot30之start.S第二阶段part2

00489: #ifndef CFG_NO_FLASH    //我们没有定义,因此执行下面的flash初始化函数
00490:
/* configure available FLASH banks */
00491:     size = flash_init ();
00492:     display_flash_config (size);
00493: #endif
/* CFG_NO_FLASH */

Uboot30之start.S第二阶段part2

---------------------------------- flash_init 函数解析----------------------------

00084: ulong flash_init (void)
00085: {
00086:     int i, j;
00087:         long size = 0;
00088:

Uboot30之start.S第二阶段part2
00089:         for (i = 0; i < CFG_MAX_FLASH_BANKS; i++)

{

00090:         ulong flashbase = 0;
00091:
00092:         flash_info[i].flash_id =

00096:             #elif defined(CONFIG_MX_LV640EB)
00097:             (MX_MANUFACT & FLASH_VENDMASK) |
00098:             (MX_ID_LV640EB & FLASH_TYPEMASK);
00099:         #else
00100:         #error "Unknown flash configured"
00101:             #endif

稍后看下id,先看下flash_info这个结构体:这个结构体是关于flash的所有参数,比如大小、扇区数、flashid,还有有些操作指令等。

Uboot30之start.S第二阶段part2

Uboot30之start.S第二阶段part2

Uboot30之start.S第二阶段part2

#define MX_MANUFACT    0x00C200C2    /* MXIC     manuf. ID in D23..D16, D7..D0 */

#define FLASH_VENDMASK    0xFFFF0000    /* extract FLASH vendor information    */

#define MX_ID_LV640EB    0x22CB22CB    /* 29LV640EB ID (64 M, bottom boot sect) */

#define FLASH_TYPEMASK    0x0000FFFF    /* extract FLASH type    information    */

结果flash_id = 0XC222CB
00102:     flash_info[i].size = FLASH_BANK_SIZE;

#define FLASH_BANK_SIZE    PHYS_FLASH_SIZE

#define PHYS_FLASH_SIZE        0x800000    /* 8MB */


00103:     flash_info[i].sector_count =CFG_MAX_FLASH_SECT;

#define CFG_MAX_FLASH_SECT    512

定义了一块nor flash,大小是8MB,共512扇区,每个扇区16KB大小。
00104:
00105:     memset (flash_info[i].protect, 0,CFG_MAX_FLASH_SECT);

Uboot30之start.S第二阶段part2Uboot30之start.S第二阶段part2

块设备保护状态,一共有512个扇区,那就需要有512个保护标志,protect[512]是个字符数组。清零。
00106:     if (i == 0) flashbase = CFG_FLASH_BASE;

Uboot30之start.S第二阶段part2

首先i确实只有0;这个flashbase数值比较大。
00108:     else panic ("configured too many flash banks!\n");
//
只能有一个bank,不然会打印bank过多的错误

00147:         size += flash_info[i].size;
00148:     }
? end for i=0;i<CFG_MAX_FLASH_B... ?
00149:
00150:     flash_protect (FLAG_PROTECT_SET,CFG_FLASH_BASE,CFG_FLASH_BASE + monitor_flash_len - 1,&flash_info[0]);

这句话是为了保护uboot这一块的flash代码,并给出保护标志。
00154:
00155: flash_protect (FLAG_PROTECT_SET,CFG_ENV_ADDR,CFG_ENV_ADDR + CFG_ENV_SIZE - 1, &flash_info[0]);

这句话是为了保护环境变量ENV这一块的flash代码,并给出保护标志。
00158:
00159: return size;
00160: }
? end flash_init ?

总结:首先求出flashid,flash的大小,并对uboot和环境变量部分的代码进行加保护标志。

00360: static void display_flash_config (ulong size)
00361: {
00362: puts ("Flash: ");
00363: print_size (size, "\n")
;
//
个print_size函数是可以识别是G、M、K,并打印,内部调用printf
00364: }

打印flash的大小。

---------------------------------- flash_init 函数解析结束----------------------------

1)虽然NandFlash和NorFlash都是Flash,但是一般NandFlash会简称为Nand而不是Flash,一般讲Flash都是指的Norflash。这里2行代码是Norflash相关的。

2)flash_init执行的是开发板中对应的NorFlash的初始化、display_flash_config打印的也是NorFlash的配置信息(Flash: 8 MB就是这里打印出来的)。但是实际上X210中是没有Norflash的。所以着两行代码是可以去掉的(我也不知道为什么没去掉?猜测原因有可能是去掉着两行代码会导致别的地方工作不正常,需要花时间去移植调试,然后移植的人就懒得弄。实际上不去掉除了显示有8MB Flash实际没用之外也没有别的影响)

armboot_start is defined in the board-specific linker script */
00525: #ifdef CONFIG_MEMORY_UPPER_CODE /* by scsuh */

00526:     mem_malloc_init (CFG_UBOOT_BASE + CFG_UBOOT_SIZE -CFG_MALLOC_LEN - CFG_STACK_SIZE);

输入堆的起始地址:

Uboot30之start.S第二阶段part2

---------------------------------- mem_malloc_init函数解析----------------------------

00111: static void mem_malloc_init (ulong dest_addr)
00112: {
00113: mem_malloc_start = dest_addr;
00114: mem_malloc_end = dest_addr + CFG_MALLOC_LEN;    //896KB
00115: mem_malloc_brk = mem_malloc_start;
00116:
00117: memset ((void *) mem_malloc_start, 0,mem_malloc_end - mem_malloc_start);
00119: }

主要就是对堆空间进行清零。

---------------------------------- mem_malloc_init函数解析结束----------------------------
00527: #else
00528:     mem_malloc_init (_armboot_start - CFG_MALLOC_LEN);
00529: #endif

1)mem_malloc_init函数用来初始化uboot的堆管理器。

2)uboot中自己维护了一段堆内存,肯定自己就有一套代码来管理这个堆内存。有了这些东西uboot中你也可以mallocfree这套机制来申请内存和释放内存。我们在DDR内存中给堆预留了896KB的内存。