前面链接地址都是0x0,可以从nor正常启动内核和文件系统。
现在把链接地址改成0x33f00000
一旦更改了链接地址, u-boot从nor flash加载时,串口没有任何输出
添加文件boot_init.c
#define NFCONF (*((volatile unsigned long *)0x4E000000))
#define NFCONT (*((volatile unsigned long *)0x4E000004))
#define NFCMMD (*((volatile unsigned char *)0x4E000008))
#define NFADDR (*((volatile unsigned char *)0x4E00000C))
#define NFDATA (*((volatile unsigned char *)0x4E000010))
#define NFSTAT (*((volatile unsigned char *)0x4E000020))
static void nand_select(void)
{
NFCONT &= ~(1<<1);
}
static void nand_deselect(void)
{
NFCONT |= (1<<1);
}
static void nand_cmd(unsigned char cmd)
{
volatile int i;
NFCMMD = cmd;
for (i = 0; i < 10; i++);
}
static void nand_addr(unsigned int addr)
{
unsigned int col = addr % 2048;
unsigned int page = addr / 2048;
volatile int i;
NFADDR = col & 0xff;
for (i = 0; i < 10; i++);
NFADDR = (col >> 8) & 0xff;
for (i = 0; i < 10; i++);
NFADDR = page & 0xff;
for (i = 0; i < 10; i++);
NFADDR = (page >> 8) & 0xff;
for (i = 0; i < 10; i++);
NFADDR = (page >> 16) & 0xff;
for (i = 0; i < 10; i++);
}
static void nand_wait_ready(void)
{
while (!(NFSTAT & 1));
}
static unsigned char nand_data(void)
{
return NFDATA;
}
static void nand_read_ll(unsigned int addr, unsigned char *buf, unsigned int len)
{
int col = addr % 2048;
int i = 0;
nand_select();
while (i < len)
{
nand_cmd(0x00);
nand_addr(addr);
nand_cmd(0x30);
nand_wait_ready();
for (; (col < 2048) && (i < len); col++)
{
buf[i] = nand_data();
i++;
addr++;
}
col = 0;
}
nand_deselect();
}
static void nand_init(void)
{
#define TACLS 0
#define TWRPH0 1
#define TWRPH1 0
NFCONF = (TACLS<<12)|(TWRPH0<<8)|(TWRPH1<<4);
NFCONT = (1<<4)|(1<<1)|(1<<0);
}
/* 1: from nor 0: from nand */
static int isBootFromNorFlash(void)
{
volatile int *p = (volatile int *)0;
int val;
val = *p;
*p = 0x12345678;
if (*p == 0x12345678)
{
*p = val;
return 0;
}
else
{
// nor
return 1;
}
}
void copy_code_to_sdram(unsigned char *src, unsigned char *dest, unsigned int len)
{
int i = 0;
if (isBootFromNorFlash())
{
while (i < len)
{
dest[i] = src[i];
i++;
}
}
else // from nand
{
nand_init();
nand_read_ll((unsigned int)src, dest, len);
}
}
void clear_bss(void)
{
extern int __bss_start, __bss_end;
int *p = &__bss_start;
for (; p < &__bss_end; p++)
*p = 0;
}
修改对应目录Makefile
obj-y := smdk2440.o boot_init.o
把smdk2440/目录下内容放最前面,满足4K内
vim arch/arm/cpu/u-boot.lds
board/samsung/smdk2440/built-in.o (.text*)
修改重定位代码:
#if defined(CONFIG_SYS_MALLOC_F_LEN) && !defined(CONFIG_SPL_BUILD)
sub sp, sp, #CONFIG_SYS_MALLOC_F_LEN
str sp, [r9, #GD_MALLOC_BASE]
#endif
#if defined(CONFIG_S3C2440)
mov r0, #0
ldr r1, = CONFIG_SYS_TEXT_BASE
ldr r2, = CONFIG_SYS_TEXT_BASE
ldr r3, =__bss_end
sub r2, r3, r2
bl copy_code_to_sdram
bl clear_bss
ldr pc, =call_board_init_f
call_board_init_f:
mov r0, #0
bl board_init_f
ldr sp, [r9, #GD_START_ADDR_SP] /* sp = gd->start_addr_sp */
bic sp, sp, #7 /* 8-byte alignment for ABI compliance */
ldr r9, [r9, #GD_BD] /* r9 = gd->bd */
sub r9, r9, #GD_SIZE /* new GD is below bd */
mov r0, r9
ldr r1, = CONFIG_SYS_TEXT_BASE
bl board_init_r
#else
/* mov r0, #0 not needed due to above code */
bl board_init_f
...
#endif
去掉pie选项vim arch/arm/config.mk
#LDFLAGS_u-boot += -pie
#ALL-y += checkarmreloc
此外board.c里面还应修改
board_init_f
//addr -= gd->mon_len;
//addr &= ~(4096 - 1);
addr = CONFIG_SYS_TEXT_BASE ;
烧写u-boot到nand
bootloader:
tftp 30000000 u-boot.bin
nand erase.part bootloader
nand write.jffs2 30000000 bootloader
烧写u-boot到nor
tftp 30000000 u-boot.bin
protect off all
erase 0 3ffff (256K)
cp.b 30000000 0 40000