daicheng

u-boot移植 中64m与128m的区别

0
阅读(2720)

目前的mini2440的NANDFLASH为128m与原来qq2440的有一定的区别,下面我介绍一下具体的区别:

首先我先介绍一下64m的:
    一、 Nand flash芯片工作原理
     Nand flash芯片型号为Samsung K9F1208U0B,数据存储容量为64MB,采用块页式存储管理。8个I/O
     引脚充当数据、地址、命令的复用端口。
     1  芯片内部存储布局及存储操作特点
    一片Nand flash为一个设备(device), 其数据存储分层为:
    1设备(Device) = 4096 块(Blocks)
    1块(Block) = 32页/行(Pages/rows) ;页与行是相同的意思,叫法不一样
    1块(Page) = 528字节(Bytes) = 数据块大小(512Bytes) + OOB块大小(16Bytes)
    在每一页中,最后16个字节(又称OOB)用于Nand Flash命令执行完后设置状态用,剩余512个字节
    又分为前半部分和后半部分。可以通过Nand Flash命令00h/01h/50h分别对前半部、后半部、OOB进行定位
   通过Nand Flash内置的指针指向各自的首地址。
    存储操作特点:
    1. 擦除操作的最小单位是块。
    2. Nand Flash芯片每一位(bit)只能从1变为0,而不能从0变为1,所以在对其进行写入操作之前要一定将相
    应块擦除(擦除即是将相应块得位全部变为1).
    3. OOB部分的第六字节(即517字节)标志是否是坏块,如果不是坏块该值为FF,否则为坏块。
    4. 除OOB第六字节外,通常至少把OOB的前3个字节存放Nand Flash硬件ECC码(关于硬件ECC码请参看
    Nandflash 控制器一节).
 2 、 寻址方式
    Samsung K9F1208U0B Nand Flash 片内寻址采用26位地址形式。从第0位开始分四次通过I/O0-I/O7进
   行传送,并进行片内寻址。具体含义如下:
    0-7位:字节在上半部、下半部及OOB内的偏移地址
    8位:值为0代表对一页内前256个字节进行寻址
    值为1代表对一页内后256个字节进行寻址
    9-13位:对页进行寻址
    14-25位:对块进行寻址
    当传送地址时,从位0开始
这样就知道区别了所以修改也就成功了!有没的看到的请看数据手册!
修改如下:
/* 发出地址 */

static void s3c2440_write_addr(unsigned int addr)

{

    int i;

S3C2440_NAND * s3c2440nand = (S3C2440_NAND *)0x4e000000;

    volatile unsigned char *p = (volatile unsigned char *)&s3c2440nand->NFADDR;

    

    *p = 0;
    for(i=0; i<10; i++);
    *p = 0;
    for(i=0; i<10; i++);
    *p = (addr >> 11) & 0xff;
    for(i=0; i<10; i++);
    *p = (addr >> 19) & 0xff;
    for(i=0; i<10; i++);

}
    /* 读函数 */

void nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)

{

    int i, j;
    if ((start_addr & NAND_BLOCK_MASK) || (size & NAND_BLOCK_MASK))
   {        return ;    /* 地址或长度不对齐 */
    }
    /* 选中芯片 */
    nand_select_chip();
    for(i=start_addr; i < (start_addr + size);) {

      /* 发出READ0命令 */

      write_cmd(0);     

      /* Write Address */

      write_addr(i);
      write_cmd(0x30);

      wait_idle();

      for(j=0; j < NAND_SECTOR_SIZE; j++, i++) {

          *buf = read_data();

          buf++;

      }

    }



    /* 取消片选信号 */

    nand_deselect_chip();

    

    return ;

}
从VIVI中修改的!