u-boot移植总结(四)u-boot-2010.09框架分析

发布者:ArtisticSoul最新更新时间:2024-07-24 来源: elecfans关键字:u-boot  移植  框架分析 手机看文章 扫描二维码
随时随地手机看文章

(一)本次移植是基于FL2440,板子的基本硬件:

CPU

 型号为S3C2440,基于ARM920T,指令集ARMV4,时钟主频400MHz

SDRAM                             

 H57V2562GTR-75C  

 2片*32MB=64MB,挂载于nGCS6 (0x3000 0000)

NANDFLASH

型号:K9F2G08U0B  大小:256MB

Network    Adapter  

网卡

 DM9000AEP   

 10/100M自适应,挂载于nGCS4 (0x2000 0000)

LED  

 5个LED(LED0~3)I/O口指示灯,LED5电源指示灯,LED9核心板3.3V指示灯

LED0~LED3分别接GPB6,GPB6,GPB8,GPB10

BEEP(蜂鸣器)       

 接在GPB0/TOUT0

                                                      


(二)U-Boot的整体框架:

arch

cpu处理器相关代码,其中每款cpu都包含了相关代码和处理器体系相关的初始化文件。其中U-Boot开始执行第一个文件start.S,主要做最早其的系统初始化,代码重定向和设置系统堆栈,为第二阶段的C程序奠定基础。而其中的board.c文件,几乎是U-Boot的所有架构第二阶段代码入口函数和相关初始化函数存放的地方。

board

已经支持的所有开发板相关文件,其中包含SDRAM初始化代码、Flash底层驱动、板级初始化文件。其中的config.mk文件定义了TEXT_BASE,也的代码在内存的真实地址,非常重要。

drivers

含几乎所有外围芯片的驱动,网卡、USB、串口、LCD、Nand Flash等等

common

与处理器体系结构无关的通用代码,U-Boot的命令解析代码,/common/command.c、所有命令的上层代码cmd_*.c、Uboot环境变量处理代码env_*.c、等都位于该目录下

Disk,fs,net

支持的CPU无关的重要子系统; 磁盘驱动的分区处理代码,文件系统:FAT、JFFS2、EXT2等;网络协议:NFS、TFTP、RARP、DHCP等等;

include

头文件,包括各CPU的寄存器定义,文件系统、网络等等;configs子目录下的文件是与目标板相关的配置头文件

doc

U-Boot的说明文档,在修改配置文件的时候可能用得上

api

部扩展应用程序的API和范例,第三方函数

nand_spl

onenand_ipl

post

一些特殊构架需要的启动代码和上电自检程序代码

Makefile

config.mk

rules.mk

控制整个编译过程的主Makefile文件和规则文件

tools

编译S-Record或U-Boot映像等相关工具,制作bootm引导的内核映像文件工具mkimage源码就在此

boards.cfg

板子配置添加,如:板子为ly440,在编译阶段需要先make ly2440_config读出文件配置

COPYING

README

MAINTAINERS

CREDITS

一些介绍性的文档、版权说明

其中红色字体标识的是比较重要的,也是主要修改文件.



(三)本次基于FL2440板子修改u-boot-2010.09,第二阶段初始化函数分析

1,测试

在boards.cfg文件添加板子配置



Makefile添加制作好交叉编译器buildroot-2011.11



测试编译,make ly2440_config 读取配置文件



由于Samsung的smdk2410与s3c2440很类似,以smdk2410为蓝本,提高修改代码效率


[zhouguangfeng@centos6 u-boot-2010.09]$ cd board
[zhouguangfeng@centos6 board]$ mkdir -p lingyun/ly2440
[zhouguangfeng@centos6 board]$ cp samsung/smdk2410/* lingyun/ly2440
[zhouguangfeng@centos6 board]$ ls lingyun/ly2440
config.mk  flash.c  lowlevel_init.S  Makefile  smdk2410.c
[zhouguangfeng@centos6 board]$ mv lingyun/ly2440/smdk2410.c lingyun/ly2440/ly2440.c
[zhouguangfeng@centos6 board]$ ls lingyun/ly2440
config.mk  flash.c  lowlevel_init.S  ly2440.c  Makefile
[zhouguangfeng@centos6 board]$ 



具体修改不详细展开




2,U-Boot开始,第一个执行Start.S在u-boot移植总结(一)start.S分析(点击链接)有总结,这里总结一些第二阶段关于板子初始化的函数:U-Boot使用一个数组init_sequence来存储对于大多数开发板都要执行的初始化函数的函数指针。init_sequence数组中有较多的编译选项,去掉编译选项后init_sequence数组如下所示:

 

typedef int(init_fnc_t) (void); //申明一种函数类型,返回值int,参数void

init_fnc_t*init_sequence[] = {

      board_init,        /*开发板相关的配置--board/lingyun/ly2440/ly2440.c */

      timer_init,           /*时钟初始化--arch/arm/cpu/arm920t/s3c24x0/timer.c*/

      env_init,           /*初始化环境变量--common/env_flash.c 或common/env_nand.c*/

      init_baudrate,      /*初始化波特率-- arch/arm/lib/board.c  */

      serial_init,           /*串口初始化--drivers/serial/serial_s3c24x0.c*/

      console_init_f,   /* 控制通讯台初始化阶段1-- common/console.c */

      display_banner,  /*打印U-Boot版本、编译的时间-- arch/arm/lib/board.c */

      dram_init,           /*配置可用的RAM--board/lingyun/ly2440/ly2440.c */

      display_dram_config,   /* 显示RAM大小-- arch/arm/lib/board.c*/

      NULL,

};

  

   

其中的board_init函数在board/lingyun/ly2440/ly2440.c中定义,该函数设置了MPLLCOM,UPLLCON,以及一些GPIO寄存器的值,还设置了U-Boot机器码和内核启动参数地址 :

#if defined(CONFIG_S3C2410)  

    /* arch number of SMDK2410-Board */
    gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
#endif

#if defined(CONFIG_S3C2440) 

/*  arch number of S3C2440-Board ,MINI2440机器代码*/
    gd->bd->bi_arch_number = MACH_TYPE_MINI2440 ;
#endif

/* 内核启动参数地址 */

gd->bd->bi_boot_params=0x30000100;  

  

     

FL2440使用2片32MB的SDRAM组成了64MB的内存,接在存储控制器的BANK6,地址空间是0x3000 0000~0x3400 0000。在include/configs/ly2440.h中PHYS_SDRAM_1和PHYS_SDRAM_1_SIZE分别被定义为0x30000000和0x04000000(64M)。

其中的dram_init函数在board/lingyun/ly2440/ly2440.c中定义如下:

int dram_init (void)

{

     gd->bd->bi_dram[0].start= PHYS_SDRAM_1;

     gd->bd->bi_dram[0].size= PHYS_SDRAM_1_SIZE;

     return 0;

}

 


 

分析完上述的数据结构,下面来分析start_armboot函数:

voidstart_armboot (void)

{

      init_fnc_t**init_fnc_ptr;

      char *s;

      … …

      /* 计算全局数据结构的地址gd,在include/asm/global_data.h有定义 */

      gd =(gd_t*)(_armboot_start - CONFIG_SYS_MALLOC_LEN - sizeof(gd_t));

      … …

      memset((void*)gd, 0, sizeof (gd_t));

      gd->bd= (bd_t*)((char*)gd - sizeof(bd_t));  /*bd结构体在arch/arm/include/asm/u-boot.h定义,保存关于板子信息*/

      memset(gd->bd, 0, sizeof (bd_t));

      gd->flags|= GD_FLG_RELOC;

 

      monitor_flash_len= _bss_start - _armboot_start;

 

/* 逐个调用init_sequence数组中的初始化函数 */

      for(init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {

             if((*init_fnc_ptr)() != 0) {

                    hang();

             }

      }

 

/*armboot_start在arch/arm/cpu/arm920t/start.S中被初始化为u-boot.lds连接脚本中的_start */

      mem_malloc_init(_armboot_start - CONFIG_SYS_MALLOC_LEN,

                    CONFIG_SYS_MALLOC_LEN);

 

/* NAND Flash初始化*/ 

#ifdefined(CONFIG_CMD_NAND)

      puts('NAND:  ');

      nand_init();        /* go init the NAND */

#endif

      … …

/*配置环境变量,重新定位 */

      env_relocate();

      … …

/* 从环境变量中获取IP地址 */

      gd->bd->bi_ip_addr= getenv_IPaddr ('ipaddr');

      stdio_init(); /* get the devices list going. */

      jumptable_init();

      … …

      console_init_r(); /* fully init console as a device */

      … …

      /* enableexceptions */

      enable_interrupts();

 

#ifdefCONFIG_USB_DEVICE

      usb_init_slave();

#endif

 

   /* Initialize from environment*/

      if ((s =getenv ('loadaddr')) != NULL) {

             load_addr= simple_strtoul (s, NULL, 16);

      }

#ifdefined(CONFIG_CMD_NET)

      if ((s =getenv ('bootfile')) != NULL) {

             copy_filename(BootFile, s, sizeof (BootFile));

      }

#endif

      … …

  /*网卡初始化 */

#ifdefined(CONFIG_CMD_NET)

#ifdefined(CONFIG_NET_MULTI)

      puts('Net:   ');

#endif

      eth_initialize(gd->bd);

#if defined(CONFIG_RESET_PHY_R)
    debug ('Reset Ethernet PHYn');
    reset_phy();
#endif

#endif

 

      /*main_loop() can return to retry autoboot, if so just run it again. */

      for (;;){

             main_loop();

      }

      /*NOTREACHED - no way out of command loop except booting */

}

main_loop函数在common/main.c中定义。一般情况下,进入main_loop函数时,超过include/configs/ly2440.h中定义的CONFIG_BOOTDELAY

时间,而没有按下ESC,则U-Boot引导加载系统内核。


关键字:u-boot  移植  框架分析 引用地址:u-boot移植总结(四)u-boot-2010.09框架分析

上一篇:u-boot移植总结(三)(转)S3C2440对Nand Flash操作和电路原理(基于K9F2G08U0A)
下一篇:内核移植和文件系统制作(2):linux内核最小系统和initramfs文件系统

推荐阅读最新更新时间:2024-11-19 23:58

006_STM32程序移植之_SYN6288语音模块
1. 测试环境:STM32C8T6 2. 测试模块:SYN6288语音模块 3. 测试接口: SYN6288语音模块: VCC------------------3.3V GND------------------GND TXD-----------------PB11 RXD-----------------PB10 BY------------------PB1 2. 串口使用串口一,波特率9600 单片机引脚------------CH340引脚 VCC--------------------VCC GND-------------------GND PA9--------------------RXD PA10------
[单片机]
006_STM32程序<font color='red'>移植</font>之_SYN6288语音模块
u-boot 第一阶段启动流程
一、u-boot启动流程 第一步: S5pc100中IROM中的代码 自动将NAND FLASH的前16KB拷贝到SRAM的0x34000 ,然后bootload的第一部分开始执行,初始化DRAM。 第二步: bootload将nandflash中所有的bootload拷贝到DRAM中。 第三步: 跳转到DRAM中开始执行bootload的第二部分代码。 二、第一阶段启动流程 裁剪之后的start.S文件如下: .globl _start _start: b reset /***********************************设
[单片机]
<font color='red'>u-boot</font> 第一阶段启动流程
米尔瑞米派Remi Pi实时系统与Ethercat移植 应用笔记
概 述 Remi Pi采用瑞萨RZ/G2L作为核心处理器,该处理器搭载双核Cortex-A55@1.2GHz+Cortex-M33@200MHz处理器,其内部集成高性能3D加速引擎Mail-G31 GPU(500MHz)和视频处理单元(支持H.264硬件编解码),16位的DDR4-1600 / DDR3L-1333内存控制器、千兆以太网控制器、USB、CAN、SD卡、MIPI-CSI等外设接口,在工业、医疗、电力等行业都得到广泛的应用。 在开发阶段,建议配合核心板配套的评估套件 MYD-YG2L23-8E1D-120-C-REMI来加速开发。 实时内核设计 实时补丁我们选择RT-Preem
[嵌入式]
米尔瑞米派Remi Pi实时系统与Ethercat<font color='red'>移植</font> 应用笔记
CS8900A网络驱动程序移植
上图为开发板上的网卡原理图,可得到: 1.CS8900A的访问基址为0x19000000 2.总线位宽为16 3.中断引脚为EINT9 驱动文件drivers/net/cs89x0.c既可以编进内核,也可以编译为一个可加载模块。编译进内核时,它的入口函数为cs89x0_probe;编译为模块时,它的入口函数为init_module。这两个函数最终都会调用cs89x0_probel函数来枚举CS8900A。因此需要在调用cs89x0_probel函数之前,指明CS8900A芯片使用的资源。 下面修改驱动文件drivers/net/cs89x0.c: (5)
[单片机]
CS8900A网络驱动程序<font color='red'>移植</font>
U-boot内核移植步骤
Linux 3.3.5系统移植 将arch/arm/mach-s3c6410/下的,mach-smdk6410.c cp为mach-my6410.c; 打开arch/arm/mach-s3c6410/下的Kconfig,仿照MACH_SMDK6410做一个菜单项: config MACH_MY6410 bool MY6410 select CPU_S3C6410 select SAMSUNG_DEV_ADC select S3C_DEV_HSMMC select S3C_DEV_HSMMC1 select S3C_DEV_I2C1 select SAMSUNG_DEV_IDE select
[单片机]
JFFS2文件系统的移植
JFFS2是JFFS的后继者,由Red Hat重新改写而成。JFFS2的全名为JournallingFlash File System Version 2(闪存日志型文件系统第2版),其功能就是管理在MTD设备上实现的日志型文件系统。与其他的存储设备存储方案相比,JFFS2并不准备提供让传统文件系统也可以使用此类设备的转换层。它只会直接在MTD设备上实现日志结构的文件系统。JFFS2会在安装的时候,扫描MTD设备的日志内容,并在RAM中重新建立文件系统结构本身。 除了提供具有断电可靠性的日志结构文件系统,JFFS2还会在它管理的MTD设备上实现“损耗平衡”和“数据压缩”等特性。 JFFS2 功能如下: Ø 支持NAND
[单片机]
基于WindowsCE下S3C2410的多串口移植技术
嵌入式系统已经渗入到国民经济的各个领域,而嵌入式操作系统是嵌入式系统的灵魂。目前国际上常用的操作系统有 VxWorks、Windows CE、Linux等。其中,微软公司开发的 Windows CE 以其快速的开发流程、灵活的软硬件选择和健壮的最终产品已成为越来越多嵌入式产品开发的首选。 由于嵌入式系统的硬件平台种类繁多,WindowsCE.net支持的处理器种类就有ARM,POWER PC, MPS、X86等几大类,各个大类之内又包含多种CPU。各硬件厂商提供的 WindowsCE.net 的硬件驱动并不全,因此开发人员经常需要根据自己特定的硬件平台进行驱动开发。WindowsCE.net的标准BSP一般只为我们开通了一个串
[单片机]
基于WindowsCE下S3C2410的多串口<font color='red'>移植</font>技术
MIPS 移植 Android “Honeycomb”平台
美普思科技公司(MIPS Technologies, Inc)宣布,已正式授权获得 Android™ 3.0,即 “Honeycomb”的源代码,并正将此最新版 Android 移植到 MIPSTM架构。对设计 Android 产品的MIPS客户来说,这将显著加速基于 MIPS 架构进行平板电脑和 Google 电视产品的开发。 MIPS 科技公司营销和业务开发副总裁 Art Swift 表示:“Android 对于MIPS 来说一直是个重要的平台。开始的时候,我们专注于把Android引入手机以外的市场;现在我们已经在市场上看到了基于 Android 和 MIPS的电视、机顶盒及其他产品。Android 也为 MIPS
[手机便携]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved