zoukankan      html  css  js  c++  java
  • DM6446开发攻略——u-boot-1.3.4移植(1)

     
    UBOOT的版本更新速度比较快,截止今天,稳定正式的版本是u-boot-2009.11-rc2,而TI最新的EVM开发包里的UBOOT1.2.0版本,国内很多公司还一直使用u-boot-1.1.4u-boot-1.1.6。其实,我们也没必要追风跟上最新版本,程序跑稳定才是最重要的。当然,有兴趣研究研究也不错,毕竟最新版本增加很多实用的功能。在移植之前,我们简单介绍u-boot这些版本架构的变化。从u-boot-1.3.0u-boot-1.3.2基本上架构是一样的,而从u-boot-1.3.3u-boot-1.3.4,架构相对u-boot-1.3.2变化比较大。从u-boot-2008.10开始,nand flash驱动变化非常大,u-boot-2009.03增加强大的lzma压缩解压功能,fs支持yaffs2u-boot-2009.06  nand flash变化更大。到u-boot-2009.11.1增加DM6467 DM365的支持。
    关于u-boot-1.3.4的移植,本人的博客也介绍在三星s3c2440上移植过,我们在这里主要针对davinci 平台。由于UBOOT功能很多,要全部把移植的东西立刻写出来,对本人还是有难度,所以中间会先发布有关montavista linux-2.6.18的移植,如何把DSP程序先跑起来,等等。由于本人的主要工作是开发产品,卖卖DM6446核心板、DM6437核心板,及相关开发板,智能视频监控IVR,推推DSP方案,所以博客更新速度比较慢,其实写博客的目的,有很大的部分就是想和全国各地朋友交流技术。同时这里要感谢51CTO的小松管理员,把本人的开发攻略改为推荐博文。回到移植正题,我们一步一步把UBOOT跑起来,把内核也跑起来。鉴于学习的目的,本人这里不提供patch
     
    第一步:解压和简化UBOOT
     
    ftp.denx.de下载u-boot-1.3.4.tar.bz2u-boot-1.3.4-rc2.tar.bz2,然后解压到你的工作目录,很多人解压完后,就马上进入正题,修改makefile什么的,本人觉得不用那么急。首先删除和平台不相关的文件和文件夹,目的让UBOOT更简化,好理解,减少虚拟机的存储空间,便于备份(每次有进展的修改后,备份和修改记录很重要,这是良好习惯):
    在顶层目录:把文件avr32_config.mkblackfin_config.mki386_config.mkm68k_config.mkmicroblaze_config.mkmips_config.mknios2_config.mknios_config.mkppc_config.mksh_config.mksparc_config.mk删除;文件夹lib_avr32lib_blackfinlib_i386lib_m68klib_microblazelib_mipslib_nioslib_nios2lib_ppclib_shlib_sparcnand_splonenand_ipl,其他就不要删了。
    board目录下:只保留davinci文件夹,其他平台板子全部干掉!男人就要狠一点。而davinci也只保留TI 自己的dv-evm文件夹,这也是我们要修改的平台,schmoogiesffsdrsonata是其他公司基于davinci上的板子,你可以删掉,也可以参考。当然,还是在boarddavinci目录下,你可以COPY dv-evm并改成你公司的板子的名字,然后在顶层修改makefile支持你公司的板子,下一步再说。
    cpu的目录:只保留arm926ejs,其他CPU全部干掉。进入arm926ejs目录,同时把at91sam9omapversatile文件夹删除,保留davinci和其他文件。
    include目录:把文件夹asm-avr32asm-blackfinasm-i386asm-m68kasm-microblazeasm-mipsasm-niosasm-nios2asm-ppcasm-shasm-sparc删除掉。进入configs目录,只保留davinci_dvevm.h,其他*.h文件全部删除调!
    做完以上的工作后,UBOOT相当简洁,其实还有一些文件和文件可以再删,不过已经没必要,我们删除的对象是其他不相关的平台。备份一下这个源版本,便于日后自己修改的UBOOT和这个源版本比较。
     
    第二步:链接交叉编译环境
     
    如果你已经看过本人有关《DAVINCI DM6446开发攻略——环境搭建篇》,按里边描述的方法,对交叉编译环境进行搭建,那么下面编译工作就好进行了。
    修改顶层makefile
    144行:把CROSS_COMPILE = arm-linux-改为CROSS_COMPILE = arm_v5t_le-
     
    282行:把ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND),改为ALL += $(obj)u-boot.srec $(obj)u-boot.bin $(obj)System.map $(U_BOOT_NAND) $(U_BOOT_ONENAND) u-boot.img,就是后面添加u-boot.img
     
    308行:./tools/mkimage -A $(ARCH) -T firmware -C none 后面,添加和注销以下代码:
        -a 0x$(shell grep "T _start" $(TOPDIR)/System.map | awk '{ printf "%s", $$1 }')
        -e 0x$(shell grep "T _start" $(TOPDIR)/System.map | awk '{ printf "%s", $$1 }')
        -n 'u-boot image' -d $< $@
    #       -a $(TEXT_BASE) -e 0
    #       -n $(shell sed -n -e 's/.*U_BOOT_VERSION//p' $(VERSION_FILE) |
    #          sed -e 's/"[  ]*$$/ for $(BOARD) board"/')
    #       -d $< $@
    (注意要加tab键)
    这里这样做的目的,生成的u-boot.img可以被上篇介绍的UBLBOOT起来,而u-boot.bin可以被TI提供的uart_load.exe uartapp.bin 软件方式(soft boot)启动起来,便于生产和测试。
     
    在源makefile文件2416行:就是davinci_dvevm_config :    unconfig
        @$(MKCONFIG) $(@:_config=) arm arm926ejs dv-evm davinci davinci
    根据这一行,你可以参考TI 这个做法定义自己的板子,添加自己板子的config,比如加入:
    davinci_dm6446_config :unconfig
        @$(MKCONFIG) $(@:_config=) arm arm926ejs dm6446 davinci davinci
    然后在boarddavinci目录下,使用
    mkdir dm6446
    cp –f dv-evm/* dm6446/
    同时进入include/configs/目录,使用cp –f davinci_dvevm.h davinci_dm6446.h
    注:其实直接在TI  dv-evm上移植也可以,没必要定义自己的板子和配置。这里只不过给大家举个例子。
    编译工作:
    $make distclean
    $make davinci_dm6446_config
    $make
    看是否编译全部通过,是否生成u-boot.binu-boot.img等文件,同时检查你的交叉编译环境是否建立好,没问题继续往下进行。
     
    第三步:移植板子驱动和配置
    1、  修改davinci_dm6446.h
    首先说说本人板子的信息:DDR2——256M-ByteNAND——128M-Byte——2K Page 通用网口PHY芯片,没有NOR FLASHATA
    /*=======*/
    /* Board */
    /*=======*/
    #define DV_EVM
    #define CFG_USE_NAND(支持NAND
    #define CFG_NAND_LARGEPAGE (支持2K PageNAND
    //#define CFG_NAND_SMALLPAGE(表示支持512 字节 Page
    //#define CFG_USE_NOR(表示支持NOR FLASH
     
    。。。。。。。
    /*===================*/
    /* SoC Configuration */
    /*===================*/
    #define CONFIG_ARM926EJS                   /* arm926ejs CPU core */
    #define CONFIG_SYS_CLK_FREQ     297000000     /* Arm Clock frequency */
    #define CFG_TIMERBASE          0x01c21400    /* use timer 0 */
    #define CFG_HZ_CLOCK            27000000       /* Timer Input clock freq */
    #define CFG_HZ                   1000
    #define CONFIG_SOC_DM644X   SOCDM644X
     
    /*====================================================*/
    /* EEPROM definitions for Atmel 24C256BN SEEPROM chip */
    /* on Sonata/DV_EVM board. No EEPROM on schmoogie.    */
    /*====================================================*/
    //#define CFG_I2C_EEPROM_ADDR_LEN            2
    //#define CFG_I2C_EEPROM_ADDR              0x50
    //#define CFG_EEPROM_PAGE_WRITE_BITS      6
    //#define CFG_EEPROM_PAGE_WRITE_DELAY_MS  20
    (如果你的板子没有I2C接口的EEPROM,把上面的代码注释掉)
     
    /*=============*/
    /* Memory Info */
    /*=============*/
    #define CFG_MALLOC_LEN              (0x10000 + 128*1024)  /* malloc() len */
    #define CFG_GBL_DATA_SIZE    128         /* reserved for initial data */
    #define CFG_MEMTEST_START  0x80000000    /* memtest start address */
    #define CFG_MEMTEST_END            0x81000000    /* 16MB RAM test */
    #define CONFIG_NR_DRAM_BANKS1            /* we have 1 bank of DRAM */
    #define CONFIG_STACKSIZE     (256*1024)     /* regular stack */
    #define PHYS_SDRAM_1           0x80000000    /* DDR Start */
    #define PHYS_SDRAM_1_SIZE0x10000000    /* DDR size 256MB */
    #define DDR_8BANKS                      /* 8-bank DDR2 (256MB) */
    有关DDR Memory这里不需要修改,因为本人的板子是256M的。除非你的板子是128M才改为:SIZE     0x08000000 DDR_4BANKS
     
    /*====================*/
    /* Serial Driver info */
    /*====================*/
    串口驱动不用改。
     
    /*===================*/
    /* I2C Configuration */
    /*===================*/
    I2C 驱动可以不用改。也可以注释掉,如果你不想在UBOOT操作任何I2C的动作。
     
    /*==================================*/
    /* Network & Ethernet Configuration */
    /*==================================*/
    网络配置也不需要修改
     
    /*=====================*/
    /* Flash & Environment */
    /*=====================*/
    由于最开始我们已经定义好CFG_USE_NANDCFG_NAND_LARGEPAGE的信息,所以这里也不需要修改;
     
    /*==============================*/
    /* U-Boot general configuration */
    /*==============================*/
    这里主要定义UBOOT的一些操作,比如命令行显示字符串,delay等待时间的长短,这些根据个人要求修改,不改也可以。
     
    /*===================*/
    /* Linux Information */
    /*===================*/
    UBOOT要把一些参数信息传给内核linux使用,linux内核运行的时候需要这些配置信息,内核能够识别这些字符串信息。先把以下两个定义注释掉,
    //#define CONFIG_BOOTARGS           xxxxxxxxxxxxxx
    //#define CONFIG_BOOTCOMMAND     xxxxxxxxxxxxxxx
    如果你要从NAND FLASH启动:
    #define CONFIG_BOOTARGS “mem=120M console=ttyS0,115200n8 noinitrd ip=off root=/dev/mtdblock3”mtdblock3 表示文件系统放在LINUX内核分区)
    #define CONFIG_BOOTCOMMAND   " nboot 0x80008000 0x700000"(把linux 内核从FLASH BOOT起来,下面会介绍UBOOT的命令)
    如果你还在调试阶段,建议你使用NFS文件系统:
    #define CONFIG_BOOTARGS “mem=120M console=ttyS0,115200n8 noinitrd rw ip=dhcp root=/dev/nfs nfsroot=192.168.1.251:/home/<useraccount>/nfs/tirootfs,nolock”
    #define CONFIG_BOOTCOMMAND   " nboot 0x80008000 0x700000"
     
    本人的redhat linux的主机地址是:192.168.1.251,即SERVER IP=192.168.1.251
    板子的IP是:192.168.1.188
    如果你没有路由器给你分配IP地址,参数行里使用:ip=off
    mem=120M:本人定义前128M linux系统, 128M DSP和图像缓冲区等;
    nboot 0x80008000 0x700000:讲明本人把内核放在nand 地址为0x700000,通过nand boot的命令把内核从nand 0x700000地址导入DDR 0x80008000地址
     
    /*=================*/
    /* U-Boot commands */
    /*=================*/
    这里有很多功能的定义,包括#include <config_cmd_default.h>里边定义的,不需要的功能可以使用#undef ,从而减小UBOOT 生成BIN文件的尺寸。比如
    #undef CONFIG_CMD_DHCP
    #undef CONFIG_CMD_DIAG
    #undef CONFIG_CMD_EEPROM
    #undef CONFIG_CMD_LOADB   /* loadb */
    #undef CONFIG_CMD_LOADS    /* loads */
     
    2、  修改board/davinci/dv-evm/dv_board.c里的有关自己板子的配置
    int board_init(void)函数里,因为本人的板子使用/EM_CS2作为NAND FLASH的片选信号,故在PINMUX0寄存器里,有关AEAW必须关掉。
    /* Enable EMAC and AEMIF pins */
    //REG(PINMUX0) = 0x80000c1f;
    REG(PINMUX0) = 0x80000000; 只使用EMAC
    否则UBOOT 启动不起来。
     
    int misc_init_r (void)函数里,因为本人没有使用I2C EEPROM存储MAC 地址,所以要注释掉
    #if 0
    /* Set Ethernet MAC address from EEPROM */
    if (i2c_read(CFG_I2C_EEPROM_ADDR, 0x7f00, CFG_I2C_EEPROM_ADDR_LEN, buf, 6)) {
         printf(" EEPROM @ 0x%02x read FAILED!!! ", CFG_I2C_EEPROM_ADDR);
    }
    else
        {
         tmp[0] = 0xff;
         for (i = 0; i < 6; i++)
             tmp[0] &= buf[i];
     
         if ((tmp[0] != 0xff) && (getenv("ethaddr") == NULL)) {
             sprintf((char *)&tmp[0], "%02x:%02x:%02x:%02x:%02x:%02x",
                 buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
             setenv("ethaddr", (char *)&tmp[0]);
         }
    }
    #endif
    一般MAC地址保存到NAND,降低成本。
    ………
    #if 0
    i2c_read (0x39, 0x00, 1, (u_int8_t *)&i, 1);
    setenv ("videostd", ((i  & 0x80) ? "pal" : "ntsc"));
    #endif
    如果你的板子没有TI 的视频采集芯片TVP5146之类的,上面的功能最好去掉。
     
    3、  网口驱动移植:Cpu/arm926ejs/davinci/ether.c
    因为DM6446芯片上集成EMACMDIO,所以直接使用PHY芯片就可以了,驱动就使用UBOOT-1.3.4 TI 默认的驱动,而不是TI EVM使用的PHY_LXT972。直接使用GENERIC PHY,有个地方需要修改,否则网口工作不起来,本人也是从一个网友那里查到类似的信息,在static int dm644x_eth_phy_detect(void)函数里,改成:
    #if 0
    for (i = 0; i < 32; i++) {
            if (phy_act_state & (1 << i)) {
                   if (phy_act_state & ~(1 << i))
                          return(0);              /* More than one PHY */
                   else {
                          active_phy_addr = i;
                          return(1);
                   }
            }
    }
     
    return(0);       /* Just to make GCC happy */
    #else
    active_phy_addr = 1;
    return(1);
    #endif
    由于本人的开发板使用GPIOPHY芯片进行复位,所以在static int dm644x_eth_hw_init(void)函数里,加入GPIO复位的支持,同时文件头部加入#include <asm/arch/hardware.h>
    可以说, UBOOT移植到这里,基本上可以跑起网络了,TFTP应该没问题了,但是有关如何烧写UBL,烧写UBOOTLINUX 内核等文件,以后再慢慢聊吧,一步一步来,《UBOOT移植(2)》以后会推出来,下一篇直接到MonaVista linux-2.6.18的移植(1),先让系统通过网络和串口跑起来,由简单到复杂。
    继续make一下,生成u-boot.binu-boot.imgCOPY u-boot.binWINDOWS底下,使用uart_load.exe和配套uart.bin文件,就可以把u-boot.bin给跑起来。如果有linux 内核编译出来并使用UBOOT tool目录下的mkimage工具生成 uImage,在UBOOT命令行下:
    U-Boot > tftp 80008000 uImage
    #######################################
    U-Boot > bootm 80008000
    ## Booting kernel from Legacy Image at 80008000 ...
       Image Name:   linux-2.6.18
       Image Type:   ARM Linux Kernel Image (uncompressed)
       Data Size:    1509948 Bytes =  1.4 MB
       Load Address: 80008000
       Entry Point:  80008040
       Verifying Checksum ... OK
       XIP Kernel Image ... OK
    OK
     
    Starting kernel ...
     
    Uncompressing Linux...................................................................................................... done, booting the kernel.
    Linux version 2.6.18_pro500-davinci_evm-arm_v5t_le (root@xxxxx.com) (gcc version 4.2.0 (MontaVista 4.2.0-16.0.32.0801914 2008-08-30)) #1 PREEMPT Sun Mar 7 01:07:16 CST 2010
    CPU: ARM926EJ-S [41069265] revision 5 (ARMv5TEJ), cr=00053177
    Machine: DaVinci EVM
    ……………………………………………………………
    当出现上面的信息后,说明以上u-boot-1.3.4的移植是成功的。有兴趣的朋友可以参考以上做法移植u-boot-2009.11-rc2,也可以跑起来,只不过CROSS_COMPILE ?= arm-linux-不是放在顶层makefile了,而是放在lib_arm/config.mk里,改成CROSS_COMPILE = arm_v5t_le-就可以编译了。  
     

    650) this.width=650;" onsubmit onchange onunload onselect onreset>

    650) this.width=650;" onsubmit onchange onunload onselect onreset> 

    650) this.width=650;" onsubmit onchange onunload onselect onreset>

    补充有关DM6446 BOOT的一点知识:如果板子没有任何程序,RBL会通过串口0发送BOOTME命令上来,运行uart_load.exe,会接到RBL的命令,然后握手通信,下载uart.bin到板子上,并运行起来,uart.bin程序就是小小的BOOT,通过串口0PC通信,下载u-boot.bin,并把u-boot.bin给运行起来。所以UBOOT移植到上面的步骤,可以进入linux 内核移植的工作了。
  • 相关阅读:
    Linux安装python3.6
    Python安装常见问题(1):zipimport.ZipImportError: can't decompress data
    ModuleNotFoundError: No module named 'apt_pkg'
    【第九届蓝桥杯大赛决赛真题】JAVA大学C组题解
    Mineweep(扫雷)
    Josephus环的四种解法(约瑟夫环)
    java背包的数组实现,链表实现
    Java 实现栈,队列
    java实现单链表
    MySql8最新配置方式(完美)
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3149618.html
Copyright © 2011-2022 走看看