PXA272启动引导程序的实现和功能扩展
C代码前必要条件。C语言函数编译必须提供堆栈存放临时变量、调用位置、寄存器信息。除堆栈外,需DATA段和BSS段存放C代码中有初始值的全局或静态变量以及没有指定初始值的全局变量。
系统存储器初始化:通过配置功能寄存器来实现;在Pxa272上电后,SDRAM处于睡眠无时钟状态,初始化必须完成SDRAM状态机转化过程,相关的寄存器:MDREFR、MDCNFG等。SDRAM的状态转换通过配置存储器的相应位,产生对应的命令实现状态机转换[1]。
4.2内核加载(Loader)
为加载内核,需初始化必要设备:网络接口、串行接口、Flash等;PXA272支持BTUART(蓝牙)、FFUART(全功能串口)、 STUART(标准串口)。可以通过串口实现与终端用户的交互,终端打印信息是非常重要的调试手段。片载的Flash遵循CFI规范(Common Flash Interface)。
内核加载前规划好内存空间:设置内存大小和起始地址,BootLoader、内核、ramdisk、root镜像在flash和SDRAM中的存放区域、大小。在这里确定好下载各个镜像文件存放的地址以及镜像加载后释放的位置。内存地址的安排关系到操作系统能否正常的启动、运行。
Parts[i].name = XXXX; //镜像名(Boot/Kernal/Ramdisk)
Parts[i].sramb = XXXX_SRAM_BASE;//在flash中的基地址
Parts[i].srams = XXXX_MAX_SIZE; //在flash中镜像大小
Parts[i].dramb = XXXX_DRAM_BASE; //在DRAM中的基地址
Parts[i].drams = 0;
Parts[i].maxs = XXXX_MAX_SIZE; //镜像大小
这里基本确定flash和DRAM的地址映射。
加载内核、文件系统映像,设置启动参数:读取映像大小和格式,将映像从Flash定向到RAM。定向后,就可启动 Linux 内核。启动内核前,要作些准备工作:设置启动参数。Linux 2.4.x 以后的内核以标记列表(tagged list)形式传递启动参数。由Boot Loader设置常见启动参数:ATAG_CORE、ATAG_MEM、ATAG_CMDLINE、ATAG_RAMDISK、ATAG_INITRD 等。启动参数列表以标记 ATAG_CORE 开始,以标记 ATAG_NONE 结束。
……
tags = (struct tag *)BOOT_PARAMS;
tags->hdr.tag = ATAG_CORE; //以CORE开始
tags->hdr.size = tag_size(tag_core);
……
tags = tag_next(tags);
tags->hdr.tag = ATAG_NONE; //以NONE结束
tags->hdr.size = 0;
……
Boot Loader 调用 Linux 内核的方法是直接跳转到内核的第一条指令处:
theKernel = (void *)mp->dramb;//Linux内核基址
theKernel (0, ARCH_URANIUM, 0xa0008000);
至此,Bootloader完成该作的工作,跳转到内核入口点,内核接管控制权,开始启动Linux。
4.3 启动程序的扩展
在开发板的硬件测试阶段,扩展命令接口,以协助硬件测试工作。
1.内存测试(MEM_TEST)[5]
测试存储器有3个部分:数据总线测试、地址总线测试和器件测试;优化通用的测试程序,能测试出错误,还对错误进行分析诊断,给出错误原因,并定位错误。
数据线测试(走1法):选择有代表性的写入值(0x01(单位),0x03(两个相邻位), 0x07(三个相连位),0x0F(四个相连位))。分别将值写入内存地址,写入后立刻读出与写入前的值比较,相等则将写入值逻辑左移一位作为下一次写入值。如此。直到所有值被测试完。如有不等,则报错将写入前后的值显示出来。
地址线测试:取测试值0xaaaaaaaa,选择测试地址,分别写入测试值,比较写入前后值。然后取其反值为测试值写入测试地址。改换测试地址,按从低向高的顺序依次写入1的递增值,比较写入前后的值;再按上一步的地址顺序写入1递增值反值,比较写入前后值;在每步写入前后值的比较中如果不一致,就输出出错的地址和写入前后的值。
器件测试:用来测试器件完成性,确定器件每一位正确。选择一组随地址变化的值写入内存,再读出比较。然后取这些值的反写入内存验证。
如测试内存代码放在SDRAM上,测试时会修改内存,这样会造成系统崩溃。所以测试内存时,把代码放在PXA272片载SRAM上。
2.液晶屏测试(LCD_TEST):启动引导程序没用到LCD,为确定目标板的LCD正常工作,提供LCD_TEST命令测试LCD。点亮LCD前,初始化 LCD控制器寄存器,划出一块内存作为LCD显示缓冲区。通过参数来控制写入显示缓冲区中的数据以显示不同图形。
3.触摸屏测试(TS_TEST):ADS7843触摸屏芯片具备12位A/D转换和低导通电阻模拟开关,通过控制GPIO模拟ADS7843传输时序,将控制字送入ADS7843,再串行读取坐标值。最后,将读取的x和y坐标送串口显示。
除上述器件测试命令,还有SPI、RTC等命令。扩展命令对于处于硬件调试阶段的开发板非常重要,可以方便调试工作。同时也能体现Boo
功能 扩展 实现 程序 启动 引导 PXA272 相关文章:
- 基于DSP数字多功能板的实现(09-08)
- 基于DSP2407的多功能电源控制系统设计(09-08)
- DVR操作系统分析(07-23)
- 基于PROTEUS技术的ARM7显示系统设计与仿真实现(11-22)
- 一种大型软件测试方法(08-01)
- 嵌入式软件三大潜在问题及其测试技术(01-13)