实验2-BootLoader编译与下载

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

3、Boot Loader 实验
【实验目的】
熟悉交叉工具链的配置.
掌握Jflash 的使用。

熟悉Blob 编译过程。

熟悉Blob的启动流程.
掌握Blob的基本调试方法。

【实验步骤】
Boot Loader 编译环境搭建
第一步:在编译Boot Loader之前,首先要确保已经安装了交叉编译工具链,可以利用which arm-linux-gcc 命令进行检测,如果未安装,会显示如下提示信息(如下图1所示)。

检测arm-linux-gcc是否安装
图1 检测arm-linux-gcc视图
第二步:如果未安装,请将发货过光盘放入到光驱当中,(提示:并利用mount - t iso9660 /dev/cdrom /mnt/cdrom命令,将光盘挂载到Linux 操作系统下,或者直接点击Linux 系统桌面右键,选择光盘->挂载选项,将发货光盘挂载到Linux 系统当中。

)进入/mnt/cdrom/Toolchain 目录下,将xscalev1_liod_qt_2.3.7.tar.gz 工具链解压到/usr/local/ 目录下面,如下图2 所示。

(将xscalev1_liod_qt_2.3.7.tar.gz文件解压到/usr/local 目录下。


[root@ local host root]# tar –xzvf xscalev1_liod_qt_2.3.7.tar.gz –C /usr/local
图2解压交叉编译工具链
第三步:利用export命令将交叉编译工具的路径加入到系统PATH环境变量中。

(也可以直接修改“root”目录下的“.bash_profile”文件)然后利用which
命令查看交叉编译工具是否已在系统搜索路径中。

图3 添加arm-linux-gcc 交叉编译工具视图
Blob 的交叉编译
第四步:将光盘中的BootLoader文件夹中的Boot-XSBase270-2.6.tar.gz文件(具体文件名以光盘Blob 文件夹中所提供的文件为准)复制到/root/work/Blob 目录下(具体目录取决用户决定)。

第五步:利用tar 命令对Boot-XSBase270-2.6.tar.gz压缩文件进行解压。

解压后,Blob 源码解压在Boot-XSBASE270文件夹中。

图4 解压Boot Loader视图
第六步:利用make命令在Blob 源码所在的目录中对源码进行编译,编译成功后在该目录中产生Blob 映象文件boot。

图5 编译Boot Loader视图
Blob 的下载
第七步:将Blob 的映象文件boot拷贝Jflash-XSBase270目录下(如果没有Jflash 工具,则将光盘中Jflash目录下的Jflash-XSBase270_010003.tar.gz文件复制到计算机中,然后利用tar命令进行解压即可)。

第八步:连好开发平台的JTAG下载器,并利用Jflash-XSBase270目录中jflashmm 程序将Blob 映象文件boot烧写到开发板上。

第九步:下载完毕后,利用RS-232平台的FFUART串口与PC串口相连,利用minicom启动串口,设置串口参数(波特率:115200、数据位:8、停止位:
1、奇偶校验:无、流控制:无)。

重新启动目标平台,Blob 启动界面。

Blob 使用:
第十一步:输入“0”后进入命令模式,Blob 命令的使用方法。

help
Load
bootp
tftp
flash
erase
boot
set
ping
reboot
Blob打印跟踪实验
Blob第1阶段分析
第一步:打开Boot-XSBase270\src\start.S,该源码文件完成系统的Blob 程序的第1阶段的编程及程序调用实现过程。

(主要包括:GPIO的初始化调用->bl define_gpio;系统时钟信号使能调用->bl clock_enable;SDRAM内存设置调用->bl setup_memory、Blob 自拷贝、堆栈的设置->ldr sp,stack_point-4以及跳转到Blob 第二阶段-> ldrpc,main)
第二步:打开Boot-XSBase270\src\fixgpio.S 文件,找到配置GPIO的define_gpio函数,该函数主要实现对系统微处理器的GPIO的初始化过程。

其中涉及GPIO的输入/输出方向设置寄存器:GPDRn、置位和清零寄存器(GPSRn、GPCRn)以及功能配置寄存器GPFRnL、GPFRnH等。

第三步:打开Boot-XSBase270\src\ memsetup.S文件,找到setup_memory函数,该函数主要对系统外部的DRAM、SRAM(FLASH)、PC Card接口等存储设备所需参数进行配置,其中包括:MDCNFG、MDREFR、MSCn等寄存器的配置。

Blob 第2阶段分析
第四步:打开Boot-XSBase270\src\main.c文件,找到int main(void)函数,该函数完成系统的Blob 程序的第2阶段的硬件初始化和菜单显示等程序调用实现过程(主要包括:终端显示串口初始化->uart_init();系统定时器->time_init();存储分配映射配置->config_init();
Flash内存器操作配置初始化->iflash_init();以及网络芯片初始化->eth_init();等本阶段硬件初始化过程调用;提示延时、菜单显示调用)
第五步:打开Boot-XSBase270\src\serial.c文件,分别找到uart_init(void)、int uart_putc(int ch)和int uart_getc(void)三个串口操作基本函数。

主要完成串口初始化与从串口获取和输出字符等操作。

实现对PXA270的串口相关寄存器进行配置。

其他与串口相关的函数都直接或间接调用这三个函数。

串口输入输出函数
第六步:打开Boot-XSBase270\src\Partition.c文件,找到init_map(void)和find_map(const char* name)函数,这两个函数主要完成对存储分配映射进行配置和查找某个指定类型的内存映射参数。

其中parts结构体数组定义了整个系统的SRAM、SDRAM等内存映射的相关参数。

内存分配映射结构体数组
第七步:打开Boot-XSBase270\src\Flash.c文件,该文件中函数主要完成对flash的编程、擦除、加/解锁等操作。

其中iflash_init(void)函数主要实现查询平台的flash存储芯片的相关信息,flash操作的命令可参考flash芯片的资料文档。

第八步:打开Boot-XSBase270\src\Flash.c文件,该文件中函数主要实现lan91c111网络芯片的底层操作配置操作,其中lan91c111_init(void)函数由main.c文件中的eth_init()函数间接调用。

具体寄存器操作方法参考lan91c111的资料文档。

第九步:打开Boot-XSBase270\src\ Network.c文件,该文件中的函数主要完成网络传输相关协议的封装(如:set_udp_header、set_ip_header、set_ether_header、set_arp_heade、set_icmp_header等)、网络数据包的解压(udp_recv_packet、ip_recv_packet、eth_recv_packet、arp_recv_packet、icmp_recv_packet)以及网络传输请求数据包的发送(send_arp_request_packet、send_icmp_echo_request等)等操作。

第十步:打开Boot-XSBase270\src\tftp.c文件,该文件中的函数主要完成文件TFTP传输相关操作。

Blob 跟踪调试信息输出
第十一步:打开Boot-XSBase270\src\main.c文件,屏蔽config_init函数后面的printf("\033[H\033[J\n");语句,同时将该语句添加到uart_init函数后,并在uart_init 函数后面添加printf("UART init over\n");语句。

第十二步:打开Boot-XSBase270\src\ Lan91c111.c文件,在lan91c111_init()函数返回前添加test_get_reg()函数,测试lan91c111网卡芯片的相关寄存器。

第十三步:打开Boot-XSBase270\src\Time.c文件,分别在time_init()函数中添加如下调试输出信息。

printf("time_init++\n");
……
printf("udelay : msecond_boundary : %d [0x%08lx]\n",msecond_boundary,msecond_boundary);
printf("time_init--\n");
第十四步:打开Boot-XSBase270\src\ Partition.c文件,在init_map函数中增加如下调试信息。

printf("Memory map name is %s\n",part->name);
printf("Memory map SRAM Base Address is 0x%08x\n",part->sramb);
printf("Memory map SRAM SIZE is 0x%08x\n",part->srams);
printf("Memory map DRAM Base Address is 0x%08x\n",part->dramb);
printf("Memory map DRAM Size is 0x%08x\n",part->drams);
printf("Memory map Max Size is 0x%08x\n",part->maxs);
第十五步:打开Boot-XSBase270\src\Flash.c文件,去掉//#define detail(fmt,args...)printf(fmt,##args)宏定义的屏蔽符“//”,使该宏定义功能有效。

第十六步:保存所有修改后的文件在Boot-XSBase270目录下利用make命令对修改后的源码进行编译;编译后将生成boot文件。

make clean
make
第十七步:将成功编译后的boot文件拷贝到Jflash-XSBase270文件夹中,连接JTAG,开启电源,并在该目录下执行下载烧录命令。

./jflashmm boot;
第十八步:重新启动开发板,在延时时间内(3秒)按空格键,Blob 显示修改后调试信息。

相关文档
最新文档