nor flash函式分析

2021-08-07 19:46:40 字數 4023 閱讀 7737

分析nor  flash**來自韋東山的uboot1.1.6

在這裡主要分析函式:

ulong flash_init (void);

void flash_print_info (flash_info_t * info);

int flash_erase (flash_info_t * info, int s_first, int s_last);

volatile static int write_hword (flash_info_t * info, ulong dest, ushort data);

int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)

一、ulong flash_init (void)

首先介紹一下nor flash的結構體變數:

typedef struct  flash_info_t;
nor  flash的結構體如上:

定義flash的大小、塊數、id、每塊的的起始位址、每塊保護狀態標記位;接著定義適用於cfi的標準介面,我們這裡沒有採用。

ulong flash_init (void)

/* 2nd and 3rd are both 8 kb */

if ((j == 1) || (j == 2))

/* 4th 32 kb */

if (j == 3)

} else

} size += flash_info[i].size;

} flash_protect (flag_protect_set,

cfg_flash_base,

cfg_flash_base + monitor_flash_len - 1,

&flash_info[0]);

flash_protect (flag_protect_set,

cfg_env_addr,

cfg_env_addr + cfg_env_size - 1, &flash_info[0]);

return size;

}

第6行的for迴圈執行一次,原因:nor flash只有一塊

7行:定義變數儲存flash的大小。

9-18行:寫nor flash的id,對flash結構體中的變數id進行初始化

19-53: 對flash的結構體進行初始化,考慮flash的塊有小塊

54-62:對uboot的**、環境變數進行保護

二:void flash_print_info (flash_info_t * info)

函式的列印資訊

三:int flash_erase (flash_info_t * info, int s_first, int s_last)

nor flash的擦除。

int flash_erase (flash_info_t * info, int s_first, int s_last)

if ((info->flash_id & flash_vendmask) !=

(amd_manufact & flash_vendmask))

prot = 0;

for (sect = s_first; sect <= s_last; ++sect)

} if (prot)

return err_protected;

/* * disable interrupts which might cause a timeout

* here. remember that our exception vectors are

* at address 0 in the flash, and we don't want a

* chip is in programming mode.

*/cflag = icache_status ();

icache_disable ();

iflag = disable_interrupts ();

/* start erase on unprotected sectors */

for (sect = s_first; sect <= s_last && !ctrlc (); sect++)

if (!chip

&& (result & 0xffff) & bit_erase_done)

chip = ready;

if (!chip

&& (result & 0xffff) & bit_program_error)

chip = err;

} while (!chip);

mem_flash_addr1 = cmd_read_array;

if (chip == err)

if (chip == tmo)

printf ("ok.\n");

} else

} if (ctrlc ())

printf ("user interrupt!\n");

outahere:

/* allow flash to settle - wait 10 ms */

udelay_masked (10000);

if (iflag)

enable_interrupts ();

if (cflag)

icache_enable ();

return rc;

}

10-11:檢查flash的id是否正確

13-14:檢測flash的塊設定是否正確

23-26:遍歷所要擦除的塊,如果有保護塊,退出

38-41:關閉中斷、**快取。防止在操作flash的過程中造成中斷、擦除不成功。

43:遍歷塊迴圈

47:復位時間戳,用於統計擦除時間

49-58:進行擦除操作,6個迴圈

60-96:對擦除結果進行分析,如果延時時間到,退出;分析是否擦除完畢與擦除錯誤

最後:開中斷、開**快取等

四:int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)

flash的寫資料

int write_buff (flash_info_t * info, uchar * src, ulong addr, ulong cnt)

for (; i < 2 && cnt > 0; ++i)

for (; cnt == 0 && i < 2; ++i, ++cp)

if ((rc = write_hword (info, wp, data)) != 0)

wp += 2;

} /*

* handle word aligned part

*/while (cnt >= 2)

src += 2;

wp += 2;

cnt -= 2;

} if (cnt == 0)

/* * handle unaligned tail bytes

*/data = 0;

for (i = 0, cp = wp; i < 2 && cnt > 0; ++i, ++cp)

for (; i < 2; ++i, ++cp)

return write_hword (info, wp, data);

}

此程式應該在開始時候進行保護位的校驗。不校驗在回來的寫函式中也不能寫成功,

13-30,判斷開始位址是否為字對齊,如果不是進行調節。注意我們的是小端。高位為高位元組

36-44,寫操作

44-60,判斷結束為止是否為字對齊,如果不是,進行調節

六、volatile static int write_hword (flash_info_t * info, ulong dest, ushort data)

寫操作、可以參考擦除操作。

OSTaskCreate()函式分析

int8u ostaskcreate void task void pd void p arg,os stk ptos,int8u prio 函式返回乙個8位的整型數,呼叫該函式需要四個引數。第乙個引數乙個指標,也就是使用者 的首位址,在平時使用中我們把自己建立的任務的名字作為這個引數就可以了 第三...

getopt函式分析

函式getopt主要用於拆分命令列引數,用這個函式就不自己寫命令列引數解析程式了,以下 摘自tcpdump原始碼,對這個函式比較感興趣,故對此進行分析注釋,因水平實在不敢恭維,不足之處希望能一起 函式getopt 有三個引數,nargc,nargv就是命令列傳過來的argc和argv字串ostr,它...

uCOS OSTaskCreate()函式分析

int8u ostaskcreate void task void pd void p arg,os stk ptos,int8u prio 函式返回乙個8位的整型數,呼叫該函式需要四個引數。第乙個引數乙個指標,也就是使用者 的首位址,在平時使用中我們把自己建立的任務的名字作為這個引數就可以了 第三...