1.4 將從Flash啟動改成從NAND Flash啟動。(特別注意:這和2410的程序有不同,不可混用!。∈强截恦ivi的代碼。)
將以下U-Boot的重定向語句段:
@#if ndef CONFIG_AT91RM9200
#if 0
#ifndef CONFIG_SKIP_RELOCATE_UBOOT
relocate: /* relocate U-Boot to RAM */
adr r0, _start /* r0 <- current position of code */
ldr r1, _TEXT_BASE /* test if we run from flash or RAM */
cmp r0, r1 /* don't reloc during debug */
beq stack_setup
ldr r2, _armboot_start
ldr r3, _bss_start
sub r2, r3, r2 /* r2 <- size of armboot */
add r2, r0, r2 /* r2 <- source end address */
7. 為了實現(xiàn)NAND Flash的讀寫,再次修改/include/configs/qljt2440.h
......
/*
* High Level Configuration Options
* (easy to change)
*/
#define CONFIG_ARM920T 1 /* This is an ARM920T Core */
//#define CONFIG_S3C2410 1 /* in a SAMSUNG S3C2410 SoC */
//#define CONFIG_SBC2410X 1 /* on a friendly-arm SBC-2410X Board */
#endif
9. cpu\arm920t\s3c24x0\ Nand.c ,很多人說u-boot-1.3.4已經(jīng)不支持CFG_NAND_LEGACY了,但其實還是支持的,定義了CFG_NAND_LEGACY后Nand.c要做如下修改:
#error "U-Boot legacy NAND support not available for S3C2410"
改成
// #error "U-Boot legacy NAND support not available for S3C2410"
/*===========================================================
到這里,編譯是不能通過的,原因上一節(jié)中CONFIG_S3C2410這個宏定義被注釋掉,下面要用CONFIG_S3C2440這個宏打開CONFIG_S3C2410所打開的內(nèi)容===========================================================*/
10. 在S3C2440與s3c2410能夠共用的文件中添加“CONFIG_S3C2440”,使得原來s3c2410的代碼可以編譯進來。
(1)/include/common.h文件的第492行:/*一些公用的常用函數(shù),例如get_fclk()*/
#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410) || defined(CONFIG_LH7A40X) || defined(CONFIG_S3C2440)
(2)/include/s3c24x0.h:文件的第85、95、99、110、148、404行:/*一些關于S3C2440寄存器的結(jié)構(gòu)體*/
#if defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
(3)/cpu/arm920t/s3c24x0/interrupts.c文件的第33行:/*主要把一些頭文件包含進去*/
#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined (CONFIG_S3C2440)
第38行:
#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
(4)/cpu/arm920t/s3c24x0/serial.c文件的第22行:/*主要把一些頭文件包含進去*/
#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined (CONFIG_S3C2440)
第26行:
#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
(5)/cpu/arm920t/s3c24x0/speed.c文件的第33行:
#if defined(CONFIG_S3C2400) || defined (CONFIG_S3C2410) || defined (CONFIG_TRAB) || defined (CONFIG_S3C2440)
第37行:
#elif defined(CONFIG_S3C2410) || defined (CONFIG_S3C2440)
順便修改源代碼,以匹配s3c2440:
static ulong get_PLLCLK(int pllreg)
{
......
m = ((r & 0xFF000) >> 12) + 8;
p = ((r & 0x003F0) >> 4) + 2;
s = r & 0x3;
//qljt /*這兩個PLL的算法參見S3C2440datasheet的254頁*/
#if defined(CONFIG_S3C2440)
if (pllreg == MPLL)
return((CONFIG_SYS_CLK_FREQ * m * 2) / (p << s)); /* CONFIG_SYS_CLK_FREQ 在qljt2440.h中定義*/
else if (pllreg == UPLL)
#endif
//qljt
return((CONFIG_SYS_CLK_FREQ * m) / (p << s));
}
......
/* return FCLK frequency */
ulong get_FCLK(void)
{
return(get_PLLCLK(MPLL));
}
if (CFG_ENV_RANGE < CFG_ENV_SIZE)
return 1;
puts ("Erasing Nand...\n");
/*在248行附近*/
// if (nand_erase_opts(&nand_info[0], &nand_erase_options))
if (nand_legacy_erase(nand_dev_desc + 0, CFG_ENV_OFFSET, CFG_ENV_SIZE, 0))
return 1;
puts ("Writing to Nand... ");
total = CFG_ENV_SIZE;
/*在254行附近*/
// if (writeenv(CFG_ENV_OFFSET, (u_char *) env_ptr)) {
// puts("FAILED!\n");
// return 1;
// }
ret = nand_legacy_rw(nand_dev_desc + 0,0x00 | 0x02, CFG_ENV_OFFSET, CFG_ENV_SIZE,&total, (u_char*)env_ptr);
if (ret || total != CFG_ENV_SIZE)
return 1;
puts ("done\n");
return ret;
}
#else /* ! CFG_ENV_OFFSET_REDUND */
.......
/*
* The legacy NAND code saved the environment in the first NAND device i.e.,
* nand_dev_desc + 0. This is also the behaviour using the new NAND code.
*/
void env_relocate_spec (void)
{
#if !defined(ENV_IS_EMBEDDED)
size_t total;
int ret;
total = CFG_ENV_SIZE;
/*在360行附近*/
// ret = readenv(CFG_ENV_OFFSET, (u_char *) env_ptr);
ret = nand_legacy_rw(nand_dev_desc + 0, 0x01 | 0x02, CFG_ENV_OFFSET,CFG_ENV_SIZE, &total, (u_char*)env_ptr);/*edited by yaoyi 20090314,1.3.4是先進入到readenv,而非直接調(diào)用nand_legacy_rw。 因此干脆就不用到readenv了,直接注釋掉,添加以上代碼 */
if (ret || total != CFG_ENV_SIZE)
return use_default();
......
void start_armboot (void)
{
init_fnc_t **init_fnc_ptr;
char *s;
#ifndef CFG_NO_FLASH
ulong size;
#endif
#if defined(CONFIG_VFD) || defined(CONFIG_LCD)
unsigned long addr;
#endif
S3C24X0_GPIO * const gpio = S3C24X0_GetBase_GPIO();
......
gpio->GPFDAT = 0x7f; //qljtninja
//在進入命令提示符之前,四個LED會同時亮起!
/* main_loop() can return to retry autoboot, if so just run it again. */
for (;;) {
main_loop ();
}
/* NOTREACHED - no way out of command loop except booting */
}
/*===========================================================
到這里,應該是可以編譯通過的,否則就是編輯的時候出現(xiàn)了錯誤
===========================================================*/