四、疑难杂症
现在,按照书《嵌入式Linux应用开发完全手册》讲述的操作已经完成,也添加了从NAND FLASH启动的代码,想想 应该是可以了,我们编译试试看。
(1)初步编译
首先配置u-boot。在u-boot-1.1.6根目录(u-boot-1.1.6#)输入命令make smdk2410_config,回车运行。出现提示:
Configuring for smdk2410 board...
表示配置完成。
然后编译,输入make命令,回车,开始编译。
出现了一堆错误:
boot_init.c: In function `s3c2440_wait_idle':
boot_init.c:133: error: `S3C2440_NAND' undeclared (first use in this function)
…
boot_init.c:221: error: `isS3C2410' undeclared (first use in this function)
…
make[1]: *** [boot_init.o] Error 1
make[1]: Leaving directory `/home/book/workspace/U-Boot/Jz_u-boot-1.1.6/board/smdk2410'
make: *** [board/smdk2410/libsmdk2410.a] Error 2
看来还是不行,还有很多问题要解决,下面就根据各种错误进行修改。
(2)S3C2440_NAND未定义
经过仔细分析,发现一个文件s3c24x0.h (路径:include/s3c24x0.h)中有类似的定义S3C2410_NAND:
/* NAND FLASH (see S3C2410 manual chapter 6) */
typedef struct {
S3C24X0_REG32 NFCONF;
S3C24X0_REG32 NFCMD;
S3C24X0_REG32 NFADDR;
S3C24X0_REG32 NFDATA;
S3C24X0_REG32 NFSTAT;
S3C24X0_REG32 NFECC;
} /*__attribute__((__packed__))*/ S3C2410_NAND;
我们就仿照其定义S3C2440_NAND,在文件s3c24x0.h (路径:include/s3c24x0.h)中增加如下代码:
typedef struct {
S3C24X0_REG32 NFCONF;
S3C24X0_REG32 NFCONT;
S3C24X0_REG32 NFCMD;
S3C24X0_REG32 NFADDR;
S3C24X0_REG32 NFDATA;
S3C24X0_REG32 NFMECCD0;
S3C24X0_REG32 NFMECCD1;
S3C24X0_REG32 NFSECCD;
S3C24X0_REG32 NFSTAT;
S3C24X0_REG32 NFESTAT0;
S3C24X0_REG32 NFESTAT1;
S3C24X0_REG32 NFMECC0;
S3C24X0_REG32 NFMECC1;
S3C24X0_REG32 NFSECC;
S3C24X0_REG32 NFSBLK;
S3C24X0_REG32 NFEBLK;
} /*__attribute__((__packed__))*/ S3C2440_NAND; 然后再次make编译,看看还有什么错误。
提示:
boot_init.c: In function `nand_reset':
boot_init.c:221: error: `isS3C2410' undeclared (first use in this function)
boot_init.c:221: error: (Each undeclared identifier is reported only once
boot_init.c:221: error: for each function it appears in.)
……
make[1]: *** [boot_init.o] Error 1
make[1]: Leaving directory `/home/book/workspace/U-Boot/Jz_u-boot-1.1.6/board/smdk2410'
make: *** [board/smdk2410/libsmdk2410.a] Error 2
原来是isS3C2410未定义
(3)isS3C2410未定义
还是在文件s3c24x0.h (路径:include/s3c24x0.h)中,在其末尾增加两行宏定义,用于自动识别cpu是s3c2410还是s3c2440:
#define rGSTATUS1 (*(volatile unsigned *)0x560000B0)
#define isS3C2410 ((rGSTATUS1 & 0xffff0000) == 0x32410000)
添加完毕,再次make编译。出现错误:
speed.c: In function `get_HCLK':
speed.c:123: error: structure has no member named `CAMDIVN'
speed.c: In function `get_PCLK':
speed.c:171: error: structure has no member named `CAMDIVN'
make[1]: *** [speed.o] Error 1
make[1]: Leaving directory `/home/book/workspace/U-Boot/Jz_u-boot-1.1.6/cpu/arm920t/s3c24x0'
make: *** [cpu/arm920t/s3c24x0/libs3c24x0.a] Error 2
提示成员CAMDIVN未定义。
(4)CAMDIVN未定义
根据提示找到其结构体,发现是s3c2440中引入了一个寄存器CAMDIVN ,s3c2410中没有,所以S3C24X0_CLOCK_POWER中未定义。我们自己加上即可。
修改前:
typedef struct {
S3C24X0_REG32 LOCKTIME;
S3C24X0_REG32 MPLLCON;
S3C24X0_REG32 UPLLCON;
S3C24X0_REG32 CLKCON;
S3C24X0_REG32 CLKSLOW;
S3C24X0_REG32 CLKDIVN;
} /*__attribute__((__packed__))*/ S3C24X0_CLOCK_POWER;
修改后
typedef struct {
S3C24X0_REG32 LOCKTIME;
S3C24X0_REG32 MPLLCON;
S3C24X0_REG32 UPLLCON;
S3C24X0_REG32 CLKCON;
S3C24X0_REG32 CLKSLOW;
S3C24X0_REG32 CLKDIVN;
S3C24X0_REG32 CAMDIVN;}
/*__attribute__((__packed__))*/ S3C24X0_CLOCK_POWER;
红色就是我们自己添加的成员CAMDIVN。
然后再次make。提示:
arm-linux-objcopy --gap-fill=0xff -O srec u-boot u-boot.srec
arm-linux-objcopy --gap-fill=0xff -O binary u-boot u-boot.bin
编译成功! 然后使用oflash下载到Jz2440开发板。连接好开发板与PC串口,打开串口工具(波特率:115200 8N1),重启开发板,观察串口输出。
串口没有输出!!! 看来还是存在问题,纠结啊!