JZ2440学习笔记,第三部分,移植uboot2015支持JZ2440的nand flash

2024-01-25 16:48

本文主要是介绍JZ2440学习笔记,第三部分,移植uboot2015支持JZ2440的nand flash,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JZ2440学习笔记

Chili

2015.5

第三部分,移植uboot2015支持JZ2440的nand flash
6,修改uboot支持nand flash 
与nor flash的初始化类似,nand flash初始化在文件u-boot-2015.04-rc4\u-boot-2015.04-rc4-my2440\arch\arm\lib\Board.c 中的函数void board_init_r(gd_t *id, ulong dest_addr)中的nand_init()中进行,用sourceInsight一路跟踪代码,发现最后调用了S3c2410_nand.c (u-boot-2015.04-rc4\u-boot-2015.04-rc4-my2440\drivers\mtd\nand)对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)

图 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);

图 2

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


图 3
6.4编译烧写
book@book-desktop:~/uboot/u-boot-2015.04-rc4$ make
编译成功,烧写启动,打印如下,说明nand驱动成功。至此就可以使用nand命令进行操作flash了


图 4
6.5 解决nand write失败
经过上面一番更改,我们已经可以使用uboot自带的一些nand操作指令了,下面我们就来测试下效果如何,nand命令网上非常多资料,这种东西就可自行百度了解,其实百度上的都是别人看uboot后发上去的,那我们都可以自己看uboot帮助信息的,直接:
SMDK2410 # nand

图 5

帮助信息,说的很清楚哦,也别啥事都想到百度,自己可以想想想,解决看看。
先试试擦除,再nand dump 看下flash内数据:
SMDK2410 # nand erase 100000 100000
SMDK2410 # nand dump 100000
显示如下说明erase成功:

图 6

我们准备将内存30000000数据烧写进nand中,事先先看看内存中的数据是什么,等下好对比:
SMDK2410 # md 30000000

图 7

万事具备,开始烧写nand:
SMDK2410 # nand write 300000 100000 100000
SMDK2410 # nand dump 100000

图 8


咦?明明显示写入成功,为何数据还是FF,这说明数据压根都没写进去啊,多写几次还是如此,怎么回事啊?难道uboot有问题?放心这一般不可能,一定是你自己底层驱动写的有问题。先让我们理一理我们干了什么,忘了的童孩可以把6.1-6.3节重新复习遍:
6.1 设置S3C2440寄存器偏移和片选宏。
分析:可以读,但是写不进去,这里应该没问题,否则绝对无法读取数据的。
6.2 设置nand操作时序。
分析:还是那个原理,读数据都可以,说明读时序没问题,那么是不是写时序有问题?有可能,去检查设置时序和韦老师给的uboot1.6中nand 操作时序,发现一致,说明时序肯定也没问题。
6.3 修改s3c24x0_hwcontrol底层命令控制函数
刚说这个函数很重要,是上层操作nand函数的最底层函数,ok,我们仔细看看,是不是哪里疏忽了:

图 9


在最后,添加IO_W的默认寄存器指向。

图 10

保存编译烧写,启动,测试:
SMDK2410 # nand erase 100000 100000
SMDK2410 # nand dump 100000
SMDK2410 # nand write 30000000 100000 100000
SMDK2410 # nand dump 100000
擦除后数据:


图 11


Ok,写入成功!至此,nand flash驱动工作完全正常!

这篇关于JZ2440学习笔记,第三部分,移植uboot2015支持JZ2440的nand flash的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/643916

相关文章

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二