最新消息:

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

C/C++ admin 2456浏览 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 0×53000000
#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, #1n”
“bne 1b”:”=r” (loops):”0″ (loops));
}
void clock_init(void)
{
struct s3c24x0_clock_power *clk_power = (struct s3c24x0_clock_power *)0x4C000000;
#define S3C2440_CLKDIV 0×05 /* FCLK:HCLK:PCLK = 1:4:8, UCLK = UPLL */
#define S3C2440_UPLL_48MHZ ((0×38<<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, 0n” /* read ctrl register */
“orr r1, r1, #0xc0000000n” /* Asynchronous */
“mcr p15, 0, r1, c1, c0, 0n” /* 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 (0×0)
#define DW16 (0×1)
#define DW32 (0×2)
#define WAIT (0×1<<2)
#define UBLB (0×1<<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 = 0×33000000 #0x33F80000
编译好之后烧到开发板的ram中,能正常运行把!

转载请注明:爱开源 » 移植u-boot-2010.09到tq2440(二)

您必须 登录 才能发表评论!