日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/10 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 移植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語言,數據結構等技術問題!

總結

以上是生活随笔為你收集整理的移植uboot之修改代码支持NorFlash记录续集的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。