2024年1月7日发(作者:同寒烟)
新单板P1010rdb的u-boot移植讲解
一、yocto project的建立
1. 搭建linux环境,ubuntu 12.04
2. QorIQ SDK 1.7 Documentation
(1)SDK 简介参考freescale的网站
/infocenter/?topic=%2FQORIQSDK%
(2)安装SDK
1.
Mount the ISO on your machine:
$ sudo mount -o loop QorIQ-SDK-
/mnt/cdrom
2.
As a non-root user, install Yocto Project:
$ /mnt/cdrom/install
3.
When you are prompted to input the install path, ensure that the current user has the
correct permission for the install path.
(3)配置sdk的环境
1、$ cd
2、$ ./scripts/
3、安装python-2.7.6,
export PATH=/opt/python-2.7.6/bin:$PATH
4、建立p1010rdb的开发环境:
$ source ./fsl-setup-poky -m p1010rdb
将生产build_p1010rdb_release的目录,用于p1010rdb相关的开发,包括u-boot, kernel,rootfs等
(4)编译工具链
1、$ cd
、
$ bitbake
fsl-toolchain
(5)编译u-boot
1、获取u-boot源码
$ bitbake -c patch u-boot
2、修改u-boot代码,u-boot代码放在路径下,获取的方法
$ bitbake -e .
3、修改编译u-boot的配置文件
meta-fsl-ppc/conf/machine/
主要是UBOOT_MACHINES = "P1023RDB"的宏变量,这个变量的值决定了编译出来的u-boot的值。
4、编译
$ cd build_
$ bitbake -c compile -f u-boot
$ bitbake u-boot
Note: U-Boot image can be found in
build_
5、清除
$
bitbake -c cleansstate u-boot
二、P1010RDB启动必备知识
1、内存映射
(1)Configuration, control, and status registers(CCSR)
默认的CCSRBAR的地址为0x0_FF70_0000 可以被修改,修改CCSRBAR的地址为0x0_FF70_0000,即它自身地址。
(2)Local access windows(LAW)
a、P1010rdb定义了12个LAW, Each of these windows maps a
programmable 4-Kbyte to 32-Gbyte region of the local36-bit address
space to a specified target interface, such as the DDR controller,
integrated flash controller, PCI Express controllers, or other targets.
b、If two or more LAWs overlap, the lower numbered window takes
instance, consider two LAWs, set up as shown in the
table below.
c、Each LAW is defined by a base address register which specifies
the starting address for the window, and an attribute register which
specifies whether the mapping is enabled, the size of the window, and
the target interface for that window. The LAW registers are accessed
by reading and writing to an address comprised of the base address
(specified in the CCSRBAR) LAW_LAWBAR0和LAW_LAWBAR1
(3)Address translation and mapping units(ATMU)
To facilitate flexibility in defining the address maps for external
interfaces such as PCIExpress, the device provides following
types of translation and mapping operations are performed by the ATMUs:
• Translating the local 36-bit address to an external address space
• Translating external addresses to the local 36-bit address space
• Assigning attributes to transactions
• Mapping a local address to a target interface
2、Reset, Clocking, and Initialization
(1)Reset memory map/register definition
a. CCSRBAR
The set of configuration, control, and status registers occupies a 1-Mbyte
region ofmemory. Their location is programmable using the CCSR base
address register(CCSRBAR). The default base address for the configuration,
control, and status registersis 0x0_FF70_0000 (CCSRBAR = 0x000F_F700).
CCSRBAR itself is part of the localaccess block of CCSR memory, which
begins at offset 0x0 from CCSRBAR. BecauseCCSRBAR is at offset 0x0
from the beginning of the local access registers, CCSRBARalways points to
itself. The contents of CCSRBAR are broadcast internally in the deviceto all
functional units that need to be able to identify or create configuration
transactions.
b. Boot page
When e500 core comes out of reset, its MMU has one 4-Kbyte page
defined at 0x0_FFFF_Fnnn. The core begins execution with the instruction at
effective address 0x0_FFFF_FFFC. To get this instruction, the core's first
instruction fetch is a burst read of boot code from effective address
0x0_FFFF_FFE0.
(2)Power-on reset sequence(POR)
The device defines the default boot ROM address range to be 8 Mbytes at address
0x0_FF80_0000 to 0x0_FFFF_FFFF.
(3)Boot from NOR flash
For NOR boot, CS0 works as boot chip-select. Therefore, during NOR boot, the external
device should be connected on CS0. Before fetching the first instruction from an external device
(NOR flash), the IFC Flash timing registers are loaded with default timing parameters.
(4)p1010的启动过程总结
1)、 CPU地址空间
地址空间(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核心文件
供make来引用的一些公共的参数据和规则,如从 .S -> .o 文件的编译参数 .c -> .o 的编译参数等等。
供make来引用的一些规则,主要是depend一类的依懒文件的生成
mkconfig 这是一个可执行脚本,用于生成特定板子的配置文件,以及建立适应特定板子的目录结构(主要是软连接)
所有和板子相关的配置文件,这些信息在该版本之前都是在Makefile中的,从这个版本开始独立成一个文件,便于移植和改造。
2、配置特定板卡的U-boot
对于要编译一个对于特定板子的u-boot,首先需要执行的是配置,这个操作在之前的版本上也是一样。这里有一些变化,之前的配置文件都是写在Makefile的主文件中的。而从这个版本开始,配置文件独立出来,放在中。而
同时是由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/。
.section .resetvec,"ax"
b _start_e500
下面的代码位于start.s中
.section .bootpg,"ax"
.globl _start_e500
_start_e500: 上电复位后默认映射的最后页,即LAST PAGE,位于0xeffff000,见uboot根目录。
2) start.s代码过程
使能L1 cache
设置异常向量表
配置MMU单元,即TLB0和TLB1 条目,此时虚实地址相同。默认只映射flash的最后的4KB空间,所以此空间也叫bootpg。配置MMU之后,可以访问所有flash。
重定位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
2024年1月7日发(作者:同寒烟)
新单板P1010rdb的u-boot移植讲解
一、yocto project的建立
1. 搭建linux环境,ubuntu 12.04
2. QorIQ SDK 1.7 Documentation
(1)SDK 简介参考freescale的网站
/infocenter/?topic=%2FQORIQSDK%
(2)安装SDK
1.
Mount the ISO on your machine:
$ sudo mount -o loop QorIQ-SDK-
/mnt/cdrom
2.
As a non-root user, install Yocto Project:
$ /mnt/cdrom/install
3.
When you are prompted to input the install path, ensure that the current user has the
correct permission for the install path.
(3)配置sdk的环境
1、$ cd
2、$ ./scripts/
3、安装python-2.7.6,
export PATH=/opt/python-2.7.6/bin:$PATH
4、建立p1010rdb的开发环境:
$ source ./fsl-setup-poky -m p1010rdb
将生产build_p1010rdb_release的目录,用于p1010rdb相关的开发,包括u-boot, kernel,rootfs等
(4)编译工具链
1、$ cd
、
$ bitbake
fsl-toolchain
(5)编译u-boot
1、获取u-boot源码
$ bitbake -c patch u-boot
2、修改u-boot代码,u-boot代码放在路径下,获取的方法
$ bitbake -e .
3、修改编译u-boot的配置文件
meta-fsl-ppc/conf/machine/
主要是UBOOT_MACHINES = "P1023RDB"的宏变量,这个变量的值决定了编译出来的u-boot的值。
4、编译
$ cd build_
$ bitbake -c compile -f u-boot
$ bitbake u-boot
Note: U-Boot image can be found in
build_
5、清除
$
bitbake -c cleansstate u-boot
二、P1010RDB启动必备知识
1、内存映射
(1)Configuration, control, and status registers(CCSR)
默认的CCSRBAR的地址为0x0_FF70_0000 可以被修改,修改CCSRBAR的地址为0x0_FF70_0000,即它自身地址。
(2)Local access windows(LAW)
a、P1010rdb定义了12个LAW, Each of these windows maps a
programmable 4-Kbyte to 32-Gbyte region of the local36-bit address
space to a specified target interface, such as the DDR controller,
integrated flash controller, PCI Express controllers, or other targets.
b、If two or more LAWs overlap, the lower numbered window takes
instance, consider two LAWs, set up as shown in the
table below.
c、Each LAW is defined by a base address register which specifies
the starting address for the window, and an attribute register which
specifies whether the mapping is enabled, the size of the window, and
the target interface for that window. The LAW registers are accessed
by reading and writing to an address comprised of the base address
(specified in the CCSRBAR) LAW_LAWBAR0和LAW_LAWBAR1
(3)Address translation and mapping units(ATMU)
To facilitate flexibility in defining the address maps for external
interfaces such as PCIExpress, the device provides following
types of translation and mapping operations are performed by the ATMUs:
• Translating the local 36-bit address to an external address space
• Translating external addresses to the local 36-bit address space
• Assigning attributes to transactions
• Mapping a local address to a target interface
2、Reset, Clocking, and Initialization
(1)Reset memory map/register definition
a. CCSRBAR
The set of configuration, control, and status registers occupies a 1-Mbyte
region ofmemory. Their location is programmable using the CCSR base
address register(CCSRBAR). The default base address for the configuration,
control, and status registersis 0x0_FF70_0000 (CCSRBAR = 0x000F_F700).
CCSRBAR itself is part of the localaccess block of CCSR memory, which
begins at offset 0x0 from CCSRBAR. BecauseCCSRBAR is at offset 0x0
from the beginning of the local access registers, CCSRBARalways points to
itself. The contents of CCSRBAR are broadcast internally in the deviceto all
functional units that need to be able to identify or create configuration
transactions.
b. Boot page
When e500 core comes out of reset, its MMU has one 4-Kbyte page
defined at 0x0_FFFF_Fnnn. The core begins execution with the instruction at
effective address 0x0_FFFF_FFFC. To get this instruction, the core's first
instruction fetch is a burst read of boot code from effective address
0x0_FFFF_FFE0.
(2)Power-on reset sequence(POR)
The device defines the default boot ROM address range to be 8 Mbytes at address
0x0_FF80_0000 to 0x0_FFFF_FFFF.
(3)Boot from NOR flash
For NOR boot, CS0 works as boot chip-select. Therefore, during NOR boot, the external
device should be connected on CS0. Before fetching the first instruction from an external device
(NOR flash), the IFC Flash timing registers are loaded with default timing parameters.
(4)p1010的启动过程总结
1)、 CPU地址空间
地址空间(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核心文件
供make来引用的一些公共的参数据和规则,如从 .S -> .o 文件的编译参数 .c -> .o 的编译参数等等。
供make来引用的一些规则,主要是depend一类的依懒文件的生成
mkconfig 这是一个可执行脚本,用于生成特定板子的配置文件,以及建立适应特定板子的目录结构(主要是软连接)
所有和板子相关的配置文件,这些信息在该版本之前都是在Makefile中的,从这个版本开始独立成一个文件,便于移植和改造。
2、配置特定板卡的U-boot
对于要编译一个对于特定板子的u-boot,首先需要执行的是配置,这个操作在之前的版本上也是一样。这里有一些变化,之前的配置文件都是写在Makefile的主文件中的。而从这个版本开始,配置文件独立出来,放在中。而
同时是由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/。
.section .resetvec,"ax"
b _start_e500
下面的代码位于start.s中
.section .bootpg,"ax"
.globl _start_e500
_start_e500: 上电复位后默认映射的最后页,即LAST PAGE,位于0xeffff000,见uboot根目录。
2) start.s代码过程
使能L1 cache
设置异常向量表
配置MMU单元,即TLB0和TLB1 条目,此时虚实地址相同。默认只映射flash的最后的4KB空间,所以此空间也叫bootpg。配置MMU之后,可以访问所有flash。
重定位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