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 */
---------------------------------- flash_init 函数解析----------------------------
00084: ulong flash_init (void)
00085: {
00086: int i, j;
00087: long size = 0;
00088:
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的所有参数,比如大小、扇区数、flash的id,还有有些操作指令等。
#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);
块设备保护状态,一共有512个扇区,那就需要有512个保护标志,protect[512]是个字符数组。清零。
00106: if (i == 0) flashbase = CFG_FLASH_BASE;
首先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);
输入堆的起始地址:
---------------------------------- 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中你也可以malloc、free这套机制来申请内存和释放内存。我们在DDR内存中给堆预留了896KB的内存。