jz2440 nandflash

芯片的型号:K9F2G08U0C
芯片大小:256M Byte记忆单元阵列:(256M + 8,192K)bit x 8bit

2048 blocks * 64 pages/block  * 2048 bytes/page = [256M Bytes]

这个芯片的写操作是以页为单位的,擦除是以块为单位的.
擦出页面的起始地址以及偏移量应该是2048*64的整数倍.

问题:
jz2440不能成功地从nandflash读取文件系统, 使用的韦老大给的fs_mini_mdev.yaffs2.

===========================================================
方法一:

0. 查看坏块,重新规划分区

用nfs启动后,使用mount挂载/dev/mtdblock3的时候打印的坏块信息:
nand bad block:
    block 29 is bad
    block 377 is bad
    block 486 is bad
    block 491 is bad
    block 659 is bad
    block 740 is bad
    block 877 is bad
    block 1412 is bad
    block 1444 is bad
    block 1539 is bad
    block 1993 is bad

new root area: 我的想法是直接跨过坏块,在好的区域安排mtdblock3.
    block 30 - 360
    0x3C0000 -- 0x2D00000;  size = 0x2940000; (测试用的root大小889bc0, 够用了)

1. 修改arch/arm/plat-s3c24xx/common-smdk.c    
    /* NAND parititon from 2.4.18-swl5 */
    static struct mtd_partition smdk_default_nand_part[] = {
            [0] = {
            .name   = "bootloader",
            .size   = 0x00040000,
                    .offset = 0,
            },  
            [1] = {
            .name   = "params",
            .offset = MTDPART_OFS_APPEND,
            .size   = 0x00020000,
            },  
            [2] = {
            .name   = "kernel",
            .offset = MTDPART_OFS_APPEND,
            .size   = 0x00200000,
            },  
            [3] = {
            .name   = "root",
            //直接跨过坏块,在好的区域安排mtdblock3.
            .offset = 0x3C0000, //MTDPART_OFS_APPEND,  
            .size   = 0x2940000, //MTDPART_SIZ_FULL,
            }   
    };
    
2. 重新烧写, 设置从nand读取文件系统
    {
        tftp 30000000 fs_mini_mdev.yaffs2 ; nand erase root; //Bytes transferred = 8952768 (889bc0 hex)
        nand write.yaffs2 30000000 0x3C0000 0x2940000;
        
        set bootcmd tftp 0x30007fc0 uImage \;bootm 0x30007fc0;
        set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0; save;
    }

NOT GOOD

===========================================================

jz2440不能成功地从nandflash读取文件系统, 使用韦老大给的fs_mini_mdev.yaffs2.
第二次尝试:
我猜想是不是不能跨过某些区域分块,因此考虑把kernel分区往后延伸.

0. 查看坏块, 重新规划
{这里奇怪的是算出来的坏块和mount打印的坏块不同}
NAND erase: device 0 offset 0x260000, size 0xfda0000
Skipping bad block at  0x005e0000       (block:  47   )                                     
Skipping bad block at  0x03160000       (block:  395   )                                     
Skipping bad block at  0x03f00000       (block:  504   )                                     
Skipping bad block at  0x03fa0000       (block:  509   )                                     
Skipping bad block at  0x054a0000       (block:  677   )                                     
Skipping bad block at  0x05ec0000       (block:  758   )                                     
Skipping bad block at  0x06fe0000       (block:  895   )                                     
Skipping bad block at  0x0b2c0000       (block:  1430   )                                     
Skipping bad block at  0x0b6c0000       (block:  1462   )                                     
Skipping bad block at  0x0c2a0000       (block:  1557   )                                     
Skipping bad block at  0x0fb60000       (block:  2011   )                                     
Erasing at 0xffe0000 -- 100% complete.

{
    new new root area:
        block 3 - 47
        0x00060000-0x005e0000 ;  size = 0x580000;
        
    new new root area:
        block 47 - all
        0x005e0000 -- all;  size = all - 0x3C0000;
}

1. 修改arch/arm/plat-s3c24xx/common-smdk.c
    /* NAND parititon from 2.4.18-swl5 */

static struct mtd_partition smdk_default_nand_part[] = {
            [0] = {
            .name   = "bootloader",
            .size   = 0x00040000,
                    .offset = 0,
            },  
            [1] = {
            .name   = "params",
            .offset = MTDPART_OFS_APPEND,
            .size   = 0x00020000,
            },  
            [2] = {
            .name   = "kernel",
            .offset = MTDPART_OFS_APPEND,
            .size   = 0x580000,
            },  
            [3] = {
            .name   = "root",
            .offset = MTDPART_OFS_APPEND ,
            .size   = MTDPART_SIZ_FULL,
            }   
    };
    
2. 重新烧写, 设置从nand读取文件系统
    {
        tftp 30000000 fs_mini_mdev.yaffs2 ; nand erase root; //Bytes transferred = 8952768 (889bc0 hex)
        nand write.yaffs2 30000000 0x005e0000 0x8A0000;
        
        set bootcmd tftp 0x30007fc0 uImage \;bootm 0x30007fc0;
        set bootargs noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0; save;
    }

仍然不能正确启动:
{
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
end_request: I/O error, dev mtdblock3, sector 2
EXT3-fs: unable to read superblock
end_request: I/O error, dev mtdblock3, sector 0
Buffer I/O error on device mtdblock3, logical block 0
end_request: I/O error, dev mtdblock3, sector 0
Buffer I/O error on device mtdblock3, logical block 0
end_request: I/O error, dev mtdblock3, sector 8
Buffer I/O error on device mtdblock3, logical block 1
end_request: I/O error, dev mtdblock3, sector 8
Buffer I/O error on device mtdblock3, logical block 1
end_request: I/O error, dev mtdblock3, sector 16
Buffer I/O error on device mtdblock3, logical block 2
end_request: I/O error, dev mtdblock3, sector 16
Buffer I/O error on device mtdblock3, logical block 2
end_request: I/O error, dev mtdblock3, sector 24
Buffer I/O error on device mtdblock3, logical block 3
end_request: I/O error, dev mtdblock3, sector 24
Buffer I/O error on device mtdblock3, logical block 3
end_request: I/O error, dev mtdblock3, sector 0
FAT: unable to read boot sector
VFS: Cannot open root device "mtdblock3" or unknown-block(31,3)
Please append a correct "root=" boot option; here are the available partitions:
1f00        256 mtdblock0 (driver?)
1f01        128 mtdblock1 (driver?)
1f02       5632 mtdblock2 (driver?)
1f03     256128 mtdblock3 (driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(31,3)
}

===========================================================

时间: 2024-08-08 21:58:35

jz2440 nandflash的相关文章

JZ2440:nandflash

本篇文章链接:http://blog.csdn.net/qqliyunpeng/article/details/51180276 芯片的型号:K9F2G08U0C 1. 硬件部分: 1.1 简介: 芯片大小:256M Byte 记忆单元阵列:(256M + 8,192K)bit x 8bit 擦写次数比较少:10 万次 数据保留时间:10 年 8个IO 口进行数据和地址的复用,因此,读写的时候要用到多个周期 几个特殊的引脚: 引脚名字 引脚功能 RE# 读使能,低电平有效 WE# 写使能,上升沿

jz2440上内核和文件系统移植

整个暑假跟着韦东山的视频和书籍移植了linux2.3.6到jz2440,现在自己尝试移植linux4.7.2到板子上,并使用ubifs文件系统代替旧的jffs2文件系统. 下载交叉编译工具链 工具链我使用的是friendlyARM提供的工具链,因为韦东山教程提供的工具链比较旧不能编译较新的linux内核,也可以自己使用crosstool-ng构建. ARM-Linux GCC 4.4.3(http://arm9download.cncncn.com/mini2440/linux/arm-linu

JZ2440开发板

2014年12月14日 刚拿到JZ2440开发板,视频第0课第一节: (1) 要给开发板烧系统,就要用到JTAG,(JTAG一般是与电脑的并口相连的),但是现在电脑都没有并口,所以出现了:OpenJTAG和J-Link.我用的是J-Link. 视频上讲的 offlash 程序,用于烧写系统,但是它只适用于 并口的JTAG 和 OpenJTAG ,不可以用于J-Link. 如果是 J-Link ,则只能使用J-Link烧写 Nor Flash .可以向Nor Flash中烧写 u-boot.bin

u-boot分析1:Nandflash、Norflash启动

了解u-boot之前首先了解下Bootloader,简单说Bootloader就是一段小程序,它在系统上电时开始运行,初始化硬件设备,准备好软件环境,最后调用操作系统内核. u-boot全称:Universal Boot Loader,即通用Bootloader,遵循GPL条款,开放源码. 支持多种嵌入式操作系统内核:Linux.NetBSD.VxWorks等 支持多个处理器系列:如PowerPC.ARM.x86.MIPS等 u-boot的核心最终目的就是从Flash上读出内核,然后启动内核.如

Jz2440 环境安装

目录 Jz2440 环境安装 Ubuntu 设置 烧写工具 交叉编译环境 使用说明 烧写特性 title: Jz2440 环境安装 tags: linux date: 2018-09-20 22:56:05 --- Jz2440 环境安装 Ubuntu 设置 现象:开启虚拟机会发现报错 Could not apply the stored configuration for monitors 原因:在关机的时候,gnome-setting-deamon 会保存上一次的设置,生成一个monitor

移植u-boot-2015.10到JZ2440开发板(五)——设置nand分区,环境变量保存地址和其它默认参数

在下载内核或文件系统时,我们可以直接在命令中写明烧到nandflash的具体地址,但较麻烦,我们可以给nandflash分区,这样就可直接写烧到那个分区就行了,较为方便.如何设置呢?首先我们在uboot中输入mtdparts命令,看看默认的分区,结果提示mtdids not defined, no default present.搜索"mtdids not defined",定位到common/cmd_mtdparts.c的mtdparts_init函数中,分析发现是mtdids_de

Linux学习 :移植U-boot_2016.09到JZ2440开发板

一.下载源码:ftp://ftp.denx.de/pub/u-boot/ 二.初始化编译: ①make smdk2410_defconfig #首先使用默认配置,减少后续的配置工作 ②make menuconfig      #根据自身需求进一步配置 ③修改Makefile ,开头只能架构和编译器: ARCH=arm CROSS_COMPILE=arm-linux-      ④修改uboot代码:    1. 设置PLL的时钟的函数在_main中的board_init_f中初始化函数列表中的 

u-boot-2016.03 在mini2440上移植之nandflash 硬件ecc

MINI2440 开发板使用的是8bit,256M blocksize= 128k,pagesize =2k的nandflash. 宽带为8bit ,由S3C2440 datasheet 可知硬件生产的ecc为4byte. S3C2440 硬件ecc 操作流程: 1.先读出NFMECC0寄存器中由硬件生产的ecc data. 2.将读出的ecc数据,进行处理之后,分别写入NFMECCD0和NFMECCD1寄存器, 硬件自动检测,检测结果可从NFESTAT0 寄存器读取. 3. 读取NFESTAT

norflash和nandflash电路

一.nandflash电路 二.norflash电路