您的位置:首页 > 其它

mini2440移植注意问题

2011-05-15 23:11 141 查看
Mini2440之Linux移植开发实战指南内容虽说很全面,但是有很多遗漏的部分。你们是否需要完善一下你们的手册。
首先必须加入以下
于是在自己的mach-mini2440.c中加入

#include <linux/mtd/mtd.h>
#include <linux/mtd/nand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>

#include <plat/nand.h>

然后接续启动信息结果如下

信息如下:
S3C24XX NAND Driver, (c) 2004 Simtec Electronics
s3c24xx-nand s3c2440-nand: Tacls=4, 39ns Twrph0=8 79ns, Twrph1=8 79ns
Unable to handle kernel NULL pointer dereference at virtual address 00000004
pgd = c0004000
[00000004] *pgd=00000000
Internal error: Oops: 5 [#1]
last sysfs file:
Modules linked in:
CPU: 0 Not tainted (2.6.33.3 #2)
PC is at s3c24xx_nand_probe+0x1d8/0x510
LR is at s3c24xx_nand_probe+0x1a4/0x510
pc : [<c01ea4ec>] lr : [<c01ea4b8>] psr: 80000013
sp : c3823f08 ip : 00000000 fp : 00000002
r10: 000002b8 r9 : 00000001 r8 : 00000000
r7 : 00000000 r6 : c39c2c00 r5 : 00000000 r4 : c39b1a40
r3 : c4c00000 r2 : 00000032 r1 : fffffff8 r0 : c39c2eb8
Flags: Nzcv IRQs on FIQs on Mode SVC_32 ISA ARM Segment kernel
Control: c000717f Table: 30004000 DAC: 00000017
Process swapper (pid: 1, stack limit = 0xc3822270)
Stack: (0xc3823f08 to 0xc3824000)
3f00: 00000000 c3852300 00000001 c00d4974 c3852300 c03e5468
3f20: c03e5468 c03fb65c c03fb65c 00000000 00000000 00000000 00000000 c01c5048
3f40: c01c5030 c01c4240 00000000 c03e5468 c03e549c c03fb65c 00000000 c01c4348
3f60: c03fb65c c01c42ec 00000000 c01c3b28 c3804938 c38474b0 c03fb65c c3998ea0
3f80: c03fa110 c01c348c c03922c2 c03922c2 00000034 c03fb65c 00000000 00000000
3fa0: 00000000 00000000 00000000 c01c4614 c001ac3c 00000000 00000000 00000000
3fc0: 00000000 c0029384 c001ac3c c03ff3dc c0406a00 c002250c c00223ac 00000000
3fe0: 00000000 00000000 00000000 c00083f0 00000000 c002a868 13cc33cc 63c133cc
[<c01ea4ec>] (s3c24xx_nand_probe+0x1d8/0x510) from [<c01c5048>] (platform_drv_probe+0x18/0x1c)
[<c01c5048>] (platform_drv_probe+0x18/0x1c) from [<c01c4240>] (driver_probe_device+0xa8/0x154)
[<c01c4240>] (driver_probe_device+0xa8/0x154) from [<c01c4348>] (__driver_attach+0x5c/0x7c)
[<c01c4348>] (__driver_attach+0x5c/0x7c) from [<c01c3b28>] (bus_for_each_dev+0x4c/0x78)
[<c01c3b28>] (bus_for_each_dev+0x4c/0x78) from [<c01c348c>] (bus_add_driver+0x98/0x214)
[<c01c348c>] (bus_add_driver+0x98/0x214) from [<c01c4614>] (driver_register+0xa4/0x134)
[<c01c4614>] (driver_register+0xa4/0x134) from [<c0029384>] (do_one_initcall+0x5c/0x1b8)
[<c0029384>] (do_one_initcall+0x5c/0x1b8) from [<c00083f0>] (kernel_init+0x94/0x10c)
[<c00083f0>] (kernel_init+0x94/0x10c) from [<c002a868>] (kernel_thread_exit+0x0/0x8)
Code: e59f2304 e58621a4 e3a02032 e58621d0 (e5952004)
---[ end trace 9dbe0b5036f4e6e8 ]---
Kernel panic - not syncing: Attempted to kill init!
[<c002e7bc>] (unwind_backtrace+0x0/0xd4) from [<c02e1980>] (panic+0x40/0x124)
[<c02e1980>] (panic+0x40/0x124) from [<c003e7a8>] (do_exit+0x64/0x598)
[<c003e7a8>] (do_exit+0x64/0x598) from [<c002d4c4>] (die+0x15c/0x180)
[<c002d4c4>] (die+0x15c/0x180) from [<c002f384>] (__do_kernel_fault+0x64/0x74)
[<c002f384>] (__do_kernel_fault+0x64/0x74) from [<c002f544>] (do_page_fault+0x1b0/0x1c4)
[<c002f544>] (do_page_fault+0x1b0/0x1c4) from [<c00292c4>] (do_DataAbort+0x34/0x94)
[<c00292c4>] (do_DataAbort+0x34/0x94) from [<c0029a40>] (__dabt_svc+0x40/0x60)
Exception stack(0xc3823ec0 to 0xc3823f08)
3ec0: c39c2eb8 fffffff8 00000032 c4c00000 c39b1a40 00000000 c39c2c00 00000000
3ee0: 00000000 00000001 000002b8 00000002 00000000 c3823f08 c01ea4b8 c01ea4ec
3f00: 80000013 ffffffff
[<c0029a40>] (__dabt_svc+0x40/0x60) from [<c01ea4ec>] (s3c24xx_nand_probe+0x1d8/0x510)
[<c01ea4ec>] (s3c24xx_nand_probe+0x1d8/0x510) from [<c01c5048>] (platform_drv_probe+0x18/0x1c)
[<c01c5048>] (platform_drv_probe+0x18/0x1c) from [<c01c4240>] (driver_probe_device+0xa8/0x154)
[<c01c4240>] (driver_probe_device+0xa8/0x154) from [<c01c4348>] (__driver_attach+0x5c/0x7c)
[<c01c4348>] (__driver_attach+0x5c/0x7c) from [<c01c3b28>] (bus_for_each_dev+0x4c/0x78)
[<c01c3b28>] (bus_for_each_dev+0x4c/0x78) from [<c01c348c>] (bus_add_driver+0x98/0x214)
[<c01c348c>] (bus_add_driver+0x98/0x214) from [<c01c4614>] (driver_register+0xa4/0x134)
[<c01c4614>] (driver_register+0xa4/0x134) from [<c0029384>] (do_one_initcall+0x5c/0x1b8)
[<c0029384>] (do_one_initcall+0x5c/0x1b8) from [<c00083f0>] (kernel_init+0x94/0x10c)
[<c00083f0>] (kernel_init+0x94/0x10c) from [<c002a868>] (kernel_thread_exit+0x0/0x8)

请楼主注意你贴出来的以下信息:

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);即可。

若以上不行可以s3c_device_nand.dev.platform_data=&mini2440_nand_info加在那个初始化函数里就行了



若出现没有相应类型的信息应该把下面几个头文件加上:

#include <linux/mtd/mtd.h>
#include <linux/mtd/nand.h>
#include <linux/mtd/nand_ecc.h>
#include <linux/mtd/partitions.h>
#include <plat/nand.h>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐