生活随笔
收集整理的這篇文章主要介紹了
移植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;
才導致的無法寫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 ;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端口寬度的操作的有哪些?看來是當初加這個結構體時有問題:
{
.mfr _id = (u16)MX_MANUFACT,
.dev _id =
0x2249 ,
.name =
"MXIC MX29LV160DB" ,
.uaddr = { [
0 ] = MTD_UADDR_0x0555_0x02AA },
.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记录续集 的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。