2290 lines
58 KiB
C
Executable File
2290 lines
58 KiB
C
Executable File
/*
|
|
* Copyright (c) Hunan Goke,Chengdu Goke,Shandong Goke. 2021. All rights reserved.
|
|
*/
|
|
|
|
#include <common.h>
|
|
#include <exports.h>
|
|
#include <asm/io.h>
|
|
#include <linux/mtd/nand.h>
|
|
#include <fmc_common.h>
|
|
#include "../../fmc_spi_ids.h"
|
|
#include "nfc_common.h"
|
|
#include "fmc100.h"
|
|
|
|
/*****************************************************************************/
|
|
set_read_std(1, INFINITE, 24);
|
|
set_read_std(1, INFINITE, 108); //@@@@
|
|
|
|
set_read_fast(1, INFINITE, 60);
|
|
set_read_fast(1, INFINITE, 80);
|
|
set_read_fast(1, INFINITE, 100);
|
|
set_read_fast(1, INFINITE, 104);
|
|
set_read_fast(1, INFINITE, 108);
|
|
set_read_fast(1, INFINITE, 120);
|
|
set_read_fast(1, INFINITE, 133);
|
|
|
|
set_read_dual(1, INFINITE, 60);
|
|
set_read_dual(1, INFINITE, 80);
|
|
set_read_dual(1, INFINITE, 100);
|
|
set_read_dual(1, INFINITE, 104);
|
|
set_read_dual(1, INFINITE, 108);
|
|
set_read_dual(1, INFINITE, 120);
|
|
set_read_dual(1, INFINITE, 133);
|
|
|
|
set_read_dual_addr(1, INFINITE, 40);
|
|
set_read_dual_addr(1, INFINITE, 60);
|
|
set_read_dual_addr(1, INFINITE, 80);
|
|
set_read_dual_addr(2, INFINITE, 80);
|
|
set_read_dual_addr(2, INFINITE, 104);
|
|
set_read_dual_addr(1, INFINITE, 100);
|
|
set_read_dual_addr(1, INFINITE, 104);
|
|
set_read_dual_addr(1, INFINITE, 108);
|
|
set_read_dual_addr(1, INFINITE, 120);
|
|
|
|
set_read_quad(1, INFINITE, 60);
|
|
set_read_quad(1, INFINITE, 80);
|
|
set_read_quad(1, INFINITE, 100);
|
|
set_read_quad(1, INFINITE, 104);
|
|
set_read_quad(1, INFINITE, 108);
|
|
set_read_quad(1, INFINITE, 120);
|
|
set_read_quad(1, INFINITE, 133);
|
|
|
|
set_read_quad_addr(2, INFINITE, 40);
|
|
set_read_quad_addr(1, INFINITE, 60);
|
|
set_read_quad_addr(1, INFINITE, 80);
|
|
set_read_quad_addr(2, INFINITE, 80);
|
|
set_read_quad_addr(4, INFINITE, 80);
|
|
set_read_quad_addr(4, INFINITE, 104);
|
|
set_read_quad_addr(1, INFINITE, 100);
|
|
set_read_quad_addr(1, INFINITE, 104);
|
|
set_read_quad_addr(2, INFINITE, 104);
|
|
set_read_quad_addr(1, INFINITE, 108);
|
|
set_read_quad_addr(1, INFINITE, 120);
|
|
|
|
/*****************************************************************************/
|
|
set_write_std(0, 256, 24);
|
|
set_write_std(0, 256, 75);
|
|
set_write_std(0, 256, 80);
|
|
set_write_std(0, 256, 100);
|
|
set_write_std(0, 256, 104);
|
|
set_write_std(0, 256, 108); //@@@@
|
|
set_write_std(0, 256, 133);
|
|
|
|
set_write_quad(0, 256, 80);
|
|
set_write_quad(0, 256, 100);
|
|
set_write_quad(0, 256, 104);
|
|
set_write_quad(0, 256, 108);
|
|
set_write_quad(0, 256, 120);
|
|
set_write_quad(0, 256, 133);
|
|
|
|
/*****************************************************************************/
|
|
set_erase_sector_128k(0, _128K, 24);
|
|
set_erase_sector_128k(0, _128K, 75);
|
|
set_erase_sector_128k(0, _128K, 80);
|
|
set_erase_sector_128k(0, _128K, 104);
|
|
set_erase_sector_128k(0, _128K, 108); //@@@@
|
|
set_erase_sector_128k(0, _128K, 133);
|
|
|
|
set_erase_sector_256k(0, _256K, 24);
|
|
set_erase_sector_256k(0, _256K, 75);
|
|
set_erase_sector_256k(0, _256K, 80);
|
|
set_erase_sector_256k(0, _256K, 100);
|
|
set_erase_sector_256k(0, _256K, 104);
|
|
set_erase_sector_256k(0, _256K, 108); //@@@@
|
|
set_erase_sector_256k(0, _256K, 133);
|
|
|
|
/*****************************************************************************/
|
|
#include "fmc100_spi_general.c"
|
|
static struct spi_drv spi_driver_general = {
|
|
.wait_ready = spi_general_wait_ready,
|
|
.write_enable = spi_general_write_enable,
|
|
.qe_enable = spi_general_qe_enable,
|
|
};
|
|
|
|
static struct spi_drv spi_driver_no_qe = {
|
|
.wait_ready = spi_general_wait_ready,
|
|
.write_enable = spi_general_write_enable,
|
|
.qe_enable = spi_do_not_qe_enable,
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
#define SPI_NAND_ID_TAB_VER "2.7"
|
|
|
|
/* ****** SPI Nand ID Table ***************************************************
|
|
* Version Manufacturer Chip Name Size Operation
|
|
* 1.0 ESMT F50L512M41A 64MB Add 5 chip
|
|
* GD 5F1GQ4UAYIG 128MB
|
|
* GD 5F2GQ4UAYIG 256MB
|
|
* GD GD5F2GQ5UEYIG 256MB
|
|
* GD 5F4GQ4UAYIG 512MB
|
|
* GD 5F4GQ4UBYIG 512MB
|
|
* GD 5F1GQ4RB9IG 128MB
|
|
* GD 5F1GQ4UEYIHY 128MB
|
|
* 1.1 ESMT F50L1G41A 128MB Add 2 chip
|
|
* Winbond W25N01GV 128MB
|
|
* Winbond W25N02JWZEIF 256MB 1.8V
|
|
* 1.2 GD 5F1GQ4UBYIG 128MB Add 2 chip
|
|
* GD 5F2GQ4U9IGR/BYIG 256MB
|
|
* 1.3 ATO ATO25D1GA 128MB Add 1 chip
|
|
* 1.4 MXIC MX35LF1GE4AB 128MB Add 2 chip
|
|
* MXIC MX35LF2GE4AB 256MB (SOP-16Pin)
|
|
* 1.5 Paragon PN26G01A 128MB Add 1 chip
|
|
* 1.6 All-flash AFS1GQ4UAC 128MB Add 1 chip
|
|
* 1.7 TOSHIBA TC58CVG0S3H 128MB Add 2 chip
|
|
* TOSHIBA TC58CVG2S0H 512MB
|
|
* 1.8 ALL-flash AFS2GQ4UAD 256MB Add 2 chip
|
|
* Paragon PN26G02A 256MB
|
|
* 1.9 TOSHIBA TC58CVG1S3H 256MB Add 1 chip
|
|
* 2.0 HeYangTek HYF1GQ4UAACAE 128MB Add 3 chip
|
|
* HeYangTek HYF2GQ4UAACAE 256MB
|
|
* HeYangTek HYF4GQ4UAACBE 512MB
|
|
* 2.1 Micron MT29F1G01ABA 128MB Add 5 chip
|
|
* TOSHIBA 1.8V TC58CYG0S3H 128MB
|
|
* TOSHIBA 1.8V TC58CYG1S3H 256MB
|
|
* TOSHIBA 1.8V TC58CYG2S0H 512MB
|
|
* Winbond 1.8V W25N01GWZEIG 128MB
|
|
* 2.2 Micron MT29F2G01ABA 256MB Add 1 chip
|
|
* 2.3 MXIC MX35LF2G14AC 256MB Add 1 chip
|
|
* 2.4 GD 1.8V 5F4GQ4RAYIG 512MB Add 1 chip
|
|
* 2.5 GD 1.8V 5F2GQ4RB9IGR 256MB Add 1 chip
|
|
* GD 1.8V 5F4GQ6RE9IG 512MB
|
|
* 2.6 MXIC 1.8V MX35UF1G14AC 128MB Add 4 chip
|
|
* MXIC 1.8V MX35UF2G14AC 256MB
|
|
* Micron 1.8V MT29F1G01ABB 128MB
|
|
* Micron 1.8V MT29F2G01ABB 256MB
|
|
* 2.7 Dosilicon DS35Q1GA-IB 128MB Add 2 chip
|
|
* Dosilicon DS35Q2GA-IB 256MB
|
|
* GD 5F1GQ4RB9IGR 128MB
|
|
* Micron MT29F4G01ADAG 512MB Add 1 chip
|
|
* GD 1.8V 5F4GQ4RBYIG 512MB Add 1 chip
|
|
* Etron 1.8V EM78D044VCF-H 256MB
|
|
* Etron 3.3V EM73C044VCC-H 128MB
|
|
* XTX 3.3V XT26G01B 1Gbit 128MB
|
|
* Micron 1.8V MT29F4G01ABBFDW 512MB Add 1 chip
|
|
* FM FM25S01-DND-A-G 128MB 3.3V
|
|
* HUAHONG FM25S01A 128MB 3.3V
|
|
*****************************************************************************/
|
|
struct spi_nand_info fmc_spi_nand_flash_table[] = {
|
|
/* Micron MT29F1G01ABA 1GBit */
|
|
{
|
|
.name = "MT29F1G01ABA",
|
|
.id = {0x2C, 0x14},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
/* dummy clock:1 byte, read size:INFINITE bytes,
|
|
* clock frq:24MHz */
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 80), /* 80MHz */
|
|
&read_dual(1, INFINITE, 80), /* 80MHz */
|
|
&read_dual_addr(1, INFINITE, 80), /* 80MHz */
|
|
&read_quad(1, INFINITE, 80), /* 80MHz */
|
|
&read_quad_addr(2, INFINITE, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
/* dummy clock:0byte, erase size:64K,
|
|
* clock frq:80MHz */
|
|
&write_std(0, 256, 80), /* 80MHz */
|
|
&write_quad(0, 256, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
/* dummy clock:0byte, erase size:128K,
|
|
clock frq:80MHz */
|
|
&erase_sector_128k(0, _128K, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* Micron MT29F1G01ABB 1GBit 1.8V */
|
|
{
|
|
.name = "MT29F1G01ABB",
|
|
.id = {0x2C, 0x15},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 80), /* 80MHz */
|
|
&read_dual(1, INFINITE, 80), /* 80MHz */
|
|
&read_dual_addr(1, INFINITE, 80), /* 80MHz */
|
|
&read_quad(1, INFINITE, 80), /* 80MHz */
|
|
&read_quad_addr(2, INFINITE, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 80), /* 80MHz */
|
|
&write_quad(0, 256, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* Micron MT29F2G01ABA 2GBit */
|
|
{
|
|
.name = "MT29F2G01ABA",
|
|
.id = {0x2C, 0x24},
|
|
.id_len = _2B,
|
|
.chipsize = _256M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 108), /* 108MHz */
|
|
&read_dual(1, INFINITE, 108), /* 108MHz */
|
|
&read_dual_addr(1, INFINITE, 108), /* 108MHz */
|
|
&read_quad(1, INFINITE, 108), /* 108MHz */
|
|
&read_quad_addr(2, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 80), /* 80MHz */
|
|
&write_quad(0, 256, 108), /* 108MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* Micron MT29F2G01ABB 2GBit 1.8V */
|
|
{
|
|
.name = "MT29F2G01ABB",
|
|
.id = {0x2C, 0x25},
|
|
.id_len = _2B,
|
|
.chipsize = _256M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 80), /* 80MHz */
|
|
&read_dual(1, INFINITE, 80), /* 80MHz */
|
|
&read_dual_addr(1, INFINITE, 80), /* 80MHz */
|
|
&read_quad(1, INFINITE, 80), /* 80MHz */
|
|
&read_quad_addr(2, INFINITE, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 80), /* 80MHz */
|
|
&write_quad(0, 256, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* Micron MT29F4G01ADAG 4GBit 3.3V */
|
|
{
|
|
.name = "MT29F4G01ADAG",
|
|
.id = {0x2C, 0x36},
|
|
.id_len = _2B,
|
|
.chipsize = _512M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 80), /* 80MHz */
|
|
&read_dual(1, INFINITE, 80), /* 80MHz */
|
|
&read_dual_addr(1, INFINITE, 80), /* 80MHz */
|
|
&read_quad(1, INFINITE, 80), /* 80MHz */
|
|
&read_quad_addr(2, INFINITE, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 80), /* 80MHz */
|
|
&write_quad(0, 256, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* Micron MT29F4G01ABBFDWB 4GBit 1.8V */
|
|
{
|
|
.name = "MT29F4G01ABBFDWB",
|
|
.id = {0x2C, 0x35},
|
|
.id_len = _2B,
|
|
.chipsize = _512M,
|
|
.erasesize = _256K,
|
|
.pagesize = _4K,
|
|
.oobsize = _256B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 80), /* 80MHz */
|
|
&read_dual(1, INFINITE, 80), /* 80MHz */
|
|
&read_quad(1, INFINITE, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 80), /* 80MHz */
|
|
&write_quad(0, 256, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_256k(0, _256K, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* ESMT F50L512M41A 512Mbit */
|
|
{
|
|
.name = "F50L512M41A",
|
|
.id = {0xC8, 0x20},
|
|
.id_len = _2B,
|
|
.chipsize = _64M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* ESMT F50L1G41A 1Gbit */
|
|
{
|
|
.name = "F50L1G41A",
|
|
.id = {0xC8, 0x21},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* GD 3.3v GD5F1GQ4UAYIG 1Gbit */
|
|
{
|
|
.name = "GD5F1GQ4UAYIG",
|
|
.id = {0xc8, 0xf1},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 120), /* 120MHz */
|
|
&read_dual(1, INFINITE, 120), /* 120MHz */
|
|
&read_dual_addr(1, INFINITE, 120), /* 120MHz */
|
|
&read_quad(1, INFINITE, 120), /* 120MHz */
|
|
&read_quad_addr(1, INFINITE, 120), /* 120MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 120), /* 120MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* GD 1.8v GD5F1GQ4RB9IG 1Gbit */
|
|
{
|
|
.name = "GD5F1GQ4RB9IG",
|
|
.id = {0xc8, 0xc1},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 120), /* 120MHz */
|
|
&read_dual(1, INFINITE, 120), /* 120MHz */
|
|
&read_dual_addr(1, INFINITE, 120), /* 120MHz */
|
|
&read_quad(1, INFINITE, 120), /* 120MHz */
|
|
&read_quad_addr(1, INFINITE, 120), /* 120MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 120), /* 120MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
/* GD 3.3v GD5F1GQ4UBYIG 1Gbit */
|
|
{
|
|
.name = "GD5F1GQ4UBYIG",
|
|
.id = {0xc8, 0xd1},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 120), /* 120MHz */
|
|
&read_dual(1, INFINITE, 120), /* 120MHz */
|
|
&read_dual_addr(1, INFINITE, 120), /* 120MHz */
|
|
&read_quad(1, INFINITE, 120), /* 120MHz */
|
|
&read_quad_addr(1, INFINITE, 120), /* 120MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 120), /* 120MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* GD 3.3v GD5F2GQ4UAYIG 2Gbit */
|
|
{
|
|
.name = "GD5F2GQ4UAYIG",
|
|
.id = {0xc8, 0xf2},
|
|
.id_len = _2B,
|
|
.chipsize = _256M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 120), /* 120MHz */
|
|
&read_dual(1, INFINITE, 120), /* 120MHz */
|
|
&read_dual_addr(1, INFINITE, 120), /* 120MHz */
|
|
&read_quad(1, INFINITE, 120), /* 120MHz */
|
|
&read_quad_addr(1, INFINITE, 120), /* 120MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 120), /* 120MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* GD 3.3v GD5F2GQ4U9IGR/BYIG 2Gbit */
|
|
{
|
|
.name = "GD5F2GQ4U9IGR/BYIG",
|
|
.id = {0xc8, 0xd2},
|
|
.id_len = _2B,
|
|
.chipsize = _256M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 120), /* 120MHz */
|
|
&read_dual(1, INFINITE, 120), /* 120MHz */
|
|
&read_dual_addr(1, INFINITE, 120), /* 120MHz */
|
|
&read_quad(1, INFINITE, 120), /* 120MHz */
|
|
&read_quad_addr(1, INFINITE, 120), /* 120MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 120), /* 120MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
|
|
/* GD 3.3v GD5F4GQ4UAYIG 4Gbit */
|
|
{
|
|
.name = "GD5F4GQ4UAYIG",
|
|
.id = {0xc8, 0xf4},
|
|
.id_len = _2B,
|
|
.chipsize = _512M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 120), /* 120MHz */
|
|
&read_dual(1, INFINITE, 120), /* 120MHz */
|
|
&read_dual_addr(1, INFINITE, 120), /* 120MHz */
|
|
&read_quad(1, INFINITE, 120), /* 120MHz */
|
|
&read_quad_addr(1, INFINITE, 120), /* 120MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 120), /* 120MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* GD 3.3v GD5F4GQ6UEYIG 4Gbit */
|
|
{
|
|
.name = "GD5F4GQ6UEYIG",
|
|
.id = {0xc8, 0x55},
|
|
.id_len = _2B,
|
|
.chipsize = _512M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual_addr(2, INFINITE, 104), /* 104MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad_addr(4, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* GD 3.3v GD5F4GQ4UBYIG 4Gbit */
|
|
{
|
|
.name = "GD5F4GQ4UBYIG",
|
|
.id = {0xc8, 0xd4},
|
|
.id_len = _2B,
|
|
.chipsize = _512M,
|
|
.erasesize = _256K,
|
|
.pagesize = _4K,
|
|
.oobsize = _256B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 120), /* 120MHz */
|
|
&read_dual(1, INFINITE, 120), /* 120MHz */
|
|
&read_dual_addr(1, INFINITE, 120), /* 120MHz */
|
|
&read_quad(1, INFINITE, 120), /* 120MHz */
|
|
&read_quad_addr(1, INFINITE, 120), /* 120MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 120), /* 120MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_256k(0, _256K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* GD 3.3v GD5F1GQ4UEYIHY 1Gbit */
|
|
{
|
|
.name = "GD5F1GQ4UEYIHY",
|
|
.id = {0xc8, 0xd9},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 120), /* 120MHz */
|
|
&read_dual(1, INFINITE, 120), /* 120MHz */
|
|
&read_dual_addr(1, INFINITE, 120), /* 120MHz */
|
|
&read_quad(1, INFINITE, 120), /* 120MHz */
|
|
&read_quad_addr(1, INFINITE, 120), /* 120MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 104), /* 104MHz */
|
|
&write_quad(0, 256, 120), /* 120MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* GD 3.3v GD5F1GQ5UEYIGY/GD5F1GQ5UEYIGR 1Gbit */
|
|
{
|
|
.name = "GD5F1GQ5UEYIG",
|
|
.id = {0xc8, 0x51},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 133), /* 133MHz */
|
|
&read_dual(1, INFINITE, 133), /* 133MHz */
|
|
&read_quad(1, INFINITE, 133), /* 133MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 133), /* 133MHz */
|
|
&write_quad(0, 256, 133), /* 133MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 133), /* 133MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* GD 3.3v GD5F2GQ5UEYIG 2Gbit */
|
|
{
|
|
.name = "GD5F2GQ5UEYIG",
|
|
.id = {0xc8, 0x52},
|
|
.id_len = _2B,
|
|
.chipsize = _256M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual_addr(2, INFINITE, 104), /* 104MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad_addr(4, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 104), /* 104MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* GD 1.8V GD5F1GQ4RB9IGR 1Gbit */
|
|
{
|
|
.name = "GD5F1GQ4RB9IGR",
|
|
.id = {0xc8, 0xc1},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual_addr(1, INFINITE, 104),
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad_addr(1, INFINITE, 104),
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* GD 1.8V GD5F2GQ4RB9IGR 2Gbit */
|
|
{
|
|
.name = "GD5F2GQ4RB9IGR",
|
|
.id = {0xc8, 0xc2},
|
|
.id_len = _2B,
|
|
.chipsize = _256M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual_addr(1, INFINITE, 104),
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad_addr(1, INFINITE, 104),
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
/* GD 1.8V 5F4GQ6RE9IG 4Gbit */
|
|
{
|
|
.name = "GD5F4GQ6RE9IG",
|
|
.id = {0xc8, 0x45},
|
|
.id_len = 2,
|
|
.chipsize = _512M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24),
|
|
&read_fast(1, INFINITE, 80),
|
|
&read_dual(1, INFINITE, 80),
|
|
&read_dual_addr(2, INFINITE, 80),
|
|
&read_quad(1, INFINITE, 80),
|
|
&read_quad_addr(4, INFINITE, 80),
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 80),
|
|
&write_quad(0, 256, 80),
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 80),
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
/* GD 1.8V GD5F4GQ4RAYIG 4Gbit */
|
|
{
|
|
.name = "GD5F4GQ4RAYIG",
|
|
.id = {0xc8, 0xe4},
|
|
.id_len = _2B,
|
|
.chipsize = _512M,
|
|
.erasesize = _256K,
|
|
.pagesize = _4K,
|
|
.oobsize = _256B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual_addr(1, INFINITE, 104),
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad_addr(1, INFINITE, 104),
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_256k(0, _256K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* GD 1.8V GD5F4GQ4RBYIG 4Gbit */
|
|
{
|
|
.name = "GD5F4GQ4RBYIG",
|
|
.id = {0xc8, 0xc4},
|
|
.id_len = _2B,
|
|
.chipsize = _512M,
|
|
.erasesize = _256K,
|
|
.pagesize = _4K,
|
|
.oobsize = _256B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 120), /* 120MHz */
|
|
&read_dual(1, INFINITE, 120), /* 120MHz */
|
|
&read_dual_addr(1, INFINITE, 120), /* 120MHz */
|
|
&read_quad(1, INFINITE, 120), /* 120MHz */
|
|
&read_quad_addr(1, INFINITE, 120), /* 120MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 120), /* 120MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_256k(0, _256K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* Winbond 1.8V W25N02JWZEIF 2Gbit */
|
|
{
|
|
.name = "W25N02JWZEIF",
|
|
.id = {0xef, 0xbf, 0x22},
|
|
.id_len = _3B,
|
|
.chipsize = _256M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 120), /* 120MHz */
|
|
&read_dual(1, INFINITE, 120), /* 120MHz */
|
|
&read_dual_addr(1, INFINITE, 120), /* 120MHz */
|
|
&read_quad(1, INFINITE, 120), /* 120MHz */
|
|
&read_quad_addr(2, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 104), /* 104MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* Winbond W25N01GV 1Gbit 3.3V */
|
|
{
|
|
.name = "W25N01GV",
|
|
.id = {0xef, 0xaa, 0x21},
|
|
.id_len = _3B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual_addr(1, INFINITE, 104),
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad_addr(2, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* Winbond W25N01GWZEIG 1Gbit 1.8V */
|
|
{
|
|
.name = "W25N01GWZEIG",
|
|
.id = {0xef, 0xba, 0x21},
|
|
.id_len = _3B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual_addr(1, INFINITE, 104),
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad_addr(2, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* ATO ATO25D1GA 1Gbit */
|
|
{
|
|
.name = "ATO25D1GA",
|
|
.id = {0x9b, 0x12},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* MXIC MX35LF1GE4AB 1Gbit */
|
|
{
|
|
.name = "MX35LF1GE4AB",
|
|
.id = {0xc2, 0x12},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* MXIC MX35UF1G14AC 1Gbit 1.8V */
|
|
{
|
|
.name = "MX35UF1G14AC",
|
|
.id = {0xc2, 0x90},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* MXIC MX35LF2GE4AB 2Gbit SOP-16Pin */
|
|
{
|
|
.name = "MX35LF2GE4AB",
|
|
.id = {0xc2, 0x22},
|
|
.id_len = _2B,
|
|
.chipsize = _256M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* MXIC MX35LF2G14AC 2GBit */
|
|
{
|
|
.name = "MX35LF2G14AC",
|
|
.id = {0xc2, 0x20},
|
|
.id_len = _2B,
|
|
.chipsize = _256M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* MXIC MX35UF2G14AC 2Gbit 1.8V */
|
|
{
|
|
.name = "MX35UF2G14AC",
|
|
.id = {0xc2, 0xa0},
|
|
.id_len = _2B,
|
|
.chipsize = _256M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* Paragon PN26G01A 1Gbit */
|
|
{
|
|
.name = "PN26G01A",
|
|
.id = {0xa1, 0xe1},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 108), /* 108MHz */
|
|
&read_dual(1, INFINITE, 108), /* 108MHz */
|
|
&read_dual_addr(1, INFINITE, 108), /* 108MHz */
|
|
&read_quad(1, INFINITE, 108), /* 108MHz */
|
|
&read_quad_addr(1, INFINITE, 108), /* 108MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 108), /* 108MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* Paragon PN26G02A 2Gbit */
|
|
{
|
|
.name = "PN26G02A",
|
|
.id = {0xa1, 0xe2},
|
|
.id_len = _2B,
|
|
.chipsize = _256M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 108), /* 108MHz */
|
|
&read_dual(1, INFINITE, 108), /* 108MHz */
|
|
&read_dual_addr(1, INFINITE, 108), /* 108MHz */
|
|
&read_quad(1, INFINITE, 108), /* 108MHz */
|
|
&read_quad_addr(1, INFINITE, 108), /* 108MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 108), /* 108MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* All-flash AFS1GQ4UAC 1Gbit */
|
|
{
|
|
.name = "AFS1GQ4UAC",
|
|
.id = {0xc1, 0x51},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 80), /* 80MHz */
|
|
&read_dual(1, INFINITE, 80), /* 80MHz */
|
|
&read_dual_addr(1, INFINITE, 80), /* 80MHz */
|
|
&read_quad(1, INFINITE, 80), /* 80MHz */
|
|
&read_quad_addr(1, INFINITE, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* All-flash AFS2GQ4UAD 2Gbit */
|
|
{
|
|
.name = "AFS2GQ4UAD",
|
|
.id = {0xc1, 0x52},
|
|
.id_len = _2B,
|
|
.chipsize = _256M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 80), /* 80MHz */
|
|
&read_dual(1, INFINITE, 80), /* 80MHz */
|
|
&read_dual_addr(1, INFINITE, 80), /* 80MHz */
|
|
&read_quad(1, INFINITE, 80), /* 80MHz */
|
|
&read_quad_addr(1, INFINITE, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* TOSHIBA TC58CVG0S3H 1Gbit */
|
|
{
|
|
.name = "TC58CVG0S3H",
|
|
.id = {0x98, 0xc2},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* TOSHIBA TC58CYG0S3H 1.8V 1Gbit */
|
|
{
|
|
.name = "TC58CYG0S3H",
|
|
.id = {0x98, 0xb2},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* TOSHIBA TC58CYG0S3HRAIJ 1.8V 1Gbit */
|
|
{
|
|
.name = "TC58CYG0S3HRAIJ",
|
|
.id = {0x98, 0xD2, 0x40},
|
|
.id_len = _3B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 133), /* 133MHz */
|
|
&read_dual(1, INFINITE, 133), /* 133MHz */
|
|
&read_quad(1, INFINITE, 133), /* 133MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 133), /* 133MHz */
|
|
&write_quad(0, 256, 133), /* 133MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 133), /* 133MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* TOSHIBA TC58CVG1S3H 2Gbit */
|
|
{
|
|
.name = "TC58CVG1S3H",
|
|
.id = {0x98, 0xcb},
|
|
.id_len = _2B,
|
|
.chipsize = _256M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* TOSHIBA TC58CYG1S3H 1.8V 2Gbit */
|
|
{
|
|
.name = "TC58CYG1S3H",
|
|
.id = {0x98, 0xbb},
|
|
.id_len = _2B,
|
|
.chipsize = _256M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 75), /* 75MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 75), /* 75MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* TOSHIBA TC58CVG1S3HRAIJ 3.3V 2Gbit */
|
|
{
|
|
.name = "TC58CVG1S3HRAIJ",
|
|
.id = {0x98, 0xeb, 0x40},
|
|
.id_len = _3B,
|
|
.chipsize = _256M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 133), /* 133MHz */
|
|
&read_dual(1, INFINITE, 133), /* 133MHz */
|
|
&read_quad(1, INFINITE, 133), /* 133MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 133), /* 133MHz */
|
|
&write_quad(0, 256, 133), /* 133MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 133), /* 133MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* TOSHIBA TC58CVG2S0H 4Gbit */
|
|
{
|
|
.name = "TC58CVG2S0H",
|
|
.id = {0x98, 0xcd},
|
|
.id_len = _2B,
|
|
.chipsize = _512M,
|
|
.erasesize = _256K,
|
|
.pagesize = _4K,
|
|
.oobsize = _256B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_256k(0, _256K, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* TOSHIBA TC58CYG2S0H 1.8V 4Gbit */
|
|
{
|
|
.name = "TC58CYG2S0H",
|
|
.id = {0x98, 0xbd},
|
|
.id_len = _2B,
|
|
.chipsize = _512M,
|
|
.erasesize = _256K,
|
|
.pagesize = _4K,
|
|
.oobsize = _256B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 75), /* 75MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_256k(0, _256K, 75), /* 75MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* KIOXIA TC58CYG2S0HRAIJ 1.8V 4Gbit */
|
|
{
|
|
.name = "TC58CYG2S0HRAIJ",
|
|
.id = {0x98, 0xdd, 0x51},
|
|
.id_len = _3B,
|
|
.chipsize = _512M,
|
|
.erasesize = _256K,
|
|
.pagesize = _4K,
|
|
.oobsize = _256B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 133), /* 133MHz */
|
|
&read_dual(1, INFINITE, 133), /* 133MHz */
|
|
&read_quad(1, INFINITE, 133), /* 133MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 133), /* 133MHz */
|
|
&write_quad(0, 256, 133), /* 133MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_256k(0, _256K, 133), /* 133MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* KIOXIA TH58CYG3S0H 1.8V 8Gbit */
|
|
{
|
|
.name = "TH58CYG3S0H",
|
|
.id = {0x98, 0xd4, 0x51},
|
|
.id_len = _3B,
|
|
.chipsize = _1G,
|
|
.erasesize = _256K,
|
|
.pagesize = _4K,
|
|
.oobsize = _256B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 133), /* 133MHz */
|
|
&read_dual(1, INFINITE, 133), /* 133MHz */
|
|
&read_quad(1, INFINITE, 133), /* 133MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 133), /* 133MHz */
|
|
&write_quad(0, 256, 133), /* 133MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_256k(0, _256K, 133), /* 133MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* HeYangTek HYF1GQ4UAACAE 1Gbit */
|
|
{
|
|
.name = "HYF1GQ4UAACAE",
|
|
.id = {0xc9, 0x51},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 60), /* 60MHz */
|
|
&read_dual(1, INFINITE, 60), /* 60MHz */
|
|
&read_dual_addr(1, INFINITE, 60), /* 60MHz */
|
|
&read_quad(1, INFINITE, 60), /* 60MHz */
|
|
&read_quad_addr(1, INFINITE, 60), /* 60MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 80), /* 80MHz */
|
|
&write_quad(0, 256, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* HeYangTek HYF2GQ4UAACAE 2Gbit */
|
|
{
|
|
.name = "HYF2GQ4UAACAE",
|
|
.id = {0xc9, 0x52},
|
|
.id_len = _2B,
|
|
.chipsize = _256M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 60), /* 60MHz */
|
|
&read_dual(1, INFINITE, 60), /* 60MHz */
|
|
&read_dual_addr(1, INFINITE, 60), /* 60MHz */
|
|
&read_quad(1, INFINITE, 60), /* 60MHz */
|
|
&read_quad_addr(1, INFINITE, 60), /* 60MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 80), /* 80MHz */
|
|
&write_quad(0, 256, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* HeYangTek HYF4GQ4UAACBE 4Gbit */
|
|
{
|
|
.name = "HYF4GQ4UAACBE",
|
|
.id = {0xc9, 0xd4},
|
|
.id_len = _2B,
|
|
.chipsize = _512M,
|
|
.erasesize = _256K,
|
|
.pagesize = _4K,
|
|
.oobsize = _256B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 60), /* 60MHz */
|
|
&read_dual(1, INFINITE, 60), /* 60MHz */
|
|
&read_dual_addr(1, INFINITE, 60), /* 60MHz */
|
|
&read_quad(1, INFINITE, 60), /* 60MHz */
|
|
&read_quad_addr(1, INFINITE, 60), /* 60MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 80), /* 80MHz */
|
|
&write_quad(0, 256, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_256k(0, _256K, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* Dosilicon 3.3V DS35Q1GA-IB 1Gbit */
|
|
{
|
|
.name = "DS35Q1GA-IB",
|
|
.id = {0xe5, 0x71},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 80), /* 80MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* XTX 3.3V XT26G01B 1Gbit */
|
|
{
|
|
.name = "XT26G01B",
|
|
.id = {0x0B, 0xF1},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 80), /* 80MHz */
|
|
&read_dual(1, INFINITE, 80), /* 80MHz */
|
|
&read_dual_addr(1, INFINITE, 80), /* 80MHz */
|
|
&read_quad(1, INFINITE, 80), /* 80MHz */
|
|
&read_quad_addr(1, INFINITE, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 80), /* 80MHz */
|
|
&write_quad(0, 256, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* Etron 1.8V EM78F044VCA-H 8Gbit */
|
|
{
|
|
.name = "EM78F044VCA-H",
|
|
.id = {0xD5, 0x8D},
|
|
.id_len = _2B,
|
|
.chipsize = _1G,
|
|
.erasesize = _256K,
|
|
.pagesize = _4K,
|
|
.oobsize = _256B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 100), /* 100MHz */
|
|
&read_dual(1, INFINITE, 100), /* 100MHz */
|
|
&read_dual_addr(1, INFINITE, 100), /* 100MHz */
|
|
&read_quad(1, INFINITE, 100), /* 100MHz */
|
|
&read_quad_addr(1, INFINITE, 100), /* 100MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 100), /* 100MHz */
|
|
&write_quad(0, 256, 100), /* 100MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_256k(0, _256K, 100), /* 100MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* Etron 1.8V EM78E044VCA-H 4Gbit */
|
|
{
|
|
.name = "EM78E044VCA-H",
|
|
.id = {0xD5, 0x8C},
|
|
.id_len = _2B,
|
|
.chipsize = _512M,
|
|
.erasesize = _256K,
|
|
.pagesize = _4K,
|
|
.oobsize = _256B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 100), /* 100MHz */
|
|
&read_dual(1, INFINITE, 100), /* 100MHz */
|
|
&read_dual_addr(1, INFINITE, 100), /* 100MHz */
|
|
&read_quad(1, INFINITE, 100), /* 100MHz */
|
|
&read_quad_addr(1, INFINITE, 100), /* 100MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 100), /* 100MHz */
|
|
&write_quad(0, 256, 100), /* 100MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_256k(0, _256K, 100), /* 100MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* Etron 1.8V EM78D044VCF-H 2Gbit */
|
|
{
|
|
.name = "EM78D044VCF-H",
|
|
.id = {0xd5, 0x81},
|
|
.id_len = _2B,
|
|
.chipsize = _256M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual_addr(1, INFINITE, 104),
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad_addr(1, INFINITE, 104),
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 80), /* 80MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
/* Etron 3.3V EM73C044VCC-H 1Gbit */
|
|
{
|
|
.name = "EM73C044VCC-H",
|
|
.id = {0xd5, 0x22},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24),
|
|
&read_fast(1, INFINITE, 120),
|
|
&read_dual(1, INFINITE, 120),
|
|
&read_dual_addr(1, INFINITE, 120),
|
|
&read_quad(1, INFINITE, 120),
|
|
&read_quad_addr(1, INFINITE, 120),
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 104),
|
|
&write_quad(0, 256, 120),
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 104),
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
/* Dosilicon 3.3V DS35Q2GA-IB 1Gb */
|
|
{
|
|
.name = "DS35Q2GA-IB",
|
|
.id = {0xe5, 0x72},
|
|
.id_len = _2B,
|
|
.chipsize = _256M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 80), /* 80MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* FM 3.3V FM25S01-DND-A-G 1Gb */
|
|
{
|
|
.name = "FM25S01-DND-A-G",
|
|
.id = {0xa1, 0xa1},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _128B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual_addr(1, INFINITE, 40), /* 40MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad_addr(2, INFINITE, 40), /* 40MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 104), /* 104MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* FM 3.3V FM25S01A 1Gb */
|
|
{
|
|
.name = "FM25S01A",
|
|
.id = {0xa1, 0xe4},
|
|
.id_len = _2B,
|
|
.chipsize = _128M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual_addr(1, INFINITE, 40), /* 40MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad_addr(2, INFINITE, 40), /* 40MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 104), /* 104MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* HSESDFDSW2G 3.3V 2G-BIT */
|
|
{
|
|
.name = "HSESDFDSW2G",
|
|
.id = {0x3C, 0xD2},
|
|
.id_len = _2B,
|
|
.chipsize = _256M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 80), /* 80MHz */
|
|
&read_dual(1, INFINITE, 80), /* 80MHz */
|
|
&read_dual_addr(1, INFINITE, 80), /* 80MHz */
|
|
&read_quad(1, INFINITE, 80), /* 80MHz */
|
|
&read_quad_addr(1, INFINITE, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 80), /* 80MHz */
|
|
&write_quad(0, 256, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 80), /* 104MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
/* Winbond 3.3V W25N02KV 2Gbit */
|
|
{
|
|
.name = "W25N02KV",
|
|
.id = {0xef, 0xaa, 0x22},
|
|
.id_len = _3B,
|
|
.chipsize = _256M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual(1, INFINITE, 104), /* 104MHz */
|
|
&read_dual_addr(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad(1, INFINITE, 104), /* 104MHz */
|
|
&read_quad_addr(2, INFINITE, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 24), /* 24MHz */
|
|
&write_quad(0, 256, 104), /* 104MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 24), /* 24MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe,
|
|
},
|
|
|
|
/* HSESDFDSW4G 3.3V 4G-BIT 20250805 */
|
|
{
|
|
.name = "HSESDFDSW4G_1",
|
|
.id = {0x3C, 0xD4, 0xD4},
|
|
.id_len = _3B,
|
|
.chipsize = _512M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 108), /* 108MHz */
|
|
&read_fast(1, INFINITE, 108), /* 108MHz */
|
|
&read_dual(1, INFINITE, 108), /* 108MHz */
|
|
&read_dual_addr(1, INFINITE, 108), /* 108MHz */
|
|
&read_quad(1, INFINITE, 108), /* 108MHz */
|
|
&read_quad_addr(1, INFINITE, 108), /* 108MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 108), /* 108MHz */
|
|
&write_quad(0, 256, 108), /* 108MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 108), /* 108MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_no_qe, // spi_driver_general
|
|
},
|
|
|
|
/* HSESDFDSW4G 3.3V 4G-BIT */
|
|
{
|
|
.name = "HSESDFDSW4G",
|
|
.id = {0x3C, 0xD4},
|
|
.id_len = _2B,
|
|
.chipsize = _512M,
|
|
.erasesize = _128K,
|
|
.pagesize = _2K,
|
|
.oobsize = _64B,
|
|
.badblock_pos = BBP_FIRST_PAGE,
|
|
.read = {
|
|
&read_std(1, INFINITE, 24), /* 24MHz */
|
|
&read_fast(1, INFINITE, 80), /* 80MHz */
|
|
&read_dual(1, INFINITE, 80), /* 80MHz */
|
|
&read_dual_addr(1, INFINITE, 80), /* 80MHz */
|
|
&read_quad(1, INFINITE, 80), /* 80MHz */
|
|
&read_quad_addr(1, INFINITE, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.write = {
|
|
&write_std(0, 256, 80), /* 80MHz */
|
|
&write_quad(0, 256, 80), /* 80MHz */
|
|
0
|
|
},
|
|
.erase = {
|
|
&erase_sector_128k(0, _128K, 80), /* 104MHz */
|
|
0
|
|
},
|
|
.driver = &spi_driver_general,
|
|
},
|
|
|
|
{ .id_len = 0, },
|
|
};
|
|
|
|
/*****************************************************************************/
|
|
static void fmc100_spi_nand_search_rw(struct spi_nand_info *spiinfo,
|
|
struct spi_op *spiop_rw, u_int iftype,
|
|
u_int max_dummy, int rw_type)
|
|
{
|
|
int ix = 0;
|
|
struct spi_op **spiop = NULL;
|
|
struct spi_op **fitspiop = NULL;
|
|
|
|
for (fitspiop = spiop = (rw_type ? spiinfo->write : spiinfo->read);
|
|
(*spiop) && ix < MAX_SPI_OP; spiop++, ix++)
|
|
if (((*spiop)->iftype & iftype) &&
|
|
((*spiop)->dummy <= max_dummy) &&
|
|
((*fitspiop)->iftype < (*spiop)->iftype))
|
|
fitspiop = spiop;
|
|
|
|
memcpy(spiop_rw, (*fitspiop), sizeof(struct spi_op));
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
static void fmc100_spi_nand_get_erase(struct spi_nand_info *spiinfo,
|
|
struct spi_op *spiop_erase)
|
|
{
|
|
int ix;
|
|
|
|
spiop_erase->size = 0;
|
|
for (ix = 0; ix < MAX_SPI_OP; ix++) {
|
|
if (spiinfo->erase[ix] == NULL)
|
|
break;
|
|
if (spiinfo->erasesize == spiinfo->erase[ix]->size) {
|
|
memcpy(&spiop_erase[ix], spiinfo->erase[ix],
|
|
sizeof(struct spi_op));
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
static void fmc100_map_spi_op(struct fmc_spi *spi)
|
|
{
|
|
unsigned char ix = 0;
|
|
|
|
const int iftype_read[] = {
|
|
SPI_IF_READ_STD, IF_TYPE_STD,
|
|
SPI_IF_READ_FAST, IF_TYPE_STD,
|
|
SPI_IF_READ_DUAL, IF_TYPE_DUAL,
|
|
SPI_IF_READ_DUAL_ADDR, IF_TYPE_DIO,
|
|
SPI_IF_READ_QUAD, IF_TYPE_QUAD,
|
|
SPI_IF_READ_QUAD_ADDR, IF_TYPE_QIO,
|
|
0, 0,
|
|
};
|
|
const int iftype_write[] = {
|
|
SPI_IF_WRITE_STD, IF_TYPE_STD,
|
|
SPI_IF_WRITE_QUAD, IF_TYPE_QUAD,
|
|
0, 0,
|
|
};
|
|
const char *if_str[] = {"STD", "DUAL", "DIO", "QUAD", "QIO"};
|
|
|
|
fmc_pr(BT_DBG, "\t||*-Start Get SPI operation iftype & clock\n");
|
|
/* the element with an even number of arrays, so increase is 2 */
|
|
for (ix = 0; iftype_write[ix]; ix += 2) {
|
|
if (spi->write->iftype == iftype_write[ix]) {
|
|
spi->write->iftype = iftype_write[ix + 1];
|
|
break;
|
|
}
|
|
}
|
|
fmc_get_fmc_best_2x_clock(&spi->write->clock);
|
|
fmc_pr(BT_DBG, "\t|||-Get best write iftype: %s clock type: %d\n",
|
|
if_str[spi->write->iftype],
|
|
get_fmc_clk_type(spi->write->clock));
|
|
/* the element with an even number of arrays, so increase is 2 */
|
|
for (ix = 0; iftype_read[ix]; ix += 2) {
|
|
if (spi->read->iftype == iftype_read[ix]) {
|
|
spi->read->iftype = iftype_read[ix + 1];
|
|
break;
|
|
}
|
|
}
|
|
fmc_get_fmc_best_2x_clock(&spi->read->clock);
|
|
fmc_pr(BT_DBG, "\t|||-Get best read iftype: %s clock type: %d\n",
|
|
if_str[spi->read->iftype],
|
|
get_fmc_clk_type(spi->read->clock));
|
|
|
|
fmc_get_fmc_best_2x_clock(&spi->erase->clock);
|
|
spi->erase->iftype = IF_TYPE_STD;
|
|
fmc_pr(BT_DBG, "\t|||-Get best erase iftype: %s clock type: %d\n",
|
|
if_str[spi->erase->iftype],
|
|
get_fmc_clk_type(spi->erase->clock));
|
|
|
|
fmc_pr(BT_DBG, "\t||*-End Get SPI operation iftype & clock\n");
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
static void fmc100_spi_ids_probe(struct fmc_host *host,
|
|
struct spi_nand_info *spi_dev)
|
|
{
|
|
unsigned int reg;
|
|
struct fmc_spi *spi = host->spi;
|
|
unsigned char *fmc_cs = get_cs_number(host->cmd_op.cs);
|
|
|
|
fmc_pr(BT_DBG, "\t|*-Start match SPI operation & chip init\n");
|
|
|
|
spi->host = host;
|
|
spi->name = spi_dev->name;
|
|
spi->driver = spi_dev->driver;
|
|
|
|
fmc100_spi_nand_search_rw(spi_dev, spi->read,
|
|
FMC_SPI_NAND_SUPPORT_READ,
|
|
FMC_SPI_NAND_SUPPORT_MAX_DUMMY, RW_OP_READ);
|
|
fmc_pr(BT_DBG, "\t||-Save spi->read op cmd:%#x\n", spi->read->cmd);
|
|
|
|
fmc100_spi_nand_search_rw(spi_dev, spi->write,
|
|
FMC_SPI_NAND_SUPPORT_WRITE,
|
|
FMC_SPI_NAND_SUPPORT_MAX_DUMMY, RW_OP_WRITE);
|
|
fmc_pr(BT_DBG, "\t||-Save spi->write op cmd:%#x\n", spi->write->cmd);
|
|
|
|
fmc100_spi_nand_get_erase(spi_dev, spi->erase);
|
|
fmc_pr(BT_DBG, "\t||-Save spi->erase op cmd:%#x\n", spi->erase->cmd);
|
|
|
|
fmc100_map_spi_op(spi);
|
|
|
|
spi->driver->qe_enable(spi);
|
|
|
|
/* Disable write protection */
|
|
reg = spi_nand_feature_op(spi, GET_OP, PROTECT_ADDR, 0);
|
|
fmc_pr(BT_DBG, "\t||-Get protect status[%#x]: %#x\n", PROTECT_ADDR, reg);
|
|
if (any_bp_enable(reg)) {
|
|
reg &= ~ALL_BP_MASK;
|
|
spi_nand_feature_op(spi, SET_OP, PROTECT_ADDR, reg);
|
|
fmc_pr(BT_DBG, "\t||-Set [%#x]FT %#x\n", PROTECT_ADDR, reg);
|
|
|
|
spi->driver->wait_ready(spi);
|
|
|
|
reg = spi_nand_feature_op(spi, GET_OP, PROTECT_ADDR, 0);
|
|
fmc_pr(BT_DBG, "\t||-Check BP disable result: %#x\n", reg);
|
|
if (any_bp_enable(reg))
|
|
db_msg("Error: Write protection disable failed!\n");
|
|
}
|
|
|
|
/* Disable chip internal ECC */
|
|
reg = spi_nand_feature_op(spi, GET_OP, FEATURE_ADDR, 0);
|
|
fmc_pr(BT_DBG, "\t||-Get feature status[%#x]: %#x\n", FEATURE_ADDR, reg);
|
|
if (reg & FEATURE_ECC_ENABLE) {
|
|
reg &= ~FEATURE_ECC_ENABLE;
|
|
spi_nand_feature_op(spi, SET_OP, FEATURE_ADDR, reg);
|
|
fmc_pr(BT_DBG, "\t||-Set [%#x]FT: %#x\n", FEATURE_ADDR, reg);
|
|
|
|
spi->driver->wait_ready(spi);
|
|
|
|
reg = spi_nand_feature_op(spi, GET_OP, FEATURE_ADDR, 0);
|
|
fmc_pr(BT_DBG, "\t||-Check internal ECC disable result: %#x\n",
|
|
reg);
|
|
if (reg & FEATURE_ECC_ENABLE)
|
|
db_msg("Error: Chip internal ECC disable failed!\n");
|
|
}
|
|
|
|
(*fmc_cs)++;
|
|
|
|
fmc_pr(BT_DBG, "\t|*-End match SPI operation & chip init\n");
|
|
}
|
|
|
|
static struct nand_flash_dev spi_nand_dev;
|
|
/*****************************************************************************/
|
|
static struct nand_flash_dev *spi_nand_get_flash_info(struct mtd_info *mtd,
|
|
struct nand_chip *chip, unsigned char *id)
|
|
{
|
|
unsigned char ix;
|
|
unsigned char len;
|
|
char buffer[TMP_BUF_LEN];
|
|
struct fmc_host *host = chip->priv;
|
|
struct spi_nand_info *spi_dev = fmc_spi_nand_flash_table;
|
|
struct nand_flash_dev *type = &spi_nand_dev;
|
|
|
|
fmc_pr(BT_DBG, "\t*-Start find SPI Nand flash\n");
|
|
|
|
len = sprintf(buffer, "SPI Nand(cs %d) ID: %#x %#x",
|
|
host->cmd_op.cs, id[0], id[1]);
|
|
|
|
for (; spi_dev->id_len; spi_dev++) {
|
|
if (memcmp(id, spi_dev->id, spi_dev->id_len))
|
|
continue;
|
|
/* element with an even number of arrays, so increase is 2 */
|
|
for (ix = 2; ix < spi_dev->id_len; ix++)
|
|
len += sprintf(buffer + len, " %#x", id[ix]);
|
|
printf("%s Name:\"%s\"\n", buffer, spi_dev->name);
|
|
|
|
fmc_pr(BT_DBG, "\t||-CS(%d) found SPI Nand: %s\n",
|
|
host->cmd_op.cs, spi_dev->name);
|
|
|
|
type->name = spi_dev->name;
|
|
memcpy(type->id, spi_dev->id, spi_dev->id_len);
|
|
type->pagesize = spi_dev->pagesize;
|
|
type->chipsize = byte_to_mb(spi_dev->chipsize);
|
|
type->erasesize = spi_dev->erasesize;
|
|
type->id_len = spi_dev->id_len;
|
|
type->oobsize = spi_dev->oobsize;
|
|
type->options = chip->options;
|
|
fmc_pr(BT_DBG, "\t|-Save struct spi_nand_info info\n");
|
|
|
|
mtd->size = spi_dev->chipsize;
|
|
|
|
fmc100_spi_ids_probe(host, spi_dev);
|
|
|
|
fmc_pr(BT_DBG, "\t*-Found SPI nand: %s\n", spi_dev->name);
|
|
|
|
return type;
|
|
}
|
|
|
|
fmc_pr(BT_DBG, "\t*-Not found SPI nand flash, ID: %s\n", buffer);
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/*****************************************************************************/
|
|
void fmc_spi_nand_ids_register(void)
|
|
{
|
|
#ifndef CONFIG_SYS_NAND_QUIET_TEST
|
|
printf("SPI Nand ID Table Version %s\n", SPI_NAND_ID_TAB_VER);
|
|
#endif
|
|
get_flash_type = spi_nand_get_flash_info;
|
|
}
|