学习底层的东西,首要的就是去了解他的架构,整体的思路知道了,就会在出现问题的时候有很清晰的思路,知道哪里出的问题,以及程序是如何执行的,相信做到上面的,所遇到的问题,大都会迎刃而解了吧,高手是有很多的,所谓的高手,不过也就那样吧,努力努力也是可以赶超的。
之前,介绍了u-boot的第一阶段的启动流程,那么接下来就来说说第二阶段的具体执行流程:
(1)初始化gloabl data和board data,这里所谓的初始化就是给他们分配一块内存空间。
(2)初始化序列(init_sequence)
在初始化的序列当中包括有:
设置系统时钟操作函数 arch_cpu_init
设置开发板的机器码 board_init
初始化定时器 timer_init
初始化环境变量 env_init
初始化波特率 init_boudrate
初始化串口 serial_init
控制台设备一级初始化 console_init
打印u-boot的版本编译时间 disoplay_banner
打印cpu类型和当前的运行频率 print_cpuinfo
打印开发板的名称 checkboard
配置可用的内存 dream_init
显示当前的内存大小 display_dram_config
(3)NAND Flash 初始化 nand_init
(4)读取NAND Flash 的环境变量,然后做CRC校验,如果错误,则使用默认的环境变量,如果正确则使用从
NAND Flash中读取的环境变量
(5)从环境变量中获得板子的ip地址
(6)初始化输入输出设备stdio_init
(7)初始化控制台,默认用串口作为控制台设备
(8)使能IRQ异常,enable——interrupts()
( 9) 初始化网卡设备,eth_initialize(gd->bd)
(10)进入main_loop()中开始判断是否设置了环境变量bootdelay和bootcmd两个参数,如果已经设置过了的话,
再判断在bootdelay的时间内串口是否有输入,如果没有的话则执行bootcmd所设置的接下来的命令,如果
两个参数没有设置过,则循环读取串口中所输入的命令,然后去执行。
以上就是整个第二阶段的内容了,接下来的几天里我会陆续的总结一下关于u-boot移植的具体操作,以及NAND Flash 的相关介绍,学习的过程总是需要把心放下来,然后专注的去体会你所认知的一些事物,每件事情都是这样,只有我们认真的去对待,才会得到应有的回报。