mini2440移植注意问题

Mini2440Linux移植开发实战指南内容虽说很全面,但是有很多遗漏的部分。你们是否需要完善一下你们的手册。
首先必须加入以下
于是在自己的machmini2440.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
是高电平使能 TACLSCLE/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>

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值