在前文关于MKCONFIG的常用配置参数与链接脚本中逐渐的引入了通过uboot的文件启动校验头引入了uboot的汇编部分,该部分是为了去启动后续的uboot的c语言部分,但是c语言是需要使用到内存的,所以可用理解为:该汇编部分的主要目的就是为了格式化内存以便c语言可用运行。
前文说到了x210的uboot使用到的16字节校验头,为了就是校验文件的完整性和正确性。异常向量表依照cpu写出,没有这玩也系统就容易跑飞。
reset 系统启动复位执行 b reset
uboot中的异常向量表处理异常能使用就行(不像是内核一样要求高)。
.balignl 16 , 0xdeadbeef
这句话的意思是以16字节对齐,若没有对齐则使用0xdeadbeaf填充,0xdeadbeaf是16进制数字,但刚好能组成一个英文词语——坏牛肉,所以就被用于做填充,其本质也是魔数有着特定的意思。(差8字节就填充2个坏牛肉)
对齐访问的优势:1.效率要求。2.硬件要求。
TEXT_BASE 链接地址 C3E00000 在Makefile里
在汇编语言中
_TEXT_BASE:
.word TEXT_BASE
_TEX_BASE:为标号
.word 为类型
TEXT_BASE 为值
其就类似于指针,可用ldr加载_TEXT_BASE得到值,在此的.word表示4个字节。
CFG_PHY_UBOOT_BASE 33e00000 是uboot的物理地址 c3e00000是虚拟地址
IRQ中断:
msr cosr_c , #0xd3
向cpsr中的c位写入0xd3。cpsr是程序状态寄存器,c位是模拟位。其中:
0xd3:11010011
其中mode位为0-4位
T位位位第五位:1-ARM状态
10011表示svc模式
F位为第6位:1表示关闭FIQ
I位为第7位:1表示关闭IRQ
这里禁止FIQ和IRQ、是为了后面为中断做好准备后再对齐进行开启。ARM类型的cpu在复位时默认为svc模式,但写T位是为了移植性,代码不依赖于预设是一种保障。
disable_L2cache 禁止L2cache
set_L2cache_auxctrl_cycle 设置L2cache的辅助控制
enable_L2cache 使能L2cache
这就是去开启一个功能的正确方式,先关闭功能,再对其进行设置,最后再开启功能。刷新L1cache的Icache与Dcache。其中Icache为指令cache,Dcache为数据cache。
关闭MMU,由于没有进行虚拟地址映射,所以先给关了。
Read booting information 读取启动信息(E000 0004)。
OM引脚选择:OM5:OM0从哪里启动(也就是启动介质)。
bic r2 ,r1 ,#0xffffffc1只保留r1位中的后几位,清除了ffffffc1位内容,存入r2中。
Nand信息:4kb 5-cycle 8-bitECC
最终在r3中存入0x3表示MMC_sd启动!
ldr sp =0xd003600 设置栈IROM
bl lowlevel_init 跳转到低层次初始化
在lowlevel_init之前因为要bl跳转了,不用栈的话只能调用一层函数,这样就回不到原位了,代码在SRAMZ中,DDR未启用,栈地址被uboot自定义。
bl只会将返回的地址存储在LR中,但LR只能写一个返回地址,所以要启动栈。在进入第二层函数时要指第一层LR入栈,才能去做第二层函数。
下一篇文章将对lowlevel_init进行详细说明,敬请期待。