U-BOOTのサポートNANDフラッシュコマンド

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導入されたメインデータ構造を

  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:なし* /

}。

 

  1. データ構造の構造体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サポートコマンド機能説明

  1. NAND情報/ NANDデバイスの機能:現在のNANDフラッシュチップの情報を表示します。関数呼び出しの関係は(年代順に)次のとおりです。

静的な無効nand_print(構造体nand_chipの*のNAND)。

 

  1. 機能NAND消去:指定されたブロックのデータを消去します。関数呼び出しの関係は(年代順に)次のとおりです。

int型nand_erase(構造体nand_chip * NAND、size_tののOFS、size_tのLEN、クリーンINT);

 

  1. NANDの悪いです

機能:不良ブロックを表示します。関数呼び出しの関係は(年代順に)次のとおりです。

静的な無効nand_print_bad(構造体nand_chipの*のNAND)。

int型check_block(構造体nand_chipの*のNAND、unsigned long型POS);

 

  1. 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)。

 

  1. 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です。

おすすめ

転載: www.cnblogs.com/fanweisheng/p/11106190.html