u-boot 启动过程 —— 基于S3C2410
虽然u-boot已经广泛应用,由于其相对的复杂性使用户在了解其内部机理和进行u-boot的移植工作时还是会碰到困难。u-boot已有一些分析文档,但多数和真正的代码不能同步或者版本老旧,难以将概念和现实的代码匹配——即硬件板上跑的代码在文档资料中却看不到,更无法紧密的跟踪。本文涉及的代码基于在s3c2410硬件运行的成熟u-boot-1.3.2代码,版本较新,提供的特性非常丰富,而且在forum.linuxbj.com可以自由浏览和下载。此u-boot代表了业界的较高水平,可以直接构建新版的嵌入式产品设计,有较高的应用价值。
u-boot总的启动流程如下
->reset
-> 设置CPU模式
-> 关闭看门狗/中断
-> 设置处理器时钟/片上总线
-> 初始化调试串口
-> MMU/外部总线/SDRAM等初始化
-> rom代码/数据搬移到ram
-> 初始化函数调用栈
-> 初始化外围设备/参数
->启动完毕,进入main_loop循环
嵌入式系统离不开bootloader初始化硬件以及引导操作系统。
现在,专用的嵌入式板子运行嵌入式Linux系统已经变得非常流行,u-boot是一种非常适合此类系统的bootloader。
u-boot主要提供以下功能:
- 设置目标板硬件参数并初始化;
- 为操作系统传递必要信息;
- 执行交互式的底层操作;
- 智能化装载操作系统;
- 引导和运行的固件程序;
- 支持大容量存储和USB接口
利用ZIX开发环境,能够通过比较直观的方式观察u-boot内部,而且可以将代码调试和分析同时进行,是一种了解、移植u-boot的强大工具。
使用arm工具链编译u-boot源代码,得到可以烧录的u-boot.bin文件。
在ZIX开发环境里,可以将u-boot.bin载入s3c2410板运行,并利用gdb调试。
gdb能通过JTAG接口访问硬件,也可以通过TCP/IP访问虚拟硬件。 建立好调试连接,即可通过gdb操纵u-boot启动过程,下面可以跟随代码的执行顺序,了解从上点开始,究竟哪些操作被执行。
s3c2410复位之后,pc指针会指向0x0地址。在u-boot代码中,该0x0地址是一个向量表,
第一条指令跳转branch到复位代码start_co
DE>.globl _start _start: DE> DE>b start_co de DE> DE> DE>ldr pc, _undefined_instruction DE> DE>ldr pc, _software_interrupt DE> DE>ldr pc, _prefetch_abort DE> DE>ldr pc, _da ta_abort DE> DE>ldr pc, _not_used DE> DE>ldr pc, _irq DE> DE>ldr pc, _fiq
复位指令跳转之后来到第154行,开始执行arm920t处理器的基本初始化。
首先修改当前程序状态寄存器CPSR,使处理器进入Supervisor|32 bit ARM模式,
并关闭ARM9TDMI中断和快速中断,这是通过设置CPSR相应掩码实现的:
DE>start_co de: DE> DE> DE> DE>/* DE> DE> DE> DE> * set the cpu to SVC32 mode DE> DE> DE> DE> */ DE> DE> DE> DE>mrs r0,cpsr DE> DE> DE> DE>bic r0,r0,#0x1f DE> DE> DE> DE>orr r0,r0,#0xd3 DE> DE> DE> DE>msr cpsr,r0 DE>
紧接着,将S3C2410特有的WTCON寄存器清零,此举仅为关闭看门狗,代码位置是234行:
DE> DE> DE>ldr r0, =pWTCON DE> DE> DE> DE>mov r1, #0x0 DE> DE> DE> DE>str r1, [r0] DE>
然后在241行,将S3C2410中断控制器INTMSK寄存器置为全1,
INTSUBMSK置为0x7ff,禁止全部中断源。S3C2410手册358页起对此有详细描述:
DE> DE> DE>mov r1, #0xffffffff DE> DE> DE> DE>ldr r0, =INTMSK DE> DE> DE> DE>str r1, [r0] # if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) || defined(CONFIG_S3C2442) || \ DE> DE> DE> DE>defined(CONFIG_S3C2443) DE> DE> DE> DE>ldr r1, =INTSUBMSK_val DE> DE> DE> DE>ldr r0, =INTSUBMSK DE> DE> DE> DE>str r1, [r0] # endif DE>
接下来在259行,访问arm920t控制寄存器CP15,并置位最高两位〔31,30〕。
此两位置为0b11后,处理器时钟被设置为异步模式,允许处理器异步访问总线:
DE> DE> DE>mrc p15, 0, r1, c1, c0, 0 DE> DE> DE> DE>orr r1, r1, #0xc0000000 DE> DE> DE> DE>mcr p15, 0, r1, c1, c0, 0 DE>
至此arm920t相关的配置完成,后面开始设定S3C2410时钟合成参数。
通过设置UPLL,MPLL和CLKdivN三个寄存器(在S3C2410手册237页起讲述),
得到需要的处理器工作频率,分别在308行:
DE> DE> DE>ldr r0, =UPLLCON DE> DE> DE> DE>ldr r1, =UPLLCON_val DE> DE> DE> DE>str r1, [r0] DE>
321
u-boot启动过程S3C241 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)