• «
  • 1
  • 2
  • 3
  • »
  • Pages: 1/3     Go
主题 : 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: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2010-04-29 17:11
这就是我为什么一直很反对出这种所谓的手册或者指南,除了造成一大堆生搬硬套而出现的错误之外,什么好处都没有。
看书的人都以为照书做就对了,但从来不去想想为什么书上这么写。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 13675
精华: 0
发帖: 39
金钱: 195 两
威望: 39 点
贡献值: 0 点
综合积分: 78 分
注册时间: 2010-01-27
最后登录: 2013-11-11
2楼  发表于: 2010-04-29 20:09
你说的不错。
学习这个东西就是这样首先第一次安装手册做完整了。然后才能更详细的了解和研究。就算自己做也要有一个范本吧。
已经是开发实战指南了。就是要把它做的尽量完美才行。
这个阶段正是我事业的上升期,我怎么能走得开呢?
级别: 精灵王
UID: 3197
精华: 3
发帖: 770
金钱: 6995 两
威望: 5398 点
贡献值: 21 点
综合积分: 1600 分
注册时间: 2008-12-30
最后登录: 2010-12-31
3楼  发表于: 2010-05-03 11:02
参考这个手册移植的时候,最好也参考我们提供的已经移植好的linux-2.6.32.2内核。
再详细的指南也需要根据实际情况来进行。
奔跑的蜗牛……
级别: 侠客
UID: 11357
精华: 4
发帖: 69
金钱: 565 两
威望: 125 点
贡献值: 4 点
综合积分: 218 分
注册时间: 2009-12-04
最后登录: 2013-04-05
4楼  发表于: 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

奔跑的蜗牛……
级别: 侠客
UID: 12377
精华: 0
发帖: 83
金钱: 415 两
威望: 83 点
贡献值: 0 点
综合积分: 166 分
注册时间: 2010-01-05
最后登录: 2023-04-08
5楼  发表于: 2010-05-16 09:59
楼上观点明确,我也是遇到楼主的问题,谢谢了
自由,自强,共享,共创。
级别: 论坛版主
UID: 12573
精华: 27
发帖: 8838
金钱: 46490 两
威望: 9298 点
贡献值: 27 点
综合积分: 18216 分
注册时间: 2010-01-09
最后登录: 2019-07-16
6楼  发表于: 2010-05-22 09:05
引用第4楼cs2003happy于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

.......



欢迎指正,共同进步。
新手如何向我们反馈有效的信息,以便解决问题,见此贴:
http://www.arm9home.net/read.php?tid-14431.html

[注]: 此处签名链接仅为指引方向,而非解答问题本身.
级别: 新手上路
UID: 3451
精华: 0
发帖: 16
金钱: 85 两
威望: 25 点
贡献值: 0 点
综合积分: 32 分
注册时间: 2009-01-12
最后登录: 2013-10-30
7楼  发表于: 2010-06-03 17:54
从以上差别可以看出你按照友善提供的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,
};
确实编译的时候出现这样的问题 ,这个函数并没有被用到
级别: 骑士
UID: 11942
精华: 1
发帖: 144
金钱: 775 两
威望: 155 点
贡献值: 1 点
综合积分: 308 分
注册时间: 2009-12-25
最后登录: 2022-01-16
8楼  发表于: 2010-06-29 08:03
mark
级别: 骑士
UID: 11942
精华: 1
发帖: 144
金钱: 775 两
威望: 155 点
贡献值: 1 点
综合积分: 308 分
注册时间: 2009-12-25
最后登录: 2022-01-16
9楼  发表于: 2010-06-29 15:43

 回 4楼(cs2003happy) 的帖子

“而TACLS是CLE/ALE使能的持续时间,也就是CLE/ALE信号线高电平持续的时间”
好像不准确吧。
异步存储器访问时序分为三部分:建立,等待,保持。
TACLS应该是建立时间吧,而CLE/ALE信号线高电平持续的时间应该是建立+等待+保持吧。
愚见,请指正
  • «
  • 1
  • 2
  • 3
  • »
  • Pages: 1/3     Go