Linux2.6.34.2在TQ6410上的移植详解(二)

来源:互联网 发布:淘宝宝贝图片 编辑:程序博客网 时间:2024/05/17 05:04

原创文章版权所有!如需转载,请注明出处: http://hi.baidu.com/liushuiyue1/myhome谢谢合作!!!!!

说明:
分析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));

由以上内容可以看出,如果内核并没有使用我们的s3c_platform结构体中的配置,就会采用
} 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.csmdk6410_machine_init(void)函数中增加s3c_nand_set_platdata(&s3c_platform);

配置内核,支持NandFlash

Device Drivers --->

<*> Memory Technology Device (MTD) support --->

[*] MTD partitioning support

<*> NAND Device Support --->

<*> NAND Flash support for S3C/S3C SoC

 
再次编译烧写,可以看到以下打印信息
NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
Scanning device for bad blocks
Bad eraseblock 517 at 0x0000040a0000
Bad eraseblock 1383 at 0x00000ace0000
Bad eraseblock 1737 at 0x00000d920000
Bad eraseblock 1897 at 0x00000ed20000
Bad eraseblock 1968 at 0x00000f600000
Creating 3 MTD partitions on "NAND 256MiB 3,3V 8-bit":
0x000000000000-0x000000040000 : "u-boot"
0x000000200000-0x000000500000 : "Kernel"
0x000000500000-0x000010000000 : "Yaffs2"
mice: PS/2 mouse device common for all mice
i2c /dev entries driver
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
s3c-sdhci s3c-sdhci.0: clock source 0: hsmmc (133000000 Hz)
s3c-sdhci s3c-sdhci.0: clock source 1: hsmmc (133000000 Hz)
s3c-sdhci s3c-sdhci.0: clock source 2: mmc_bus (24000000 Hz)
mmc0: SDHCI controller on samsung-hsmmc [s3c-sdhci.0] using PIO
TCP cubic registered
VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5
VFS: Cannot open root device "mtdblock2" or unknown-block(31,2)
Please append a correct "root=" boot option; here are the available partitions:
1f00             256 mtdblock0 (driver?)
1f01            3072 mtdblock1 (driver?)
1f02          257024 mtdblock2 (driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,2)
Backtrace: 
[<c0025c34>] (dump_backtrace+0x0/0x10c) from [<c023caf4>] (dump_stack+0x18/0x1c)
 r7:c0318350 r6:00008000 r5:c0339cb0 r4:c7c27f40
[<c023cadc>] (dump_stack+0x0/0x1c) from [<c023cb44>] (panic+0x4c/0xd0)
[<c023caf8>] (panic+0x0/0xd0) from [<c0008fc0>] (mount_block_root+0x178/0x234)
 r3:00000000 r2:c7c3af2c r1:c7c27f40 r0:c02d5a38
[<c0008e48>] (mount_block_root+0x0/0x234) from [<c000912c>] (mount_root+0xb0/0xf4)
[<c000907c>] (mount_root+0x0/0xf4) from [<c0009278>] (prepare_namespace+0x108/0x1c8)
 r7:c001e378 r6:c0339600 r5:c001e378 r4:c001e388
[<c0009170>] (prepare_namespace+0x0/0x1c8) from [<c00084ec>] (kernel_init+0x118/0x160)
 r7:00000000 r6:c001d8b8 r5:c001db68 r4:c001db68
[<c00083d4>] (kernel_init+0x0/0x160) from [<c0041c44>] (do_exit+0x0/0x640)
 r7:00000000 r6:00000000 r5:00000000 r4:00000000
以上红色部分是由于kernel还未支持yaffs文件系统才会有的错误。
在这要说明的:
1.                    ./driver/mtd/nand目录下是关于nand的驱动,与硬件相关的文件是s3c2410.c。如果使用其他的硬件的话可以替换此文件。
2.                    ./driver/mtd/nand/s3c2410.c中的s3c2410_nand_driver.driver中的name字段一定要与./arch/arm/plat-samsung/dev_nand.c(平台设备)中的s3c_device_nand中的name字段保持一致,这样才能进行调用。否则可能会出现nand设备驱动不成功的现象。我的内核打印错误信息如下:
[<c01469cc>] (strnlen+0x0/0x58) from [<c0148150>] (string+0x44/0xfc)
[<c0148110>] (string+0x4/0xfc) from [<c0149270>] (vsnprintf+0x458/0xa28)
 r9:c033a5b0 r8:c7c27dd0 r7:c02efb56 r6:c02efb56 r5:c02efb57
r4:00000000
[<c0148e18>] (vsnprintf+0x0/0xa28) from [<c0149914>] (vscnprintf+0x14/0x20)
[<c0149900>] (vscnprintf+0x0/0x20) from [<c003f6d4>] (vprintk+0x80/0x38c)
 r5:00000000 r4:c033a0f8
[<c003f654>] (vprintk+0x0/0x38c) from [<c023cbf0>] (printk+0x28/0x30)
[<c023cbc8>] (printk+0x0/0x30) from [<c017a1bc>] (add_mtd_partitions+0x2e0/0x7c0)
 r3:c031b578 r2:c031c1bc r1:70200000 r0:c02efb3c
[<c0179edc>] (add_mtd_partitions+0x0/0x7c0) from [<c018487c>] (s3c24xx_nand_probe+0x4b4/0x774)
[<c01843c8>] (s3c24xx_nand_probe+0x0/0x774) from [<c017167c>] (platform_drv_probe+0x20/0x24)
[<c017165c>] (platform_drv_probe+0x0/0x24) from [<c01704b0>] (driver_probe_device+0x80/0x18c)
[<c0170430>] (driver_probe_device+0x0/0x18c) from [<c0170650>] (__driver_attach+0x94/0x98)
[<c01705bc>] (__driver_attach+0x0/0x98) from [<c016fcc8>] (bus_for_each_dev+0x68/0x94)
 r7:c01705bc r6:c0333834 r5:c7c27ee0 r4:00000000
[<c016fc60>] (bus_for_each_dev+0x0/0x94) from [<c017033c>] (driver_attach+0x20/0x28)
 r7:c0333834 r6:c7c26000 r5:c0333834 r4:c02d872c
[<c017031c>] (driver_attach+0x0/0x28) from [<c016f46c>] (bus_add_driver+0xa4/0x260)
[<c016f3c8>] (bus_add_driver+0x0/0x260) from [<c0170914>] (driver_register+0x74/0x15c)
[<c01708a0>] (driver_register+0x0/0x15c) from [<c0171968>] (platform_driver_register+0x4c/0x60)
 r7:c03393c0 r6:c7c26000 r5:c001db58 r4:c001dae0
[<c017191c>] (platform_driver_register+0x0/0x60) from [<c0017638>] (s3c2410_nand_init+0x1c/0x28)
[<c001761c>] (s3c2410_nand_init+0x0/0x28) from [<c0021368>] (do_one_initcall+0x38/0x1c4)
[<c0021330>] (do_one_initcall+0x0/0x1c4) from [<c0008480>] (kernel_init+0xac/0x160)
[<c00083d4>] (kernel_init+0x0/0x160) from [<c0041c44>] (do_exit+0x0/0x640)
 r7:00000000 r6:00000000 r5:00000000 r4:00000000
Code: e24cb004 e3510000 e1a02000 0a00000d (e5d03000) 
---[ end trace 48c84fc47f611133 ]---
Kernel panic - not syncing: Attempted to kill init!
Backtrace: 
[<c0025c34>] (dump_backtrace+0x0/0x10c) from [<c023caf4>] (dump_stack+0x18/0x1c)
 r7:c7c24000 r6:c01469e4 r5:c0339cb0 r4:0000000b
[<c023cadc>] (dump_stack+0x0/0x1c) from [<c023cb44>] (panic+0x4c/0xd0)
[<c023caf8>] (panic+0x0/0xd0) from [<c004218c>] (do_exit+0x548/0x640)
 r3:c031d408 r2:c7c279a8 r1:c7c27884 r0:c02d8ea4
[<c0041c44>] (do_exit+0x0/0x640) from [<c0025fd0>] (die+0x290/0x2dc)
[<c0025d40>] (die+0x0/0x2dc) from [<c00282f8>] (__do_kernel_fault+0x6c/0x8c)
[<c002828c>] (__do_kernel_fault+0x0/0x8c) from [<c0028460>] (do_page_fault+0x148/0x200)
 r9:00000005 r8:c7c27c20 r7:c7c24000 r6:70200000 r5:00000000
r4:c7c27c20
[<c0028318>] (do_page_fault+0x0/0x200) from [<c002862c>] (do_translation_fault+0x6c/0xa4)
[<c00285c0>] (do_translation_fault+0x0/0xa4) from [<c00212cc>] (do_DataAbort+0x40/0xa4)
 r7:c0318590 r6:00000005 r5:c7c27c54 r4:c0318540
[<c002128c>] (do_DataAbort+0x0/0xa4) from [<c0021aac>] (__dabt_svc+0x4c/0x60)
Exception stack(0xc7c27c20 to 0xc7c27c68)
7c20: 70200000 ffffffff 70200000 ff0a0004 00000000 c033a1dc c033a5b0 0000ffff
7c40: 70200000 c033a5b0 c033a1dc c7c27c74 c7c27c78 c7c27c68 c0148150 c01469e4
7c60: a0000093 ffffffff
[<c01469cc>] (strnlen+0x0/0x58) from [<c0148150>] (string+0x44/0xfc)
[<c0148110>] (string+0x4/0xfc) from [<c0149270>] (vsnprintf+0x458/0xa28)
 r9:c033a5b0 r8:c7c27dd0 r7:c02efb56 r6:c02efb56 r5:c02efb57
r4:00000000
[<c0148e18>] (vsnprintf+0x0/0xa28) from [<c0149914>] (vscnprintf+0x14/0x20)
[<c0149900>] (vscnprintf+0x0/0x20) from [<c003f6d4>] (vprintk+0x80/0x38c)
 r5:00000000 r4:c033a0f8
[<c003f654>] (vprintk+0x0/0x38c) from [<c023cbf0>] (printk+0x28/0x30)
[<c023cbc8>] (printk+0x0/0x30) from [<c017a1bc>] (add_mtd_partitions+0x2e0/0x7c0)
 r3:c031b578 r2:c031c1bc r1:70200000 r0:c02efb3c
[<c0179edc>] (add_mtd_partitions+0x0/0x7c0) from [<c018487c>] (s3c24xx_nand_probe+0x4b4/0x774)
[<c01843c8>] (s3c24xx_nand_probe+0x0/0x774) from [<c017167c>] (platform_drv_probe+0x20/0x24)
[<c017165c>] (platform_drv_probe+0x0/0x24) from [<c01704b0>] (driver_probe_device+0x80/0x18c)
[<c0170430>] (driver_probe_device+0x0/0x18c) from [<c0170650>] (__driver_attach+0x94/0x98)
[<c01705bc>] (__driver_attach+0x0/0x98) from [<c016fcc8>] (bus_for_each_dev+0x68/0x94)
 r7:c01705bc r6:c0333834 r5:c7c27ee0 r4:00000000
[<c016fc60>] (bus_for_each_dev+0x0/0x94) from [<c017033c>] (driver_attach+0x20/0x28)
 r7:c0333834 r6:c7c26000 r5:c0333834 r4:c02d872c
[<c017031c>] (driver_attach+0x0/0x28) from [<c016f46c>] (bus_add_driver+0xa4/0x260)
[<c016f3c8>] (bus_add_driver+0x0/0x260) from [<c0170914>] (driver_register+0x74/0x15c)
[<c01708a0>] (driver_register+0x0/0x15c) from [<c0171968>] (platform_driver_register+0x4c/0x60)
 r7:c03393c0 r6:c7c26000 r5:c001db58 r4:c001dae0
[<c017191c>] (platform_driver_register+0x0/0x60) from [<c0017638>] (s3c2410_nand_init+0x1c/0x28)
[<c001761c>] (s3c2410_nand_init+0x0/0x28) from [<c0021368>] (do_one_initcall+0x38/0x1c4)
[<c0021330>] (do_one_initcall+0x0/0x1c4) from [<c0008480>] (kernel_init+0xac/0x160)
[<c00083d4>] (kernel_init+0x0/0x160) from [<c0041c44>] (do_exit+0x0/0x640)
 r7:00000000 r6:00000000 r5:00000000 r4:00000000
7.添加yaffs文件系统的支持:
 1、下载Yaffs2
      
http://www.aleph1.co.uk/cgi-bin/viewcvs.cgi/
 2、解压Yaffs2并将其加入Linux内核(打补丁的方式)
       #cd yaffs2
      
#./patch-ker.sh c /linux-2.6.34.2/
3.    修改配置文件,添加对yaffs文件系统的支持(同时也支持cramfsnfs文件系统)

       File systems --->

Miscellaneous filesystems --->

<*> YAFFS2 file system support

-*- 512 byte / page devices

[ ] Use older-style on-NAND data format with pageStatus byte

[ ] Lets Yaffs do its own ECC

-*- 2048 byte (or larger) / page devices

[*] Autoselect yaffs2 format

[ ] Disable lazy loading

[ ] Turn off wide tnodes

[ ] Force chunk erase check

[*] Cache short names in RAM

< > Journalling Flash File System v2 (JFFS2) support

<*> Compressed ROM file system support (cramfs)

[*] Network File Systems --->

--- Network File Systems

最后重新编译烧写到开发板,打印信息为:

NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)

Scanning device for bad blocks

Bad eraseblock 517 at 0x0000040a0000

Bad eraseblock 1383 at 0x00000ace0000

Bad eraseblock 1737 at 0x00000d920000

Bad eraseblock 1897 at 0x00000ed20000

Bad eraseblock 1968 at 0x00000f600000

Creating 3 MTD partitions on "NAND 256MiB 3,3V 8-bit":

0x000000000000-0x000000040000 : "u-boot"

0x000000200000-0x000000500000 : "Kernel"

0x000000500000-0x000010000000 : "Yaffs2"

mice: PS/2 mouse device common for all mice

i2c /dev entries driver

sdhci: Secure Digital Host Controller Interface driver

sdhci: Copyright(c) Pierre Ossman

s3c-sdhci s3c-sdhci.0: clock source 0: hsmmc (133000000 Hz)

s3c-sdhci s3c-sdhci.0: clock source 1: hsmmc (133000000 Hz)

s3c-sdhci s3c-sdhci.0: clock source 2: mmc_bus (24000000 Hz)

mmc0: SDHCI controller on samsung-hsmmc [s3c-sdhci.0] using PIO

TCP cubic registered

VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5

。。。

yaffs: dev is 32505858 name is "mtdblock2"

yaffs: passed flags ""

yaffs: Attempting MTD mount on 31.2, "mtdblock2"

block 478 is bad

block 1344 is bad

block 1698 is bad

block 1858 is bad

block 1929 is bad

yaffs_read_super: isCheckpointed 0

VFS: Mounted root (yaffs2 filesystem).

Freeing init memory: 140K

Warning: unable to open an initial console.

Kernel panic - not syncing: No init found.  Try passing init= option to kernel.Kernel panic - not syncing:

Backtrace:

[<c0025c34>] (dump_backtrace+0x0/0x10c) from [<c023caf4>] (dump_stack+0x18/0x1c)

 r7:c0318350 r6:00008000 r5:c0339cb0 r4:c7c27f40

[<c023cadc>] (dump_stack+0x0/0x1c) from [<c023cb44>] (panic+0x4c/0xd0)

[<c023caf8>] (panic+0x0/0xd0) from [<c0008fc0>] (mount_block_root+0x178/0x234)

 r3:00000000 r2:c7c3af2c r1:c7c27f40 r0:c02d5a38

[<c0008e48>] (mount_block_root+0x0/0x234) from [<c000912c>] (mount_root+0xb0/0xf4)

[<c000907c>] (mount_root+0x0/0xf4) from [<c0009278>] (prepare_namespace+0x108/0x1c8)

 r7:c001e378 r6:c0339600 r5:c001e378 r4:c001e388

[<c0009170>] (prepare_namespace+0x0/0x1c8) from [<c00084ec>] (                            kernel_init+0x118/0x160)

 r7:00000000 r6:c001d8b8 r5:c001db68 r4:c001db68

[<c00083d4>] (kernel_init+0x0/0x160) from [<c0041c44>] (do_exit+0x0/0x640)

 r7:00000000 r6:00000000 r5:00000000 r4:00000000

文件系统还没有移植好所以只能到这了

 

 

原创粉丝点击