主题 : linux-2.6.38到tiny6410的移植-nand flash 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 71414
精华: 0
发帖: 6
金钱: 30 两
威望: 6 点
综合积分: 12 分
注册时间: 2012-06-04
最后登录: 2012-10-10
楼主  发表于: 2012-10-10 19:34

 linux-2.6.38到tiny6410的移植-nand flash

各位大大,本人新人。

    为什么我按照linux-2.6.38到tiny6410的移植手册(连载1)__nand flash来进行NANF FLASH驱动移植。会出现这样的错误啊

    NAND device: Manufacturer ID: 0xec, Chip ID: 0xd5 (Samsung NAND 2GiB 3,3V 8-bi)
No oob scheme defined for oobsize 436                                          
kernel BUG at drivers/mtd/nand/nand_base.c:3290!                              
Unable to handle kernel NULL pointer dereference at virtual address 00000000  
pgd = c0004000                                                                
[00000000] *pgd=00000000                                                      
Internal error: Oops: 805 [#1]                                                
last sysfs file:                                                              
Modules linked in:                                                            
CPU: 0    Not tainted  (2.6.38 #4)                                            
PC is at __bug+0x1c/0x28                                                      
LR is at __bug+0x18/0x28                                                      
pc : [<c0029d34>]    lr : [<c0029d30>]    psr: 60000013                        
sp : cf82ded0  ip : 00003f00  fp : cf8099e8                                    
r10: 00000000  r9 : 00000001  r8 : c01893b0                                    
r7 : 00000000  r6 : cf800f80  r5 : cf809800  r4 : cf8099e8                    
r3 : 00000000  r2 : cf82dec4  r1 : c023a2e6  r0 : 00000037                    
Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel            
Control: 00c5387d  Table: 50004008  DAC: 00000015                              
Process swapper (pid: 1, stack limit = 0xcf82c268)                            
Stack: (0xcf82ded0 to 0xcf82e000)                                              
dec0:                                     00002480 c0183fa0 cf809800 cfa009c0  
dee0: cf800f80 c0189f24 00000000 00000003 cf84ea20 00000000 c028a6d8 c028a6d8  
df00: c028a6d8 c029e3a8 c029e3a8 00000000 00000000 00000000 00000000 c0175ad0  
df20: c0175abc c0174ce8 00000000 c028a6d8 c028a70c c029e3a8 00000000 c0174df8  
df40: c029e3a8 cf82df50 c0174d98 c0173fd0 cf803a48 cf823760 c029e3a8 c029e3a8  
df60: cfa00960 c029af10 00000000 c017466c c0251ebf c0251ebf cf82a000 c029e3a8  
df80: c001c9d4 c0027508 c001a440 00000000 00000000 c0175044 00000000 c001c940  
dfa0: c001c9d4 c0027508 c001a440 00000000 00000000 c0021500 00000000 c0020000  
dfc0: 00000013 000000f5 c0293f84 c001c940 c001c9d4 c0027508 00000013 00000000  
dfe0: 00000000 c0008abc 00000000 00000000 c0008a24 c0027508 ffffffff ffffffff  
[<c0029d34>] (__bug+0x1c/0x28) from [<c0183fa0>] (nand_scan_tail+0x128/0x5c0)  
[<c0183fa0>] (nand_scan_tail+0x128/0x5c0) from [<c0189f24>] (s3c24xx_nand_prob)
[<c0189f24>] (s3c24xx_nand_probe+0x370/0x480) from [<c0175ad0>] (platform_drv_)
[<c0175ad0>] (platform_drv_probe+0x14/0x18) from [<c0174ce8>] (driver_probe_de)
[<c0174ce8>] (driver_probe_device+0xa8/0x158) from [<c0174df8>] (__driver_atta)
[<c0174df8>] (__driver_attach+0x60/0x84) from [<c0173fd0>] (bus_for_each_dev+0)
[<c0173fd0>] (bus_for_each_dev+0x4c/0x78) from [<c017466c>] (bus_add_driver+0x)
[<c017466c>] (bus_add_driver+0xa8/0x224) from [<c0175044>] (driver_register+0x)
[<c0175044>] (driver_register+0xa8/0x12c) from [<c0021500>] (do_one_initcall+0)
[<c0021500>] (do_one_initcall+0xbc/0x190) from [<c0008abc>] (kernel_init+0x98/)
[<c0008abc>] (kernel_init+0x98/0x148) from [<c0027508>] (kernel_thread_exit+0x)
Code: e59f0010 e1a01003 eb06c47e e3a03000 (e5833000)                          
---[ end trace 9ed839e6fe93d5b7 ]---                                          
Kernel panic - not syncing: Attempted to kill init!                            
[<c002bc04>] (unwind_backtrace+0x0/0xe4) from [<c01dae10>] (panic+0x50/0x16c)  
[<c01dae10>] (panic+0x50/0x16c) from [<c003ceb0>] (do_exit+0x68/0x5c0)        
[<c003ceb0>] (do_exit+0x68/0x5c0) from [<c002a214>] (die+0x190/0x1c0)          
[<c002a214>] (die+0x190/0x1c0) from [<c002cb88>] (__do_kernel_fault+0x64/0x84)
[<c002cb88>] (__do_kernel_fault+0x64/0x84) from [<c002cd70>] (do_page_fault+0x)
[<c002cd70>] (do_page_fault+0x1c8/0x1e4) from [<c002123c>] (do_DataAbort+0x30/)
[<c002123c>] (do_DataAbort+0x30/0x98) from [<c00260cc>] (__dabt_svc+0x4c/0x60)
Exception stack(0xcf82de88 to 0xcf82ded0)                                      
de80:                   00000037 c023a2e6 cf82dec4 00000000 cf8099e8 cf809800  
dea0: cf800f80 00000000 c01893b0 00000001 00000000 cf8099e8 00003f00 cf82ded0  
dec0: c0029d30 c0029d34 60000013 ffffffff                                      
[<c00260cc>] (__dabt_svc+0x4c/0x60) from [<c0029d34>] (__bug+0x1c/0x28)        
[<c0029d34>] (__bug+0x1c/0x28) from [<c0183fa0>] (nand_scan_tail+0x128/0x5c0)  
[<c0183fa0>] (nand_scan_tail+0x128/0x5c0) from [<c0189f24>] (s3c24xx_nand_prob)
[<c0189f24>] (s3c24xx_nand_probe+0x370/0x480) from [<c0175ad0>] (platform_drv_)
[<c0175ad0>] (platform_drv_probe+0x14/0x18) from [<c0174ce8>] (driver_probe_de)
[<c0174ce8>] (driver_probe_device+0xa8/0x158) from [<c0174df8>] (__driver_atta)
[<c0174df8>] (__driver_attach+0x60/0x84) from [<c0173fd0>] (bus_for_each_dev+0)
[<c0173fd0>] (bus_for_each_dev+0x4c/0x78) from [<c017466c>] (bus_add_driver+0x)
[<c017466c>] (bus_add_driver+0xa8/0x224) from [<c0175044>] (driver_register+0x)
[<c0175044>] (driver_register+0xa8/0x12c) from [<c0021500>] (do_one_initcall+0)
[<c0021500>] (do_one_initcall+0xbc/0x190) from [<c0008abc>] (kernel_init+0x98/)
[<c0008abc>] (kernel_init+0x98/0x148) from [<c0027508>] (kernel_thread_exit+0x)

nand_base.c直接拷的友善的,为什么源码可以。移植后就出问题呢。怎么解决啊



级别: 新手上路
UID: 79620
精华: 0
发帖: 14
金钱: 70 两
威望: 14 点
综合积分: 28 分
注册时间: 2012-10-10
最后登录: 2013-02-20
1楼  发表于: 2012-10-11 08:51
没有大大帮忙回答一下吗?
你们移植的时候都没有碰到这个问题吗
级别: 圣骑士
UID: 44407
精华: 0
发帖: 386
金钱: 1945 两
威望: 389 点
综合积分: 772 分
注册时间: 2011-04-25
最后登录: 2014-08-25
2楼  发表于: 2012-10-12 13:41
引用第1楼lcslqc@163.c于2012-10-11 08:51发表的  :
没有大大帮忙回答一下吗?
你们移植的时候都没有碰到这个问题吗


老大,你只有說你的情形,沒有貼你改的內容,基本上你參考那篇,我都可以移植2.6.39到mini6410了,你可以參考我那一篇
级别: 新手上路
UID: 79620
精华: 0
发帖: 14
金钱: 70 两
威望: 14 点
综合积分: 28 分
注册时间: 2012-10-10
最后登录: 2013-02-20
3楼  发表于: 2012-10-19 14:37
我就是完全按照那上面说的啊,

1. 从Tiny6410配套内核中复制Nand相关驱动
将友善之臂提供的内核中的它们复制到刚才解压的内核的对应文件夹下
drivers/mtd/nand/s3c_nand.c
arch/arm/plat-samsung/include/plat/regs-nand.h
drivers/mtd/nand/s3c_nand_mlc.fo
drivers/mtd/nand/nand_base.c    
drivers/mtd/nand/s3c_nand.c
如图所示:

中大概79行左右包含了MLC的分区信息:

#ifdef  CONFIG_MACH_MINI6410
static  struct  mtd_partition  mini6410_nand_part_mlc[]  =  {
                {              
                                .name                      =  "Bootloader",
                                .offset                  =  0,        
                                .size                      =  (4  *  SZ_1M),        //0x0-0x400000
                                .mask_flags          =  MTD_CAP_NANDFLASH,
                },            
                {              
                                .name                      =  "Kernel",
                                .offset                  =  (4  *  SZ_1M),  
                                .size                      =  (8  *  SZ_1M)  ,      //0x400000-0x800000
                                .mask_flags          =  MTD_CAP_NANDFLASH,
                },            
                {              
                                .name                      =  "File  System",
                                .offset                  =  MTDPART_OFS_APPEND,
                                .size                      =  MTDPART_SIZ_FULL,
                }              
};
#endif
arch/arm/mach-s3c64xx/mach-mini6410.c中包含的是SLC  Flash的分区


cp  arch/arm/configs/s3c6400_defconfig      .config
2. 同时复制配置文件

drivers/mtd/nand/Kconfig
上面文件也可以通过自己修改实现,难度不大。
3. 修改Nand相关的Makefile

在drivers/mtd/nand/Makefile中20行增加
obj-$(CONFIG_MTD_NAND_S3C)                        +=  s3c_nand.o
另外,在末尾再增加
S3C_NAND_MLC_SRC  =  $(shell  ls  drivers/mtd/nand/s3c_nand_mlc.c  2>/dev/null)
ifeq  ($(S3C_NAND_MLC_SRC),)    
obj-$(CONFIG_MTD_NAND_S3C)                        +=  s3c_nand_mlc.fo
else
obj-$(CONFIG_MTD_NAND_S3C)                        +=  s3c_nand_mlc.o
endif
这步要是不愿意改的话,直接从配套内核拷贝覆盖即可
4. 再次配置Nand  驱动
#make  menuconfig


内核配置菜单中做如下选择:
Device  Drivers--->  
        <*>  Memory  Technology  Device  (MTD)  support    --->
                       [*]      MTD  partitioning  support
                      [*]          Command  line  partition  table  parsing  
                          <*>      Direct  char  device  access  to  MTD  devices  
                          <*>      Caching  block  device  access  to  MTD devices
                          <*>      NAND  Device  Support    --->
                                       <>      NAND  Flash  support  for  Samsung  S3C  SoCs    
                                        <*>      NAND  Flash  support  for  S3C  SoC    
                                        [*]          S3C  NAND  Hardware  ECC        

5. 执行初次编译
#make

Make成功
级别: 新手上路
UID: 79620
精华: 0
发帖: 14
金钱: 70 两
威望: 14 点
综合积分: 28 分
注册时间: 2012-10-10
最后登录: 2013-02-20
4楼  发表于: 2012-10-19 14:46
我看了源码,/nand_base.c/nand_scan_tail

    if (!chip->ecc.layout) {
        switch (mtd->oobsize) {
        case 8:
            chip->ecc.layout = &nand_oob_8;
            break;
        case 16:
            chip->ecc.layout = &nand_oob_16;
            break;
        case 64:
            chip->ecc.layout = &nand_oob_64;
            break;
        case 128:
            chip->ecc.layout = &nand_oob_128;
            break;
        default:
            printk(KERN_WARNING "No oob scheme defined for "
                   "oobsize %d\n", mtd->oobsize);
            BUG();
        }
    }

我追踪了源码,这里根本就没友进来。也就是chip->ecc.layout有值但我移植的chip->ecc.layout没有值。谁能告诉我一下原因

另外我的NANDFLASH用的是MLC
级别: 新手上路
UID: 79620
精华: 0
发帖: 14
金钱: 70 两
威望: 14 点
综合积分: 28 分
注册时间: 2012-10-10
最后登录: 2013-02-20
5楼  发表于: 2012-10-19 14:48
我追踪了源码,这里友善的根本就没友进来。也就是友善的chip->ecc.layout有值但我移植的chip->ecc.layout没有值。谁能告诉我一下原因

另外我的NANDFLASH用的是MLC
级别: 新手上路
UID: 86709
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
综合积分: 14 分
注册时间: 2013-01-22
最后登录: 2014-12-24
6楼  发表于: 2013-04-02 23:07
遇到同样的问题了,请问楼主怎么解决的?
级别: 新手上路
UID: 86709
精华: 0
发帖: 7
金钱: 35 两
威望: 7 点
综合积分: 14 分
注册时间: 2013-01-22
最后登录: 2014-12-24
7楼  发表于: 2013-05-19 23:22
楼主,我是楼上的,估计你犯的错我是一样的。移植文档没有问题,但是不要把android里面的nand_base.c等文件拷到新下载的2.6.38内核中,因为android的那个是2.6.36内核!!应该是用友善提供的linux系统的那个2.6.38里面的文件。这两版内核中起码nand_chip结构体定义是不同的,而且友善的s3c_nand_mlc.fo又不开源,我不知道它对传进去的nand_chip类型变量做了什么