版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、08级本科学年设计(论文)题 目: 基于ours pxa270的u-boot制作与移植 系 别: 数学与信息工程学院 班 级: 08计算机科学与技术(嵌入式) 学 号: 20080861132 姓 名: 杨坤龙 指导教师: 李年攸 职 称 讲师 起讫日期: 2010年3月8日-2011年7月7日 基于ours pxa270的u-boot制作与移植杨坤龙(三明学院 数学与信息工程学院 2008级计算机科学与技术(嵌入式)摘要:Bootloader 是在操作系统运行前执行的一小段程序,Bootloader 启动代码的分析与移植是嵌入式产品研发中最重要的环节之一,它将操作系统和硬件平台衔接在一切。本
2、文主要介绍嵌入式系统中Bootloader 的基本概念和功能、及一般Bootloader 的启动过程; 并重点分析了Uboot在ours pxa270rp 嵌入式系统中的启动过程和移植过程。关键词:启动; 移植; Bootloader; U- boot; 嵌入式系统; ours_pxa270Based on ours pxa270 production of u-boot and transplantationYang Kun long 2008 Computer Science and Technology Major,Department of Mathematics and Comput
3、er Science, Sanming UniversityAbstract:Bootloader is the operating system is running short before the execution of the program, Bootloader boot code analysis and migration is embedded in the product development one of the most important aspects that will interface between operating systems and hardw
4、are platforms in all. This paper describes the embeddedSystem, the basic concepts and Bootloader functions, and general Bootloader boot process; and focused on analyzing the Uboot In ours pxa270rp embedded system boot process and transplant process.Key words:Bootloader;Start; transplantation; U-boot
5、; embedded systems; ours_pxa270目 录第一章 绪论11.1 BOOTLOADER的简介11.1.1BOOTLOADER的定义11.1.2 BOOTLOADER的作用11.1.3. BOOTLOADER是不是必须的21.2 U-Boot的简介21.2.1 U-BOOT介绍21.2.2选择U-Boot的理由:2第二章 U-BOOT的启动过程简介32.1 U-Boot内各文件及文件夹的内容32.2 U-Boot启动内核的过程42.3 详细介绍U-Boot的启动过程5第三章 U-BOOT的移植143.1添加目标板的定义143.2 修改U-Boot Stage 1(汇编级)
6、的平台相关代码143.3修改U-Boot Stage 2(C语言级)的平台相关代码163.4 文件的具体修改163.5 板级初始化代码ours.c213.6 驱动程序移植21第四章 U-Boot的烧写224.1 u-boot的烧写过程224.1.1 u-boot的烧写224.1.2 烧写过程中可能遇到的问题224.2 引导Linux内核22第五章 结论23致 谢24参考文献25第一章 绪论嵌入式系统是计算机技术、微电子技术、语音图像数据传输技术、通信技术、半导体技术,甚至传感器等先进技术和具体应用对象相结合后的更新换代产品。根据IEEE(电气和电子工程师协会)的定义,嵌入式系统是“控制、监视或
7、者辅助装置、机器和设备运行的装置”(devices used to control, monitor, or assist the operation of equipment, machinery or plants)。从中可以看出嵌入式系统是软件和硬件的综合体,还可以涵盖机械等附属装置。目前国内一个普遍被认同的定义是:以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。因此往往是技术很密集、投资的强度大、高度又极其分散、不断创新的知识密集型系统,反射出当代最新技术的先进水平。在目前的各种嵌入式处理器中,由于ARM芯片的低功
8、耗、低成本等显著优点,因而得到很多半导体厂商的支持,并且在32位的嵌入式应用领域中取得了巨大的成功。因为Linux操作系统具有开放源代码、功能强大且易于移植等特点所以它就成为了嵌入式操作系统的首选。因此在ARM上构建嵌入式Linux系统成为嵌入式领域的一个热点。1.1 BOOTLOADER的简介1.1.1BOOTLOADER的定义 Bootloader是系统运行前运行的一小段代码,是一段小程序。1.1.2 BOOTLOADER的作用 一个嵌入式Linux系统从软件的角度看通常可以分为三个层次: 1、 引导加载程序。包括固化在固件中的boot代码,和BootLoader两大部分。 2、 Linu
9、x内核。特定于嵌入式板子的定制内核以及内核的启动参数。 3、 文件系统。包括根文件系统和建立于Flash内存设备之上文件系统。通常用ramdisk来作为rootfs。 引导加载程序是系统加电运行的第一段代码。PC机中的引导加载程序由BIOS和位于硬盘MBR中的OS BootLoader一起组成。BIOS在完成硬件检测和资源分配后,将硬盘MBR中的BootLoader读到系统的RAM中,然后再将控制权交给OS BootLoader。BootLoader的主要任务就是将内核映象从硬盘上读到 RAM 中,然后跳转到内核的入口点去运行,就是开始启动操作系统。 而在嵌入式系统中,通常并没有像BIOS那样
10、的固件程序,因此整个系统的加载启动任务就完全由BootLoader来完成。简单地说,BootLoader就是在操作系统内核运行之前运行的一段小程序。通过这段小程序,我们可以初始化硬件设备、建立内存空间的映射图,从而将系统的软硬件环境带到一个合适的状态,以便为最终调用操作系统内核做好正确的环境准备1。1.1.3. BOOTLOADER是不是必须的 bootloader并不是必须的,如果我们的硬件有足够大的norflash,并且实现了XIP技术,那么WinCE 操作系统可以直接在norflash里面运行起来,不需要将它复制到RAM中去,所以bootloader就失去了作用。但是考虑到成本因素,现在
11、的硬件一般都不会配置这么大的norflash,image文件都存储在nand flash里面,所以都会用到bootloader。1.2 U-Boot的简介1.2.1 U-BOOT介绍 U-Boot,全称Universal Boot Loader,是遵循GPL条款的开放源码项目。从FADSROM、8xxROM、PPCBOOT逐步发展演化而来。其源码目录、编译形式与Linux内核很相似,事实上,不少U-Boot源码就是相应的Linux内核源程序的简化,尤其是一些设备的驱动程序,这从U-Boot源码的注释中能体现这一点。但是U-Boot不仅仅支持嵌入式Linux系统的引导,当前,它还支持NetBSD
12、, VxWorks, QNX, RTEMS, ARTOS, LynxOS嵌入式操作系统。其目前要支持的目标操作系统是OpenBSD, NetBSD, FreeBSD,4.4BSD, Linux, SVR4, Esix, Solaris, Irix, SCO, Dell, NCR, VxWorks, LynxOS, pSOS, QNX, RTEMS, ARTOS。这是U-Boot中Universal的一层含义,另外一层含义则是U-Boot除了支持PowerPC系列的处理器外,还能支持MIPS、x86、ARM、NIOS、XScale等诸多常用系列的处理器。这两个特点正是U-Boot项目的开发目标,
13、即支持尽可能多的嵌入式处理器和嵌入式操作系统。就目前来看,U-Boot对PowerPC系列处理器支持最为丰富,对Linux的支持最完善。从PPCBOOT向U-Boot的顺利过渡,很大程度上归功于U-Boot的维护人德国DENX软件工程中心Wolfgang Denk以下简称W.D本人精湛专业水平和持着不懈的努力。当前,U-Boot项目正在他的领军之下,众多有志于开放源码BOOT LOADER移植工作的嵌入式开发人员正如火如荼地将各个不同系列嵌入式处理器的移植工作不断展开和深入,以支持更多的嵌入式操作系统的装载与引导。1.2.2选择U-Boot的理由: 开放源码; 支持多种嵌入式操作系统内核,如L
14、inux、NetBSD, VxWorks, QNX, RTEMS, ARTOS, LynxOS; 支持多个处理器系列,如PowerPC、ARM、x86、MIPS、XScale; 较高的可靠性和稳定性; 较高的可靠性和稳定性; 高度灵活的功能设置,适合U-Boot调试、操作系统不同引导要求、产品发布等; 丰富的设备驱动源码,如串口、以太网、SDRAM、FLASH、LCD、NVRAM、EEPROM、RTC、第二章 U-BOOT的启动过程简介2.1 U-Boot内各文件及文件夹的内容在了解U-Boot的启动过程前,我们首先要了解U-Boot内各文件及文件夹的内容。表2-1 u-boot的目录和各文件
15、的内容3目录内容board和一些已有开发板有关的文件. 每一个开发板都以一个子目录出现在当前目录中,比如说:SMDK2410,子目录中存放与开发板相关的配置文件.common实现uboot命令行下支持的命令,如:printenv,setenv每一条命令都对应一个文件。例如go命令对应就是 cmd_boot.ccpu与特定CPU架构相关目录,每一款uboot下支持的CPU在该目录下对应一个子目录,比如有子目录arm920t等。子目录下又包含不同的片上系统相关的代码及公共代码。disk对磁盘的支持 (X)doc文档目录。uboot有非常完善的文档,推荐大家参考阅读。driversuboot支持的设
16、备驱动程序都放在该目录,比如各种网卡、串口和USB等。fs支持的文件系统,uboot现在支持cramfs、fat、fdos、jffs2和registerfs。include头文件和开发板配置文件。该目录下configs目录有与每种开发板相关的配置头文件,如smdk2410.h。该目录下的asm目录有与CPU体系结构相关的头文件,asm对应的是asm-arm。lib_xxxx与体系结构相关的库文件。如与ARM相关的库放在lib_arm中。net与网络协议栈相关的代码,BOOTP协议、TFTP协议、RARP协议和NFS文件系统的实现。(u-boot 只允许自己ping其他机,因为它不支持icmp协
17、议 )tools存放制作S-Record 或者U-BOOT格式的映像等工具,如:mkimage, crclib_arm存放对ARM体系结构通用的文件,主要用于实现ARM平台通用的函数。lib_generic通用库函数的实现post存放上电自检程序rtcRTC 驱动程序dtt数据温度测量器或者传感器的驱动example一些独立运行的程序的例子,如 helloword2.2 U-Boot启动内核的过程U-Boot启动内核的过程可以分为两个阶段,两个阶段的功能如下:(1)第一阶段的功能 硬件设备初始化 加载U-Boot第二阶段代码到RAM空间 设置好栈 跳转到第二阶段代码入口(2)第二阶段的功能 初
18、始化本阶段使用的硬件设备 检测系统内存映射 将内核从Flash读取到RAM中 为内核设置启动参数 调用内核如下图所示2.3 详细介绍U-Boot的启动过程在这里我们以U-Boot-1.1.6版本中的ADSVIX为例介绍U-Boot的启动过程。首先要找到程序入口点。每个U-Boot程序都只有一个入口点。从board/adxvix/u-boot.lds我们可以发现u-boot的程序入口为_start,它在cpu/pxa/start.o当中。因此首先要分析start.S程序,U-Boot中所有的PXA系列的处理器都从这里开始执行第一条语句。.globl_start_start: b resetldr
19、 pc, _undefined_instructionldr pc, _software_interruptldr pc, _prefetch_abortldr pc, _data_abortldr pc, _not_usedldr pc, _irqldr pc, _fiq0x0地址开始是ARM异常向量表。一上电的第一条指令是跳转到reset复位处理程序:reset:/*进入SVC模式 */#ifndef CONFIG_SKIP_LOWLEVEL_INITbl cpu_init_crit /* we do sys-critical inits */#endif#ifndef CONFIG_SK
20、IP_RELOCATE_UBOOTrelocate:.一般不需要定义CONFIG_SKIP_LOWLEVEL_INIT,按照程序接下来跳转到cpu_init_crit处: cpu_init_crit:/*屏蔽所有中断 */*设置时钟源,关闭除FFUART,SRAM,SDRAM,FLASH以外的外设时钟 */.#ifdef CFG_CPUSPEEDldr r0, CC_BASE /*时钟控制寄存器基址 */ldr r1, cpuspeed/* cpuspeed: .word CFG_CPUSPEED */str r1, r0, #CCCRmov r0, #2mcr p14, 0, r0, c6,
21、 c0, 0setspeed_done:#endif/* CFG_CPUSPEED */*跳转到lowlevel_init,这里ip即r12,用作暂存寄存器 */mov ip, lrbl lowlevel_initmov lr, ip/* Memory interfaces are working. Disable MMU and enable I-cache. */ldr r0, =0x2001./*关闭MMU,使能I-Cache(可选) */mov pc, lr /*这里是从cpu_init_crit返回到relocate标号 */由此我们可知, cpu_init_crit的主要工作是设置
22、时钟,配置处理器主频,调用lowlevel_init函数进行底层初始化等,随后关闭MMU并使能I-Cache,再返回。lowlevel_init函数在board/adsvix/lowlevel_init.S中定义,其流程都是按照PXA27X的开发手册来的,所以不再赘述。其中的寄存器在include/asm-arm/arch-pxa/pxa-regs.h头文件中定义,寄存器初始化值在include/configs/adsvix.h中定义。另外,在后面的实际移植工作中,由于目标板XSBASE270使用的PXA270处理器,与adsvix的处理器一样,因此可使用adsvix开发板的lowlevel_
23、init.S文件4。接着程序的执行线索进行分析。从cpu_init_crit返回后就开始relocate(重定位),即将U-Boot从FLASH存储器搬运到SDRAM中TEXT_BASE开始的存储空间(TEXT_BASE在board/adsvix/config.mk中定义),并初始化堆栈,以在SDRAM中开始进入到Bootloader stage 2的C程序入口。Relocate部分开始的代码如下: /*之前已定义的部分变量有:_TEXT_BASE: .word TEXT_BASE_armboot_start: .word _start_bss_start: .word _bss_start_
24、bss_end: .word _end */relocate: /* relocate U-Boot to RAM */adr r0, _start /* r0 - current position of code */ldr r1, _TEXT_BASE /* test if we run from flash or RAM */cmp r0, r1 /* dont reloc during debug */beq stack_setupldr r2, _armboot_start /*读入_start到r2 */ldr r3, _bss_start /*读入_bss_start到r3 */
25、sub r2, r3, r2 /* r2 - size of armboot */add r2, r0, r2 /* r2 bd = (bd_t*)(char*)gd - sizeof(bd_t);memset (gd-bd, 0, sizeof (bd_t); /*用0填充(初始化) *gd-bd */monitor_flash_len = _bss_start - _armboot_start;for (init_fnc_ptr = init_sequence; *init_fnc_ptr; +init_fnc_ptr) if (*init_fnc_ptr)() != 0) hang ()
26、; /*打印错误信息并死锁 */#ifndef CFG_NO_FLASH/* configure available FLASH banks */size = flash_init (); /* drivers/cfi_flash.c或自定义 */display_flash_config (size);#endif /* CFG_NO_FLASH */*armboot_start is defined in the board-specific linker script*/mem_malloc_init (_armboot_start - CFG_MALLOC_LEN);./* initia
27、lize environment */env_relocate ();/* IP Address */gd-bd-bi_ip_addr = getenv_IPaddr (ipaddr);/* MAC Address */int i;ulong reg;char *s, *e;char tmp64;i = getenv_r (ethaddr, tmp, sizeof (tmp);s = (i 0) ? tmp : NULL;for(reg = 0; reg bd-bi_enetaddrreg = s ? simple_strtoul (s, &e, 16) : 0;if(s)s = (*e) ?
28、 e + 1 : e;devices_init (); /* get the devices list going. */.jumptable_init ();console_init_r (); /* fully init console as a device */enable_interrupts (); /* enable exceptions */* Perform network card initialisation if necessary */#if defined(CONFIG_DRIVER_SMC91111)| |defined (CONFIG_DRIVER_LAN91C
29、96)if(getenv (ethaddr)smc_set_mac_addr(gd-bd-bi_enetaddr);#endif /* CONFIG_DRIVER_SMC91111 | CONFIG_DRIVER_LAN91C96 */* Initialize from environment */if(s = getenv (loadaddr) != NULL) load_addr = simple_strtoul (s, NULL, 16);#if defined(CONFIG_CMD_NET)if (s = getenv (bootfile) != NULL)copy_filename
30、(BootFile, s, sizeof (BootFile);#endif#ifdef BOARD_LATE_INITboard_late_init ();#endif./*main_loop() can return to retry autoboot, if so just run it again.*/for (;) main_loop ();gd_t是全局数据表类型,在include/asm-arm/global_data.h中定义如下: /*Keep it *SMALL* and remember to set CFG_GBL_DATA_SIZE sizeof(gd_t)*/typ
31、edef struct global_data bd_t *bd;unsigned long flags;unsigned long baudrate;unsigned long have_console; /* serial_init() was called */unsigned long reloc_off; /* Relocation Offset */unsigned long env_addr; /* Address of Environment struct */unsigned long env_valid; /*Checksum of Environment valid?*/
32、unsigned long fb_base; /* base address of frame buffer */.void*jt; /* jump table */ gd_t;bd_t在include/asm-arm/u-boot.h中定义如下: typedef struct bd_info int bi_baudrate; /* serial console baudrate */unsigned long bi_ip_addr; /* IP Address */unsigned char bi_enetaddr6; /* Ethernet adress */struct environm
33、ent_s *bi_env;ulong bi_arch_number; /* unique id for this board */ulong bi_boot_params; /* where this board expects params*/struct /* RAM configuration */ulong start;ulong size;bi_dramCONFIG_NR_DRAM_BANKS; bd_t;jt是函数数组指针,随后将在jumptable_init()函数中初始化。从lib_arm/board.c的源码不难分析出系统的启动流程:首先初始化全局数据表,然后顺序执行函数指
34、针数组init_sequence中的一系列初始化函数由其在本文件中的相关定义可得知初始化流程:typedef int (init_fnc_t) (void);init_fnc_t *init_sequence = cpu_init, /* basic cpu dependent setup -cpu/pxa/cpu.c*/board_init, /* basic board setup -board/adsvix/adsvix.c */interrupt_init, /* set up exceptions -cpu/pxa/interrupts.c */env_init, /* initia
35、lize environment -common/env_flash.c */init_baudrate, /* initialze baudrate settings-lib_arm/board.c */serial_init, /* serial communications setup-cpu/pxa/serial.c */console_init_f, /* stage 1 init of console -common/console.c*/display_banner, /* say that we are here -lib_arm/board.c */#if defined(C
36、ONFIG_DISPLAY_BOARDINFO)checkboard, /* display board info */#endifdram_init, /* configure available RAM banks -board/adsvix/adsvix.c */display_dram_config, /*lib_arm/board.c */NULL,;在执行这个函数序列的过程中,任何一个函数异常返回都会导致u-boot“死锁”或说“挂起”在hang()函数的死循环当中。若一切顺利,接下来就调用flash_init()函数初始化CFI FLASH(针对NOR型闪存而言),该函数在dri
37、vers/cfi_flash.c中定义,不过,只有在目标板头文件中”#define CFG_FLASH_CFI_DRIVER”之后该驱动才会被编译;在adsvix的u-boot实现当中,include/configs/adsvix.h中没有定义CFG_FLASH_CFI_DRIVER。在移植U-Boot时,可以根据实际情况选择使用U-Boot自带的FLASH驱动还是自己编写新的驱动。如果配置了NAND闪存,还会对其进行初始化。接下来调用env_relocate()函数初始化环境变量,该函数在common/env_common.c文件中定义。在同一文件中可以发现还定义了一个字符数组default
38、_environment,用于描述缺省的环境变量,这些都要在include/configs/adsvix.h头文件中进行设置,包括启动命令CONFIG_BOOTCOMMAND,波特率CONFIG_BAUDRATE,IP地址CONFIG_IPADDR等等7。然后是获取自设置的目标板的网络地址,包括IP地址和MAC地址。再然后是调用common/devices.c中定义的devices_init()函数来创建设备列表,并初始化相应的设备,主要是”stdin”,”stdout”,”stderr”以及自定义的设备如I2C,LCD等8。接着调用common/exports中定义好了的jumptable_
39、init()函数,然后初始化数据表中的跳转表gd-jt,跳转表其实是一个函数指针数组,定义了U-Boot中的常用的函数库;而gd-jt则是这函数指针数组的首指针。部分代码如下: void jumptable_init (void) int i;gd-jt = (void *) malloc (XF_MAX * sizeof(void *);for (i = 0; i jti = (void *) dummy;gd-jtXF_get_version = (void *) get_version;gd-jtXF_malloc = (void *) malloc;gd-jtXF_free = (vo
40、id *) free;gd-jtXF_getenv = (void *) getenv;gd-jtXF_setenv = (void *) setenv;.上面的XF_get_version, XF_malloc, XF_free等在include/exports.h的枚举变量中定义,因此,实际上是作为”Label式整型序号”使用,即XF_get_version=1, XF_malloc=2, XF_free=3 .,相关代码如下: enum /* include/exports.h */#define EXPORT_FUNC(x) XF_ # x ,#include #undef EXPOR
41、T_FUNCXF_MAX;EXPORT_FUNC(get_version)EXPORT_FUNC(getc)EXPORT_FUNC(tstc)EXPORT_FUNC(putc)EXPORT_FUNC(puts)EXPORT_FUNC(printf). /* include/_exports.h */由于这些也是平台无关的代码,因此在移植过程中没有必要深究。然后是调用common/console.c中定义的函数console_init_r()初始化串口控制台。这时U-Boot的基本功能已经初始化完毕,便可开中断,并对附加功能进行配置与初始化,包括网卡驱动配置。目标板使用LAN91C1111网卡,
42、对应SMC91111网卡驱动,也可以根据需要配置其他的网卡驱动如CS8900等,这些都需要在include/configs/adsvix.h中定义9。然后是调用board/adsvix/adsvix.c中定义的board_late_init()函数进行板级的后期初始化。相关源代码如下:int board_late_init(void)setenv(stdout, serial);setenv(stderr, serial);return0;最后一个很重要的文件是lib_arm/armlinux.c,它要实现的主要功能包括设置内核启动参数,并负责将这些参数传递给内核,然后跳转到Linux的内核入
43、口,并将控制权提交给内核。具体需要传递的是哪些参数,要通过在include/configs/adsvix.c中指定条件编译选项来控制的,对应于lib_arm/armlinux.c中的部分源代码形式如下: #if defined (CONFIG_SETUP_MEMORY_TAGS) | defined (CONFIG_CMDLINE_TAG) | defined (CONFIG_INITRD_TAG) | defined (CONFIG_SERIAL_TAG) | defined (CONFIG_REVISION_TAG)static void setup_start_tag (bd_t *bd
44、);# ifdef CONFIG_SETUP_MEMORY_TAGSstatic void setup_memory_tags (bd_t *bd);# endifstatic void setup_commandline_tag (bd_t *bd, char *commandline);# ifdef CONFIG_INITRD_TAGstatic void setup_initrd_tag (bd_t *bd, ulong initrd_start,ulong initrd_end);# endifstatic void setup_end_tag (bd_t *bd);static s
45、truct tag *params;#endif.voiddo_bootm_linux (cmd_tbl_t *cmdtp, int flag, int argc, char *argv,ulong addr, ulong *len_ptr, int verify).void(*theKernel)(int zero, int arch, uint params);.#ifdef CONFIG_CMDLINE_TAGchar *commandline = getenv (bootargs);#endiftheKernel = (void (*)(int, int, uint)ntohl(hdr
46、-ih_ep);.theKernel (0, bd-bi_arch_number, bd-bi_boot_params);关于这个参数列表中各个参数的定义及含义,以及参数列表的初始化过程,可以参考Booting ARM Linux一文。参数列表(tag list)在内存中的起始地址会保存在通用寄存器R2中,并传递给内核。而按照习惯或说惯例,通常tag list的首地址(物理地址)会设置为RAM起始地址+ 0x100偏移量,因此R2的值实际上是确定不变的。另外,还要正确设置R0和R1的值,在呼叫内核时,R0的值应为0,R1中则应保存机器类型(machine type)编号。R0,R1和R2都会作
47、为参数传递给内核。在上面的代码中,定义了一个函数指针theKernel,通过倒数第二条语句将内核入口地址赋给theKernel(hdr是include/image.h中定义的一个image_header结构体类型的数据,hdr-ih_ep中保存了内核入口地址,ntohl的功能是字节顺序的大小端转换,相关代码可以参考tools/mkimage.c),最后,根据APCS规则,将0, bd-bi_arch_number, bd-bi_boot_params依次作为参数通过R0,R1和R2传递给theKernel这个函数,然后再进入内核启动部分10。经过上述对U-Boot启动过程的说明,我们可以更加准
48、确的明白哪些文件是和平台有关的,哪些文件是和平台无关的。这样在移植的时候,我们才知道哪些要改哪些不要改。第三章 U-BOOT的移植 我采用的U-Boot-1.1.6版本的,我的目标板是北京OURS PXA270RP。它是一款基于INTEL XSCALE PXA270处理器,针对高校嵌入式系统教学和实验科研的平台。3.1添加目标板的定义 因为我的目标板的处理器和adsvix的处理器一样,所以我以adsvix这块板子为模板制作u-boot。在board文件夹里新建一个文件夹,并命名为ours。在board中,把adsvix文件中的所有文件拷贝到ours中,并把adsvix.c这个文件改名成ours
49、.c。在ours下,打开Makefile文件,把OBJS:= adsvix.o pcmcia.o改成OBJS:= ours.o pcmcia.o在include/configs/中,把adsvix.h复制粘贴并更名成ours.h。在主目录下,打开Makefile文件,找到语句adsvix_config:unconfig ./mkconfig $(:_config=) arm pxa adsvix在它的下一行添加下面语句ours_config:unconfig ./mkconfig $(:_config=) arm pxa ours 在主目录下编译。 make ours_config make 编译完成之后,得到的几个重要文件是11:(1) u-boot.bin: 原始二进制文件,用于下载到启动ROM进行系统引导;(2) u-boot:ELF格式映像文件,可加载到SDRAM或SRAM中进行调试;(3) u-boot.srec: Motorola S-Records格式映像。(4) System.map: U-Boot映像文件的符号表,各符号的链接地址。 但是这些并不是我们最终要使用的文件,紧紧只是测试目标板的定义的添加是否成功而已。3.2 修改U-Boot Stage 1(汇编级
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度城市公共绿地养护管理合同2篇
- 2024年度企业内退员工创业支持合同3篇
- 二零二四年度版权授权使用合同:某电影公司将某小说的改编权授权给某影视公司3篇
- 2024年专利权风险共担合同3篇
- 非公开发行债券承诺书合同三篇
- 2024年专业三方委托合同示例
- 2024年成都市二手住宅交易协议2篇
- 2024年城市绿化管道顶管施工合同
- 2024年二手房交易按揭贷款合同范例2篇
- 2024年度幼儿园儿童心理健康服务合同
- 概率论与数理统计知到章节答案智慧树2023年安徽农业大学
- 医师值班、交接班制度
- vc约起来史上最全180个知名投资人联系方式
- 诗歌讲解 第十三讲南唐词人李煜课件(98张PPT)
- YC/T 455.1-2013卷烟零售市场信息采集和分析应用基本规范第1部分:总则
- JJF 1458-2014磁轭式磁粉探伤机校准规范
- T-SZSA 030.1-2021 医院及医疗机构建筑空间照明技术规范 第1部分:总规范
- 课程设计传动装置输入轴组合结构设计
- 狂犬病病例分析课件
- 边塞诗课件(公开课)
- 寺庙民主管理委员会章程
评论
0/150
提交评论