P1010rdb新单板u-boot移植过程总结

发布时间 : 星期二 文章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

联系合同范文客服:xxxxx#qq.com(#替换为@)