发布时间 : 星期二 文章P1010rdb新单板u-boot移植过程总结更新完毕开始阅读
重定位CCSRBAR,即cpu的寄存器映射区域,control config status registers 配置Local Access Window L1 cache
设置L1 data cache 作为INIT_RAM使用 跳到_start_cont 处开始执行
? 设置堆栈到INIT_RAM中(L1 data cache),此时ddr尚未规划。
? 调用cpu_init_f()函数(arch/powerpc/cpu/mpc85xx/cpu_init_early.c),完成下面
的工作:
? ? ? ?
1、为U-boot的全局变量指定地址并清空 2、为CCSRBAR建立TBL
3、建立nor flash、cpld、nand flash到LAW 4、为L2SRAM建立TLB,配置L2RAM
5、为NOR FLASH建立TLB, 并从新配置IFC驱动nor flash
6、禁止MMU TLB1,这样就导致不能使用启动时的默认TBL去映射nor flash了 7、为L1 DCache 重新建立TLB,L1 DCache for SRAM, 用作stack空间
? 调用board_init_f()板级初始化函数(common/board_f.c),
1、逐个调用init_sequence[]中的板级初始化函数,包括cpu探测,时钟的获取、初始
化时间基数、环境变量env的初始化,初始波特率、初始化串口、初始化终端、打印选项、检测cpu、检测board等和最关键的时初始化DDR SDRAM(board/freescale/p1010rdb/ddr.c,不使用SPD EEPROM) 2、分配从0—512MB的RAM空间。初始化bd_t *bd 板级数据结构信息。调用函数relocate_code (addr_sp, id, addr) 把代码从flash中load到RAM中并从RAM中继续运行, 其中:addr_sp指向栈顶(最大地址)。id指向gd_t,即全局数据结构。 Addr指向代码搬移的目的地址。
? relocate_code的工作
relocate_code (addr_sp, id, addr) 把代码从flash中load到RAM中 并从RAM中继续运行!
1将栈由内部RAM(cache)空间重新定位到外部DDR内
2从flash中拷贝代码到DDR RAM中,在RAM中的高端,具体地址根据RAM大小确定。
3重定位中断向量到DDR RAM中
4 计算in_ram函数在RAM中的地址,并跳转到该函数继续执行。 5 调整GOT表中函数的地址,并清零bss段。 6 调用board_init_r()函数
6.1 更新uboot命令函数地址,因为代码已拷贝到RAM中。 6.2 调用函数trap_init () copy exception 代码到RAM低地址处 6.3 调用flash_init()获取flash校验等,并填写flash信息到bd中。 6.4 调用cpu_init_r()初始化L2 cache。
6.5调用mem_malloc_init()初始化uboot阶段的,可以allocate的memory,我们板卡定义了128KB空间。
6.6 调用env_relocate(),如果enviroment 包含在编译的镜像中,则修改其地址。否则,申请空间,并拷贝默认的environment。
6.7 获取ethernet mac地址,并保存到bd中。
6.8 调用getenv_IPaddr()从environment 信息中获取ip地址,保存到bd中。
6.9 devices_init(),根据板卡头文件定义,注册必要的设备,如串口设备。 6.10 jumptable_init()初始化gd中的jump table中的函数,如get_version,malloc,getenv
6.11调用console_init_r()把串口设备设置为标准的输入、输出、错误控制终端。
6.12 调用interrupt_init()使能中断。 6.13 获取uImage 在RAM中的地址 注:在板卡头文件中定义了uImage(kernel),ramdisk和flat device tree 在RAM中的地址,在调试过程中需要把他们分别下载到对应的地址,即可调用bootm命令启动linux。
如:ramdiskaddr=2000000,fdtaddr=400000,uImage在1000000。
6.14 调用eth_initialize(bd)初始化以太网接口(net/eth.c/eth_initialize())。 6.15 调用main_loop()函数,进入主循环。 ? main_loop()函数
Uboot在硬件初始化完成后将进入main_loop()函数,main_loop()函数将进入一个无限循环,等待用户输入命令后。
4、P1010rdb_pb的demo开发板Memory Map
=============================== Address Start Address End Memory type 0x0000_0000 0x1fff_ffff DDR 0xa000_0000 0xdfff_ffff PCI Express Mem 0xee00_0000 0xefff_ffff NOR Flash 0xffc2_0000 0xffc5_ffff PCI IO range 0xffa0_0000 0xffaf_ffff NAND Flash 0xffb0_0000 0xffbf_ffff Board CPLD 0xffd0_0000 0xffd0_3fff L1 for Stack 16K 0xffe0_0000 0xffef_ffff CCSR
Attributes
512MB Cacheable 1G non-cacheable 32M non-cacheable 256K non-cacheable 1M cacheable 1M non-cacheable Cacheable TLB0 1M non-cacheable