请楼主注意你贴出来的以下信息:
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c24xx-nand s3c2440-nand:
Tacls=4, 39ns Twrph0=8 79ns, Twrph1=8 79ns友善官方启动信息里这部分的内容是:
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c2440-nand s3c2440-nand:
Tacls=3, 29ns Twrph0=7 69ns, Twrph1=3 29ns我贴上去的是友善的2.6.29.4内核的,具体的加粗部分前边的可能和友善2.6.32.2的不太一样,但是原理是一样。
从以上差别可以看出你按照友善提供的Linux移植开发实战所修改的下面一个结构体里设置的参数并没有生效:
static struct s3c2410_platform_nand mini2440_nand_info = {
.tacls = 20,
.twrph0 = 60,
.twrph1 = 20,
.nr_sets = ARRAY_SIZE(mini2440_nand_sets),
.sets = mini2440_nand_sets,
};
以上的结构体是mini2440开发板上使用的nand flash的一些配置信息,其中包括芯片操作时序信息。
查看nand flash相应的datasheet里面对nand flash控制器的NFCONF寄存器有如下描述
CLE/ALE是高电平使能 而TACLS是CLE/ALE使能的持续时间,也就是CLE/ALE信号线高电平持续的时间;
nWE是低电平使能 TWRPH0对应于nWE的使能持续时间,也就是nWE信号线低电平的持续时间;
而TWRPH1对应于nWE信号线高电平的持续时间。
而通过内核打印信息+Source Insight查找到输出
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c24xx-nand s3c2440-nand:
Tacls=4, 39ns Twrph0=8 79ns, Twrph1=8 79ns语句信息的函数在内核源码中nand flash驱动程序里的drivers/mtd/nand/s3c2410.c文件中。
分析Linux内核中的nand flash驱动drivers/mtd/nand/s3c2410.c文件中的相应函数,
其中的static int s3c2410_nand_setrate(struct s3c2410_nand_info *info)函数发现:
struct s3c2410_platform_nand *plat = info->platform;
int
tacls_max = (info->cpu_type == TYPE_S3C2412) ? 8 : 4; …………
info->clk_rate = clkrate;
clkrate /= 1000; /* turn clock into kHz for ease of use */
if (plat != NULL) { tacls = s3c_nand_calc_rate(plat->tacls, clkrate, tacls_max);
twrph0 = s3c_nand_calc_rate(plat->twrph0, clkrate, 8);
twrph1 = s3c_nand_calc_rate(plat->twrph1, clkrate, 8);
} else { /* default timings */
tacls = tacls_max;
twrph0 = 8;
twrph1 = 8; }
if (tacls < 0 || twrph0 < 0 || twrph1 < 0) {
dev_err(info->device, "cannot get suitable timings\n");
return -EINVAL;
}
dev_info(info->device, "Tacls=%d, %dns Twrph0=%d %dns, Twrph1=%d %dns\n",
tacls, to_ns(tacls, clkrate), twrph0, to_ns(twrph0, clkrate), twrph1, to_ns(twrph1, clkrate));
由以上内容可以看出,你的内核并没有使用你的mini2440_nand_info结构体中的配置,而是使用了它的默认配给,即
} else { /* default timings */
tacls = tacls_max;
twrph0 = 8;
twrph1 = 8; }
中的配置信息。这点和你的内核输出s3c24xx-nand s3c2440-nand:
Tacls=4, 39ns Twrph0=8 79ns, Twrph1=8 79ns完全符合。
因此可以判断你没有在你的mach-mini2440.c中加入
s3c_nand_set_platdata(&mini2440_nand_info);语句来设置你当前平台所使用的存储nand flash配置的相应结构体mini2440_nand_info。
解决方法:
只需在mach-mini2440.c的初始化函数mini2440_machine_init(void)里加入
s3c_nand_set_platdata(&mini2440_nand_info);即可。
[ 此帖被cs2003happy在2010-05-16 01:02重新编辑 ]