U-BOOTのためのNANDフラッシュ supportコマンド
NANDフラッシュのサポートは、主にUBOOTで、コマンドラインでNANDフラッシュの動作を実現しています。NANDフラッシュコマンドが実装されている:NAND情報、NANDデバイス、NAND型読み取り、NANDの書き込み、NAND型erease、ナンド悪いです。
使用される主なデータ構造は以下のとおりです。構造体nand_flash_dev、構造体nand_chip。前者は、メインチップモデル、記憶容量を含み
デバイスID、I / Oバス幅情報、後者は、NANDフラッシュ動作の特定の情報に使用されます。
3.2.1導入されたメインデータ構造を
- データ構造の構造体nand_flash_dev
このデータ構造を含む/リナックス/ MTD / nand_ids.hにおける初期値で、含む/リナックス/ MTD / nand.hで定義されています。構造体nand_flash_dev {
* N-チャーAME; / *チップ名* / INT manufacture_id; / *メーカーID * / INT MODEL_ID; / *モードID * /
int型chipshift; / * NANDフラッシュアドレスビット* /
char型のpage256; / * 256バイトかどうかを示します。1:はい; 0:いいえ * /
文字pageadrlen; / *完全なアドレスの送信がでNFADDRに数回送信する必要があります。* /符号なしlong erasesize; / *消去ブロックは、バイトの数を消去します* /
INT bus16; / *かどうか16ビットのアドレスライン、1:はい; 0:なし* /
}。
- データ構造の構造体nand_chip
このデータ構造を含む/リナックス/ MTD / nand.hで定義された構造は、NANDフラッシュデバイスのアレイに定義されている:構造体nand_chip nand_dev_desc [CFG_MAX_NAND_DEVICE] ;.
アレイにおけるnand_probe()で初期化します。
構造体nand_chip {
int型 |
page_shift; |
/ *ページのアドレスビット |
* / |
u_char型 |
* data_buf; |
/ *データは、この時間を読み出します |
* / |
u_char型 |
* data_cache; |
/ *データの読み出し |
* / |
int型 |
cache_page; |
/ *最後の操作のページ番号 |
* / |
u_char型ecc_code_buf [6]; / * ECCチェックコード* / u_char型予約[2]。
チャーCHIPID; / *チップID番号* /
構造体ナンド*チップ; / * NANDフラッシュチップのリストには、一つのデバイス* / int型chipshiftに複数のチップのための支持を表明しました。
char * chips_name; / * NANDフラッシュチップ名* /
unsigned long型erasesize; / *消去ブロックサイズ* /
unsigned long型メーカ; / *ベンダーID * /
unsigned long型のid; / *モードID * /
文字*名; / *デバイス名* /
int型numchips; / *いくつかのNANDフラッシュチップは、* /あり
チャーpage256; / * Aが256バイト、又は512バイト* /チャーでpageadrlen; / *ページアドレス*の長さ/
unsigned long型IO_ADDR; / * / * NANDフラッシュの合計サイズ; / * NANDフラッシュに対処するためのアドレス値* / unsigned long型totlenを保存
UINT oobblock; 1の/ *サイズ。/ *スペアアレイサイズ;この段落のNANDフラッシュは、512 * / UINT oobsizeです。/ * / * ECCサイズ;この段落のNANDフラッシュは、16 * / UINT eccsizeです
INT bus16; / *かどうか16ビットのアドレスライン、1:はい; 0:なし* /
}。
3.2.2サポートコマンド機能説明
- NAND情報/ NANDデバイスの機能:現在のNANDフラッシュチップの情報を表示します。関数呼び出しの関係は(年代順に)次のとおりです。
静的な無効nand_print(構造体nand_chipの*のNAND)。
- 機能NAND消去:指定されたブロックのデータを消去します。関数呼び出しの関係は(年代順に)次のとおりです。
int型nand_erase(構造体nand_chip * NAND、size_tののOFS、size_tのLEN、クリーンINT);
- NANDの悪いです
機能:不良ブロックを表示します。関数呼び出しの関係は(年代順に)次のとおりです。
静的な無効nand_print_bad(構造体nand_chipの*のNAND)。
int型check_block(構造体nand_chipの*のNAND、unsigned long型POS);
- NAND型読みます
機能:SDRAMへのNANDフラッシュ情報を読み込みます。
関数呼び出しの関係は(年代順に)次のとおりです。
int型nand_rw(構造体nand_chip * NANDは、cmdをint型開始、size_tの、size_tのLEN、size_tの* retlen、u_char型* BUF)。静的int型nand_read_ecc(構造体nand_chipの*のNAND、開始SIZE_T、size_tのLEN、
size_tの* retlen、u_char型* bufは、u_char型* ecc_code)。
静的な無効NanD_ReadBuf(構造体nand_chip * NAND、u_char型* data_buf、int型のCNTR)。READ_NAND(ADR)。
- NAND書き込み
機能:NANDフラッシュへSDRAMからのデータを書き込みます。
関数呼び出しの関係は(年代順に)次のとおりです。
int型nand_rw(構造体nand_chip * NANDは、cmdをint型開始、size_tの、size_tのLEN、size_tの* retlen、u_char型* BUF)。静的int型nand_write_ecc(構造体nand_chip * NAND、size_tのLENにsize_tの、
size_tの* retlen、constのu_char型* bufは、u_char型* ecc_code)。
静的int型nand_write_page(構造体nand_chip * NAND、int型のページ、int型コル、int型最後、u_char型* ecc_code)。WRITE_NAND(D、ADR)。
3.2.3 U-BOOTのサポート NANDフラッシュコマンドの説明移植
1.設定する設定オプション
CONFIG_COMMANDSで、オープンCFG_CMD_NANDオプション。
#define CONFIG_COMMANDS \
(CONFIG_CMD_DFL | \ CFG_CMD_CACHE | \ CFG_CMD_NAND | \
/ * CFG_CMD_EEPROM | * / \
/ * CFG_CMD_I2C | * / \
/ * CFG_CMD_USB | * / \ CFG_CMD_PING | \ CFG_CMD_REGINFO | \ CFG_CMD_DATE | \ CFG_CMD_ELF)
#if(CONFIG_COMMANDS&CFG_CMD_NAND)
レジスタSFRアドレスを開始する地域での#define CFG_NAND_BASE 0x4E000000 / * NANDフラッシュコントローラ* /
ほとんどのデータでの#define CFG_MAX_NAND_DEVICE 1 / * NANDフラッシュサポート* /
#define SECTORSIZE 512 / *サイズ* / 1の
#define NAND_SECTOR_SIZE SECTORSIZE
#define NAND_BLOCK_MASK(NAND_SECTOR_SIZE - 1)/ *页掩码* /
1 / *に#define ADDR_COLUMNのカラムアドレスバイト* /
#define ADDR_PAGE 3 / * 3バイトのページ・ブロック・アドレス、A9A25 * /
総ページブロックアドレス内の#define ADDR_COLUMN_PAGE 4 / * 4バイト* /
#define NAND_ChipID_UNKNOWNは0x00 / *未知のチップのID番号* /
#define NAND_MAX_FLOORS 1
#define NAND_MAX_CHIPS 1
/ * NANDフラッシュは、* /下地層インタフェース機能を命じます
#define WRITE_NAND_COMMAND(D、ADR)を実行{rNFCMD = D;}ながら(0)
#define WRITE_NAND_ADDRESS(D、ADR)を実行{rNFADDR = D;}ながら(0)
#define WRITE_NAND(D、ADR)を実行{rNFDATA = D;}ながら(0)
#define READ_NAND(ADR)(rNFDATA)
{一方((rNFSTAT&(1 << 0))!);}の#define NAND_WAIT_READY(NAND)
#define NAND_DISABLE_CE(NAND){rNFCONF | =(1 << 11);}
#define NAND_ENABLE_CE(NAND){rNFCONF&=〜(1 << 11);}
NANDフラッシュのボイドに対する操作の/ *以下のセット* /
#define NAND_CTL_CLRALE(nandptr)
#define NAND_CTL_SETALE(nandptr)
#define NAND_CTL_CLRCLE(nandptr)
#define NAND_CTL_SETCLE(nandptr)
NANDフラッシュの書き込みを可能にする* / *チェックイン/
#define CONFIG_MTD_NAND_VERIFY_WRITE 1
#endifの/ * CONFIG_COMMANDS&CFG_CMD_NAND * /
2.独自のNANDフラッシュチップのモデルを追加します。
次のように構造の含ま/リナックス/ MTD / nand_ids.h割り当てに変更される:静的構造体nand_flash_devのnand_flash_ids [] = {
......
{ "三星K9F1208U0B"、NAND_MFR_SAMSUNG、0x76、26、0、4、0x4000の、0}、
.......
}
段落NANDフラッシュチップのような操作を適切に実行するため。
3.でボード/ crane2410 / crane2410.cで独自のNANDフラッシュの初期化機能を追加nand_init()関数を記述します。ボイドnand_init(ボイド)
{
/ *初期NANDフラッシュコントローラ、およびNANDフラッシュチップ* / nand_reset();
/ * / *チップタイプを検出するために)(nand_probeを呼び出します
printf( "%4lu MBを\ n"、nand_probe(CFG_NAND_BASE)>> 20)。
}
この関数は、()起動時に呼び出されるstart_armbootです。