基于TQ2440的u-boot 1.1.6移植(一)(文件裁剪、时钟修改)

来源:互联网 发布:知乎如何将答案离线 编辑:程序博客网 时间:2024/06/06 03:57
1.首先建立交叉编译环境,使用天嵌公司提供第交叉编译器crosstools_3.4.5_softfloat

2.到u-boot官方网张下载u-boot-1.1.6.tar.bz2

3.解压下载好的u-boot-1.1.6.tar.bz2   tar xjvf  u-boot-1.1.6.tar.bz2

4.进入解压好的u-boot-1.1目录文件裁剪:

(1)删除 board/下除 smdk2410 以外的所有其它目标板文件夹
(2)删除 cpu/下除 arm920t 以外的所有其它 cpu 目录
(3)删除根目录下 除lib_arm 和 lib_generic以外的所有lib_XXX 的库文件目录
(4)删除 include/目录下 asm-XXX 的文件目录,只留下 asm-arm
(5)删除 include/configs 目录下除 smdk2410.h 以外的所有其它配置头文件

5.将 board/smdk2410 目录复制为 hang2440 目录,进入hang2440目录把smdk2410.c改为hang2440.c,修改当前目录下第Makefile中第28行改为:COBJS
:= hang2440.o flash.o。

进入include/configs 目录 将smdk2410.h改为 hang2440.h。修改顶层目录中的Makefile文件中第1881行,添加:

hang2440_config    :    unconfig
    @$(MKCONFIG) $(@:_config=) arm arm920t hang2440 NULL s3c24x0

各项的意思如下:
arm: CPU 的架构(ARCH)
arm920t: CPU 的类型(CPU),其对应于 cpu/arm920t 子目录。
hang2440: 开发板的型号(BOARD),对应于 board/dong2440 目录。
NULL: 开发者/或经销商(vender)。(此处没加 vender,为 NULL。)


修改第128行第交叉编译器:CROSS_COMPILE = /opt/EmbedSky/crosstools_3.4.5_softfloat/gcc-3.4.5-glibc-2.3.6/arm-linux/bin/arm-linux-

退出Makefile,编译测试:

#make mrproper //(或#make distclean 修改顶层 Makefile 等相关文件必须执行此步骤)
#make hang2440_config
#make all

编译中如果不出错,就会才当前目录生成u-boot.bin文件。


6.修改文件增加对S3C2440的支持。

进入 board/hang2440 目录修改 lowlevel_init.S 文件 54 行如下:
#define B1_BWSCON          (DW16)
#define B2_BWSCON          (DW16)
#define B3_BWSCON          (DW16 + WAIT + UBLB)
#define B4_BWSCON          (DW16)
#define B5_BWSCON          (DW8)
#define B6_BWSCON          (DW32)
#define B7_BWSCON          (DW32)
第126行:#define REFCNT             0x4f4

7.时钟设置。

由于u-boot只支持2410不支持2440。它们的时钟设置不一样。所以要重新设置时钟。

首先屏蔽2410的时钟 修改 cpu/arm920t/目录下 start.S 文件 148 行如下:

#if 0
    /* FCLK:HCLK:PCLK = 1:2:4 */
    /* default FCLK is 120 MHz ! */
    ldr    r0, =CLKDIVN
    mov    r1, #3
    str    r1, [r0]
#endif

#if 0 的意思就是不进行编译。

修改时钟的方法是重新写一个时钟初始化函数。修改cpu/arm920t/start.S 文件时在屏蔽原来的时钟后将 stack_setup 子程序搬到 relocate 子程序之前,并在 stack_setup 子程序后加一条跳转指令调用到 clock_init 子函数,进行时钟初始化:
stack_setup:
    ldr    r0, _TEXT_BASE        /* upper 128 KiB: relocated uboot   */
    sub    r0, r0, #CFG_MALLOC_LEN    /* malloc area                      */
    sub    r0, r0, #CFG_GBL_DATA_SIZE /* bdinfo                        */
#ifdef CONFIG_USE_IRQ
    sub    r0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
    sub    sp, r0, #12        /* leave 3 words for abort-stack    */
    bl clock_init

#ifndef CONFIG_SKIP_RELOCATE_UBOOT
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                  /* don't reloc during debug         */
    beq     clear_bss                       /*stack_setup*/
 
    ldr    r2, _armboot_start
    ldr    r3, _bss_start
    sub    r2, r3, r2        /* r2 <- size of armboot            */
#if 1
    bl CopyCode2Ram
#else    
    add    r2, r0, r2        /* r2 <- source end address         */

在 board/hang2440 目录下新建一个名为 boot_init.c 的文件,编写 colck_init 函数,同时加上一些声明和延时子函数,还有后面要用到的nand 相关操作函数:http://download.csdn.net/detail/u012851076/6971119

然后修改 board/hang2440/hang2440.c 文件中的 board_init 函数,修改如下:
gpio->GPACON = 0x007FFFFF;
    gpio->GPBCON = 0x00055555;
    gpio->GPBUP = 0x000007FF;
    gpio->GPCCON = 0xAAAAAAAA;
    gpio->GPCUP = 0x0000FFFF;
    gpio->GPDCON = 0xAAAAAAAA;
    gpio->GPDUP = 0x0000FFFF;
    gpio->GPECON = 0xAAAAAAAA;
    gpio->GPEUP = 0x0000FFFF;
    gpio->GPFCON = 0x000055AA;
    gpio->GPFUP = 0x000000FF;
    gpio->GPGCON = 0xFF94FFBA;
    gpio->GPGUP = 0x0000FFFF;
    gpio->GPGDAT = gpio->GPGDAT &(~(1<<4))|(1<<4);
    gpio->GPHCON = 0x002AFAAA;
    gpio->GPHUP = 0x000007FF;

   /*support both of S3C2410 and S3C2440*/
if((gpio->GSTATUS1==0x32410000)||(gpio->GSTATUS1==0x32410002))
{
    /* arch number of SMDK2410-Board */
    gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;
}
else
{
    /* arch number of SMDK2440-Board */
    gd->bd->bi_arch_number = MACH_TYPE_S3C2440;
}
    


    /* adress of boot parameters */
    gd->bd->bi_boot_params = 0x30000100;


然后修改 board/hang2440/目录下的 Makefile 文件 28 行,修改如下:  COBJS    := hang2440.o flash.o boot_init.o

并在 board/hang2440/u-boot.lds 文件中 35 行添加如下内容:

.text      :
    {
      cpu/arm920t/start.o    (.text)
      board/hang2440/boot_init.o (.text)
      *(.text)
    }


在后面设置串口波特率时需要获得系统时钟, 就是在 U-Boot 的第二阶段,lib_arm/board.c中 start_armboot 函数调用 serial_init 函数初始化串口时,会调用 get_PCLK 函数 。它在
cpu/arm920t/s3c24x0/speed.c 中定义,与它相关的还有 get_HCLK、get_PLLCLK 等函数。前 面 的 board_init 函 数 在 识 别 出 S3C2410 或 S3C2440 后 , 设 置 了 机 器 类 型
ID:gd、 bd、 bi_arch_number,后面的函数可以通过它来分辨是 S3C2410 还是 S3C2440。首先要在程序的开头增加如下一行,这样才可以使用 gd 变量。

首先要在程序的开头增加如下一行,这样才可以使用 gd 变量。在 cpu/arm920t/s3c24x0/speed.c 中修改:在程序开头 40 行增加一行:DECLARE_GLOBAL_DATA_PTR;这样才可以使用 gd 变量
修改 get_PPLCLK 函数:

m = ((r & 0xFF000) >> 12) + 8;
    p = ((r & 0x003F0) >> 4) + 2;
    s = r & 0x3;

    return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s)); /*s3c2400*/


修改 get_HCLK、get_PCLK:

/* for s3c2440 */
#define S3C2440_CLKDIVN_PDIVN  (1<<0)
#define S3C2440_CLKDIVN_HDIVN_MASK (3<<1)
#define S3C2440_CLKDIVN_HDIVN_1  (0<<1)
#define S3C2440_CLKDIVN_HDIVN_2  (1<<1)
#define S3C2440_CLKDIVN_HDIVN_4_8  (2<<1)
#define S3C2440_CLKDIVN_HDIVN_3_6  (3<<1)
#define S3C2440_CLKDIVN_UCLK  (1<<3)

#define S3C2440_CAMDIVN_CAMCLK_MASK (0xf<<0)
#define S3C2440_CAMDIVN_CAMCLK_SEL (1<<4)
#define S3C2440_CAMDIVN_HCLK3_HALF (1<<8)
#define S3C2440_CAMDIVN_HCLK4_HALF (1<<9)
#define S3C2440_CAMDIVN_DVSEN  (1<<12)


/* return HCLK frequency */
ulong get_HCLK(void)
{
    S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
unsigned long clkdiv;
unsigned long camdiv;
int hdiv = 1;
/* support both of S3C2410 and S3C2440 */
if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)
   return((clk_power->CLKDIVN & 0x2) ? get_FCLK()/2 : get_FCLK());
else
{
    clkdiv = clk_power->CLKDIVN;
    camdiv = clk_power->CAMDIVN;
/* work out clock scalings */
    switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {
     case S3C2440_CLKDIVN_HDIVN_1:
        hdiv = 1;
         break;
    case S3C2440_CLKDIVN_HDIVN_2:
        hdiv = 2;
        break;
    case S3C2440_CLKDIVN_HDIVN_4_8:
         hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;
         break;
    case S3C2440_CLKDIVN_HDIVN_3_6:
         hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;
        break;
}
    return get_FCLK() / hdiv;
}

}

修改 PCLK

unsigned long clkdiv;
unsigned long camdiv;
int hdiv = 1;
/* support both of S3C2410 and S3C2440 */
if (gd->bd->bi_arch_number == MACH_TYPE_SMDK2410)
    return((clk_power->CLKDIVN & 0x1) ? get_HCLK()/2 : get_HCLK());
else
{
    clkdiv = clk_power->CLKDIVN;
    camdiv = clk_power->CAMDIVN;
/* work out clock scalings */
switch (clkdiv & S3C2440_CLKDIVN_HDIVN_MASK) {
    case S3C2440_CLKDIVN_HDIVN_1:
         hdiv = 1;
        break;
    case S3C2440_CLKDIVN_HDIVN_2:
        hdiv = 2;
        break;
    case S3C2440_CLKDIVN_HDIVN_4_8:
        hdiv = (camdiv & S3C2440_CAMDIVN_HCLK4_HALF) ? 8 : 4;
        break;
    case S3C2440_CLKDIVN_HDIVN_3_6:
        hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;
        break;
    }


    return get_FCLK()/hdiv/((clkdiv & S3C2440_CLKDIVN_PDIVN)?2:1);
}
}



在 include/s3c24x0.h 中 重 新 定 义 S3C24X0_CLOCK_POWER 结 构 体 , 在include/s3c24x0.h 中,S3C24X0_CLOCK_POWER 结构体中增加:129 行:  

S3C24X0_REG32    CLKDIVN;



至此,对 s3c2440 的支持(时钟配置部分)就算做好了,为了方便调试,可以利用开发板自带的 u-boot 文件烧写到内存中运行,此时还要修改一些配置:

修改 cpu/arm920t/start.S 文件的 162 行如下:
#ifndef CONFIG_SKIP_LOWLEVEL_INIT
@bl cpu_init_crit
#endif


修改 board/dong2440/config.mk 文件如下:
TEXT_BASE = 0x33000000
#TEXT_BASE = 0x33F80000

进入u-boot-1.1.6 目录
在超级用户模式下执行

[root@acer 1]# make mrproper

[root@acer 1]# make hang2440_config
Configuring for hang2440 board...

make

进入开发板的nor flsah模式 q  进入命令行模式

EmbedSky> tftp 0x33000000 u-boot.bin

dm9000 i/o: 0x20000300, id: 0x90000a46
MAC: 0a:1b:2c:3d:4e:5f
TFTP from server 192.168.1.101; our IP address is 192.168.1.6
Filename 's.bin'.
Load address: 0x33000000
Loading: T #######
done
Bytes transferred = 94500 (17124 hex)
EmbedSky> go 0x33000000
## Starting application at 0x33000000 ...


U-Boot 1.1.6 (Feb 27 2014 - 21:18:05)

DRAM:  64 MB
Flash: 512 kB
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial



说明时钟移植成功



1 0
原创粉丝点击