- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
本文以流行的Samsung公司的S3C2410,openmoko平台和u-boot-1.3.2(2008.5 发布)为例,介绍如何在ZIX嵌入式开发环境下探索u-boot启动过程。虽然u-boot已经广泛应用,由于其相对的复杂性使用户在了解其内部机理和进行u-boot的移植工作时还是会碰到困难。u-boot已有一些分析文档,但多数和真正的代码不能同步或者版本老旧,难以将概念和现实的代码匹配——即硬件板上跑的代码在文档资料中却看不到,更无法紧密的跟踪。本文涉及的代码基于在s3c2410硬件运行的成熟u-boot-1.3.2代码,版本较新,提供的特性非常丰富,而且在可以自由浏览和下载。此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_code。 位于cpu/arm920t/start.S汇编语言文件第53行:.globl _start??_start:??b start_code??? ? ldr pc, _undefined_instruction ? ? ldr pc, _software_interrupt ? ? ldr pc, _prefetch_abort ? ? ldr pc, _data_abort ? ? ldr pc, _not_used ? ? ldr pc, _irq ? ? ldr pc, _fiq复位指令跳转之后来到第154行,开始执行arm920t处理器的基本初始化。首先修改当前程序状态寄存器CPSR,使处理器进入Supervisor|32 bit ARM模式,并关闭ARM9TDMI中断和快速中断,这是通过设置CPSR相应掩码实现的:start_code: ? ? /* ? ???* set the cpu to SVC32 mode ? ???*/??? ? mrs r0,cpsr ? ? bic r0,r0,#0x1f ? ? orr r0,r0,#0xd3 ? ? msr cpsr,r0??紧接着,将S3C2410特有的WTCON寄存器清零,此举仅为关闭看门狗,代码位置是234行:? ? ldr r0, =pWTCON ? ? mov r1, #0x0 ? ? str r1, [r0] 然后在241行,将S3C2410中断控制器INTMSK寄存器置为全1,INTSUBMSK置为0x7ff,禁止全部中断源。S3C2410手册358页起对此有详细描述:? ? mov r1, #0xffffffff??? ? ldr r0, =INTMSK ? ? str r1, [r0]??# if defined(CONFIG_S3C2410) || defined(CONFIG_S3C2440) || defined(CONFIG_S3C2442) || \????defined(CONFIG_S3C2443)??? ? ldr r1, =INTSUBMSK_val??? ? ldr r0, =INTSUBMSK??? ? str r1, [r0]??# endif
文档评论(0)