uboot中nand详细分析(一)

本文深入解析uboot在启动过程中对GPMC(General Purpose Memory Controller)和NAND Flash的初始化过程,包括GPMC的基本设置、NAND底层和MTD层的初始化,涉及寄存器配置、ECC校验等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.gpmc初始化
uboot首先执行start.s,初始化cpu并从nand中拷贝其他代码到内存中;最后跳转到start_armboot()函数;
在start_armboot()中,循环初始化外设,其中board_init()函数就调用gpmc_init()初始化了gpmc:
void gpmc_init(void)
{
        //通过把gpmc_cfg指向gpmc基地址,使gpmc_cfg中的数据类型所代表的是gpmc寄存器地址
gpmc_cfg = (struct gpmc *)GPMC_BASE;

#if defined(CONFIG_CMD_NAND) || defined(CONFIG_CMD_ONENAND)
const u32 *gpmc_config = NULL;
u32 base = 0;
u32 size = 0;
#if defined(CONFIG_ENV_IS_IN_NAND) || defined(CONFIG_ENV_IS_IN_ONENAND)
u32 f_off = CONFIG_SYS_MONITOR_LEN;
u32 f_sec = 0;
#endif
/* global settings;初始化gpmc基本设置 */
writel(0x00000008, &gpmc_cfg->sysconfig);
writel(0x00000100, &gpmc_cfg->irqstatus);
writel(0x00000200, &gpmc_cfg->irqenable);
writel(0x00000012, &gpmc_cfg->config);
/*Disable the GPMC0 config set by ROM code*/
writel(0, &gpmc_cfg->cs[0].config7);
sdelay(1000);
#if defined(CONFIG_CMD_NAND) /* CS 0 */
        //gpmc_m_nand是gpmc cs的设置
gpmc_config = gpmc_m_nand;
base = PISMO1_NAND_BASE;
size = PISMO1_NAND_SIZE;
        //根据gpmc_m_nand中的配置设置gpmc_cfg->cs[0]
enable_gpmc_cs_config(gpmc_config, &gpmc_cfg->cs[0], base, size);
#endif
}
二.nand底层初始化
nand_init()调用nand_init_chip()来初始化寄存器设置和赋值相关操作函数;
uboot将nand操作封装成mtd子系统,其中mtd_info结构体表示mtd通用层的数据结构和操作函数;而nand_chip表示nand底层相关的数据结构和操作函数;其中mtd->priv=nand;即把底层的数据结构赋给mtd的priv,方便直接通过mtd获得;
在nand_init_chip()中,通过调用board_nand_init()来初始化基本寄存器和赋值chip相关函数,调用nand_scan()来初始化通用层需要的数据和赋值mtd层相关函数。
1.底层初始化
我们先来看board_nand_init():
int board_nand_init(struct nand_chip *nand)
{
cs = 0;
while (cs < GPMC_MAX_CS) {
/* Check if NAND type is set;看是否有设备连接上 */
if ((readl(&gpmc_cfg->cs[cs].config1) & 0xC00) == 0x800) {
/* Found it!! */
break;
}
cs++;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值