现在的位置: 首页 > 综合 > 正文

nand_cp.c

2013年10月09日 ⁄ 综合 ⁄ 共 3892字 ⁄ 字号 评论关闭

/*
 * address format
 *              17 16         9 8            0
 * --------------------------------------------
 * | block(12bit) | page(5bit) | offset(9bit) |
 * --------------------------------------------
 */

static int nandll_read_page (uchar *buf, ulong addr, int large_block)             1page=4k
{
    int i;
    int page_size = 512;

    if (large_block==1)
        page_size = 2048;
    if (large_block==2)
        page_size = 4096;
    if(large_block==3)
        page_size = 8192;

    NAND_ENABLE_CE();

    NFCMD_REG = NAND_CMD_READ0;

    /* Write Address */
    NFADDR_REG = 0;

    if (large_block)
        NFADDR_REG = 0;

    NFADDR_REG = (addr) & 0xff;
    NFADDR_REG = (addr >> 8) & 0xff;
    NFADDR_REG = (addr >> 16) & 0xff;

    if (large_block)
        NFCMD_REG = NAND_CMD_READSTART;

    NF_TRANSRnB();

    /* for compatibility(2460). u32 cannot be used. by scsuh */
    for(i=0; i < page_size; i++) {
        *buf++ = NFDATA8_REG;                                                                                  4096
    }

    NAND_DISABLE_CE();
    return 0;
}

/*
 * Read data from NAND.
 */
static int nandll_read_blocks (ulong dst_addr, ulong size, int large_block)               1block=128k
{
    uchar *buf = (uchar *)dst_addr;
    int i;
    uint page_shift = 9;

    if (large_block==1)
        page_shift = 11;

    if(large_block==2)
        page_shift = 12;

    if(large_block==3)
        page_shift =13;

    if(large_block == 2)
    {
        /* Read pages */
        for (i = 0; i < 4; i++, buf+=(1<<(page_shift-1))) {
            nandll_read_page(buf, i, large_block);
        }

        /* Read pages */
        for (i = 4; i < (0x3c000>>page_shift); i++, buf+=(1<<page_shift)) {
            nandll_read_page(buf, i, large_block);                                                         60
        }

    }else if(large_block == 3)  //K9GAG08U0E
    {
        /* Read pages */
        for (i = 0; i < 4; i++, buf+=(1<<(page_shift-2))) {
            nandll_read_page(buf, i, large_block);
        }

        /* Read pages */
        for (i = 4; i < (0x3c000>>page_shift); i++, buf+=(1<<page_shift)) {
            nandll_read_page(buf, i, large_block);
        }
    }
    else
    {
        for (i = 0; i < (0x3c000>>page_shift); i++, buf+=(1<<page_shift)) {
            nandll_read_page(buf, i, large_block);
        }
    }
    return 0;
}

int copy_uboot_to_ram (void)
{

    int large_block = 0;
    int i;
    vu_char id;

    NAND_ENABLE_CE();                                                    宏,片选有效,Xm0CSn2
    NFCMD_REG=NAND_CMD_RESET;                                command 0xff,初始值为0x00,为什么要赋值,不清楚
    NF_TRANSRnB();                                                           等待nand就绪

    NFCMD_REG = NAND_CMD_READID;                           0x90
    NFADDR_REG =  0x00;                                                 address

    NF_TRANSRnB();                                                           等待nand就绪

    /* wait for a while */
    for (i=0; i<200; i++);

    int factory = NFDATA8_REG;
    id = NFDATA8_REG;

    int cellinfo=NFDATA8_REG;
    int tmp= NFDATA8_REG;

    //int childType=tmp & 0x03; //Page size
    int childType=cellinfo; //Page size

    if (id > 0x80)
    {
        large_block = 1;
    }

    if(id == 0xd5 && childType==0x94 )//K9GAG08U0D
    {
        large_block = 2;

    }
    if(id == 0xd5 && childType==0x14 )//K9GAG08U0M
    {
        large_block = 2;

    }
    if(id == 0xd5 && childType==0x84 )//K9GAG08U0E
    {
        large_block = 3;

    }
    if(id==0xd7)//K9LBG08U0D
    {
        large_block = 2;
    }
    if(factory==0x2c && id == 0x48) //MT29F16G08ABACAWP
    {
        large_block = 2;

    }if(factory==0x2c && id == 0x38) //MT29F8G08ABABAWP                                       选择
    {
        large_block = 2;

    }

    /* read NAND Block.
     * 128KB ->240KB because of U-Boot size increase. by scsuh
     * So, read 0x3c000 bytes not 0x20000(128KB).                                                        读240k
     */
    return nandll_read_blocks(CFG_PHY_UBOOT_BASE, 0x3c000, large_block);
}

#if 1

#define REG_GPFCON       (0x7F0080A0)
#define REG_GPFDAT       (0x7F0080A4)

void beep(void)
{

    uint reg_f_cfg=readl(REG_GPFCON) & 0x3FFFFFFF | (1<<30);
    writel(reg_f_cfg,REG_GPFCON);

    uint reg_f_on=readl(REG_GPFDAT) & 0xFFFF7FFF | (1<<15);
    uint reg_f_off=readl(REG_GPFDAT) & 0xFFFF7FFF;

    writel(reg_f_on,REG_GPFDAT);
}
#else
void  beep(void)
{

}
#endif

#endif

【上篇】
【下篇】

抱歉!评论已关闭.