blob: 6c4f2135ca84e5d2eba6ff7f2254bdb36b2a9c7d [file] [log] [blame]
/******************************************************************************
*
* Copyright 2013 Altera Corporation. All Rights Reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER "AS IS" AND ANY EXPRESS OR
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED. IN NO
* EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
* OF SUCH DAMAGE.
*
******************************************************************************/
/*! \file
* Altera - NAND Flash Controller Module
*/
#ifndef __ALT_NAND_PRIVATE_H__
#define __ALT_NAND_PRIVATE_H__
/*
* *****************************************
* Struct for NAND Manager IO block
* which consists of cfg, param, status, ecc and dma register blocks
* located at address: ALT_NAND_CFG_ADDR
* *****************************************
*/
typedef struct {
ALT_NAND_CFG_raw_t* cfg; // nand configuration block
ALT_NAND_PARAM_raw_t* param; // nand parameter block
ALT_NAND_STAT_raw_t* stat; // nand status block
ALT_NAND_ECC_raw_t* ecc; // nand ecc block
ALT_NAND_DMA_raw_t* dma; // nand dma block
volatile uint32_t * const ctrl_addr; // indirect access address control
volatile uint32_t * const data_addr; // fifo access address control
} ALT_NAND_MGR_t;
//
// flash memory characterization
//
typedef struct
{
uint32_t manufacturer_id;
uint32_t device_id;
uint32_t device_param_0;
uint32_t device_param_1;
uint32_t device_param_2;
uint32_t page_size;
uint32_t spare_size;
uint32_t revision;
uint32_t onfi_device_features;
uint32_t onfi_optional_commands;
uint32_t onfi_timing_mode;
uint32_t onfi_pgm_cache_timing_mode;
uint32_t onfi_compliant;
uint32_t onfi_device_no_of_luns;
uint32_t onfi_device_no_of_blocks_per_lun;
uint32_t features;
uint32_t number_of_planes;
uint32_t pages_per_block;
uint32_t device_width;
uint32_t device_main_area_size;
uint32_t device_spare_area_size;
uint32_t block_size;
uint32_t spare_area_skip_bytes;
uint32_t first_block_of_next_plane;
uint32_t page_size_32;
uint32_t page_shift;
uint32_t block_shift;
uint32_t dma_burst_length;
uint32_t ecc_correct;
} FLASH_CHARACTERIZATION_t;
typedef uint32_t (*nand_interrupt_handler_t)(uint32_t interrup_status_register, uint32_t interrup_status_mask );
/*
* Some default values.
*/
#define ALT_HHP_NAND_SECTOR_SIZE (512)
#define ALT_HHP_NAND_PAGE_SIZE (2048)
#define ALT_HHP_NAND_PAGE_SHIFT (11)
#define ALT_HHP_NAND_SPARE_SIZE (128) /* Spare bytes per page. */
#define ALT_HHP_NAND_PAGES_PER_BLOCK (64) /* 128 pages per block (512KB) */
#define ALT_HHP_NAND_BLOCK_SIZE (ALT_HHP_NAND_PAGE_SIZE *ALT_HHP_NAND_PAGES_PER_BLOCK)
#define ALT_HHP_NAND_ECC_CORRECT (8) /* 8 bit ECC. */
#define ALT_HHP_NAND_SPARE_SKIP (2) /* Skip the first 2 bytes of the spare space. */
#define ALT_HHP_NAND_BLOCK_SHIFT (6) /* from page boundary */
#define ALT_HHP_NAND_MANUFACTURER_ID (0x1)
#define ALT_HHP_NAND_DEVICE_ID (0xd3)
#define ALT_HHP_NAND_REVISION (5)
#define ALT_HHP_NAND_NUMBER_OF_PLANES (2)
#define ALT_HHP_NAND_DEVICE_WIDTH (0)
#define ALT_HHP_NAND_FIRST_BLOCK_OF_NEXT_PLANE (2048)
#define ALT_HHP_NAND_NUM_OF_LUNS (2)
#define ALT_HHP_NAND_NUM_OF_BLOCK_PER_LUNS (4096)
#define ALT_HHP_NAND_NUM_OF_BLOCK_TOTAL (ALT_HHP_NAND_NUM_OF_LUNS * ALT_HHP_NAND_NUM_OF_BLOCK_PER_LUNS)
//
// Constants from 8.1. Address Mapping
//
// Table 8.2
#define ALT_HHP_NAND_MODE_00 (0x00000000)
#define ALT_HHP_NAND_MODE_01 (0x04000000)
#define ALT_HHP_NAND_MODE_10 (0x08000000)
#define ALT_HHP_NAND_MODE_11 (0x0C000000)
#define ALT_HHP_NAND_ADDR_MAP_CMD_MAP_LSB_INDEX (26)
#define ALT_HHP_NAND_ADDR_MAP_BANK_SEL_LSB_INDEX (24)
#define ALT_HHP_NAND_ADDR_MAP_MEM_ADDR_LSB_INDEX (0)
#define ALT_HHP_NAND_10_OP_DEFAULT_AREA (0x0042)
#define ALT_HHP_NAND_10_OP_ERASE_BLOCK (0x0001)
#define ALT_HHP_NAND_10_OP_LOAD_PAGE (0x0060)
#define ALT_HHP_NAND_10_OP_DEST_ADDR (0x0061)
#define ALT_HHP_NAND_10_OP_WRITE_PAGE (0x0062)
#define ALT_HHP_NAND_10_OP_READ_PIPE (0x2000)
#define ALT_HHP_NAND_10_OP_WRITE_PIPE (0x2100)
#define ALT_HHP_UINT32_MASK ((uint32_t) -1)
#define ALT_NAND_BOOTSTRAP_INHIBIT_INIT_ENABLE (1)
#define ALT_NAND_BOOTSTRAP_INHIBIT_INIT_DISABLE (0)
#define ALT_NAND_BOOTSTRAP_INHIBIT_B0P0_LOAD_ENABLE (1)
#define ALT_NAND_BOOTSTRAP_INHIBIT_B0P0_LOAD_DISABLE (0)
#define ALT_NAND_BOOTSTRAP_512B_DEVICE_ENABLE (1)
#define ALT_NAND_BOOTSTRAP_512B_DEVICE_DISABLE (0)
#define ALT_NAND_BOOTSTRAP_TWO_ROW_ADDR_CYCLES_EABLE (1)
#define ALT_NAND_BOOTSTRAP_TWO_ROW_ADDR_CYCLES_DISABLE (0)
#define ALT_NAND_FLASH_MEM_BANK_0 (0)
#define ALT_NAND_FLASH_MEM_BANK_1 (1)
#define ALT_NAND_FLASH_MEM_BANK_2 (2)
#define ALT_NAND_FLASH_MEM_BANK_3 (3)
uint32_t alt_nand_poll_for_interrupt_status_register(uint32_t , uint32_t );
uint32_t ffs32(uint32_t);
uint32_t alt_nand_compose_map10_cmd_addr(const uint32_t bank, const uint32_t block_addr, const uint32_t page_addr);
int32_t alt_nand_full_page_read_with_map10(const uint32_t bank, const uint32_t block_addr, const uint32_t page_addr, uint32_t *buffer);
void alt_nand_write_indirect(const uint32_t address, const uint32_t value);
uint32_t alt_nand_read_indirect(const uint32_t address);
int32_t alt_nand_full_page_write_with_map10(const uint32_t bank, const uint32_t block_addr, const uint32_t page_addr, const uint32_t *buffer);
void alt_nand_full_page_read_with_map10_post_read_with_map01(const uint32_t bank, const uint32_t block_addr, const uint32_t page_addr, uint32_t *buffer);
void alt_nand_full_page_write_with_map10_post_write_with_map01(const uint32_t bank, const uint32_t block_addr, const uint32_t page_addr, const uint32_t *buffer);
void alt_nand_set_sysmgr_bootstrap_value( uint32_t bootstrp_inhibit_init,
uint32_t bootstrp_inhibit_b0p0_load,
uint32_t bootstrp_512b_device,
uint32_t bootstrp_two_row_addr_cycles);
void alt_nand_reset_bank(uint32_t bank);
uint32_t alt_nand_bank_get(void);
void alt_nand_dma_write_cmd_structure( const uint32_t bank, const uint32_t block_addr, const uint32_t page_addr, const uint32_t page_count, uint64_t mem_addr, int32_t is_read_op, const uint32_t burst_len );
void alt_nand_dma_set_enabled( int32_t is_enabled );
int32_t alt_nand_dma_page_read( const uint32_t bank, const uint32_t block_addr, const uint32_t page_addr, uint32_t mem_addr );
int32_t alt_nand_dma_page_write( const uint32_t bank, const uint32_t block_addr, const uint32_t page_addr, uint32_t mem_addr );
ALT_STATUS_CODE alt_nand_flash_init_manual(void *);
void alt_nand_erase_block_callback(ALT_STATUS_CODE, void *);
void alt_nand_dma_page_callback(ALT_STATUS_CODE, void *);
void nand_print_device(void);
uint32_t nand_read_register(uint32_t offset);
void alt_nand_rb_pin_mode_set(uint32_t);
void alt_nand_rb_pin_mode_clear(uint32_t);
#endif /* __ALT_NAND_PRIVATE_H__ */