zoukankan      html  css  js  c++  java
  • u-boot移植总结(四)u-boot-2010.09框架分析

    (一)本次移植是基于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,fsnet

    支持的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为蓝本,提高修改代码效率

    <strong><span style="font-size:24px;">[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]$ </span></strong>
    

    具体修改不详细展开

    2,U-Boot开始,第一个执行Start.Su-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使用232MBSDRAM组成了64MB的内存,接在存储控制器的BANK6,地址空间是0x3000 0000~0x3400 0000include/configs/ly2440.hPHYS_SDRAM_1PHYS_SDRAM_1_SIZE分别被定义为0x300000000x0400000064M)。

    其中的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_startarch/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 PHY ");
        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引导加载系统内核。



  • 相关阅读:
    利用JavaScript+DIV+CSS实现下拉菜单。当鼠标移动到菜单选项的时候显示对应的DIV:function show(menu)。当鼠标移出的时候隐藏所有的DIV:function hide()。
    java编程——图片旋转
    名言
    利用CSS对注册页面实现修饰
    软件过程
    Warning: Failed to halt at after bootloader, forced stop at
    cc2650 7x7封装更换为 5X5 4x4
    IAR 路径导致的错误
    cc2650-cc2640蓝牙开发准备手记
    window10装机 nvem简介,针对于 联想R720系列
  • 原文地址:https://www.cnblogs.com/xiaoxing/p/3933604.html
Copyright © 2011-2022 走看看