6、移植UBOOT之支持Nand Flash

上一节:5、移植UBOOT之支持Nor Flash

下一节:7、移植UBOOT之支持DM9000网卡

1、之前编译时出现的错误

之前由于nand部分报错,直接注释了 u-boot-2012.04.01\include\configs\smdk2440.h 中的#define CONFIG_CMD_NAND。现在我们去掉注释,重新编译。
在这里插入图片描述
报错如下:
在这里插入图片描述
这是由于我们没有定义CONFIG_S3C2410这个宏导致的:
在这里插入图片描述
可以看到下面有2440的NAND结构体
在这里插入图片描述

2、复制s3c2410_nand.c,修改宏定义支持SC32440

所以我们可以拷贝一份s3c2410_nand.c给2440,使用2410的NandFlash位于drivers/mtd/nand/s3c2410_nand.c,首先复制s3c2410_nand.c,改为s3c2440_nand.c
在这里插入图片描述
并修改drivers/mtd/nand/Makefile,如下图所示:
在这里插入图片描述
在上一节分析过CONFIG_NAND_S3C2410宏,位于include/configs/smdk2440.h
在这里插入图片描述
如上图所示,其中CONFIG_CMD_NAND宏表示uboot是否支持nand,在上节里我们把它屏蔽了,接下来便取消屏蔽CONFIG_CMD_NAND宏。

继续添加对CONFIG_NAND_S3C2440宏的支持,将:

/*
 * NAND configuration
 */
#ifdef CONFIG_CMD_NAND

#define CONFIG_NAND_S3C2410
#define CONFIG_SYS_S3C2410_NAND_HWECC

#define CONFIG_SYS_MAX_NAND_DEVICE  1
#define CONFIG_SYS_NAND_BASE              0x4E000000
#endif
/*
 * File system
 */

修改为:

/*
 * NAND configuration
 */
#ifdef CONFIG_CMD_NAND

#ifdef CONFIG_S3C2410          
#define CONFIG_NAND_S3C2410
#define CONFIG_SYS_S3C2410_NAND_HWECC
#else	// CONFIG_S3C2440      
#define CONFIG_NAND_S3C2440    
#define CONFIG_SYS_S3C2440_NAND_HWECC
#endif

#define CONFIG_SYS_MAX_NAND_DEVICE      1
#define CONFIG_SYS_NAND_BASE            0x4E000000
#endif
/*
 * File system
 */

其中CONFIG_S3C2410没有定义,而CONFIG_S3C2440定义了:
在这里插入图片描述
由于smdk2410.h中定义的是CONFIG_S3C2410,而smdk2440.h中定义的是CONFIG_S3C2440,所以便会根据上面的#ifdef来动态定义宏。

分析nand的初始化过程:nand_init()如下:

nand_init
	nand_init_chip
		board_nand_init	//单板相关的初始化
			设置nand_chip结构体, 提供底层的操作函数(即发命令、发地址、读数据等等)
		nand_scan	//识别nand flash
			nand_scan_ident
				nand_set_defaults
					chip->select_chip = nand_select_chip;	//选中芯片
					chip->cmdfunc = nand_command;	//发出读复位命令
					chip->read_byte = busw ? nand_read_byte16 : nand_read_byte;	//读数据
				nand_get_flash_type
					chip->select_chip
					chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1);
						nand_command()//即可发命令,也可发列地址(页内地址)、行地址(哪一页)
						chip->cmd_ctrl
							s3c2440_hwcontrol
					chip->cmdfunc(mtd, NAND_CMD_READID, 0x00, -1);
					*maf_id = chip->read_byte(mtd);
					*dev_id = chip->read_byte(mtd);

3、修改s3c2440_nand.c 中的NFCONF,NFCONT,支持S3C2440

往下看代码发现原来的NFCONF设置并不能匹配我们的2440,将s3c2440_nand.c中改为如下:
在这里插入图片描述
其中:
在这里插入图片描述
2440的NFCONF的15位是保留的:
在这里插入图片描述
所以注释掉这部分代码:
在这里插入图片描述2410 NFCONF的其他位设置也不匹配我们的2440:
在这里插入图片描述
2440NFCONF 时序参数设置:
在这里插入图片描述
s3c2440_hwcontrol函数中使能选中:
在这里插入图片描述
加粗样式
对照2440手册修改为支持2440的:
在这里插入图片描述
修改为:

int board_nand_init(struct nand_chip *nand) {
。。。
。。。
#if 0
	cfg = S3C2410_NFCONF_EN;
	cfg |= S3C2410_NFCONF_TACLS(tacls - 1);
	cfg |= S3C2410_NFCONF_TWRPH0(twrph0 - 1);
	cfg |= S3C2410_NFCONF_TWRPH1(twrph1 - 1);
#endif
	/* 初始化时序 */
	cfg = ((tacls-1)<<12)|((twrph0-1)<<8)|((twrph1-1)<<4);
	writel(cfg, &nand_reg->nfconf);

	/* 使能NAND Flash控制器, 初始化ECC, 禁止片选 */
	writel((1<<4)|(1<<1)|(1<<0), &nand_reg->nfcont);


	/* initialize nand_chip data structure */
	nand->IO_ADDR_R = (void *)&nand_reg->nfdata;
	nand->IO_ADDR_W = (void *)&nand_reg->nfdata;

	nand->select_chip = s3c2440_nand_select;

	/* read_buf and write_buf are default */
	/* read_byte and write_byte are default */
。。。
。。。

4、修改s3c2440_hwcontrol区分命令和地址

/* ctrl : 表示做什么, 选中芯片/取消选中, 发命令还是发地址
 * dat  : 命令值或地址值
 */
static void s3c2440_hwcontrol(struct mtd_info *mtd, int dat, unsigned int ctrl)
{
	struct s3c2440_nand *nand = s3c2440_get_base_nand();

	if (ctrl & NAND_CLE) {
		/* 发命令 */
		writeb(dat, &nand->nfcmd);
	} else if(ctrl & NAND_ALE) {
		/* 发地址 */
		writeb(dat, &nand->nfaddr);		
	}
}

5、添加选中芯片函数

修改board_nand_init函数中的`选中芯片函数:

nand->select_chip = NULL;             //设置CE ;

改为:

nand->select_chip = s3c2440_select_chip;             //设置CE ;

在这里插入图片描述

选中芯片函数s3c2440_select_chip如下:

static void s3c2440_nand_select(struct mtd_info *mtd, int chipnr)
{
	struct s3c2440_nand *nand = s3c2440_get_base_nand();

	switch (chipnr) {
	case -1: /* 取消选中 */
		nand->nfcont |= (1<<1);
		break;
	case 0:  /* 选中 */
		nand->nfcont &= ~(1<<1);
		break;

	default:
		BUG();
	}
}

编译烧写如下图所示,可以看到已支持Nand Flash:
在这里插入图片描述
试验nand是否能读写,烧写到nand flash:

nand erase 0 2000                      //擦除
mw.b 30000000 0x55 2000               //向30000000 写入0x55,长度为2000
nand write 30000000 0 2000        //将0x55写入nand,
nand dump 0 2000        //打印

如下图所示,可以看到读写nand都没问题:
在这里插入图片描述
开发版设置为nand启动,重新上电。完成支持nand即可发现nand启动时不支持读取nor flash,此时nor flash为0。
在这里插入图片描述

上一节:5、移植UBOOT之支持Nor Flash

下一节:7、移植UBOOT之支持DM9000网卡

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 要将U-Boot 2021移植到i.MX6ULL上,需要进行以下步骤: 1. 获取U-Boot 2021源代码,并解压缩。 2. 进入U-Boot源代码目录,执行make mx6ull_config命令,生成配置文件。 3. 执行make命令编译U-Boot。 4. 将编译好的U-Boot烧录到i.MX6ULL的启动设备上,例如SD卡或eMMC。 5. 在i.MX6ULL上启动U-Boot,可以通过串口或网络连接进行调试和配置。 需要注意的是,U-Boot移植需要根据具体的硬件平台进行调整和配置,例如时钟、存储器、网络等参数。同时,还需要根据具体的应用场景进行功能定制和优化。 ### 回答2: 如何移植uboot2021到imx6ull平台上呢?这里主要分为以下几个步骤: 1. 准备工作:获取uboot2021源码,编译工具链及imx6ull开发板。 2. 配置uboot:将uboot源码解压到本地目录,进入该目录执行make distclean命令清除旧的编译结果,接着执行make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mx6ull_14x14_evk_defconfig命令生成初始配置文件,该命令将生成一个.config文件,保存uboot的各种配置选项。若需要重新配置uboot,可以执行make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig命令,进入ncurses界面进行配置。 3. 编译uboot:执行make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf-命令编译uboot。编译完成后会生成u-boot.bin文件及其他相关文件。 4. 烧写uboot:将编译好的u-boot.bin文件烧写到imx6ull开发板上,可以使用JTAG或SD卡等方式进行烧写操作。 5. 测试uboot:烧写完成后重启开发板,在uboot命令行模式下执行命令,如printenv、boot等,验证uboot是否能够正常工作。 在这个过程中需要注意以下几点: 1. 在配置uboot时,需要参考imx6ull开发板的硬件配置文件进行相应的配置,如串口、网卡等。 2. 在编译uboot时,需要指定交叉编译工具链的路径及前缀,例如arm-linux-gnueabihf-。 3. 在烧写uboot前,需要确保imx6ull开发板已处于烧写模式,并准备好相应的烧写工具。 总结来说,移植uboot2021到imx6ull平台上需要对uboot进行配置、编译和烧写等操作,需要了解相关的硬件配置和交叉编译工具链等知识,同时需要注意进行正确的操作步骤和验证步骤。 ### 回答3: imx6ull是一款基于ARM Cortex-A7架构的嵌入式处理器,它广泛应用于物联网、智能家居、医疗设备等领域。移植U-Boot可以为imx6ull的开发和应用提供更多的功能和扩展性。本文将介绍如何移植U-Boot 2021到imx6ull平台上。 移植步骤: 1. 准备工具和环境:交叉编译工具、串口调试器和开发板。安装交叉编译工具,设置环境变量。 2. 下载U-Boot源码,并解压缩。 3. 选择imx6ull配置文件:从U-Boot源码中找到与imx6ull对应的配置文件,具体位置在“configs/”目录下。可以通过“make menuconfig”命令进行配置,或者手动复制对应的配置文件到“config/”目录下。 4. 编译U-Boot:执行“make”命令进行编译,输出“u-boot.bin”文件。 5. 烧录U-Boot:通过串口调试器将U-Boot烧录到开发板的Flash中。连接串口调试器,并使用命令“sudo minicom -s”打开串口设置界面。设置串口设备、波特率等参数,保存退出。使用“sudo minicom”命令即可进入串口终端,输入“Ctrl + C”进入U-Boot命令行模式。通过“mmc dev 0”和“mmc part”命令设置分区和卡设备。使用“fatls mmc 0:1”或“ext2ls mmc 0:1”查看文件系统,确认烧录地址和文件名。 6. 烧录软件:使用命令“fatload mmc 0:1 ${loadaddr} u-boot.bin”将U-Boot软件烧录到开发板中,然后通过“go ${loadaddr}”命令运行U-Boot。 注意事项: 1. 在选择配置文件时,要注意选择与开发板硬件一致的配置文件,否则可能会出现不可预知的问题。 2. 在烧录过程中,注意确认文件名和烧录地址是否正确,以免造成不可恢复的损失。 3. 在调试过程中,可以使用“printenv”命令查看环境变量,使用“setenv”命令设置和修改环境变量。 总结: 移植U-Boot需要使用交叉编译工具和串口调试器,选取开发板对应的配置文件,然后进行编译和烧录。在调试过程中要注意环境变量和文件名,避免出现不可预知的问题。U-Boot为开发者提供了更多的扩展性和功能,可以大大提高开发效率和应用体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZhangDaniel_ZD

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值