u-boot-2016.09移植(7)-nandflash
一、uboot中增加NANDFLASH 由第二节分析得知,硬件初始化在board_init_r中,我们到这里找到nand的初始化: u-boot-2016.09$ vim common/board_r.c 看这里知道首先我们需要定义宏CONFIG_CMD_NAND,屏蔽CONFIG_CMD_ONENAND,才可以调用nand的初始化函数,在include/conifgs/tq210.h中定义宏: #define CONFIG_CMD_NAND 编译,发现没有定义CONFIG_SYS_MAX_NAND_DEVICE,由于我们的板子上只有一个nandflash,所以在tq210.h中定义宏: #define CONFIG_SYS_MAX_NAND_DEVICE 1 再次编译,发现没有定义CONFIG_SYS_NAND_BASE,查看datasheet,定义宏: #define CONFIG_SYS_NAND_BASE 0xB0E00000 再次编译,还是出错,onenand_mtd和board_nand_init又没有定义,查看common/Makefile 我们需要把环境变量保存到nand,所以屏蔽掉CONFIG_ENV_IS_IN_ONENAND,并定义宏CONFIG_ENV_IS_IN_NAND #define CONFIG_ENV_IS_IN_NAND 再次变编译,发现onenand_mtd的错误消失,只有board_nand_init没有定义了。搜索代码,发现只drivers/mtd/nand/s3c2410_nand.c中有定义,于是我们仿照s3c2410_nand.c修改一个s5pv210_nand.c obj-$(CONFIG_NAND_S5PV210) += s5pv210_nand.o #define CONFIG_NAND_S5PV210 首先我们需要用到nand相关的寄存器操作,在arch/arm/mach-s5pv210/include/mach/cpu.h中添加nand的基地址和宏 #define S5PV210_NAND_BASE 0xB0E00000 SAMSUNG_BASE(nand,NAND_BASE) 然后在arch/arm/mach-s5pv210/include/mach/下创建文件nand_reg.h,定义 NAND 的寄存器结构体 u-boot-2016.09$ vim arch/arm/mach-s5pv210/include/mach/nand_reg.h 然后在s5pv210_nand.c 中添加头文件 #include <asm/arch/nand_reg.h> 在board_nand_init进行相关的初始化,增加函数s5pv210_nand_select_chip,这个片选函数最终将调用s5pv210_hwcontrol,修改s5pv210_hwcontrol函数,这个函数主要做一些硬件相关的操作,比如发命令、发地址、片选。 编译,发现产生u-boot.bin,烧录发现不能识别出nand的信息,前面已经配置好了串口,所以这里就进行打印调试,最终发现是nand_scan中chip信息有问题,搜索尝试发现在drivers/mtd/nand/nand.c中static void nand_init_chip(int i)函数中添加mtd->priv = nand;就可以解决问题。 二、给nandflash分区: 在tq210.h中,已经有NAND分区的例子,我们直接修改 256K给u-boot,128K给params,即环境变量,3M给内核,剩余的全部给根文件系统,这里指定了环境变量在NAND的分区所在的地址空间,在tq210.h中定义了其所在的地址和大小,两者必须保持一致。 重新编译,将u-boot.bin烧录进开发板,打开串口,开发板上电,发现nand信息已经打印出来。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |