U-Boot 1.1.6 移植到2440 (一)

时间:2021-07-31 17:16:44

http://home.eeworld.com.cn/my/space.php?uid=135723&do=blog&id=25347

u-boot 下载 U-boot 镜像 ,下载 1.1.6 版本的,这是比较早的版本,选择它主要是为了学习用。
u-boot中已经有对2410的支持了,我的板子是TQ2440 ,只需要在smdk2410的基础上改就可以了。
U-Boot 1.1.6 移植到2440 (一)

  • 这是u-boot的大致目录,先精简一下,删除不需要的文件:
    1> 删除根目录下的除了了lib_arm , lib_generic 外的其他lib_XXX类型的目录。
    2> 删除/board/ 目录下的除了smdk2410以外的其他目录。
    3> 删除/cpu/ 目录下的除了arm920t以外的其他目录
    4> 删除cpu /arm920t/目录下除了s3c24x0以外的其他目录,是目录,文件不要删。
    5> 删除/include/目录下除了asm-arm目录以外的其他asm-XXX目录。
    6> 删除/include/configs 目录下除了smdk2410.h 以外的其他头文件。

  • 建立TQ2440 的目录
    1>复制board/smdk2410为 board/TQ2440 ,复制board/smdk2410/smdk2410.c 为 board/TQ2440/TQ2440.c
    2>复制include/s3c2410.h 为/include /s3c2440.h
    3>复制include/configs/smdk2410.h 为 include /configs/TQ2440.h

  • 修改顶层Makefile:
    搜索smdk2410_config :在其下方添加:、
    TQ2440_config : unconfig
    @$(MKCONFIG) $(@:_config=) arm arm920t TQ2440 NULL s3c24x0
    交叉编译器 已经默认配置为arm-linux- 了,不需要改。

  • 修改/board/TQ2440/Makefile :
    COBJS := smdk2410.o flash.o
    改为:
    COBJS := TQ2440.o flash.o

  • 修改头文件包含关系
    /board/TQ2440/TQ2440.c
    顶部#include < s3c2410.h> ==> #include < s3c2440.h>
    /cpu/arm920t/s3c24x0/下的几个文件都需要改,只要是有CONFIG_S3C2410) 宏定义的地方,都加上 || defined(CONFIG_S3C2440)

#include < common.h>
#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined(CONFIG_S3C2440)
#if defined(CONFIG_S3C2400)
#include < s3c2400.h>
#elif defined(CONFIG_S3C2410)
#include < s3c2410.h>
#elif defined(CONFIG_S3C2440)
#include < s3c2440.h>
#endif

有这样的头部都像这样改,有些文件中间还有部分有这个宏,也得改为2440.h 得,不然包含不进去。

  • 修改/include /configs /TQ2440.h
#define CONFIG_ARM920T 1 /* This is an ARM920T Core */
#define CONFIG_S3C2440 1 /* in a SAMSUNG S3C2410 SoC */
#define CONFIG_TQ2440 1 /* on a SAMSUNG SMDK2410 Board */
  • 修改/include /s3c24x0.h
    同样将有CONFIG_S3C2410 宏得地方加上 2440 得宏

  • /include/ s3c2440.h

#ifndef __S3C2440_H__
#define __S3C2440_H__
  • /cpu/arm920t/s3c24x0/interrupts.c
    这里面有个比较隐蔽得地方,需要加上TQ2440得宏
#if defined(CONFIG_SMDK2400) || defined(CONFIG_TRAB)
tbclk = timer_load_val * 100;
#elif defined(CONFIG_SBC2410X) || \
defined(CONFIG_SMDK2410) || \
defined(CONFIG_TQ2440) || \
defined(CONFIG_VCMA9)
tbclk = CFG_HZ;
#else
# error "tbclk not configured"
#endif

否则就会看见 tbclk not configured 得错误。

  • 修改适配板级得SDRAM配置
    SDRAM是在/board/TQ2440/lowlevel_init.S中完成得.
#define B1_BWSCON (DW16) //(DW32) (IDE)
#define B2_BWSCON (DW16) //(IDE)
#define B3_BWSCON (DW16 + WAIT + UBLB) //CS8900
#define B4_BWSCON (DW16) //DM9000
#define B5_BWSCON (DW8) //(DW16)
#define B6_BWSCON (DW32)
#define B7_BWSCON (DW32)
...
修改REFCNT 得值为0x4f4 因为是100MHZ
#include REFCNT 0x4f4
  • 修改/board/TQ2440/Makefile
    因为改了名字,所以需要编译得名字也改了
COBJS   := TQ2440.o flash.o
  • 修改/board/TQ2440/TQ2440.c
    因为2440和2410得时钟不一样,所以需要修改board_init中的时钟设置。
//添加时钟配置的宏:
#define S3C2440_MPLL_400MHZ ((0x5c<<12)|(0x02<<4)|(0x01)) //HJ 400MHZ
#define S3C2440_UPLL_48MHZ ((0x38<<12)|(0x02<<4)|(0x02)) //HJ 100MHZ
#define S3C2440_CLKDIV 0x05


/* 修改后的 board_init 函数 */
int board_init (void)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();

/* set up the I/O ports */
gpio->GPACON = 0x007FFFFF;
gpio->GPBCON = 0x00044555;
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 = 0xFF95FFBA;
gpio->GPGUP = 0x0000FFFF;
gpio->GPHCON = 0x002AFAAA;
gpio->GPHUP = 0x000007FF;

clk_power->CLKDIVN = S3C2440_CLKDIV;

/* change to asynchronous bus mode */
__asm__( "mrc p15, 0, r1, c1, c0, 0\n"
"orr r1, r1, #0xc0000000\n"
"mcr p15, 0, r1, c1, c0, 0\n"
:::"r1"
);

/* to reduce PLL lock time, adjust the LOCKTIME register */
clk_power->LOCKTIME = 0xFFFFFF;

/* configure MPLL */
clk_power->MPLLCON = S3C2440_MPLL_400MHZ;

/* some delay between MPLL and UPLL */
delay (4000);

/* configure UPLL */
clk_power->UPLLCON = S3C2440_UPLL_48MHZ;

/* some delay between MPLL and UPLL */
delay (8000);


/* arch number of SMDK2410-Board */
gd->bd->bi_arch_number = MACH_TYPE_S3C2440;

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

icache_enable();
dcache_enable();

return 0;
}
  • 修改相关时钟函数
    因为2440和2410 MPLL和UPLL计算的公式不一样,所以获取当前分频的函数有些不同,他们都在/cpu/arm920t/s3c24x0/speed.c 中定义。
    首先更改get_PLLCLK 函数:
 return((CONFIG_SYS_CLK_FREQ * m *2) / (p << s));

再更改 get_HCLK 和get__PCLK

ulong get_HCLK(void)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
unsigned long clkdiv;
unsigned long camdiv;
int hdiv = 1;

clkdiv = clk_power->CLKDIVN;
camdiv = clk_power->CAMDIVN;

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_CAMDIVN_HCLK3_HALF:
hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;
break;

}

return( get_FCLK() / hdiv );
}

/* return PCLK frequency */
ulong get_PCLK(void)
{
S3C24X0_CLOCK_POWER * const clk_power = S3C24X0_GetBase_CLOCK_POWER();
unsigned long clkdiv;
unsigned long camdiv;
int hdiv = 1;

clkdiv = clk_power->CLKDIVN;
camdiv = clk_power->CAMDIVN;

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_CAMDIVN_HCLK3_HALF:
hdiv = (camdiv & S3C2440_CAMDIVN_HCLK3_HALF) ? 6 : 3;
break;

}

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

}

到此配置了最基本的uboot ,如果没错的话,应该可以编译烧写到TQ2440并在串口有输出。