sdk-hwV1.3/lichee/linux-4.9/modules/nand/common1/phy-nand/rawnand/rawnand_ids.c

2052 lines
60 KiB
C
Executable File

/*
* nand_ids.c
*
* Copyright (C) 2019 Allwinner.
*
* cuizhikui <cuizhikui@allwinnertech.com>
*
* SPDX-License-Identifier: GPL-2.0
*/
#include "rawnand_ids.h"
#include "rawnand_chip.h"
#include "rawnand_boot.h"
#include "rawnand_debug.h"
#include <linux/string.h>
/*cmd stay to handle*/
struct nand_phy_op_par phy_op_para[] = {
{
// CMD_SET_0 index
.instr = {
.read_instr = {0x00, 0x30},
.multi_plane_read_instr = {0x00, 0x30, 0x00, 0x30}, //simulate
.write_instr = {0x80, 0x10},
.multi_plane_write_instr = {0x80, 0x10, 0x80, 0x10}, //simulate
},
},
{
// CMD_SET_1 index
.instr = {
.read_instr = {0x00, 0x30},
.multi_plane_read_instr = {0x00, 0x30, 0x00, 0x30}, //simulate
.write_instr = {0x80, 0x10},
.multi_plane_write_instr = {0x80, 0x11, 0x80, 0x10},
},
},
{
// CMD_SET_2 index
.instr = {
.read_instr = {0x00, 0x30},
.multi_plane_read_instr = {0x00, 0x32, 0x00, 0x30},
.write_instr = {0x80, 0x10},
.multi_plane_write_instr = {0x80, 0x11, 0x81, 0x10},
},
},
{
// CMD_SET_3 index
.instr = {
.read_instr = {0x00, 0x30},
.multi_plane_read_instr = {0x00, 0x32, 0x00, 0x30},
.write_instr = {0x80, 0x10},
.multi_plane_write_instr = {0x80, 0x11, 0x80, 0x10},
},
},
};
struct sunxi_nand_flash_device raw_sandisk[] = {
{
.name = "SDTNSGAMA-016G",
.id = {0x45, 0x3A, 0x94, 0x93, 0x76, 0x51, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 4212,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM |
SANDISK_LSB_PAGE,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 40,
.ecc_mode = BCH_40,
.read_retry_type = 0x342009,
.ddr_type = SDR,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_SANDISK,
.ddr_info_no = 1,
.id_number = 0x0,
.max_blk_erase_times = 3000,
.access_high_freq = 40,
},
{
.name = "SDTNRFAMA-004G",
.id = {0x45, 0xd7, 0x84, 0x93, 0x72, 0x50, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 1060,
.operation_opt = NAND_RANDOM | NAND_READ_RETRY |
SANDISK_LSB_PAGE,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 40,
.ecc_mode = BCH_40,
.read_retry_type = 0x331f04,
.ddr_type = SDR,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_SANDISK,
.ddr_info_no = 1,
.id_number = 0x1,
.max_blk_erase_times = 4000,
.access_high_freq = 40,
},
{
.name = "SDTNRGAMA-008G",
.id = {0x45, 0xde, 0x94, 0x93, 0x76, 0x50, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 2132,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM |
NAND_READ_RETRY | SANDISK_LSB_PAGE,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 40,
.ecc_mode = BCH_40,
.read_retry_type = 0x331f04,
.ddr_type = SDR,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_SANDISK,
.ddr_info_no = 1,
.id_number = 0x2,
.max_blk_erase_times = 4000,
.access_high_freq = 40,
},
{
.name = "SDTNQGAMA-008G",
.id = {0x45, 0xde, 0x94, 0x93, 0x76, 0x57, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 2116,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM |
NAND_READ_RETRY | SANDISK_LSB_PAGE,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 40,
.ecc_mode = BCH_40,
.read_retry_type = 0x301409,
.ddr_type = SDR,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_SANDISK,
.ddr_info_no = DDR_INFO_PARAS0_DEF,
.id_number = 0x4,
.max_blk_erase_times = 4000,
.access_high_freq = 40,
},
{
.name = "SDTNQFAMA-004G",
.id = {0x45, 0xd7, 0x84, 0x93, 0x72, 0x57, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 1060,
.operation_opt = NAND_RANDOM | NAND_READ_RETRY |
SANDISK_LSB_PAGE,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 40,
.ecc_mode = BCH_40,
.read_retry_type = 0x301409,
.ddr_type = SDR,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_SANDISK,
.ddr_info_no = DDR_INFO_PARAS0_DEF,
.id_number = 0x5,
.max_blk_erase_times = 4000,
.access_high_freq = 40,
},
};
struct sunxi_nand_flash_device raw_toshiba[] = {
{
.name = "TC58TEG6DDLTA00",
.id = {0x98, 0xde, 0x94, 0x93, 0x76, 0x51, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 2148,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM |
TOSHIBA_LSB_PAGE,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 60,
.ecc_mode = BCH_40,
.read_retry_type = 0x120a05,
.ddr_type = TOG_DDR,
.ddr_opt = NAND_VCCQ_1P8V | NAND_TOGGLE_IO_DRIVER_STRENGTH
| NAND_TOGGLE_VENDOR_SPECIFIC_CFG,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_TOSHIBA,
.ddr_info_no = 0,
.id_number = 0x0,
.max_blk_erase_times = 3000,
.access_high_freq = 60,
},
{
/*TC58NVG2S0HTAI0&TC58NVG2S0HTA00 the same id (industry/consumption)*/
.name = "TC58NVG2S0HTAI0",
.id = {0x98, 0xdc, 0x90, 0x26, 0x76, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 8,
.page_cnt_per_blk = 64,
.blk_cnt_per_die = 2048,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_32,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = FIRST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_TOSHIBA,
.ddr_info_no = 0,
.id_number = 0x1,
.max_blk_erase_times = 60000,
.access_high_freq = 30,
},
{
.name = "TC58NVG1S3HTA00",
.id = {0x98, 0xda, 0x90, 0x15, 0x76, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 4,
.page_cnt_per_blk = 64,
.blk_cnt_per_die = 2048,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_32,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_NO,
.ddr_info_no = 0,
.id_number = 0x2,
.max_blk_erase_times = 60000,
.access_high_freq = 30,
},
{
.name = "TC58TFG7DDLTA0D",
.id = {0x98, 0x3a, 0x94, 0x93, 0x76, 0x51, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 4212,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM |
TOSHIBA_LSB_PAGE | NAND_READ_RETRY,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 40,
.ecc_mode = BCH_40,
.read_retry_type = 0x120a05,
.ddr_type = TOG_DDR,
.ddr_opt = NAND_VCCQ_1P8V | NAND_TOGGLE_IO_DRIVER_STRENGTH
| NAND_TOGGLE_VENDOR_SPECIFIC_CFG,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_TOSHIBA,
.ddr_info_no = 0,
.id_number = 0x3,
.max_blk_erase_times = 3000,
.access_high_freq = 40,
},
{
.name = "TC58BVG0S3HTAI0",
.id = {0x98, 0xf1, 0x80, 0x15, 0xf2, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 4,
.page_cnt_per_blk = 64,
.blk_cnt_per_die = 1024,
.operation_opt = NAND_RANDOM,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_16,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = FIRST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_0,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_NO,
.ddr_info_no = 0,
.id_number = 0x4,
.max_blk_erase_times = 30000,
.access_high_freq = 30,
},
{
.name = "TC58TEG5DCKTA00",
.id = {0x98, 0xd7, 0x84, 0x93, 0x72, 0x50, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 1060,
.operation_opt = NAND_RANDOM | TOSHIBA_LSB_PAGE |
NAND_READ_RETRY,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 40,
.ecc_mode = BCH_40,
.read_retry_type = 0x110705,
.ddr_type = SDR,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_TOSHIBA,
.ddr_info_no = 0,
.id_number = 0x5,
.max_blk_erase_times = 3000,
.access_high_freq = 40,
},
{
.name = "TC58TEG6DDJTA00",
.id = {0x98, 0xde, 0x94, 0x93, 0x76, 0x57, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 2130,
.operation_opt = NAND_RANDOM | TOSHIBA_LSB_PAGE |
NAND_READ_RETRY,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_40,
.read_retry_type = 0x100604,
.ddr_type = SDR,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_TOSHIBA,
.ddr_info_no = 0,
.id_number = 0x6,
.max_blk_erase_times = 4000,
.access_high_freq = 30,
},
{
.name = "TC58TEG5DCJTA00",
.id = {0x98, 0xd7, 0x84, 0x93, 0x72, 0x57, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 1060,
.operation_opt = NAND_RANDOM | TOSHIBA_LSB_PAGE |
NAND_READ_RETRY,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_40,
.read_retry_type = 0x100604,
.ddr_type = SDR,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_TOSHIBA,
.ddr_info_no = 0,
.id_number = 0x7,
.max_blk_erase_times = 4000,
.access_high_freq = 30,
},
{
.name = "TC58NVG6DCJTA00",
.id = {0x98, 0xde, 0x84, 0x93, 0x72, 0x57, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 2092,
.operation_opt = NAND_RANDOM | TOSHIBA_LSB_PAGE |
NAND_READ_RETRY,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_40,
.read_retry_type = 0x100604,
.ddr_type = SDR,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_TOSHIBA,
.ddr_info_no = 0,
.id_number = 0x8,
.max_blk_erase_times = 4000,
.access_high_freq = 30,
},
{
.name = "TH58NVG6D2ETA20",
.id = {0x98, 0xd7, 0x95, 0x32, 0xff, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 2,
.sect_cnt_per_page = 16,
.page_cnt_per_blk = 128,
.blk_cnt_per_die = 4096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 25,
.ecc_mode = BCH_24,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_3,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_TOSHIBA,
.ddr_info_no = 0,
.id_number = 0x9,
.max_blk_erase_times = 8000,
.access_high_freq = 25,
},
{
.name = "TH58NVG6D2FTA20",//TH58NVG5D2FTA00
.id = {0x98, 0xd7, 0x94, 0x32, 0xff, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 16,
.page_cnt_per_blk = 128,
.blk_cnt_per_die = 4096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 25,
.ecc_mode = BCH_28,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_3,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_TOSHIBA,
.ddr_info_no = 0,
.id_number = 0x10,
.max_blk_erase_times = 8000,
.access_high_freq = 25,
},
};
struct sunxi_nand_flash_device raw_micron[] = {
{
.name = "MT29F64G08CBABA",
.id = {0x2c, 0x64, 0x44, 0x4B, 0xA9, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 16,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 4096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM |
MICRON_0x41_LSB_PAGE,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 40,
.ecc_mode = BCH_48,
.read_retry_type = 0x400a01,
.ddr_type = SDR,
.ddr_opt = NAND_ONFI_TIMING_MODE,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_1,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_MICRON,
.ddr_info_no = 0,
.id_number = 0x0,
.max_blk_erase_times = 3000,
.access_high_freq = 40,
},
{
.name = "MT29F32G08CBADBWP",
.id = {0x2c, 0x44, 0x44, 0x4B, 0xA9, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 16,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 2128,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM |
MICRON_0x41_LSB_PAGE | NAND_FIND_ID_TAB_BY_NAME,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 60,
.ecc_mode = BCH_48,
.read_retry_type = 0x400a01,
.ddr_type = ONFI_DDR,
.ddr_opt = NAND_ONFI_TIMING_MODE | NAND_ONFI_IO_DRIVER_STRENGTH
| NAND_ONFI_RB_STRENGTH,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_1,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_MICRON,
.ddr_info_no = 0,
.id_number = 0x1,
.max_blk_erase_times = 3000,
.access_high_freq = 60,
},
{
.name = "MT29F128G08CFAAA",
.id = {0x2c, 0x88, 0x04, 0x4B, 0xA9, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 16,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 4096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM |
GENERIC_LSB_PAGE,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 40,
.ecc_mode = BCH_28,
.read_retry_type = 0,
.ddr_type = SDR,
.ddr_opt = NAND_ONFI_TIMING_MODE,
.bad_block_flag_position = FIRST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_3,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_NO,
.ddr_info_no = 0,
.id_number = 0x2,
.max_blk_erase_times = 3000,
.access_high_freq = 40,
},
{
.name = "FBNL05B128G1KDBABJ4",
.id = {0x2c, 0x84, 0x44, 0x32, 0xAA, 0x04, 0x00, 0x00},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 512,
.blk_cnt_per_die = 2192,
/*
* This nand request that it should write lsb/msb shared pages together,
* so use GENERIC_LSB_PAGE to write boot0 data both to lsb and msb pages
* and use NAND_PAIRED_PAGE_SYNC for driver to write lsb,msb pages together
*/
.operation_opt = NAND_RANDOM | NAND_READ_RETRY | NAND_READ_UNIQUE_ID | NAND_PAGE_ADR_NO_SKIP | NAND_PAIRED_PAGE_SYNC |NAND_ONFI_SYNC_RESET_OP | GENERIC_LSB_PAGE,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 75,
.ecc_mode = BCH_76,
.read_retry_type = 0x421201,
.ddr_type = ONFI_DDR,
.ddr_opt = NAND_VCCQ_1P8V|NAND_ONFI_TIMING_MODE|NAND_ONFI_DDR2_CFG|NAND_ONFI_IO_DRIVER_STRENGTH|NAND_TOGGLE_VENDOR_SPECIFIC_CFG,
.bad_block_flag_position = FIRST_PAGE,
.multi_plane_block_offset = 1,
.sharedpage_offset = 1,
.cmd_set_no = CMD_SET_3,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_MICRON,
.ddr_info_no = DDR_INFO_PARAS1_DRV_2,
.id_number = 0x3,
.max_blk_erase_times = 1500,
.access_high_freq = 75,
},
{
.name = "FBNL06B256G1KDBABJ4",
.id = {0x2c, 0xA4, 0x64, 0x32, 0xAA, 0x04, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 1024,
.blk_cnt_per_die = 2192,
.operation_opt = NAND_RANDOM | MICRON_0x44_LSB_PAGE,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 75,
.ecc_mode = BCH_76,
.read_retry_type = 0x421000,
.ddr_type = ONFI_DDR,
.ddr_opt = NAND_VCCQ_1P8V | NAND_ONFI_IO_DRIVER_STRENGTH |
NAND_ONFI_TIMING_MODE,
.bad_block_flag_position = FIRST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_1,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_MICRON,
.ddr_info_no = 0,
.id_number = 0x4,
.max_blk_erase_times = 1000,
.access_high_freq = 75,
},
{
.name = "MT29F4G08ABAF",
.id = {0x2c, 0xDC, 0x80, 0xA6, 0x62, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 8,
.page_cnt_per_blk = 64,
.blk_cnt_per_die = 2048,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM | GENERIC_LSB_PAGE,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 40,
.ecc_mode = BCH_32,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.ddr_opt = NAND_ONFI_TIMING_MODE,
.bad_block_flag_position = FIRST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_0,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_NO,
.ddr_info_no = 0,
.id_number = 0x5,
.max_blk_erase_times = 60000,
.access_high_freq = 40,
},
{
.name = "MT29F32G08CBADAWP",
.id = {0x2c, 0x44, 0x44, 0x4B, 0xA9, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 16,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 2128,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM |
MICRON_0x41_LSB_PAGE | NAND_FIND_ID_TAB_BY_NAME,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 40,
.ecc_mode = BCH_48,
.read_retry_type = 0x400a01,
.ddr_type = SDR,
.ddr_opt = NAND_ONFI_TIMING_MODE,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_1,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_MICRON,
.ddr_info_no = 0,
.id_number = 0x6,
.max_blk_erase_times = 3000,
.access_high_freq = 40,
},
{
.name = "FxxL85C71KSBAB",
.id = {0x2C, 0x84, 0x64, 0x3C, 0xa9, 0x04, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 512,
.blk_cnt_per_die = 2096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM | NAND_READ_RETRY | NAND_FIND_ID_TAB_BY_NAME |
NAND_READ_UNIQUE_ID | MICRON_0x41_LSB_PAGE | NAND_ONFI_SYNC_RESET_OP,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 75,
.ecc_mode = BCH_40,
.read_retry_type = 0x410c01,
.ddr_type = ONFI_DDR,
.ddr_opt = NAND_ONFI_RB_STRENGTH | NAND_ONFI_TIMING_MODE | NAND_ONFI_DDR2_CFG |
NAND_ONFI_IO_DRIVER_STRENGTH | NAND_TOGGLE_VENDOR_SPECIFIC_CFG,
.bad_block_flag_position = FIRST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_1,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_MICRON,
.ddr_info_no = DDR_INFO_PARAS1_DRV_2,
.id_number = 0x7,
.max_blk_erase_times = 1500,
.access_high_freq = 75,
},
{
.name = "FxxL95B71KDBABH6",
.id = {0x2C, 0x84, 0x64, 0x54, 0xa9, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 512,
.blk_cnt_per_die = 2096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM | NAND_READ_RETRY |
MICRON_0x42_LSB_PAGE,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 75,
.ecc_mode = BCH_64,
.read_retry_type = 0x410c01,
.ddr_type = ONFI_DDR,
.ddr_opt = NAND_ONFI_RB_STRENGTH | NAND_ONFI_TIMING_MODE | NAND_ONFI_DDR2_CFG | NAND_ONFI_IO_DRIVER_STRENGTH | NAND_VCCQ_1P8V,
.bad_block_flag_position = FIRST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_3,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_MICRON,
.ddr_info_no = DDR_INFO_PARAS1_DRV_2,
.id_number = 0x8,
.max_blk_erase_times = 1000,
.access_high_freq = 75,
},
{
.name = "L84D",
.id = {0x2C, 0x64, 0x64, 0x3C, 0xa5, 0x08, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 512,
.blk_cnt_per_die = 1048,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM | NAND_READ_RETRY |
MICRON_0x41_LSB_PAGE,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 40,
.ecc_mode = BCH_40,
.read_retry_type = 0x400a01,
.ddr_type = ONFI_DDR,
/*.ddr_opt = NAND_ONFI_TIMING_MODE,*/
.ddr_opt = NAND_ONFI_DDR2_CFG | NAND_ONFI_IO_DRIVER_STRENGTH |
NAND_ONFI_TIMING_MODE | NAND_VCCQ_1P8V,
.bad_block_flag_position = FIRST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_3,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_MICRON,
.id_number = 0x9,
.max_blk_erase_times = 3000,
.access_high_freq = 40,
},
{
.name = "L04A",
.id = {0x2C, 0x64, 0x44, 0x32, 0xa5, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 512,
.blk_cnt_per_die = 1088,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM | NAND_READ_RETRY |
GENERIC_LSB_PAGE | NAND_PAIRED_PAGE_SYNC,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 75,
.ecc_mode = BCH_76,
.read_retry_type = 0x421201,
.ddr_type = ONFI_DDR,
.ddr_opt = NAND_ONFI_DDR2_CFG | NAND_ONFI_IO_DRIVER_STRENGTH |
NAND_ONFI_TIMING_MODE | NAND_VCCQ_1P8V,
.bad_block_flag_position = FIRST_PAGE,
.multi_plane_block_offset = 1,
.sharedpage_offset = 1,
.cmd_set_no = CMD_SET_3,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_MICRON,
.ddr_info_no = DDR_INFO_PARAS1_DRV_2,
.id_number = 0xA,
.max_blk_erase_times = 1000,
.access_high_freq = 75,
},
{
.name = "FxxL85C71KSBAR",
.id = {0x2C, 0x84, 0x64, 0x3C, 0xa9, 0x04, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 512,
.blk_cnt_per_die = 2096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM | NAND_READ_RETRY | MICRON_0x41_LSB_PAGE | NAND_FIND_ID_TAB_BY_NAME,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 40,
.ecc_mode = BCH_40,
.read_retry_type = 0x410c01,
.ddr_type = SDR,
.ddr_opt = NAND_ONFI_RB_STRENGTH | NAND_ONFI_TIMING_MODE | NAND_ONFI_IO_DRIVER_STRENGTH,
.bad_block_flag_position = FIRST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_1,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_MICRON,
.ddr_info_no = 0,
.id_number = 0xB,
.max_blk_erase_times = 1500,
.access_high_freq = 40,
},
{
.name = "MT29F128G08CBEBB3W",
.id = {0x2C, 0x84, 0x64, 0x3C, 0xa9, 0x04, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 512,
.blk_cnt_per_die = 2096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM | NAND_READ_RETRY |
NAND_FIND_ID_TAB_BY_NAME_CANCEL | NAND_READ_UNIQUE_ID | MICRON_0x41_LSB_PAGE |
NAND_ONFI_SYNC_RESET_OP,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 75,
.ecc_mode = BCH_40,
.read_retry_type = 0x410c01,
.ddr_type = ONFI_DDR,
.ddr_opt = NAND_ONFI_RB_STRENGTH | NAND_ONFI_TIMING_MODE | NAND_ONFI_DDR2_CFG |
NAND_ONFI_IO_DRIVER_STRENGTH,
.bad_block_flag_position = FIRST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_1,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_MICRON,
.ddr_info_no = DDR_INFO_PARAS1_DRV_2,
.id_number = 0xC,
.max_blk_erase_times = 1500,
.access_high_freq = 75,
},
{
.name = "MT29F256G08CJABA",
.id = {0x2c, 0x84, 0xc5, 0x4b, 0xa9, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 2,
.sect_cnt_per_page = 16,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 4096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM | NAND_READ_RETRY |
NAND_READ_UNIQUE_ID | MICRON_0x41_LSB_PAGE | NAND_PAGE_ADR_NO_SKIP,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 40,
.ecc_mode = BCH_44,
.read_retry_type = 0x400a01,
.ddr_type = SDR,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_1,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_MICRON,
.ddr_info_no = 0,
.id_number = 0xD,
.max_blk_erase_times = 3500,
.access_high_freq = 40,
},
{
.name = "MT29F64G08CBAAA",
.id = {0x2c, 0x88, 0x24, 0x4B, 0xff, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 16,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 4096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM | NAND_READ_RETRY |
NAND_READ_UNIQUE_ID | NAND_READ_UNIQUE_ID,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_28,
.read_retry_type = 0x400a01,
.ddr_type = SDR,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_1,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_MICRON,
.ddr_info_no = 0,
.id_number = 0xE,
.max_blk_erase_times = 5000,
.access_high_freq = 30,
},
{
.name = "MT29F32G08CBACA",
.id = {0x2c, 0x68, 0x04, 0x4A, 0xff, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 8,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 4096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM |
NAND_READ_UNIQUE_ID,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_28,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_1,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_MICRON,
.ddr_info_no = 0,
.id_number = 0xF,
.max_blk_erase_times = 5000,
.access_high_freq = 30,
},
{
.name = "MT29F32G08CBABA",
.id = {0x2c, 0x68, 0x04, 0x46, 0xff, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 8,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 4096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM |
NAND_READ_UNIQUE_ID,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_28,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_1,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_MICRON,
.ddr_info_no = 0,
.id_number = 0x10,
.max_blk_erase_times = 5000,
.access_high_freq = 30,
},
{
.name = "MT29F32G08CBAAA",
.id = {0x2c, 0xd7, 0x94, 0x3e, 0xff, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 8,
.page_cnt_per_blk = 128,
.blk_cnt_per_die = 8192,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM |
NAND_READ_UNIQUE_ID,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_28,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_1,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_MICRON,
.ddr_info_no = 0,
.id_number = 0x11,
.max_blk_erase_times = 5000,
.access_high_freq = 30,
},
{
.name = "MT29F8G08MAA",
.id = {0x2c, 0xd3, 0x94, 0xa5, 0xff, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 4,
.page_cnt_per_blk = 128,
.blk_cnt_per_die = 4096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_16,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_1,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_MICRON,
.ddr_info_no = 0,
.id_number = 0x10,
.max_blk_erase_times = 10000,
.access_high_freq = 30,
},
{
.name = "FBML05B128G1KDBABJ4",
.id = {0x2c, 0x84, 0x44, 0x34, 0xAA, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 512,
.blk_cnt_per_die = 2192,
/*
* This nand request that it should write lsb/msb shared pages together,
* so use GENERIC_LSB_PAGE to write boot0 data both to lsb and msb pages
* and use NAND_PAIRED_PAGE_SYNC for driver to write lsb,msb pages together
*/
.operation_opt = NAND_RANDOM | NAND_READ_RETRY | NAND_READ_UNIQUE_ID | NAND_PAGE_ADR_NO_SKIP | NAND_PAIRED_PAGE_SYNC |NAND_ONFI_SYNC_RESET_OP | GENERIC_LSB_PAGE,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 75,
.ecc_mode = BCH_76,
.read_retry_type = 0x421201,
.ddr_type = ONFI_DDR,
.ddr_opt = NAND_VCCQ_1P8V|NAND_ONFI_TIMING_MODE|NAND_ONFI_DDR2_CFG|NAND_ONFI_IO_DRIVER_STRENGTH|NAND_TOGGLE_VENDOR_SPECIFIC_CFG,
.bad_block_flag_position = FIRST_PAGE,
.multi_plane_block_offset = 1,
.sharedpage_offset = 1,
.cmd_set_no = CMD_SET_3,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_MICRON,
.ddr_info_no = DDR_INFO_PARAS1_DRV_2,
.id_number = 0x3,
.max_blk_erase_times = 1500,
.access_high_freq = 75,
},
};
struct sunxi_nand_flash_device raw_spansion[] = {
{
.name = "S34ML01G200TFI000",
.id = {0x01, 0xf1, 0x80, 0x1d, 0xff, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 4,
.page_cnt_per_blk = 64,
.blk_cnt_per_die = 1024,
.operation_opt = NAND_RANDOM,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_16,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_0,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_NO,
.ddr_info_no = 0,
.id_number = 0x0,
.max_blk_erase_times = 60000,
.access_high_freq = 30,
},
{
.name = "S34ML02G200TFI000",
.id = {0x01, 0xda, 0x90, 0x95, 0x46, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 4,
.page_cnt_per_blk = 64,
.blk_cnt_per_die = 2048,
.operation_opt = NAND_RANDOM | NAND_MULTI_PROGRAM | NAND_PAGE_COPYBACK,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_32,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_NO,
.ddr_info_no = 0,
.id_number = 0x1,
.max_blk_erase_times = 60000,
.access_high_freq = 30,
},
};
struct sunxi_nand_flash_device raw_esmt[] = {
{
.name = "IS34ML04G084",
.id = {0xC8, 0xDC, 0x90, 0x95, 0x54, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 4,
.page_cnt_per_blk = 64,
.blk_cnt_per_die = 4096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_16,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_NO,
.ddr_info_no = 0,
.id_number = 0x0,
.max_blk_erase_times = 60000,
.access_high_freq = 30,
},
{
.name = "F59L2G81KA",
.id = {0xc8, 0x6a, 0x90, 0x04, 0x34, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 4,
.page_cnt_per_blk = 64,
.blk_cnt_per_die = 2048,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM | GENERIC_LSB_PAGE,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_32,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_NO,
.ddr_info_no = 0,
.id_number = 0x1,
.max_blk_erase_times = 50000,
.access_high_freq = 30,
},
{
.name = "F59L1G81MB",
.id = {0xc8, 0xd1, 0x80, 0x95, 0x40, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 4,
.page_cnt_per_blk = 64,
.blk_cnt_per_die = 1024,
.operation_opt = NAND_RANDOM | GENERIC_LSB_PAGE,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_16,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_0,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_NO,
.ddr_info_no = 0,
.id_number = 0x2,
.max_blk_erase_times = 60000,
.access_high_freq = 30,
},
};
struct sunxi_nand_flash_device raw_intel[] = {
{
.name = "JS29F64G08ACMF3",
.id = {0x89, 0x88, 0x24, 0x4B, 0xa9, 0x84, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 16,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 4096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM | NAND_READ_RETRY | NAND_READ_UNIQUE_ID | MICRON_0x40_LSB_PAGE | NAND_ONFI_SYNC_RESET_OP,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 50,
.ecc_mode = BCH_40,
.read_retry_type = 0x500701,
.ddr_type = SDR,
.ddr_opt = NAND_VCCQ_1P8V | NAND_ONFI_TIMING_MODE | NAND_ONFI_DDR2_CFG | NAND_ONFI_IO_DRIVER_STRENGTH | NAND_TOGGLE_VENDOR_SPECIFIC_CFG,
.bad_block_flag_position = FIRST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_1,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_MICRON,
.ddr_info_no = DDR_INFO_PARAS1_DRV_2,
.id_number = 0x0,
.max_blk_erase_times = 3000,
.access_high_freq = 50,
},
{
.name = "AW56B16A4",
.id = {0x89, 0x84, 0x64, 0x3C, 0xa5, 0x0c, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 512,
.blk_cnt_per_die = 2096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM | NAND_READ_RETRY |
MICRON_0x41_LSB_PAGE | NAND_ONFI_SYNC_RESET_OP | NAND_READ_UNIQUE_ID,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 75,
.ecc_mode = BCH_40,
.read_retry_type = 0x411201,
.ddr_type = ONFI_DDR,
.ddr_opt = NAND_ONFI_RB_STRENGTH | NAND_ONFI_TIMING_MODE | NAND_ONFI_DDR2_CFG |
NAND_ONFI_IO_DRIVER_STRENGTH | NAND_TOGGLE_VENDOR_SPECIFIC_CFG,
.bad_block_flag_position = FIRST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_1,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_MICRON,
.ddr_info_no = DDR_INFO_PARAS0_DEF,
.id_number = 0x1,
.max_blk_erase_times = 1500,
.access_high_freq = 75,
},
};
struct sunxi_nand_flash_device raw_mxic[] = {
{
.name = "MX30LF2G18AC",
.id = {0xC2, 0xDA, 0x90, 0x95, 0x06, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 4,
.page_cnt_per_blk = 64,
.blk_cnt_per_die = 2048,
.operation_opt = NAND_RANDOM | NAND_READ_UNIQUE_ID,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 50,
.ecc_mode = BCH_16,
.read_retry_type = 0x0,
.ddr_type = SDR,
.ddr_opt = 0x0,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_1,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = 0,
.ddr_info_no = 0,
.id_number = 0x0,
.max_blk_erase_times = 10000,
.access_high_freq = 50,
},
{
.name = "MX30LF1G18AC",
.id = {0xC2, 0xF1, 0x80, 0x95, 0x02, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 4,
.page_cnt_per_blk = 64,
.blk_cnt_per_die = 1024,
.operation_opt = NAND_RANDOM | NAND_READ_UNIQUE_ID,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 50,
.ecc_mode = BCH_16,
.read_retry_type = 0x0,
.ddr_type = SDR,
.ddr_opt = 0x0,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_0,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = 0,
.ddr_info_no = 0,
.id_number = 0x1,
.max_blk_erase_times = 10000,
.access_high_freq = 50,
},
};
struct sunxi_nand_flash_device raw_giga[] = {
{
.name = "GD9FU2G8F2A",
.id = {0xC8, 0xDA, 0x90, 0x95, 0x46, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 4,
.page_cnt_per_blk = 64,
.blk_cnt_per_die = 2048,
.operation_opt = NAND_RANDOM | NAND_READ_UNIQUE_ID,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 50,
.ecc_mode = BCH_32,
.read_retry_type = 0x0,
.ddr_type = SDR,
.ddr_opt = 0x0,
.bad_block_flag_position = FIRST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_1,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = 0,
.ddr_info_no = 0,
.id_number = 0x0,
.max_blk_erase_times = 10000,
.access_high_freq = 50,
},
};
struct sunxi_nand_flash_device raw_foresee[] = {
{
.name = "FS33ND04GS108TF10",
.id = {0xec, 0xdc, 0x10, 0x95, 0x56, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 4,
.page_cnt_per_blk = 64,
.blk_cnt_per_die = 4096,
.operation_opt = NAND_RANDOM | NAND_MULTI_PROGRAM,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 40,
.ecc_mode = BCH_16,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.ddr_opt = 0x0,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_NO,
.ddr_info_no = 0,
.id_number = 0x0,
.max_blk_erase_times = 60000,
.access_high_freq = 40,
},
{
.name = "FS33ND01GS108TF10",
.id = {0xec, 0xf1, 0x00, 0x95, 0x42, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 4,
.page_cnt_per_blk = 64,
.blk_cnt_per_die = 1024,
.operation_opt = NAND_RANDOM,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_16,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.ddr_opt = 0x0,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_0,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_NO,
.ddr_info_no = 0,
.id_number = 0x1,
.max_blk_erase_times = 60000,
.access_high_freq = 30,
},
};
struct sunxi_nand_flash_device raw_samsung[] = {
{
.name = "FS33ND01GS108TF10",
.id = {0xec, 0xf1, 0x00, 0x95, 0x42, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 4,
.page_cnt_per_blk = 64,
.blk_cnt_per_die = 1024,
.operation_opt = NAND_RANDOM,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_16,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.ddr_opt = 0x0,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_0,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_NO,
.ddr_info_no = 0,
.id_number = 0x0,
.max_blk_erase_times = 60000,
.access_high_freq = 30,
},
{
.name = "K9GCGD8U0F",
.id = {0xec, 0xde, 0x94, 0xc3, 0xa4, 0xca, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 792,
.blk_cnt_per_die = 688,
.operation_opt = NAND_RANDOM | NAND_READ_RETRY | NAND_TOGGLE_ONLY,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_52,
.read_retry_type = 0x200e04,
.ddr_type = TOG_DDR2,
.ddr_opt = NAND_TOGGLE_IO_DRIVER_STRENGTH,
.bad_block_flag_position = FIRST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_SAMSUNG,
.ddr_info_no = DDR_INFO_PARAS0_DEF,
.id_number = 0x1,
.max_blk_erase_times = 1500,
.access_high_freq = 30,
},
{
.name = "K9HDG08U1A",
.id = {0xec, 0xde, 0xd5, 0x7A, 0x58, 0x43, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 16,
.page_cnt_per_blk = 128,
.blk_cnt_per_die = 4196,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM |
NAND_DIE_SKIP,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_32,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_SAMSUNG,
.ddr_info_no = DDR_INFO_PARAS0_DEF,
.id_number = 0x2,
.max_blk_erase_times = 1500,
.access_high_freq = 30,
},
{
.name = "K9LCG08U0B",
.id = {0xec, 0xde, 0xd5, 0x7e, 0x68, 0x44, 0xff, 0xff},
.die_cnt_per_chip = 2,
.sect_cnt_per_page = 16,
.page_cnt_per_blk = 128,
.blk_cnt_per_die = 4096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM |
NAND_READ_RETRY | SAMSUNG_LSB_PAGE,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_40,
.read_retry_type = 0x200e04,
.ddr_type = SDR,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_SAMSUNG,
.ddr_info_no = DDR_INFO_PARAS0_DEF,
.id_number = 0x3,
.max_blk_erase_times = 3500,
.access_high_freq = 30,
},
{
.name = "K9GBG08U0B",
.id = {0xec, 0xd7, 0x94, 0x7e, 0x64, 0x44, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 16,
.page_cnt_per_blk = 128,
.blk_cnt_per_die = 4096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM |
NAND_READ_RETRY | SAMSUNG_LSB_PAGE,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 40,
.ecc_mode = BCH_40,
.read_retry_type = 0x200e04,
.ddr_type = SDR,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_SAMSUNG,
.ddr_info_no = DDR_INFO_PARAS0_DEF,
.id_number = 0x4,
.max_blk_erase_times = 3500,
.access_high_freq = 40,
},
{
.name = "K9GBG08U0A",
.id = {0xec, 0xd7, 0x94, 0x76, 0x64, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 16,
.page_cnt_per_blk = 128,
.blk_cnt_per_die = 4096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_32,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_SAMSUNG,
.ddr_info_no = DDR_INFO_PARAS0_DEF,
.id_number = 0x5,
.max_blk_erase_times = 8000,
.access_high_freq = 30,
},
{
.name = "K9LCG08U0A",
.id = {0xec, 0xde, 0xd5, 0x7A, 0x58, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 2,
.sect_cnt_per_page = 16,
.page_cnt_per_blk = 128,
.blk_cnt_per_die = 4096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM |
NAND_DIE_SKIP,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_32,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_SAMSUNG,
.ddr_info_no = DDR_INFO_PARAS0_DEF,
.id_number = 0x6,
.max_blk_erase_times = 4000,
.access_high_freq = 30,
},
{
.name = "K9GAG08U0M",
.id = {0xec, 0xd5, 0x14, 0xb6, 0xff, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 8,
.page_cnt_per_blk = 128,
.blk_cnt_per_die = 4096,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_16,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_SAMSUNG,
.ddr_info_no = DDR_INFO_PARAS0_DEF,
.id_number = 0x6,
.max_blk_erase_times = 10000,
.access_high_freq = 30,
},
{
.name = "K9F2G08U0A",
.id = {0xec, 0xda, 0x10, 0x95, 0x44, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 4,
.page_cnt_per_blk = 64,
.blk_cnt_per_die = 2048,
.operation_opt = NAND_MULTI_PROGRAM | NAND_RANDOM |
NAND_MULTI_READ,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_16,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_SAMSUNG,
.ddr_info_no = DDR_INFO_PARAS0_DEF,
.id_number = 0x7,
.max_blk_erase_times = 10000,
.access_high_freq = 30,
},
};
struct sunxi_nand_flash_device raw_hynix[] = {
{
.name = "H27TDG8T2D8R",
.id = {0xad, 0x3a, 0x14, 0x03, 0x08, 0x50, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 388,
.blk_cnt_per_die = 2724,
.operation_opt = NAND_RANDOM | NAND_MULTI_PROGRAM | GENERIC_LSB_PAGE,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 50,
.ecc_mode = BCH_56,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = TOG_DDR2,
.ddr_opt = NAND_TOGGLE_SPECIFIC_CFG |
NAND_TOGGLE_VENDOR_SPECIFIC_CFG |
NAND_TOGGLE_IO_DRIVER_STRENGTH,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_1,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_NO,
.ddr_info_no = DDR_INFO_PARAS0_DEF,
.id_number = 0x0,
.max_blk_erase_times = 10000,
.access_high_freq = 50,
},
{
.name = "H27UCG8T2ETR",
.id = {0xad, 0xde, 0x14, 0xA7, 0x42, 0x4a, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 2120,
.operation_opt = NAND_RANDOM | NAND_MULTI_PROGRAM |
NAND_READ_RETRY,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_48,
.read_retry_type = 0x040704,
.ddr_type = SDR,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_HYNIX_16NM,
.ddr_info_no = DDR_INFO_PARAS0_DEF,
.id_number = 0x1,
.max_blk_erase_times = 2000,
.access_high_freq = 30,
},
{
.name = "H27UBG8T2DTR",
.id = {0xad, 0xd7, 0x14, 0x9e, 0x34, 0x4a, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 16,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 2122,
.operation_opt = NAND_RANDOM | NAND_MULTI_PROGRAM |
NAND_READ_RETRY,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 40,
.ecc_mode = BCH_48,
.read_retry_type = 0x040704,
.ddr_type = SDR,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_HYNIX_16NM,
.ddr_info_no = DDR_INFO_PARAS0_DEF,
.id_number = 0x2,
.max_blk_erase_times = 2000,
.access_high_freq = 40,
},
{
.name = "H27UCG8T2B",
.id = {0xad, 0xde, 0x94, 0xeb, 0x74, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 32,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 2132,
.operation_opt = NAND_RANDOM | NAND_MULTI_PROGRAM |
NAND_READ_RETRY,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 40,
.ecc_mode = BCH_40,
.read_retry_type = 0x030708,
.ddr_type = SDR,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_HYNIX_20NM,
.ddr_info_no = DDR_INFO_PARAS0_DEF,
.id_number = 0x3,
.max_blk_erase_times = 2000,
.access_high_freq = 40,
},
{
.name = "H27UBG8T2C",
.id = {0xad, 0xd7, 0x94, 0x91, 0x60, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 16,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 2092,
.operation_opt = NAND_RANDOM | NAND_MULTI_PROGRAM |
NAND_READ_RETRY,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 40,
.ecc_mode = BCH_40,
.read_retry_type = 0x030708,
.ddr_type = SDR,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_HYNIX_20NM,
.ddr_info_no = DDR_INFO_PARAS0_DEF,
.id_number = 0x4,
.max_blk_erase_times = 2000,
.access_high_freq = 40,
},
{
.name = "H27UBG8T2B",
.id = {0xad, 0xd7, 0x94, 0xda, 0xff, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 16,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 2048,
.operation_opt = NAND_RANDOM | NAND_MULTI_PROGRAM |
NAND_READ_RETRY,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_40,
.read_retry_type = 0x010604,
.ddr_type = SDR,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_HYNIX_26NM,
.ddr_info_no = DDR_INFO_PARAS0_DEF,
.id_number = 0x5,
.max_blk_erase_times = 2000,
.access_high_freq = 30,
},
{
.name = "H27UBG8T2A",
.id = {0xad, 0xd7, 0x94, 0x9A, 0xff, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 16,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 2048,
.operation_opt = NAND_RANDOM | NAND_MULTI_PROGRAM,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_28,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_HYNIX_16NM,
.ddr_info_no = DDR_INFO_PARAS0_DEF,
.id_number = 0x7,
.max_blk_erase_times = 5000,
.access_high_freq = 30,
},
{
.name = "H27UAG8T2B",
.id = {0xad, 0xd5, 0x94, 0x9A, 0xff, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 16,
.page_cnt_per_blk = 256,
.blk_cnt_per_die = 1024,
.operation_opt = NAND_RANDOM,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 30,
.ecc_mode = BCH_28,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.bad_block_flag_position = LAST_PAGE,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_HYNIX_26NM,
.ddr_info_no = DDR_INFO_PARAS0_DEF,
.id_number = 0x7,
.max_blk_erase_times = 5000,
.access_high_freq = 30,
},
};
struct sunxi_nand_flash_device raw_winbond[] = {
{
.name = "W29N02KV",
.id = {0xef, 0xda, 0x10, 0x95, 0x06, 0xff, 0xff, 0xff},
.die_cnt_per_chip = 1,
.sect_cnt_per_page = 4,
.page_cnt_per_blk = 64,
.blk_cnt_per_die = 2048,
.operation_opt = NAND_RANDOM | NAND_MULTI_PROGRAM,
.valid_blk_ratio = VALID_BLK_RATIO_DEFAULT,
.access_freq = 40,
.ecc_mode = BCH_32,
.read_retry_type = READ_RETRY_TYPE_NULL,
.ddr_type = SDR,
.ddr_opt = 0x0,
.bad_block_flag_position = FIRST_TWO_PAGES,
.multi_plane_block_offset = 1,
.cmd_set_no = CMD_SET_2,
.selected_write_boot0_no = NAND_WRITE_BOOT0_GENERIC,
.selected_readretry_no = NAND_READRETRY_NO,
.id_number = 0x0,
.max_blk_erase_times = 60000,
.access_high_freq = 40,
},
};
struct nand_manufacture mfr_tbl[] = {
NAND_MANUFACTURE(NAND_MFR_MICRON, MICRON_NAME, raw_micron),
NAND_MANUFACTURE(NAND_MFR_SPANSION, SPANSION_NAME, raw_spansion),
NAND_MANUFACTURE(NAND_MFR_SANDISK, SANDISK_NAME, raw_sandisk),
NAND_MANUFACTURE(NAND_MFR_TOSHIBA, TOSHIBA_NAME, raw_toshiba),
NAND_MANUFACTURE(NAND_MFR_ESMT, ESMT_NAME, raw_esmt),
NAND_MANUFACTURE(NAND_MFR_INTEL, INTEL_NAME, raw_intel),
NAND_MANUFACTURE(NAND_MFR_GIGA, GIGA_NAME, raw_giga),
NAND_MANUFACTURE(NAND_MFR_MXIC, MXIC_NAME, raw_mxic),
NAND_MANUFACTURE(NAND_MFR_FORESEE, FORESEE_NAME, raw_foresee),
NAND_MANUFACTURE(NAND_MFR_SAMSUNG, SAMSUNG_NAME, raw_samsung),
NAND_MANUFACTURE(NAND_MFR_HYNIX, HYNIX_NAME, raw_hynix),
NAND_MANUFACTURE(NAND_MFR_WINBOND, WINBOND_NAME, raw_winbond),
};
struct sunxi_nand_flash_device *sunxi_search_idtab_by_id(unsigned char *id)
{
int m = 0;
int d = 0;
int i = 0;
u8 mfr_id = id[0];
u8 dev_id = id[1];
int cnt = 0;
int match_id_cnt = 0;
struct sunxi_nand_flash_device *match = NULL;
for (m = 0; m < sizeof(mfr_tbl) / sizeof(struct nand_manufacture); m++) {
struct nand_manufacture *mfr = &mfr_tbl[m];
if (mfr_id == mfr->id) {
for (d = 0; d < mfr->ndev; d++) {
struct sunxi_nand_flash_device *dev =
&mfr->dev[d];
cnt = 0;
if (dev_id == dev->dev_id) {
for (i = 0; i < NAND_MAX_ID_LEN; i++) {
if (dev->id[i] == id[i])
cnt++;
else
break;
}
if (cnt > match_id_cnt) {
if (cnt >= NAND_MIN_ID_LEN) {
match = dev;
match_id_cnt = cnt;
}
}
}
}
}
}
return match;
}
struct sunxi_nand_flash_device *sunxi_search_idtab_by_name(char *mfr_name, char *device_name)
{
int m = 0;
int d = 0;
struct sunxi_nand_flash_device *match = NULL;
for (m = 0; m < sizeof(mfr_tbl) / sizeof(struct nand_manufacture); m++) {
struct nand_manufacture *mfr = &mfr_tbl[m];
if (!memcmp(mfr_name, mfr->name, strlen(mfr->name))) {
for (d = 0; d < mfr->ndev; d++) {
struct sunxi_nand_flash_device *dev =
&mfr->dev[d];
if (!memcmp(device_name, dev->name, strlen(dev->name))) {
match = dev;
}
}
}
}
return match;
}
/**
* sunxi_search_id: search id is id table
* @id : this id is read from device
* */
struct sunxi_nand_flash_device *sunxi_search_id(struct nand_chip_info *nci,
unsigned char *id)
{
/*
*int m = 0;
*int d = 0;
*int i = 0;
*u8 mfr_id = id[0];
*u8 dev_id = id[1];
*int match_id_cnt = 0;
*/
struct sunxi_nand_flash_device *match = NULL;
unsigned char *mem = NULL;
char *device_name = NULL;
int ret = 0;
unsigned int nand_close_model_match = 0;
mem = kmalloc(REVISION_FEATURES_BLOCK_INFO_PARAMETER_LEN, GFP_KERNEL);
if (!mem) {
RAWNAND_ERR("malloc buffer fail in %s %d\n", __func__, __LINE__);
goto err0;
}
memset(mem, 0, REVISION_FEATURES_BLOCK_INFO_PARAMETER_LEN);
device_name = (char *)&mem[MCIRON_DEVICE_MODEL_OFFSET];
match = sunxi_search_idtab_by_id(id);
if (!match) {
goto err0;
}
/*micron: different flash have the same id, find the id table by name(device model)*/
if (match->mfr_id == NAND_MFR_MICRON) {
if (match->operation_opt & NAND_FIND_ID_TAB_BY_NAME) {
ret = of_property_read_u32(aw_ndfc.dev->of_node,
"nand0_close_model_match", &nand_close_model_match);
if (nand_close_model_match != 1) {
ret = rawnand_read_parameter_page(nci, mem);
if (ret != NAND_OP_TRUE) {
RAWNAND_ERR("rawnand read parameter fail ret:%d\n", ret);
goto err0;
}
RAWNAND_INFO("device model from flash:%s\n", device_name);
match = sunxi_search_idtab_by_name(MICRON_NAME, device_name);
}
}
}
RAWNAND_INFO("match the device from idtab:%s\n", match ? match->name : "null");
err0:
return match;
}
int generic_is_lsb_page(__u32 page_num) //0x00
{
return 1;
}
int hynix20nm_is_lsb_page(__u32 page_num) //0x01
{
struct nand_chip_info *nci = g_nsi->nci;
//hynix 20nm
if ((page_num == 0) || (page_num == 1))
return 1;
if ((page_num == nci->npi->page_cnt_per_blk - 2) || (page_num == nci->npi->page_cnt_per_blk - 1))
return 0;
if ((page_num % 4 == 2) || (page_num % 4 == 3))
return 1;
return 0;
}
int hynix26nm_is_lsb_page(__u32 page_num) //0x01
{
struct nand_chip_info *nci = g_nsi->nci;
//hynix 26nm
if ((page_num == 0) || (page_num == 1))
return 1;
if ((page_num == nci->npi->page_cnt_per_blk - 2) || (page_num == nci->npi->page_cnt_per_blk - 1))
return 0;
if ((page_num % 4 == 2) || (page_num % 4 == 3))
return 1;
return 0;
}
int hynix16nm_is_lsb_page(__u32 page_num) //0x02
{
__u32 pages_per_block;
// __u32 read_retry_type;
struct nand_chip_info *nci = g_nsi->nci;
pages_per_block = nci->page_cnt_per_blk;
if (page_num == 0)
return 1;
if (page_num == pages_per_block - 1)
return 0;
if (page_num % 2 == 1)
return 1;
return 0;
}
int toshiba_is_lsb_page(__u32 page_num) //0x10
{
struct nand_chip_info *nci = g_nsi->nci;
//toshiba 2xnm 19nm 1ynm
if (page_num == 0)
return 1;
if (page_num == nci->npi->page_cnt_per_blk - 1)
return 0;
if (page_num % 2 == 1)
return 1;
return 0;
}
int samsung_is_lsb_page(__u32 page_num) //0x20
{
struct nand_chip_info *nci = g_nsi->nci;
//(NAND_LSBPAGE_TYPE == 0x20) //samsung 25nm
if (page_num == 0)
return 1;
if (page_num == nci->npi->page_cnt_per_blk - 1)
return 0;
if (page_num % 2 == 1)
return 1;
return 0;
}
int sandisk_is_lsb_page(__u32 page_num) //0x30
{
struct nand_chip_info *nci = g_nsi->nci;
//sandisk 2xnm 19nm 1ynm
if (page_num == 0)
return 1;
if (page_num == nci->npi->page_cnt_per_blk - 1)
return 0;
if (page_num % 2 == 1)
return 1;
return 0;
}
int micron_0x40_is_lsb_page(__u32 page_num) // 20nm (29f64g08cbaba) 0x40
{
struct nand_chip_info *nci = g_nsi->nci;
if ((page_num == 0) || (page_num == 1))
return 1;
if ((page_num == nci->npi->page_cnt_per_blk - 2) || (page_num == nci->npi->page_cnt_per_blk - 1))
return 0;
if ((page_num % 4 == 2) || (page_num % 4 == 3))
return 1;
return 0;
}
int micron_0x41_is_lsb_page(__u32 page_num) //20nm (29f32g08cbada) 0x41
{
struct nand_chip_info *nci = g_nsi->nci;
//micron 20nm L83A L84A L84C L84D L85A L85C
if ((page_num == 2) || (page_num == 3))
return 1;
if ((page_num == nci->npi->page_cnt_per_blk - 2) || (page_num == nci->npi->page_cnt_per_blk - 1))
return 1;
if ((page_num % 4 == 0) || (page_num % 4 == 1))
return 1;
return 0;
}
int micron_0x42_is_lsb_page(__u32 page_num) // 16nm l95b 0x42
{
// struct nand_chip_info *nci = g_nsi->nci;
//micron 16nm l95b
if ((page_num == 0) || (page_num == 1) || (page_num == 2) || (page_num == 3) || (page_num == 4) || (page_num == 5) || (page_num == 7) || (page_num == 8) || (page_num == 509))
return 1;
if ((page_num == 6) || (page_num == 508) || (page_num == 511))
return 0;
if ((page_num % 4 == 2) || (page_num % 4 == 3))
return 1;
return 0;
}
int micron_0x43_is_lsb_page(__u32 page_num) // L04A
{
if ((page_num < 16) || ((page_num > 495) && (page_num < 512)))
return 1;
if (page_num % 2 == 0)
return 1;
if (page_num % 2 == 1)
return 0;
return 0;
}
int micron_0x44_is_lsb_page(__u32 page_num) // L06B
{
if (page_num < 64)
return 1;
if (page_num % 2 == 0)
return 0;
if (page_num % 2 == 1)
return 1;
return 0;
}
lsb_page_t chose_lsb_func(__u32 no)
{
no = (no << LSB_PAGE_POS);
switch (no) {
case GENERIC_LSB_PAGE:
return generic_is_lsb_page;
case HYNIX20_26NM_LSB_PAGE:
return hynix20nm_is_lsb_page;
case HYNIX16NM_LSB_PAGE:
return hynix16nm_is_lsb_page;
case TOSHIBA_LSB_PAGE:
return toshiba_is_lsb_page;
case SAMSUNG_LSB_PAGE:
return samsung_is_lsb_page;
case SANDISK_LSB_PAGE:
return sandisk_is_lsb_page;
case MICRON_0x40_LSB_PAGE:
return micron_0x40_is_lsb_page;
case MICRON_0x41_LSB_PAGE:
return micron_0x41_is_lsb_page;
case MICRON_0x42_LSB_PAGE:
return micron_0x42_is_lsb_page;
case MICRON_0x43_LSB_PAGE:
return micron_0x43_is_lsb_page;
case MICRON_0x44_LSB_PAGE:
return micron_0x44_is_lsb_page;
default:
return generic_is_lsb_page;
}
return generic_is_lsb_page;
}
struct sunxi_nand_flash_device selected_id_tbl;
struct nfc_init_ddr_info def_ddr_info[] = {
////////////////////////////
{
0, //en_dqs_c;
0, //en_re_c;
0, //odt;
0, //en_ext_verf;
0, //dout_re_warmup_cycle;
0, //din_dqs_warmup_cycle;
0, //output_driver_strength;
0, //rb_pull_down_strength;
},
////////////////////////////
{
0, //en_dqs_c;
0, //en_re_c;
0, //odt;
0, //en_ext_verf;
0, //dout_re_warmup_cycle;
0, //din_dqs_warmup_cycle;
2, //output_driver_strength;
2, //rb_pull_down_strength;
},
////////////////////////////
};