1. はじめに
Platform Designer には、Flash ROM にアクセスする多くの種類の Flash Controller があり、その最新 IP が Generic Serial Flash Interface Intel® FPGA IP (以下 GSFI)になります。
参考:Generic Serial Flash Interface Intel® FPGA IP User Guide
その他の Flash Controller に関する情報はこちらをご覧ください。
参考:Embedded Peripherals IP - Flash Controller サンプル
参考:Embedded Peripherals IP - 各種 Flash Controller の比較
従来の Flash Controller から、大幅に機能が拡充されており、CSR Avalon Slave Port にアクセスすることで、SCLK(Flash ROM アクセス周波数)の周波数を変更したり、I/O Mode( QUAD や Standard )を変更することができるようになり、さらに様々な Flash ROM に対応できるようになっています。
その反面、使用する Flash ROM の仕様に合わせて、レジスターを操作する Master 処理のシーケンスを作る必要があります。
この記事のサンプル・ソフトウェアは、Nios® II ソフトウェアにて簡単に処理シーケンスを開発できるように関数を用意しており、様々なベンダーの Flash ROM に対応できるようになっています。
GSFI はメーカーからサンプル・ソフトウェアが出ており、こちらをベースに弊社で Memory Test サンプル・ソフトウェアをご用意しました。
参考: Generic Serial Flash Interface Intel® FPGA IP Core Reference Design
注記:
この記事で紹介するサンプル・ソフトウェアは、動作を保証するものではありませんので、使用する Flash ROM の仕様に合わせてカスタマイズと検証を行った上でご使用ください。
2. レジスターマップ
【表 1】に GSFI の レジスターマップの概要を記載します。最新の詳細はユーザーガイドを参照してください。
参考:Generic Serial Flash Interface Intel® FPGA IP User Guide
【表 1】GSFI レジスターマップ概要
Offset |
Register Name | R/W | Description |
0x0 |
Control Register | R/W |
Addressing mode, Chip Select, GSFI IP Enable の設定を行います。 [7:4] : Selects the flash device [1] : IP Enable |
0x1 |
SPI Clock Baud-rate Register | R/W |
SPI Clock(SCLK)の分周比を設定します。 [4:0] : Baud rate divisor |
0x2 | CS Delay Setting Register | R/W |
nCS の動作タイミングを調整します。 [11:8]:tSHSL [7:4]:CS de-assert [3:0]:CS assert |
0x3 | Read Capturing Register | R/W |
読み取りデータロジックを IP_CLK サイクルの値だけ遅延させます。 [3:0]:Read delay |
0x4 | Operating Protocols Setting Register | R/W |
Instruction, Read, Write コマンドそれぞれの I/O Mode を設定します。 [17:16] : Read Data out transfer mode [13:12] : Read Address transfer mode [9:8] : Write Data in transfer mode [5:4] : Write Address transfer mode [1:0] : Instruction transfer mode - 0x0: Standard SPI mode – DQ0 を使って通信します |
0x5 | Read Instruction Register | R/W |
Avalon MEM Port に Read を発行した時に発行するコマンドを設定します。 [12:8] : Dummy cycles [7:0] : Read opcode - IO Mode によって設定するコマンドが変わります。 |
0x6 | Write Instruction Register | R/W |
Avalon MEM Port に Write を発行した時に発行するコマンドを設定します。 [15:8] : Polling opcode - Status Register のコマンドを設定します。 [7:0] : Write opcode - IO Mode によって設定するコマンドが変わります。 |
0x7 | Flash Command Setting Register | R/W |
発行するコマンドを設定します。 [20:16] : Number of dummy cycles - ダミーサイクルの値を設定します。 [15:12] : Number of data bytes - Data を 必要としないコマンドは 0x0 を設定します。 [11] : Data type - [15:12] で設定されたデータ数が Read なのか Write なのかを示します。 [10:8] : Number of address bytes - 3/4 bytes addressing を設定します。 [7:0] : Opcode |
0x8 | Flash Command Control Register | W | Offset 0x7 のレジスターで設定したコマンドを実行します。 |
0x9 | Flash Command Address Register | R/W | Offset 0x7 のレジスターで設定したコマンドに付与するアドレス値を設定します。 |
0xA | Flash Command Write Data 0 Register | R/W | Offset 0x7 のレジスターで設定したコマンドに付与する Write Data (下位 4 bytes) を設定します。 |
0xB | Flash Command Write Data 1 Register | R/W | Offset 0x7 のレジスターで設定したコマンドに付与する Write Data (上位 4 bytes) を設定します。 |
0xC | Flash Command Read Data 0 Register | R | Offset 0x8 のレジスターを実行し、返ってきた Read Data (下位 4 bytes) が格納されています。 |
0xD | Flash Command Read Data 1 Register | R | Offset 0x8 のレジスターを実行し、返ってきた Read Data (上位 4 bytes) が格納されています。 |
3. Platform Designer の Hidden Parameter について
【表 1】で示したレジスターの初期値は、Platform Designer の IP パラメーターで設定することが可能です。
普段は隠れていますが、IP 名の部分を 右クリックし Show/Hide Hidden Parameters を押すと【図 1】のように初期値設定が可能です。
ソフトウェアでレジスターを設定できますが、こちらで設定しておくことも可能です。
また、Nios® II Boot として GSFI を使用する場合、ユーザー・ソフトウェアが起動する前に、GSFI で Boot 処理を行うため、Flash ROM に合わせてデフォルト値を設定しておく必要があります。
参考: Nios® II Boot Option ~ Generic Serial Flash Interface を使った Boot 方法 ~
【図 1】GSFI Parameter 設定 Hidden Parameter
4. サンプルデザイン概要
この記事で紹介するサンプルデザイン情報を下記に記載します。
- 使用 Kit: Cycloen V GX スタータ開発キット
(Qsys ファイルとソフトウェアを他の Kit に移植して再現可能) - Tool バージョン: Quartus® Prime ver20.1_Standard
- 主な使用 IP: Nios® II, On-Chip RAM, JTAG UART, PIO (LED), GSFI
- Nios® II/f(Gen2): 命令/データキャッシュ : 4 KB
- On-Chip RAM: 128KB(ワークメモリー)
- ソフトウェア容量の目安:program size(code + initialized data):
enable_small_c_library【有効】28 KBytes、【無効】80 KBytes
注記:
ソフトウェア容量に対して RAM の容量が少ない場合、スタックオーバーフローが発生する可能性がありますので、RAM 容量は余裕をもって設定してください。
Platform Designer の接続図を【図 2】に示します。
【図 2】 Platform Designer 接続図
4-1. サンプル・ソフトウェア解説
このサンプル・ソフトウェアは、GSFI の制御関数を用意しており、#define 文の設定を Flash ROM の仕様に合わせて変更することで、様々な Flash ROM に対してアクセスできるように作成されています。
Protect Sector がかかっていたり、Write Enable を発行していなかったり、WIP チェックを行っていなかったなどのソフトウェア処理が原因による書き込みエラーは発生しにくいですので、最小限のソフトウェア変更で Flash ROM にアクセスでき、全領域に対して Memory Test を行うことができます。
デフォルトの設定では、AS Interface に Configuration ROM として接続されている EPCQ256 に対して下記の処理を実施するソフトウェアになっています。
- Protect Sector の解除
- 1 Sector 分 Erase を実行し、データが 0xFF になっているかの Verify を実施
- Flash ROM の 0x0000_0000 から、Sub Sector 毎に書き込みを行い、1 Sector 分データの書き換えを実施
- Sub Sector 毎に Verify を実施
- Verify エラーが発生した場合は、読み取ったデータを表示してエラーのデータを確認可能
注記:
書き換えてはいけない領域のある Flash ROM に対して、そのまま実行しないでください。
【表 2】にこの記事のサンプル・ソフトウェアの概要を記載します。
【表 2】サンプル・ソフトウェア概要
ソフトウェア名 | 概要 |
GSFI_Access_Sample.c | Main 処理を記載しています。 |
GSFI_Operation_sample.h | Flash ROM のコマンド情報と GSFI のレジスター情報を記載しています。 |
GSFI_Operation_sample.c | GSFI を制御する関数を記載しています。 |
実装されている関数の詳細は、添付されているソースコードをご覧ください。
下記 #define 文で定義されている定数を変更することで、ご自身の Platform Designer の構成に合わせてソフトウェアを使用することが可能です。
GSFI_Access_Sample.c に記載されている #define 文
/***********************************************************************************
* re-definitions
* ※このセクションは "system.h" で定義された定数を、
* 本ソースファイル内で使用するために再定義したものです。
* ご使用の際は右側の定数を "system.h" を参照の上、変更してお使いください。
***********************************************************************************/
#define SFC_AVL_CSR_BASE (INTEL_GENERIC_SERIAL_FLASH_INTERFACE_TOP_0_AVL_CSR_BASE)
#define SFC_AVL_CSR_SPAN (INTEL_GENERIC_SERIAL_FLASH_INTERFACE_TOP_0_AVL_CSR_SPAN)
#define SFC_AVL_MEM_BASE (INTEL_GENERIC_SERIAL_FLASH_INTERFACE_TOP_0_AVL_MEM_BASE)
#define SFC_AVL_MEM_SPAN (INTEL_GENERIC_SERIAL_FLASH_INTERFACE_TOP_0_AVL_MEM_SPAN)
下記 #define 文で定義されている定数を変更することで、書き込みを行う Sector の領域や IO Mode、Protect Sector の設定を変更できます。
GSFI_Access_Sample.c に記載されている #define 文
/***********************************************************************************
* definitions (define)
* ※ デフォルト状態の本ソースコードは、Flash ROM の 0x0000_00000 から、1 セクター分データの書き換えを行います。
* 書き換えても問題ない Flash ROM でお試しください。
* #define 文で定義されている SEC_BASE_ADD、NUM_OF_SEC の値を変更する事で、書き換えを行う Sector を調整することができます。
* 設定した値がセクターのベースアドレスでない場合やセクターの数が Flash ROM を超える場合は、Nois II が終了します。
***********************************************************************************/
#define SEC_BASE_ADD (0x00000000) // Erase と Write と Read を行うセクターのベースアドレス
#define NUM_OF_SEC (1) // Erase と Write と Read を行うセクター数
#define IO_MODE (0) // 0:Standard, 1:Dual, 2:QUAD
#define CLOCK_RATE (0x1) // IP のデフォルトは、0x10 (f[Hz]/32)です。0x1(f[Hz]/2) ~ 0x10(f[Hz]/32) まで設定できます。
#define SECTOR_LOOK (0x0) // Sector Lock の設定値。0x0 を設定しておくと、LOCK 解除を行います。
#define DATA_LENGTH (0x00001000) // データサイズ デフォルトは Sub Sector サイズ 0x00001000
#define WRITE_DATA (0x00) // Write Data
#define PRINT_COLUMNS (16) // Print_Data() で表示する列数 1~256
下記 #define 文で定義されている定数を変更することで、様々な Flash ROM に対応することができます。
注記:
Macronix Flash ROM を使用する場合は、MACRONIX_ISSI を 1 にしてください。
ISSI Flash ROM を使用する場合は、MACRONIX_ISSI と ADDRESS_IO_MODE を 1 にしてください。
EPCQA を使用する場合は、ADDRESS_IO_MODE を 1 にしてください。
GSFI_Operation_sample.h に記載されている #define 文
/***********************************************************************************
* definitions (define)
* Flash ROM の種類に合わせて設定を変更してください。
* *********************************************************************************/
#define MACRONIX_ISSI (0) // Macronix と ISSI の Flash ROM は Addressing の設定と QUAD の設定が必要なので、使用するときは 1 にしてください。
#define ADDRESS_IO_MODE (0) // QUAD Write の Address I/O Mode を Standard にする必要がある場合 1 にしてください。(ISSI と EPCQA の場合有効にしてください。)
/*******************************************************************************
* Flash ROM Command Info based on EPCQ256 EPCQA128 MT25QL256 MX25L25645G IS25LP256D
*******************************************************************************/
#define READ_DEVICE_ID_CMD (0x9F)
#define READ_DEVICE_ID_BYTES (4)
#define READ_STATUS_CMD (0x05)
#define READ_STATUS_BYTES (1)
#define READ_FLAG_STATUS_CMD (0x70) // EPCQA Macronix ISSI is not support
#define READ_FLAG_STATUS_BYTES (1)
#define READ_NON_VOLA_CONFIG_CMD (0xB5) // EPCQA is not support. EPCQ Micron:0xB5, Macronix:0x15, ISSI:0x61
#define READ_NON_VOLA_CONFIG_BYTES (2)
#define WRITE_STATUS_CMD (0x01)
#define WRITE_STATUS_BYTES (1)
#define WRITE_NON_VOLA_CONFIG_CMD (0xB1) // EPCQA Macronix ISSI is not support
#define WRITE_NON_VOLA_CONFIG_BYTES (2)
#define WRITE_ENABLE_CMD (0x06)
#define WRITE_ENABLE_BYTES (0)
#define WRITE_DISABLE_CMD (0x04)
#define WRITE_DISABLE_BYTES (0)
#define READ_BYTES_CMD (0x03)
#define READ_BYTES_DUMMY (0)
#define EXTENDED_DUAL_FAST_READ_CMD (0xBB)
#define EXTENDED_DUAL_FAST_READ_DUMMY (10) // EPCQ Micron:8 or 10 or 12, EPCQA ISSI Macronix:6 or 10
#define EXTENDED_QUAD_FAST_READ_CMD (0xEB)
#define EXTENDED_QUAD_FAST_READ_DUMMY (10) // EPCQ Micron:8 or 10 or 12, EPCQA ISSI Macronix:6 or 10
#define WRITE_BYTES_CMD (0x02)
#define WRITE_BYTES_DUMMY (0)
#define EXTENDED_DUAL_FAST_WRITE_CMD (0xD2) // EPCQA Macronix ISSI is not support
#define EXTENDED_DUAL_FAST_WRITE_DUMMY (0)
#define EXTENDED_QUAD_FAST_WRITE_CMD (0x12) //EPCQ:0x12, EPCQA:0x32, Micron Macronix ISSI:0x38
#define EXTENDED_QUAD_FAST_WRITE_DUMMY (0)
#define ERASE_SUBSECTOR_CMD (0x20)
#define ERASE_SUBSECTOR_DUMMY (0)
#define ERASE_SECTOR_CMD (0xD8)
#define ERASE_SECTOR_DUMMY (0)
#define ERASE_BULK_CMD (0xC7)
#define ERASE_BULK_DUMMY (0)
/*******************************************************************************
*Flash ROM Command Info for Macronix ISSI base on MX25L25645G IS25LP256D
* ****************************************************************************/
#define ENABLE_4BYTE_FOR_MX25L_CMD (0xB7)
#define ENABLE_4BYTE_FOR_MX25L_BYTES (0)
#define DISABLE_4BYTE_FOR_MX25L_CMD (0xE9) // Macronix:0xE9, ISSI:0x29
#define DISABLE_4BYTE_FOR_MX25L_BYTES (0)
/*******************************************************************************
* Flash ROM Command Info Other Registers base on MT25QL256
* ****************************************************************************/
#define READ_VOLA_CONFIG_CMD (0x85)
#define READ_VOLA_CONFIG_BYTES (1)
#define READ_ENHAN_VOLA_CONFIG_CMD (0x65)
#define READ_ENHAN_VOLA_CONFIG_BYTES (1)
#define READ_EXTEN_ADD_REG_CMD (0xC8)
#define READ_EXTEN_ADD_REG_BYTES (1)
#define READ_GEN_PURPOSE_REG_CMD (0x96)
#define READ_GEN_PURPOSE_REG_BYTES (1)
#define READ_SEC_PROTECT_CMD (0x2D)
#define READ_SEC_PROTECT_BYTES (1)
#define READ_VOLA_LOCK_BIT_CMD (0xE8)
#define READ_VOLA_LOCK_BIT_BYTES (1)
#define READ_NON_VOLA_LOCK_BIT_CMD (0xE2)
#define READ_VOLA_LOCK_BIT_BYTES (1)
#define READ_GLOBAL_FREEZE_BIT_CMD (0xA7)
#define READ_GLOBAL_FREEZE_BIT_BYTES (1)
4-2. サンプル・ソフトウェアの動作確認結果
【表 3】にこの記事のサンプル・ソフトソフトウェアが動作することを確認できた Flash ROM を記載します。検証時に変更した箇所を表内の「#define 文の変更内容」の項目に記載しています。Flash ROM の種類に合わせて変更の上ご使用ください。
注記:
【表 3】は弊社環境にて動作確認を行った結果をもとに「例」として記載しています。必要に応じてカスタマイズしてお使いください。
【表 3】サンプル・ソフトウェアの動作確認済み Flash ROM 一覧
Vender | Flash ROM (*1) | IO Mode | #define 文の変更内容 (*2) |
Intel® |
EPCQ64 | Standard DUAL QUAD |
<GSFI_Operation_sample.h> |
Intel® |
EPCQA128 | Standard QUAD |
Dual Write Not Support <GSFI_Operation_sample.h> |
Intel® |
EPCQ256 | Standard DUAL QUAD | デフォルトで OK |
Micron | MT25QL128 | Standard DUAL QUAD |
<GSFI_Operation_sample.h> |
Micron | MT25QL256 | Standard DUAL QUAD |
<GSFI_Operation_sample.h> |
Macronix | MX25L256 | Standard QUAD |
Dual Write Not Support <GSFI_Operation_sample.h> |
ISSI | IS25LP128 | Standard QUAD |
Dual Write Not Support <GSFI_Operation_sample.h> |
ISSI | IS25LP256 | Standard QUAD |
Dual Write Not Support <GSFI_Operation_sample.h> |
注記:
*1 Third Party Flash ROM の User Guide は各ベンダーから取得ください。
*2 各 Flash ROM の Nonvolatile Configuration Register の値によって Dummy Cycles の値が変わります。Memory Test で値を確認し EXTENDED_QUAD_FAST_READ_DUMMY と EXTENDED_DUAL_FAST_READ_DUMMY の設定を調整してください。特に Configuration ROM として使用している場合、JIC / POF の書き込みによって、Nonvolatile Configuration Register の値が書き換わります。書き換わる値に関しては下記情報をご参照ください。
参考:Intel Supported Third Party Configuration Devices
4-3. サンプル・ソフトウェア検証手順
Nios® II SBT にサンプル・ソフトウェアのプロジェクトを作成して、検証を行う手順を紹介します。ユーザー作成の Qsys で検証する時も同様の手順です。
【最低限必要なシステム要件】
- Nios® II Processor Core( Fast または Economy )
- Generic Serial Flash Interface
- 実行 RAM( On Chip RAM(約 40k Bytes 以上)または 外部 RAM)
- stdout 機能の実装(JTAG UART または UART Core など、Printf 文で結果を表示するため)
【手順】
- Platform Designer の Generate HDL で sopcinfo ファイルを生成
- Nios® II SBT にて Nios® II Application and BSP from Template を実行
(テンプレートは hello_world_small または hello_world など) - ソフトウェアを サンプル・ソフトウェア に置き換えて #define 文を修正 (*3)
- BSP Editor を On Chip RAM または 外部 RAM 実行に設定し Generate BSP 実行(参考)
- Build を実行し Run AS を実行
注記:
*3 Build 実行後 #define 文を再修正した場合、変更が反映されないことがありますので、Nios II SBT で Clean Project を実行してから Build を実行ください。
4-4. サンプル・ソフトウェア動作
Nios® II SBT の Run As で実行すると、Work RAM(このデザインでは On Chip RAM)で Nios® II が実行されます。
Nios® II Console にて、Flash ROM の Status Register 情報、設定した セクター・ベースアドレスの値と書き込みを行うセクター数の情報が表示されます。その後、GSFI の各種設定、Protect Sector の更新、GSFI の レジスター情報の表示、そして Erase Write Read を開始します。
EPCQ 256 に対して、1 Sector 分実行した際の Log を以下に記載します。
Hello from Nios II!
Source File: GSFI_Access_Sample.c
Open flash device.
Device ID = 0x1019ba20
Read Status = 0x0
Read Flag Status = 0x81
READ NONVOLATILE CONFIGURATION REGISTER = 0xafee
READ VOLATILE CONFIGURATION REGISTER = 0xfb
READ ENHANCED VOLATILE CONFIGURATION REGISTER = 0xdf
READ EXTENDED ADDRESS REGISTER = 0x0
READ GENERAL PURPOSE READ REGISTER = 0x0
READ SECTOR PROTECTION = 0x0
READ VOLATILE LOCK BITS = 0x0
READ NONVOLATILE LOCK BITS = 0x0
READ GLOBAL FREEZE BIT = 0x0
The Start Sector Address you set = 0x00000000
The Number of Sector you set = 1
There are no setting errors.
Set Clock Rate [fHz]/2.
Protect Change OK.
Set IO Mode 0(0:Standard, 1:Dual, 2:QUAD)
Read Status = 0x0
Read Flag Status = 0x81
READ NONVOLATILE CONFIGURATION REGISTER = 0xafee
READ VOLATILE CONFIGURATION REGISTER = 0xfb
READ ENHANCED VOLATILE CONFIGURATION REGISTER = 0xdf
READ EXTENDED ADDRESS REGISTER = 0x0
READ GENERAL PURPOSE READ REGISTER = 0x0
READ SECTOR PROTECTION = 0x0
READ VOLATILE LOCK BITS = 0x0
READ NONVOLATILE LOCK BITS = 0x0
READ GLOBAL FREEZE BIT = 0x0
Print GSFI Register.
Offset 0x0 : 0x00000101
Offset 0x1 : 0x00000001
Offset 0x2 : 0x00000000
Offset 0x3 : 0x00000000
Offset 0x4 : 0x00000000
Offset 0x5 : 0x00000003
Offset 0x6 : 0x00000502
Offset 0x7 : 0x000018a7
Offset 0x8 : 0x00000000
Offset 0x9 : 0x00000000
Offset 0xa : 0x00000000
Offset 0xb : 0x00000000
Offset 0xc : 0x00000000
Offset 0xd : 0x00000000
*******************************************
Number of Executions = 1 [n]
Erase/Write/Read Sector BASE Address = 0x00000000 (Sector Number = 0)
Start Erase.
Erase Sector Address = 0x00000000
Verify Address = 0x00000000 : Erase Verify was successful.
Verify Address = 0x00001000 : Erase Verify was successful.
Verify Address = 0x00002000 : Erase Verify was successful.
Verify Address = 0x00003000 : Erase Verify was successful.
Verify Address = 0x00004000 : Erase Verify was successful.
Verify Address = 0x00005000 : Erase Verify was successful.
Verify Address = 0x00006000 : Erase Verify was successful.
Verify Address = 0x00007000 : Erase Verify was successful.
Verify Address = 0x00008000 : Erase Verify was successful.
Verify Address = 0x00009000 : Erase Verify was successful.
Verify Address = 0x0000a000 : Erase Verify was successful.
Verify Address = 0x0000b000 : Erase Verify was successful.
Verify Address = 0x0000c000 : Erase Verify was successful.
Verify Address = 0x0000d000 : Erase Verify was successful.
Verify Address = 0x0000e000 : Erase Verify was successful.
Verify Address = 0x0000f000 : Erase Verify was successful.
End Erase.
Start Write Read Verify
Read Address 0x00000000 : Verify was successful.
Read Address 0x00001000 : Verify was successful.
Read Address 0x00002000 : Verify was successful.
Read Address 0x00003000 : Verify was successful.
Read Address 0x00004000 : Verify was successful.
Read Address 0x00005000 : Verify was successful.
Read Address 0x00006000 : Verify was successful.
Read Address 0x00007000 : Verify was successful.
Read Address 0x00008000 : Verify was successful.
Read Address 0x00009000 : Verify was successful.
Read Address 0x0000a000 : Verify was successful.
Read Address 0x0000b000 : Verify was successful.
Read Address 0x0000c000 : Verify was successful.
Read Address 0x0000d000 : Verify was successful.
Read Address 0x0000e000 : Verify was successful.
Read Address 0x0000f000 : Verify was successful.
-Address--|00 01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f| ASCII
----------+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+----------------
0x0000f000 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F ................
0x000f0010 ~ 0x0000ffe0 は割愛 (00 ~ FF の繰り返し)
0x0000fff0 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 FA FB FC FD FE FF ................
End Write Read Verify
Read Status = 0x0
Read Flag Status = 0x81
READ NONVOLATILE CONFIGURATION REGISTER = 0xafee
READ VOLATILE CONFIGURATION REGISTER = 0xfb
READ ENHANCED VOLATILE CONFIGURATION REGISTER = 0xdf
READ EXTENDED ADDRESS REGISTER = 0x0
READ GENERAL PURPOSE READ REGISTER = 0x0
READ SECTOR PROTECTION = 0x0
READ VOLATILE LOCK BITS = 0x0
READ NONVOLATILE LOCK BITS = 0x0
READ GLOBAL FREEZE BIT = 0x0
*******************************************
Free buf_read_data.
Free buf_write_data.
Free flash_info.
Finish Nios II.
*******************************************