移植uboot之修改代码支持NorFlash记录续集

接着上一篇文章写的内容(上一篇文章链接:移植uboot之修改代码支持NORFLASH),上一篇结尾测试flash的擦除读写功能,结果无法写flash,卡在了这里:
这里写图片描述
前面已经擦除成功,这里写内容写不进去,显示没有擦除成功。一开始怀疑是不是硬件问题,后来用好的uboot试了一下,是可以实现写功能的,所以排除了硬件的问题。软件有问题?看一下代码关于擦除读写的内容吧,根据串口打印的消息搜索字符串信息:Copy to Flash… 以及Flash not Erased信息。
通过搜索相关字符串消息,搜索到Cfi_flash.c中有函数:write_buff这个函数,这个函数里面有

rc = flash_write_cfiword (info, wp, cword);        if (rc != 0)
            return rc;
.......if ((rc = flash_write_cfibuffer (info, wp, src, i)) != ERR_OK)return rc;
.......if ((rc = flash_write_cfiword (info, wp, cword)) != 0)
                return rc;
......if ((rc = flash_write_cfiword (info, wp, cword)) != 0)return rc;
......return flash_write_cfiword (info, wp, cword);

通过将上面几个判断语句屏蔽掉,然后重新编译,测试,发现可以写flash了,那么接下来就该看是哪个判断语句执行了导致无法写flash的。
通过逐个将上面结合判断语句屏蔽,最后发现是执行了这些:

while (cnt >= info->portwidth) {cword.l = 0;for (i = 0; i < info->portwidth; i++) {flash_add_byte (info, &cword, *src++);}if ((rc = flash_write_cfiword (info, wp, cword)) != 0)return rc;  //lyy

才导致的无法写flash,心累啊,调试过程漫长啊,烧写编译烧写编译烧写。。。。。不过找到了问题所在,我很开心!!!
由上面代码知结构体数据info->portwidth这一项出了问题,也就是flash的端口宽度有问题。跳转到函数:flash_write_cfiword:

/*-----------------------------------------------------------------------*/
static int flash_write_cfiword (flash_info_t * info, ulong dest,cfiword_t cword)
{void *dstaddr = (void *)dest;int flag;flash_sect_t sect = 0;char sect_found = 0;/* Check if Flash is (sufficiently) erased */switch (info->portwidth) {case FLASH_CFI_8BIT:flag = ((flash_read8(dstaddr) & cword.c) == cword.c);break;case FLASH_CFI_16BIT:flag = ((flash_read16(dstaddr) & cword.w) == cword.w);break;case FLASH_CFI_32BIT:flag = ((flash_read32(dstaddr) & cword.l) == cword.l);break;case FLASH_CFI_64BIT:flag = ((flash_read64(dstaddr) & cword.ll) == cword.ll);break;default:flag = 0;break;}if (!flag)return ERR_NOT_ERASED;...........................
...........................
...........................//省略号代表后面还有其他代码

我将上面的判断语句屏蔽掉,重新烧写启动,果然,可以正常写FLASH。看来问题就是出在上面的switch (info->portwidth)结构中,端口宽度的问题!!!!

现在想想应该是哪里错了呢?
1.排除硬件问题,因为我烧写uboot都是通过旧的uboot烧写新的uboot,中间存在擦除与写flash操作
2.这之前修改代码涉及到flash端口宽度的操作的有哪些?看来是当初加这个结构体时有问题:

/* jz2440使用的是MX29LV160DB芯片 */{.mfr_id     = (u16)MX_MANUFACT, /*厂家ID*/.dev_id     = 0x2249,           /*设备ID*/.name       = "MXIC MX29LV160DB",.uaddr      = {             /*NOR FLASH看到的解锁地址*/[0] = MTD_UADDR_0x0555_0x02AA /* x16 */},.DevSize    = SIZE_2MiB,    /* 总大小 */.CmdSet     = P_ID_AMD_STD,.NumEraseRegions= 4,   /* 擦除区域的数目 */.regions    = {   ERASEINFO(16*1024, 1),ERASEINFO(8*1024, 2),ERASEINFO(32*1024, 1),ERASEINFO(64*1024, 31),}},

看来是这句话的问题了,[0] = MTD_UADDR_0x0555_0x02AA /* x16 */,我们的16位宽,应该是1,将其改成:

[1] = MTD_UADDR_0x0555_0x02AA /* x16 */

重新编译uboot,烧写测试:
这里写图片描述
一个字:完美!!!!!
感慨一下这次的调试过程:提升了一个档次吧~(之前挺菜的)

想获得各种学习资源以及交流学习的加我:
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/423349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#开发终端式短信的原理和方法

本文示例源代码或素材下载 简介 没发过短信的年轻人肯定是属于那种受保护的稀有动物&#xff0c;通讯发达的今天短信已经成为人们交流的重要手段&#xff0c;其中也蕴含着巨大的市场和经济利益&#xff0c;掌握短信技术的人才也受到各大公司的追捧是目前职场上耀眼的明星。本文…

移植uboot之修改代码支持NorFlash记录续集二

先说一个事&#xff1a;我会在最后把移植好的uboot&#xff0c;内核&#xff0c;分别做一个补丁文件&#xff0c;以后如果用到相同的uboot以及内核都可以直接下载我这个补丁进行打补丁操作就可以直接用~ 上一个移植uboot续集&#xff0c;我们解决了无法写flash的问题&#xff…

Mysql function(函数)

1.mysql 拼接函数 1. 1CONCAT(string1,string2,…) 说明 : string1,string2代表字符串,concat函数在连接字符串的时候&#xff0c;只要其中一个是NULL,那么将返回NULL 1.2 CONCAT_WS(separator,str1,str2,...)说明 : string1,string2代表字符串,concat_ws 代表 conca…

【C++深度剖析教程6】C++之友元

这几天在复习数学考试&#xff0c;都没有学C&#xff0c;今天抽空来学一点。 什么是友元&#xff1f; 友元是C中的一种关系友元发生在函数与类之间或者类与类之间友元关系是单向的&#xff0c;不能传递 在具体讲解友元的性质之前&#xff0c;我们先来看看一个程序&#xff…

SpringAOP xml 方式和注解简单实现日志处理

1.首先是用注解方式捕捉Controller 层异常&#xff1a; 首先是引入aop 依赖的jar <!-- Spring AOP 日志管理需要导入的包 --><dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.8.13</…

call stack and stack buffer overflow

http://en.wikipedia.org/wiki/Call_stack http://en.wikipedia.org/wiki/Stack_buffer_overflow Stack_buffer_overflow里提到的frame pointer 的位置不一样&#xff0c;不同的系统实现应该是不一样的。 运行时的栈是从高地址向低地址分配的&#xff0c;堆是从低地址向高地址…

谈一下我对如何设计微服务接口的理解和思考

微服务是一个独立运行、自带数据存储管理&#xff0c;对外提供接口的自治系统。微服务设计很关键的一点是微服务接口的设计。不同微服务经常是分配给不同的团队开发的&#xff0c;接口是各团队编程的契约。 下面只讨论微服务间接口的设计&#xff0c;至于微服务内部子模块间接…

【C++深度剖析教程7】C++之类中的函数重载

函数重载的回顾&#xff08;接上一篇文章&#xff09;&#xff1a; 函数重载的本质为相互独立的不同的函数C中通过函数名和函数参数确定函数调用无法直接通过函数名得到重载函数的入口地址函数重载必然发生在同一个作用域中 类中的成员函数可以进行重载 构造函数的重载普通成…

Linux 服务器远程控制三剑客Telnet、SSH 和 VNC 之 VNC

使用VNC服务实现远程控制Telnet和SSH服务只能实现基于字符界面的远程控制&#xff0c;如果要基于图形界面进行远程控制&#xff0c;可以借助免费的VNC来完成。VNC是VirtualNetworkComput-ing英文的缩写&#xff0c;它是一款优秀远程控制软件&#xff0c;类似Windows的终端服务。…

嵌入式Linux操作系统移植IMX6开发板之实现USB 自动挂载

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 本篇文章讲述如何实现USB自动挂载&#xff0c;U盘即插即用&#xff0c;不用手动挂载的方法&#xff0c;以及给出U盘自动挂载的原理。 目前做的IMX6开发…

C# 繁体,简体 互转

usingMicrosoft.VisualBasic; publicstaticstringTraditional2Simplified(stringstr) { //繁体转简体 return(Microsoft.VisualBasic.Strings.StrConv(str, Microsoft.VisualBasic.VbStrConv.SimplifiedChinese, 0)); } publicstaticstringSimplified…

【C++深度剖析教程8】C++的操作符重载的概念

之前学习了类的函数重载的概念&#xff0c;今天学习操作符重载的概念。在这之前我们先看一个例子&#xff1a; 上面是一个复数的加法&#xff0c;a为复数的实部&#xff0c;b为复数的虚部&#xff0c;在main函数里我想实现复数c1与c2的加法。很显然&#xff0c;正常的号操作符…

大数据开发者应该知道的分布式系统 CAP 理论

无论你是一个系统架构师&#xff0c;还是一个普通开发&#xff0c;当你开发或者设计一个分布式系统的时候&#xff0c;CAP理论是无论如何也绕不过去的。本文就来介绍一下到底什么是CAP理论&#xff0c;如何证明CAP理论&#xff0c;以及CAP的权衡问题。 CAP理论概述 CAP理论&a…

【C++深度剖析教程11】C++学习之编写代码实现复数类

今天&#xff0c;我来学习将复数的加减乘除以及比较运算&#xff0c;编写一个复数类&#xff0c;方便计算复数之间的运算。具体用的方法就是之前写过的操作符重载的概念来实现&#xff08;操作符重载的概念学习&#xff09;。 那么为了显得清晰&#xff0c;今天写的程序运用模块…

IT餐馆—第二十五回 结对

周五开会时&#xff0c;有人提出在团队中采用结对开发的Agile实践。 当然团队里有人说&#xff0c;如果让新手与水平高的人结对&#xff0c;基本上就是知识的单向传递了&#xff0c;对于新手来说的确是个不错的学习机会&#xff0c;但对于水平高的开发者&#xff0c;就未必不乐…

Spring Cloud各组件总结归纳

前面介绍了很多Spring Cloud的组件&#xff0c;本篇按照自己的角度来做一次归纳。 Spring Cloud技术应用从场景上可以分为两大类&#xff1a;润物无声类和独挑大梁类。 润物无声&#xff0c;融合在每个微服务中、依赖其它组件并为其提供服务。 Ribbon&#xff0c;客户端负载均…

移植Linux系统到iMX6开发板之LVDS显示屏驱动程序的框架分析与移植

学习交流加 个人qq&#xff1a; 1126137994个人微信&#xff1a; liu1126137994学习交流资源分享qq群&#xff1a; 962535112 今天记录一下项目中的关于LVDS显示屏的驱动程序的分析与移植。因为驱动源码厂家已经提供好&#xff0c;我们需要做的就是读懂驱动程序的代码&#xff…

Java api 1.8 中文 帮助文档

java 1.6 帮助文档 中文 链接&#xff1a;http://download.csdn.net/detail/qw599186875/9608735 英文 Java1.8 帮助文档 英文 中文 – 谷歌版 在线版: https://blog.fondme.cn/apidoc/jdk-1.8-google/下载链接&#xff1a;http://download.csdn.net/detail/qw599186875/980219…

设计模式记--Observer Pattern观察者模式

观察者模式——定义了对象之间的一对多依赖&#xff0c;这样一来&#xff0c;当一个对像改变状态时&#xff0c;它的所有依赖者都会收到通知并自动更新. 从定义可以看出,OBSERVER(观察者)模式逻辑上需要两组对象来实现.首先它必需要有发布者(Publish),也可称为被观察的目标 (…

前端学习(64):css继承属性小结

今天来总结一点关于css中哪些属性可以被继承&#xff0c;哪些不可以被继承。不是很全&#xff0c;仅供大家参考&#xff0c;也方便于自己以后复习。 一、不能被继承的属性 1、display&#xff1a;规定元素应该生成的框的类型 2、文本属性&#xff1a; vertical-align、 text…