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

发布时间 : 星期二 文章P1010rdb新单板u-boot移植过程总结更新完毕开始阅读

地址空间(local address map)就是core能够访问到的36bit的地址空间。这个地址空间包括各个功能模块能够访问的地址空间,DDR SDRAM空间以及CCSR地址空间。CPU core是怎么访问SOC上的各个功能模块的, 比如IFC控制器,DDR控制器,PCI控制器等等。通过LAW(Local Access Window)寄存器来配置。每个LAW寄存器将一段地址空间和相应的功能模块连接起来,从core出来的物理地址和各个LAW的地址进行比较,如果在某个LAW指定的地址空间,那么就将这个发送给该LAW指定的功能模块。每个LAW可指定的地址空间大小为4K-32G。【特别提醒】:LAWBA [BASE_ADDR]域必须和地址空间大小对齐。 在这个地址空间中有三段地址是比较特殊的(特别想u-boot启动时): A.CCSR的地址空间:这段地址空间只需要通过CCSBAR寄存器来指定起始地址,地址空间大小是固定的1M空间(e500core是1M);

CCSRBAR(Configuration,Control,and Status Registers Base Address Register)的缺省值是0xFF700000。

访问该空间的TLB在设置时,需要将I和G位置1。 B.L2SRAM地址空间

P1010rdb有512K的L2cache,该cache可以配置为SRAM使用,此时需要通过L2CTL[L2SRAM]域来指定L2SRAM的大小,通过L2SRBAR寄存器指定其实地址。

C.缺省的8Mbootrom地址空间

一般SOC会定义8MB的bootrom启动地址空间(0xFF80_0000–0xFFFF_FFFF),在core复位启动访问第一条指令时能够直接访问指定启动设备的地址空间。启动设备可以指定挂在IFC上的NANDflash,NOR flash,或者指定SD卡/SPIflash。

上述地址空间配置优先级:

L2SRBAR指定的地址优先于其他方式指定的地址空间;CCSRBAR指定的地址空间不能和DDR控制器指定的地址空间重复,否则,CPU行为是未定义的;LAW之间的地址如果重复,则低编码LAW覆盖高编码LAW的地址空间。 2)TLB

TLB简单说就是将程序虚拟地址转化为物理地址的一个查找表。TLB使用WIMGE字段来指定所访问地址空间的属性。在启动的时候,所有L1/L2MMU中的TLBEntry都是无效的,除了TLB1的Entry0,该Entry被赋予以下数值来指定地址空间0(AS0)中的4KB启动地址空间(0xFFFF_F000– 0xFFFF_FFFF)。在U-Boot代码中,这段4K代码被称为bootpage,即cpu/mpc85xx/start.S中的

bootpg汇编代码。e500 core在复位的时候会去0xFFFF_FFFC去读取第一条指令,该指令一般是一条跳转指令,跳转到bootpg的头部去执行。 3)bootfrom NOR flash

一般NOR flash挂接在CPU的IFC控制器上,通过CS0来片选。要想从NOR flash启动,首先将编译好的768K U-Boot image烧写到NORflash的最后768K中。CPU core启动时会去0xFFFFFFFC处取第一条指令执行,一般是一条跳转指令跳转到bootpage的地方,因为NOR flash是可以字节访问的,随后CPU会顺序执行NOR flash中的代码。 4)U-Boot image要烧写地址

首先一个问题是U-Boot image要烧写到NOR flash的哪个地址,是由CPU和NORflash的硬件连线决定的。同时该地址也决定了U-Boot的

CONFIG_SYS_TEXT_BASE 代码段.test的起始地址的值,也就是U-Boot image中text段的起始地址。

三、U-boot的移植

1、u-boot的工程结构

|-api u-boot的一些编程接口(u-boot越来越向着操作系统的方向发展了,有点像DOS了)

|-arch 体系结构相关的内容,都是关于CPU和SOC的内容

|-board 和具体板子相关的内容,包括板子的初始化、片上资源初始化的代码

|-common u-boot的通用代码,包括main函数,命令处理,执行等等的代码

|-disk 磁盘操作相关的代码?这个部分我还没有看。 |-doc u-boot的文档 |-drivers 驱动程序代码 |-examples api应用的一些示例

|-fs 文件系统相关的代码 |-include 头文件目录 |-configs 板级相关的头文件

|-linux 从linux内核中引用来的头文件 |.....

|-lib 与体系无关的通用函数库

|-nand_spl nand引导器,这个应该是这个版本新增的,提供了一种新的方式来制做如nand或sd载入u-boot的方式 |-net 网络相关的代码

|-onenand_ipl 这个不大清楚,猜想与nand_spl可能类似,等有时间看看文档再补充

|-post 没用到呢,也不大清楚

|-tools 一些工具类和脚本类的代码,用于生成配置文件和一些编译相关的与HOST体系相关的东焉

上面这些是目录,下面是一些重要文件(代码根目录的) Makefile make核心文件

config.mk 供make来引用的一些公共的参数据和规则,如从 .S -> .o 文件的编译参数 .c -> .o 的编译参数等等。

rules.mk 供make来引用的一些规则,主要是depend一类的依懒文件的生成

mkconfig 这是一个可执行脚本,用于生成特定板子的配置文件,以及建立适应特定板子的目录结构(主要是软连接)

boards.cfg 所有和板子相关的配置文件,这些信息在该版本之前都是在Makefile中的,从这个版本开始独立成一个文件,便于移植和改造。

2、配置特定板卡的U-boot

对于要编译一个对于特定板子的u-boot,首先需要执行的是配置,这个操作在之前的版本上也是一样。这里有一些变化,之前的配置文件都是写在Makefile的主文件中的。而从这个版本开始,配置文件独立出来,放在boards.cfg中。而

同时是由makefile来调用mkconfig这个可执行脚本来生成相关配置和文件的。

对于配置,这个指令没有变。 make xxxxx_config,xxxxxx是板子的名称,我们p1010rdb板卡配置为p1010rdb_pb_nor_config,执行make

p1010rdb_pb_nor_config后,执行make就可以完成u-boot编译,我们这边使用yocto project来完成这些工作。

配置p1010rdb_pd_nor板卡的关键文件为include/config.h,config.h文件又包括include/config/p1010rdb.h的配置文件,该文件包括了单板的配置信息,包括地址映射控制等。

3、U-boot走读和修改

1) 入口:_start_e500

P0101rdb复位后,只映射了最后的4K有效地址空间。Bootpg 区域被定位到LAST PAGE。该区域中的代码主要做三件事情:

a.清零一些寄存器; b.设置exception table;

c.添加TLB项,映射更大的区域。 复位入口代码在文件resetvec.s中,只有一条跳转命令,将位于flash的0xfffffffc处,见uboot根目录board/freescale/p1010rdb/u-boot.lds。

.section .resetvec,\b _start_e500

下面的代码位于start.s中

.section .bootpg,\.globl _start_e500

_start_e500: 上电复位后默认映射的最后页,即LAST PAGE,位于0xeffff000,见uboot根目录u-boot.lds。 2) start.s代码过程

? 使能L1 cache

? 设置异常向量表

? 配置MMU单元,即TLB0和TLB1 条目,此时虚实地址相同。默认只映射

flash的最后的4KB空间,所以此空间也叫bootpg。配置MMU之后,可以访问所有flash。

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