IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    移植u-boot-2010.09到tq2440(二)

    Qiang发表于 2011-02-08 12:55:21
    love 0

    三. 移植的准备工作
    注意:cd ~/u-boot-2010.09表示进入u-boot源码的根目录。
    1. 修改顶层目录的Makefile,增加tq2440的配置:
    tq2440_config: unconfig
    @$(MKCONFIG) $@ arm arm920t tq2440 samsung s3c24x0
    同时修改160行为自己的交叉链,例如我的:
    CROSS_COMPILE ?=arm-linux-
    2. 因为2440与2410的差异并不大,所以通过复制s3c2410的源代码文件进行修改能大大减小移植的工作量:
    cd ~/u-boot-2010.09
    cp include/configs/smdk2410.h include/configs/tq2440.h
    cp -r board/samsung/smdk2410 board/samsung/tq2440
    mv board/samsung/tq2440/smdk2410.c board/samsung/tq2440/tq2440.c
    修改board/samsung/tq2440/Makefile 的28行
    COBJS := smdk2410.o flash.o
    为
    COBJS := tq2440.o flash.o
    3. 在arch/arm/cpu/arm920t/u-boot.lds的43行增加:
    board/samsung/tq2440/lowlevel_init.o (.text)
    board/samsung/tq2440/tq2440.o (.text)
    4. 测试准备工作
    make distclean
    make tq2440_config
    make
    如果不出问题的话,将会在u-boot的根目录生成一个u-boot.bin文件,这样,准备工作就完成了,下面就开始真正的移植啦!

    四. 硬件相关修改
    1. 中断部分的修改
    修改arch/arm/cpu/arm920t/start.S的中断代码为:
    #define pWTCON 0x53000000
    #define INTMSK 0x4A000008
    #define INTSUBMSK 0x4A00001C
    #define CLKDIVN 0x4C000014
    ldr r1, =0x7fff
    ldr r0, =INTSUBMSK
    str r1, [r0]
    2. cpu时钟设置部分的修改
    我选择增加一个c函数clock_init的方式来修改系统时钟,因为用到了堆栈,所以将设置堆栈的代码剪切到前面,然后跳转到clock_init函数:
    /* Set up the stack */
    stack_setup:
    ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot */
    sub r0, r0, #CONFIG_SYS_MALLOC_LEN /* malloc area */
    sub r0, r0, #CONFIG_SYS_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
    在board/samsung/tq2440/tq2440.c中删除掉board_init函数中有关时钟修改的代码,同时增加函数clock_init:
    static inline void delay (unsigned long loops)
    {
    __asm__ volatile (“1:\n”
    “subs %0, %1, #1\n”
    “bne 1b”:”=r” (loops):”0″ (loops));
    }
    void clock_init(void)
    {
    struct s3c24x0_clock_power *clk_power = (struct s3c24x0_clock_power *)0x4C000000;
    #define S3C2440_CLKDIV 0x05 /* FCLK:HCLK:PCLK = 1:4:8, UCLK = UPLL */
    #define S3C2440_UPLL_48MHZ ((0x38<<12)|(0x02<<4)|(0x02))
    #define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x01<<4)|(0x01))

    clk_power->CLKDIVN = S3C2440_CLKDIV;

    /* change to asynchronous bus mod */
    __asm__( “mrc p15, 0, r1, c1, c0, 0\n” /* read ctrl register */
    “orr r1, r1, #0xc0000000\n” /* Asynchronous */
    “mcr p15, 0, r1, c1, c0, 0\n” /* write ctrl register */
    :::”r1″ );
    /* to reduce PLL lock time, adjust the LOCKTIME register */
    clk_power->LOCKTIME = 0xFFFFFF;
    /* configure UPLL */
    clk_power->UPLLCON = S3C2440_UPLL_48MHZ; //fin=12.000MHz
    /* some delay between MPLL and UPLL */
    delay (4000);
    /* configure MPLL */
    clk_power->MPLLCON = S3C2440_MPLL_400MHZ; //fin=12.000MHz
    }
    同时还需要修改arch/arm/cpu/arm920t/s3c24x0/speed.c:
    67行修改为:
    return (CONFIG_SYS_CLK_FREQ * m * 2) / (p << s);
    81行修改为:
    return get_FCLK() / 4;
    85行修改为:
    return get_FCLK() / 8 ;
    3. 把board/samsung/tq2440/tq2440.c中 的机器码为:
    gd->bd->bi_arch_number = MACH_TYPE_TQ2440;
    4. 修改board/samung/tq2440/lowleve_init.S中的几个寄存器:
    #define DW8 (0x0)
    #define DW16 (0x1)
    #define DW32 (0x2)
    #define WAIT (0x1<<2)
    #define UBLB (0x1<<3)

    #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)
    以及后面的:
    #define REFCNT 0x4F4
    5. 测试本阶段的工作
    注释掉start.S中的bl cpu_init_crit,即:
    @ bl cpu_init_crit
    同时修改board/samsung/tq2440/config.mk 中的25行为:
    TEXT_BASE = 0x33000000 #0x33F80000
    编译好之后烧到开发板的ram中,能正常运行把!



沪ICP备19023445号-2号
友情链接