分析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位的整型數,呼叫該函式需要四個引數。第乙個引數乙個指標,也就是使用者 的首位址,在平時使用中我們把自己建立的任務的名字作為這個引數就可以了 第三...