接着上一篇文章写的内容(上一篇文章链接:移植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语言,数据结构等技术问题!

移植uboot之修改代码支持NorFlash记录续集相关推荐

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

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

  2. 移植uboot之修改代码支持NorFlash记录

    学习交流加 个人qq: 1126137994 个人微信: liu1126137994 学习交流资源分享qq群: 962535112 今天我们的任务是修改uboot源码支持NorFlash. 上两篇关于 ...

  3. jz2440开发板移植U-boot之修改代码支持DM9000网卡

    今天我们来移植U-boot到jz2440开发板,修改代码支持DM9000网卡.查看之前写的移植记录请点击链接:点击查看之前的移植记录 现在大多数开发板都支持DM9000网卡.我们的U-boot源码里面 ...

  4. 五、移植u-boot-2016.03到Jz2440之修改代码支持NOR Flash

    5. 移植u-boot-2016.03修改代码支持NOR Flash 从上一节把uboot烧写到NAND启动后,最后打印出Flash: 0 Bytes,如下图所示.我们的Jz2440开发板的NOR F ...

  5. 移植u-boot-2012.04.01到jz2440开发板之修改代码支持NAND启动

    上一篇文章我们已经修改了uboot源码使其能够正常打印输出了,但是输出停到了nand启动那里,所以这篇文章就来记录如何修改源码使uboot支持NAND启动. 原来的代码在链接时加了"-pie ...

  6. 移植uboot第九步:支持yaffs映像烧写

    写在前面: 我的博客已迁移至自建服务器:博客传送门,CSDN博客暂时停止,如有机器学习方面的兴趣,欢迎来看一看. 此外目前我在gitHub上准备一些李航的<统计学习方法>的实现算法,目标将 ...

  7. 1--新唐nuc980 NUC980移植 UBOOT,从外部mx25l启动

    1.下载官方源码U-boot 2.修改配置支持外部spi nor flash https://blog.csdn.net/LOTOOHE/article/details/114291715 3.增加C ...

  8. 移植U-BOOT之裁剪和修改默认参数(易用性)启动内核,以及对uboot进行分区

    今天我们来裁剪U-BOOT,使其更加易用,修改默认参数,以及制作最终修改好得补丁文件方便以后的快速移植. 那么如果想看之前的关于网卡以及flash等的移植,请点击链接查看:点击链接查看 在裁剪修改之前 ...

  9. TQ2440的学习——UBOOT移植(串口控制台的支持)

    这里让UBOOT使用串口作为控制台输出,必须要保证串口功能被完善的支持.不过在启动到初始化串口功能之前,我们必须保证前面的初始化功能能顺利走完. 先来看看UBOOT的一个启动流程: UBOOT起始代码 ...

最新文章

  1. 如何修改IE的默认标题
  2. DedeCMS Wap.php绑定域名的方法
  3. 腾讯开源国际化新突破,将紧密参与全球开源治理
  4. Angular 自定义结构化指令,如何传入多个输入参数
  5. ACM算法--二分法--模板
  6. cannot load php5,Cannot load php5apache2_4.dll into server解决办法
  7. jQuery 基础事件
  8. Kafka Partition Leader选举机制原理详解
  9. 是夫妻就一起把它戒了吧!
  10. jmeter学习总结
  11. 《王道计算机网络》学习笔记总目录+思维导图
  12. Stemming词干提取 和 Lemmatization 词形还原
  13. 02_如何计算叔块奖励
  14. oracle 数据占百分比,占总数比例怎么算_占总金额百分比公式
  15. 数字化闯入“深水区”,超级营销平台是突破口吗?
  16. 英雄之盾-第11届蓝桥杯Scratch省赛真题第4题
  17. 微贷网java高级开发工程师
  18. 在单点登录中,如果cookie被禁用了怎么办?
  19. 程序员薪酬到底有多高?来看硅谷的工程师统计
  20. 九州量子黄蕾蕾:我们是冲着量子通信产业化来的

热门文章

  1. emqx使用webhook数据持久化到mysql
  2. Vh和Vw的简介和使用
  3. 谷歌开源的 GAN 库--TFGAN
  4. 阿里云服务器邮件发送
  5. Oracle 用户,角色,权限等
  6. SICK TiM561激光雷达的使用
  7. 见微知著(一):解析ctf中的pwn--Fast bin里的UAF
  8. 几个比58同城交换更好玩的交换玩法
  9. LocalBroadcastManager 的使用
  10. mysql往前一天同一时间_Mysql时间轴数据 获取同一天数据的前三条