嵌入式技术william hill官网
直播中

lee_st

12年用户 45163经验值
擅长:可编程逻辑 嵌入式技术 处理器/DSP RF/无线
私信 关注
[经验]

tq210从 NAND 启动 u-boot

之前的所有学习都是从SD卡启动uboot,今天开始折腾从nand启动uboot,于是在之前的基础上继续更改代码,实现该功能。
结果见图
捕获.JPG
还是设置从SD启动,使用SD卡的uboot,进行烧录,把uboot烧录到nand,完成后,重新上电或reset一下,结果如图
捕获1.JPG

代码需要的更改如下
void copy_bl2_to_ram(void)
{
/*
** ch:  通道
** ***:  起始块
** bs:  块大小
** dst: 目的地
** i:         是否初始化
*/
#define CopySDMMCtoMem(ch, ***, bs, dst, i)
        (((u8(*)(int, u32, unsigned short, u32*, u8))
        (*((u32 *)0xD0037F98)))(ch, ***, bs, dst, i))
       
#define MP0_1CON  (*(volatile u32 *)0xE02002E0)
#define        MP0_3CON  (*(volatile u32 *)0xE0200320)
#define        MP0_6CON  (*(volatile u32 *)0xE0200380)       


#define NF8_ReadPage_Adv(a,b,c) (((int(*)(u32, u32, u8*))(*((u32 *)0xD0037F90)))(a,b,c))
       
        u32 bl2Size = 250 * 1024;        // 250K
       
        u32 OM = *(volatile u32 *)(0xE0000004);        // OM Register
        OM &= 0x1F;                                        // 取低5位
       
        if (OM == 0x2)                                // NAND 2 KB, 5cycle 8-bit ECC
        {
                u32 cfg = 0;
                struct s5pv210_nand *nand_reg = (struct s5pv210_nand *)(struct s5pv210_nand *)samsung_get_base_nand();
               
                /* initialize hardware */
                /* HCLK_PSYS=133MHz(7.5ns) */
                cfg =        (0x1 << 23) |        /* Disable 1-bit and 4-bit ECC */
                                /* 下面3个时间参数稍微比计算出的值大些(我这里依次加1),否则读写不稳定 */
                                (0x3 << 12) |        /* 7.5ns * 2 > 12ns tALS tCLS */
                                (0x2 << 8) |         /* (1+1) * 7.5ns > 12ns (tWP) */
                                (0x1 << 4) |         /* (0+1) * 7.5 > 5ns (tCLH/tALH) */
                                (0x0 << 3) |         /* SLC NAND Flash */
                                (0x0 << 2) |        /* 2KBytes/Page */
                                (0x1 << 1);                /* 5 address cycle */
       
                writel(cfg, &nand_reg->NFConf);
               
                writel((0x1 << 1) | (0x1 << 0), &nand_reg->nfcont);
                /* Disable chip select and Enable NAND Flash Controller */
       
                /* Config GPIO */
                MP0_1CON &= ~(0xFFFF << 8);
                MP0_1CON |= (0x3333 << 8);
                MP0_3CON = 0x22222222;
                MP0_6CON = 0x22222222;               
               
                int i = 0;
                int pages = bl2Size / 2048;                // 多少页
                int offset = 0x4000 / 2048;                        // u-boot.bin在NAND中的偏移地址(页地址)
                u8 *p = (u8 *)CONFIG_SYS_SDRAM_BASE;
                for (; i < pages; i++, p += 2048, offset += 1)
                        NF8_ReadPage_Adv(offset / 64, offset % 64, p);
        }
        else if (OM == 0xC)                // SD/MMC
        {
                u32 V210_SDMMC_BASE = *(volatile u32 *)(0xD0037488);        // V210_SDMMC_BASE
                u8 ch = 0;
               
                /* 参考S5PV210手册7.9.1 SD/MMC REGISTER MAP */
                if (V210_SDMMC_BASE == 0xEB000000)                // 通道0
                        ch = 0;
                else if (V210_SDMMC_BASE == 0xEB200000)        // 通道2
                        ch = 2;
                CopySDMMCtoMem(ch, 32, bl2Size / 512, (u32 *)CONFIG_SYS_SDRAM_BASE, 0);
        }
}

其他的就不多说了



更多回帖

发帖
×
20
完善资料,
赚取积分