完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
JZ2440学习笔记 Chili 2015.5 第三部分,移植uboot2015支持JZ2440的nand flash 6,修改uboot支持nand flash 与nor flash的初始化类似,nand flash初始化在文件u-boot-2015.04-rc4u-boot-2015.04-rc4-my2440archarmlibBoard.c 中的函数void board_init_r(gd_t *id, ulong dest_addr)中的nand_init()中进行,用sourceInsight一路跟踪代码,发现最后调用了S3c2410_nand.c (u-boot-2015.04-rc4u-boot-2015.04-rc4-my2440driversmtdnand)对nand进行初始化,那么本次我们就需要修改此文件。 6.1 修改S3c2410_nand.c 寄存器偏移宏定义 book@book-desktop:~/uboot/u-boot-2015.04-rc4$ vim drivers/mtd/nand/s3c2410_nand.c 因为,S3C2440和2410的nand控制器有些区别,时序设置需要多设置一个寄存器,而且寄存器偏移不一致,因此添加如下图所示的宏定义,添加: #define S3C2440_ADDR_NALE 12 #define S3C2440_ADDR_NCLE 8 #define S3C2440_NFCONT_nFCE (1<<1)
6.2修改board_nand_init函数设置时序 由于2440的nand控制寄存器与2410有区别,所以要做修改: tacls = 0; twrph0 = 4; twrph1 = 2; ... writel(((tacls<<12) | (twrph0<<8)|(twrph1<<4)), &nand_reg->nfconf); writel((1<<0)|(0<<1)|(1<<4), &nand_reg->nfcont);
6.3修改s3c24x0_hwcontrol函数 Uboot的nand驱动最重要的就是这个函数了,它实现了nand读写的最底层控制,此处修改不当直接导致nand驱动不起来,因此需要特别注意。修改如下: #if defined(CONFIG_S3C2410) if (ctrl & NAND_NCE) writel(readl(&nand->nfconf) & ~S3C2410_NFCONF_nFCE, &nand->nfconf); else writel(readl(&nand->nfconf) | S3C2410_NFCONF_nFCE, &nand->nfconf); #elif defined(CONFIG_S3C2440) if (ctrl & NAND_NCE)/* modified by chili, 2440*/ writel(readl(&nand->nfcont) & ~S3C2440_NFCONT_nFCE, &nand->nfcont); else writel(readl(&nand->nfcont) | S3C2440_NFCONT_nFCE, &nand->nfcont); #endif
6.4编译烧写 book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make 编译成功,烧写启动,打印如下,说明nand驱动成功。至此就可以使用nand命令进行操作flash了
6.5 解决nand write失败 经过上面一番更改,我们已经可以使用uboot自带的一些nand操作指令了,下面我们就来测试下效果如何,nand命令网上非常多资料,这种东西就可自行百度了解,其实百度上的都是别人看uboot后发上去的,那我们都可以自己看uboot帮助信息的,直接: SMDK2410 # nand
帮助信息,说的很清楚哦,也别啥事都想到百度,自己可以想想想,解决看看。 先试试擦除,再nand dump 看下flash内数据: SMDK2410 # nand erase 100000 100000 SMDK2410 # nand dump 100000 显示如下说明erase成功:
我们准备将内存30000000数据烧写进nand中,事先先看看内存中的数据是什么,等下好对比: SMDK2410 # md 30000000
万事具备,开始烧写nand: SMDK2410 # nand write 300000 100000 100000 SMDK2410 # nand dump 100000
咦?明明显示写入成功,为何数据还是FF,这说明数据压根都没写进去啊,多写几次还是如此,怎么回事啊?难道uboot有问题?放心这一般不可能,一定是你自己底层驱动写的有问题。先让我们理一理我们干了什么,忘了的童孩可以把6.1-6.3节重新复习遍: 6.1 设置S3C2440寄存器偏移和片选宏。 分析:可以读,但是写不进去,这里应该没问题,否则绝对无法读取数据的。 6.2 设置nand操作时序。 分析:还是那个原理,读数据都可以,说明读时序没问题,那么是不是写时序有问题?有可能,去检查设置时序和韦老师给的uboot1.6中nand 操作时序,发现一致,说明时序肯定也没问题。 6.3 修改s3c24x0_hwcontrol底层命令控制函数 刚说这个函数很重要,是上层操作nand函数的最底层函数,ok,我们仔细看看,是不是哪里疏忽了: |
|
|
相关推荐
|
|
飞凌嵌入式ElfBoard-文件I/O的深入学习之阻塞I/O与非阻塞I/O
307 浏览 0 评论
大神们,想知道你们都用什么ide编程调试器? Arduino IDE?还是 e2studio ?还有其他吗?哪个好用呢
459 浏览 0 评论
825 浏览 0 评论
790 浏览 0 评论
飞凌嵌入式ElfBoard-文件I/O的了解探究之复制文件描述符
717 浏览 0 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 08:50 , Processed in 0.787474 second(s), Total 73, Slave 54 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖