川师arm linux系统实验报告Word格式.docx
《川师arm linux系统实验报告Word格式.docx》由会员分享,可在线阅读,更多相关《川师arm linux系统实验报告Word格式.docx(59页珍藏版)》请在冰豆网上搜索。
实验名称
学时
必做
选做
学分数
实验类型
内容提要
基本操作
验证
综合
设计
4
四
Bootloader跟踪打印实验
√
熟悉Linux嵌入式系统bootloader实现原理。
五
Bootloader增加命令选项实验
熟悉根据实际需要修改bootloader的基本步骤
6
六
内核编译实验
2
熟悉Linux嵌入式系统内核移植过程。
7
七
文件系统制作实验
熟悉Linux嵌入式系统根文件制作。
8
八
驱动程序加载实验
熟悉驱动程序动态、静态的加载过程
四、实验内容安排:
实验四Bootloader跟踪打印实验
(验证型实验4学时)
1.目的要求:
(1)熟练掌握Bootloader的启动过程。
(2)熟练掌握Bootloader的基本调试方法。
(3)熟练掌握Bootloader的编译过程。
2.实验内容
(1)Blob第1阶段分析
●打开Boot-XSBase270\src\start.S,该源码文件完成系统的Blob程序的第1阶段的编程及程序调用实现过程。
(主要包括:
GPIO的初始化调用->
bldefine_gpio;
系统时钟信号使能调用->
blclock_enable;
SDRAM内存设置调用->
blsetup_memory、Blob自拷贝、堆栈的设置->
ldrsp,stack_point-4以及跳转到Blob第二阶段->
ldrpc,main)
【图4-1】
●
打开Boot-XSBase270\src\fixgpio.S文件,找到配置GPIO的define_gpio函数,该函数主要实现对系统微处理器的GPIO的初始化过程。
其中涉及GPIO的输入/输出方向设置寄存器:
GPDRn、置位和清零寄存器(GPSRn、GPCRn)以及功能配置寄存器GPFRnL、GPFRnH等。
【图4-2】
●打开Boot-XSBase270\src\memsetup.S文件,找到setup_memory函数,该函数主要对系统外部的DRAM、SRAM(FLASH)、PCCard接口等存储设备所需参数进行配置,其中包括:
MDCNFG、MDREFR、MSCn等寄存器的配置。
【图4-3】
(2)
Blob第2阶段分析
●打开Boot-XSBase270\src\main.c文件,找到intmain(void)函数,该函数完成系统的Blob程序的第2阶段的硬件初始化和菜单显示等程序调用实现过程(主要包括:
终端显示串口初始化->
uart_init();
系统定时器->
time_init();
存储分配映射配置->
config_init();
Flash内存器操作配置初始化->
iflash_init();
以及网络芯片初始化->
eth_init();
等本阶段硬件初始化过程调用;
提示延时、菜单显示调用)
【图4-4】main程序初始化
【图4-5】main程序延迟
【图4-6】Bootloader打印菜单函数
●打开Boot-XSBase270\src\serial.c文件,分别找到uart_init(void)、intuart_putc(intch)和intuart_getc(void)三个串口操作基本函数。
主要完成串口初始化与从串口获取和输出字符等操作。
实现对PXA270的串口相关寄存器进行配置。
其他与串口相关的函数都直接或间接调用这三个函数。
【图4-7】串口初始化函数
【图4-8】串口输入、输出函数
●打开Boot-XSBase270\src\Partition.c文件,找到init_map(void)和find_map(constchar*name)函数,这两个函数主要完成对存储分配映射进行配置和查找某个指定类型的内存映射参数。
其中parts结构体数组定义了整个系统的SRAM、SDRAM等内存映射的相关参数。
【图4-9】DRAM\SRAM地址映像函数
【图4-10】内存地址分配映射结构体数值
●打开Boot-XSBase270\src\Flash.c文件,该文件中函数主要完成对flash的编程、擦除、加/解锁等操作。
其中iflash_init(void)函数主要实现查询平台的flash存储芯片的相关信息,flash操作的命令可参考flash芯片的资料文档。
【图4-11】flash初始化函数
●打开Boot-XSBase270\src\lan91c111.c文件,该文件中函数主要实现lan91c111网络芯片的底层操作配置操作,其中lan91c111_init(void)函数由main.c文件中的eth_init()函数间接调用。
具体寄存器操作方法参考lan91c111的资料文档。
【图4-12】Ethernet初始化函数
●打开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等)等操作。
【图4-13】网络传输函数
●打开Boot-XSBase270\src\tftp.c文件,该文件中的函数主要完成文件TFTP传输相关操作。
【图4-14】tftp命令结构体定义
(3)Blob跟踪调试信息输出
●打开Boot-XSBase270\src\main.c文件,屏蔽config_init函数后面的printf("
\033[H\033[J\n"
);
语句,同时将该语句添加到uart_init函数后,并在uart_init函数后面添加printf("
UARTinitover\n"
语句。
【图4-15】跟踪UART
●打开Boot-XSBase270\src\Lan91c111.c文件,在lan91c111_init()函数返回前添加test_get_reg();
函数,测试lan91c111网卡芯片的相关寄存器。
【图4-16】测试网卡寄存器
●打开Boot-XSBase270\src\Time.c文件,分别在time_init()函数中添加如下调试输出信息。
printf("
time_init++\n"
……
udelay:
msecond_boundary:
%d[0x%08lx]\n"
msecond_boundary,msecond_boundary);
time_init--\n"
【图4-17】跟踪时间初始化
●打开Boot-XSBase270\src\Partition.c文件,在init_map函数中增加如下调试信息。
Memorymapnameis%s\n"
part->
name);
MemorymapSRAMBaseAddressis0x%08x\n"
sramb);
MemorymapSRAMSIZEis0x%08x\n"
srams);
MemorymapDRAMBaseAddressis0x%08x\n"
dramb);
MemorymapDRAMSizeis0x%08x\n"
drams);
MemorymapMaxSizeis0x%08x\n"
maxs);
【图4-18】跟踪DRAM/SRAM映射关系
●打开Boot-XSBase270\src\Flash.c文件,去掉//#definedetail(fmt,args...)printf(fmt,##args)宏定义的屏蔽符“//”,使该宏定义功能有效。
【图4-19】打印flash寄存器
●保存所有修改后的文件在Boot-XSBase270目录下利用make命令对修改后的源码进行编译;
编译后将生成boot文件。
makeclean
make
【图4-20】Bootloader编译
●将成功编译后的boot文件拷贝到JFlash_MM文件夹中,连接JTAG,开启电源,并在该目录下执行下载烧录命令start.bat。
.
【图4-21】Bootloader烧写
●重新启动开发板,在延时时间内(3秒)按空格键,Blob显示修改后调试信息。
【图4-22】存储器映射关系打印
【图4-23】Flash寄存器信息打印
【图4-24】Bootloader菜单打印
3.主要仪器设备及软件:
(1)PC
(2)XSBase270ARM实验开发平台一套
实验五Bootloader新增命令项实验
(1)熟悉Bootloader。
(2)深入理解Bootloader的源代码。
(3)熟练掌握Bootloader新增命令项的基本步骤。
(1)打开Boot-XSBase270\src\menu.c文件,在DisplayMenu函数中增加:
[d]LEDTest\n"
使Bootloader程序在启动时提供显示LED灯测试选项。
【图5-1】增加Bootloader菜单项
(2)打开Boot-XSBase270\src\command.c文件,在该文件中增加测试LED灯命令项对象externstructcommand_tcmd_led;
,并将命令项对象添加到命令列表结构体staticstructcommand_t*cmdlist[]中。
【图5-2】增加命令结构体
(3)打开Boot-XSBase270\src\main.c文件,在等待选项输入的地方增加对小写英文字符”d”输入条件的选择。
【图5-3】增加命令菜单字符项
(4)打开Boot-XSBase270\src\main.c文件,在选项判断的case语句中增加小写英文字符”d”输入条件的选择判断。
case100:
command_run("
ledtest"
break;
【图5-4】增加命令菜单项响应
(5)
在Boot-XSBase270\src\文件夹中新增一个Testled.c文件,文件内容如下,主要完成对Led测试命令项的操作,该命令实现对开发板中的8个LED二极管循环向右移动,直到用户选择小写英文字符“f”后退出。
#include<
stdio.h>
time.h>
command.h>
#defineLED_CS4(*((volatileunsignedchar*)(0x10500000)))
staticbooldo_led(intargc,char**argv);
staticvoidled_usage(void);
structcommand_tcmd_led={
.name="
.run=do_led,
.usage=led_usage
};
staticbooldo_led(intargc,char**argv)
{
intLED_Value=0x01;
intiNum=0;
printf("
LedShiftCommandTest!
\n"
Pleasepress[f]keyexit!
"
while
(1)
{
LED_CS4=~LED_Value;
mdelay(1000);
iNum=getc();
if(iNum==102)
LED_Value=LED_Value<
<
1;
if(LED_Value>
0x80)
LED_Value=0x01;
}
LED_CS4=0xFF;
returntrue;
}
staticvoidled_usage(void)
usage_format("
testled"
"
TestingtheLEDS"
return;
【图5-5】Testled.c
(6)打开Boot-XSBase270\src\Makefile文件,在该文件中的objfiles变量中增加:
objfiles+=testled.o,实现对testled.c的编译和链接。
【图5-6】修改Makefile
(7)在Boot-XSBase270目录下利用make命令对修改后的源码进行编译;
【图5-7】编译Bootloader
(8)将成功编译后的boot文件拷贝到JFlash_MM文件夹中,连接JTAG,开启电源,并在该目录下执行下载烧录命令start.bat。
【图5-8】烧写Bootloader
(9)重新启动开发板,在延时时间内(3秒)按空格键,bootloader显示修改后的启动菜单。
【图5-9】命令菜单添加效果图
(10)输入小写英文字母“d”,查看开发平台上8个LED发光二极管的运行情况和boot菜单的变化。
【图5-10】命令菜单运行效果图
(11)输入小写英文字母“f”,查看开发平台上8个LED发光二极管的运行情况和boot菜单的变化。
实验六、Linux-2.6.22.10移植实验
1.实验目的
Ø
掌握Linux源码结构。
掌握Linux系统移植方法和步骤。
2.实验步骤
第1步、从http:
//www.kernel.org/pub/linux/kernel/v2.6下载linux-2.6.22.10.tar.bz2压缩文件(或光盘中提供);
第2步、将linux-2.6.22.10.tar.bz2压缩文件复制到Linux工作目录(如root/work目录下);
第3步、在Linux下利用tarjxvflinux-2.6.22.10.tar.bz2命令解压linux-2.6.22.10.tar.bz2压缩文件。
第4步、进入解压后的linux-2.6.22.10目录下,利用vi编辑工具修改linux-2.6.22.10目录下的顶层Makefile文件。
修改linux-2.6.22.10目录下的顶层Makefile文件,设置编译linux操作系统的CPU体系架构变量ARCH和所使用的交叉编译工具链变量CROSS_COMPILE(注:
实验使用arm-linux交叉编译工具链4.4.3版本,可从http:
//ftp.snapgear.org/pub/snapgear/tools/arm-linux/下载arm-linux-tools-20070808.tar.gz压缩文件)。
ARCH?
=arm
CROSS_COMPILE?
=/opt/FriendlyARM/toolschain/4.4.3/bin/arm-linux-
将linux-2.6.22.10目录下的arch/arm/configs/mainstone_defconfig文件复制为xsbase270_defconfig文件。
第5步、将实验源码目录下的\linux-2.6.22.10_patch\arch\arm\mach-pxa目录下的xsbase270.c文件复制到linux-2.6.22.10\arch\arm\mach-pxa目录中(注:
xsbase270.c从该目录下的mainstone.c修改而来)。
第6步、修改linux-2.6.22.10\arch\arm\mach-pxa目录下的Makefile文件,增加编译xsbase270.c的编译选项,即:
obj-$(CONGIG_MACH_XSBASE270)+=xsbase270.o。
obj-$(CONFIG_MACH_XSBASE270)+=xsbase270.ortc4513.o
第7步、修改linux-2.6.22.10\arch\arm\mach-pxa目录下的Kconfig文件,增加在裁剪内核时支持对EELiod/Liod平台的选择
第8步、将实验源码目录下的\linux-2.6.22.10_patch\drivers\mtd\maps目录下的xsbase270-flash.c文件复制到linux-2.6.22.10\drivers\mtd\maps目录中(注:
xsbase270-flash.c从该目录下的mainstone-flash.c修改而来)。
修改linux-2.6.22.10\drivers\mtd\maps目录下的Makefile文件,增加编译xsbase270-flash.c的编译选项,
即:
obj-$(CONGIG_MTD_XSBASE270)+=xsbase270-flash.o。
第9步、修改linux-2.6.22.10\drivers\mtd\maps目录下的Kconfig文件,增加在裁剪内核时支持对EELiod/Liod平台flash驱动的选择
第10步、将实验源码目录下的\linux-2.6.22.10_patch\include\asm-arm\arch-pxa目录下的xsbase270.h文件复制到linux-2.6.22.10\include\asm-arm\arch-pxa目录中。
第11步、修改linux-2.6.22.10\include\asm-arm\arch-pxa目录中irqs.h文件,在文件最后增加EELiod/Liod平台相关中断定义,内容如下。
#defineXSBEDR_USBWAKE_IRQIRQ_GPIO
(1)
#defineXSBEDR_USB2_IRQIRQ_GPIO(9)
#defineXSBEDR_ETH_IRQIRQ_GPIO(10)
#defineXSBEDR_CF_DETECT_IRQIRQ_GPIO(12)
#defineXSBEDR_AC97_IRQIRQ_GPIO(13)
#defineXSBEDR_CF_IRQIRQ_GPIO(22)
#defineXSBDVK_IRQ(x)(IRQ_BOARD_START+(x))
#defineXSBDVK_ETH_IRQIRQ_GPIO(10)
#defineXSBDVK_2700G_IRQIRQ_GPIO(12)
#defineXSBDVK_AC97_IRQIRQ_GPIO(13)
#defineXSBDVK_CF_IRQIRQ_GPIO(22)
#defineXSBDVK_MMC_IN_IRQXSBDVK_IRQ(0)
#defineXSBDVK_MMC_OUT_IRQXSBDVK_IRQ
(1)
#defineXSBDVK_SIM_IN_IRQXSBDVK_IRQ
(2)
#defineXSBDVK_SIM_OUT_IRQXSBDVK_IRQ(3)
#defineXSBDVK_USB_IN_IRQXSBDVK_IRQ(4)
#defineXSBDVK_USB_OUT_IRQXSBDVK_IRQ(5)
#defineXSBDVK_CF_IN_IRQXSBDVK_IRQ(6)
#defineXSBDVK_CF_OUT_IRQXSBDVK_IRQ(7)
#defineXSBDVK_SW1_IRQXSBDVK_IRQ(8)
#defineXSBDVK_SW2_IRQXSBDVK_IRQ(9)
#defineXSBDVK_SW3_IRQXSBDVK_IRQ(10)
#defineXSBDVK_SW4_1_IRQXSBDVK_IRQ(11)
#defineXSBDVK_SW4_2_IRQXSBDVK_IRQ(12)
#defineXSBDVK_SW4_3_IRQXSBDVK_IRQ(13)
第12步、在linux-2.6.22.10目录下执行makexsbase270_defconfig。