主题 : Mini2440之Linux移植开发实战指南请关注它是否正确 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 13675
精华: 0
发帖: 39
金钱: 195 两
威望: 39 点
贡献值: 0 点
综合积分: 78 分
注册时间: 2010-01-27
最后登录: 2013-11-11
楼主  发表于: 2010-04-29 16:46

 Mini2440之Linux移植开发实战指南请关注它是否正确


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)
奔跑的蜗牛……
级别: 侠客
UID: 11357
精华: 4
发帖: 69
金钱: 565 两
威望: 125 点
贡献值: 4 点
综合积分: 218 分
注册时间: 2009-12-04
最后登录: 2013-04-05
1楼  发表于: 2010-05-16 00:51
图片:
图片:
请楼主注意你贴出来的以下信息:

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重新编辑 ]
Continue Study of Embedded Linux Development and Application

奔跑的蜗牛……