一、 修改时钟
在配置文件include/configstq2440.h中加入S3C2440的配置,屏蔽掉S3C2410的配置
//#defineCONFIG_S3C2410 /* specifically aSAMSUNG S3C2410 SoC */
#define CONFIG_S3C2440
//#defineCONFIG_SMDK2410 /* on a SAMSUNGSMDK2410 Board */
屏蔽一些暂时不用的支持
#if 0
#define CONFIG_CS8900 /* we have a CS8900 on-board */
#define CONFIG_CS8900_BASE 0x19000300
#define CONFIG_CS8900_BUS16 /* the Linux driver does accesses as shorts */
#endif
#if 0
#define CONFIG_USB_OHCI
#define CONFIG_USB_KEYBOARD
#define CONFIG_USB_STORAGE
#define CONFIG_DOS_PARTITION
#endif
//#defineCONFIG_CMD_DHCP
//#defineCONFIG_CMD_NAND
//#defineCONFIG_CMD_USB
#if 0
#define CONFIG_CMD_FAT
#define CONFIG_CMD_EXT2
#define CONFIG_CMD_UBI
#define CONFIG_CMD_UBIFS
#define CONFIG_CMD_MTDPARTS
#define CONFIG_MTD_DEVICE
#defineCONFIG_MTD_PARTITIONS
#define CONFIG_YAFFS2
#define CONFIG_RBTREE
#endif
在arch/arm/cpu/arm920t/start.S添加如下代码
# if defined(CONFIG_S3C2410)
ldr r1, =0x3ff
ldr r0, =INTSUBMSK
str r1, [r0]
# endif
# ifdefined(CONFIG_S3C2440)
ldr r1,=0x7fff
ldr r0,=INTSUBMSK
str r1,[r0]
# endif
# ifdefined(CONFIG_S3C2440)
# define MPLLCON 0x4C000004 //系统主频配置寄存器
# define UPLLCON 0x4C000008 //USB频率配置寄存器
# define CAMDIVN 0x4C000018 //照相机时钟分频寄存器
ldr r0, =CAMDIVN
mov r1, #0
str r1, [r0]
ldr r0, =CLKDIVN
mov r1, #0x05
str r1, [r0]
/*如果HDIVN不等于0,CPU必须设置为异步总线模式*/
mrc p15,0,r0,c1,c0,0
orr r0,r0,#0xc0000000
mcr p15,0,r0,c1,c0,0
ldr r0, =UPLLCON
ldr r1, =0x38022 // 48MHZ
str r1, [r0]
/*
**When you set MPLL&UPLL values, you haveto set the UPLL
**value first and then the MPLL value. (Needsintervals
**approximately 7 NOP)
*/
nop
nop
nop
nop
nop
nop
nop
ldr r0, =MPLLCON
ldr r1, =0x5c011 //400MHZ
str r1, [r0]
# else
/* FCLK:HCLK:PCLK = 1:2:4 */
/* default FCLK is 120 MHz ! */
ldr r0, =CLKDIVN
mov r1, #3
str r1, [r0]
# endif /*CONFIG_S3C2440 */
#endif /* CONFIG_S3C24X0 */
屏蔽board/tq2440/tq2440.c中board_early_init_f()函数对时钟的设置
#if 0
struct s3c24x0_clock_power * const clk_power =
s3c24x0_get_base_clock_power();
#endif
struct s3c24x0_gpio * const gpio =s3c24x0_get_base_gpio();
#if 0
/* to reduce PLL lock time, adjust the LOCKTIME register */
writel(0xFFFFFF, &clk_power->locktime);
/* configure MPLL */
writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,
&clk_power->mpllcon);
/* some delay between MPLL and UPLL */
pll_delay(4000);
/* configure UPLL */
writel((U_M_MDIV << 12) + (U_M_PDIV << 4) + U_M_SDIV,
&clk_power->upllcon);
/* some delay between MPLL and UPLL */
pll_delay(8000);
#endif
在board_init函数中修改机器码
gd->bd->bi_arch_number= MACH_TYPE_S3C2440;
修改代码以支持直接烧到SDRAM运行
修改配置文件include\configs\tq2440.h
#define CONFIG_SYS_TEXT_BASE 0x32000000
#define CONFIG_SKIP_LOWLEVEL_INIT
#defineCONFIG_AUTO_COMPLETE //开启命令自动补全
修改命令提示符
#define CONFIG_SYS_PROMPT "TQ2440# "
修改顶层目录Makefile(根据自己的tftp服务器目录修改,这只是为了以后方便)
$(obj)u-boot.bin: $(obj)u-boot
$(OBJCOPY) ${OBJCFLAGS} -O binary $<$@
$(BOARD_SIZE_CHECK)
cp u-boot.bin /home/tftpboot
配置
root@zjh:/home/work/u-boot-2012.04.01#make tq2440_config
Configuring for tq2440board...
编译
root@zjh:/home/work/u-boot-2012.04.01#make
将u-boot.bin烧到0x32000000地址然后执行
TQ2440 # tftp 32000000u-boot.bin
dm9000 i/o: 0x20000000, id:0x90000a46
DM9000: running in 16 bitmode
MAC: 00:0c:29:4d:e4:f4
Using dm9000 device
TFTP from server172.28.12.60; our IP address is 172.28.12.10
Filename 'u-boot.bin'.
Load address: 0x32000000
Loading: T #############
done
Bytes transferred = 180536(2c138 hex)
TQ2440 # go 32000000
## Starting application at0x32000000 ...
U-Boot 2012.04.01 (Dec 292012 - 14:00:52)
CPUID: 32440001
FCLK: 400 MHz
HCLK: 100 MHz
PCLK: 50 MHz
DRAM: 64 MiB
WARNING: Caches not enabled
Flash: *** failed ***
### ERROR ### Please RESETthe board ###卡在这里不动了
搜索“Flash:”
puts("Flash: ");
flash_size = flash_init();
if (flash_size > 0) {
# ifdefCONFIG_SYS_FLASH_CHECKSUM
char *s = getenv("flashchecksum");
print_size(flash_size, "");
/*
* Compute and printflash CRC if flashchecksum is set to 'y'
*
* NOTE: Maybe weshould add some WATCHDOG_RESET()? XXX
*/
if (s && (*s == 'y')) {
printf(" CRC: %08X", crc32(0,
(const unsigned char *) CONFIG_SYS_FLASH_BASE,
flash_size));
}
putc('\n');
# else /* !CONFIG_SYS_FLASH_CHECKSUM */
print_size(flash_size, "\n");
# endif /*CONFIG_SYS_FLASH_CHECKSUM */
} else {
puts(failed);
hang();
}
在看下hang()函数
void hang(void)
{
puts("### ERROR ### Please RESET the board ###\n");
for (;;);
}
从这里可以知道是Flash初始化失败