微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > MCU和DSP > U-Boot在S3C2410上的移植

U-Boot在S3C2410上的移植

时间:09-17 来源:互联网 点击:
在本系统中,传递参数时分别调用了以下tag:  

setup_start_tag(bd); //标记列表开始  

setup_memory_tags(bd); //设置内存的起始位置和大小  

setup_commandline_tag(bd, commandline); /*Linux内核在启动时可以命令行参数的形式来接收信息,利用这一点可以向内核提供那些内核不能检测的硬件参数信息,或者重载(override)内核检测到的信息,这里char *commandline "initrd=0x30800000,0x440000 root="/dev/ram" init="/linuxrc" console="ttyS0"";*/  

setup_ramdisk_tag(bd); //表示内核解压后ramdisk的大小  

setup_initrd_tag(bd, initrd_start, initrd_end); //设置ramdisk的大小和物理起始地址  

setup_end_tag(bd); //标记列表结束  

其中bd_t *bd = gd->bd是指向bd_t 结构体的指针,在该结构体中存放了关于开发板配置的基本信息。标记列表应该放在内核解压和initrd的bootp程序都不会覆盖的内存区域,同时又不能和异常处理的入口地址相冲突。建议放在RAM起始的16K大小处,在本系统中即为0x30000100处。  

U-Boot调用 Linux 内核的方法是直接跳转到内核的第一条指令处,也即直接跳转到 MEM_START+0x8000地址处。在跳转时,要满足下列条件:  

a) CPU寄存器的设置:R0=0;R1=机器类型 ID,本系统的机器类型ID=193。R2=启动参数标记列表在RAM中的起始基地址;  

b) CPU模式:必须禁止中断(IRQs和FIQs);CPU必须工作在SVC模式;  

c) Cache和MMU的设置:MMU 必须关闭;指令Cache可以打开也可以关闭;数据Cache必须关闭。  

系统采用下列代码来进入内核函数:  

theKernel = (void (*)(int, int))ntohl(hdr->ih_ep);

theKernel(0, bd->bi_arch_number);其中,hdr是image_header_t类型的结构体,hdr->ih_ep指向内核的第一条指令地址,即Linux操作系统下的/kernel/arch/arm/boot/compressed/head.S汇编程序。theKernel()函数调用应该不会返回,如果该调用返回,则说明出错。  

结语  

本文总结介绍了U-Boot在S3C2410上的移植,移植完成后,U-Boot能够稳定地运行在开发板上,为后续的软件开发打下较好的基础.

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top