]> git.karo-electronics.de Git - karo-tx-redboot.git/blobdiff - packages/devs/flash/arm/mxc/v2_0/include/mxc_nfc.h
TX51 pre-release
[karo-tx-redboot.git] / packages / devs / flash / arm / mxc / v2_0 / include / mxc_nfc.h
index c76a04dc822df98691d8fe6ae6a8657e80c9ecf0..4e9b7642839013c0daaefb654c167d3f8cc2d0d5 100644 (file)
 #include <pkgconf/devs_flash_onmxc.h>
 #include "mxc_nand_specifics.h"
 
-#define NFC_DEBUG_NONE  0
-#define NFC_DEBUG_MIN   1
-#define NFC_DEBUG_MED   2
-#define NFC_DEBUG_MAX   3
-#define NFC_DEBUG_DEF   NFC_DEBUG_NONE
 
-#define PG_2K_DATA_OP_MULTI_CYCLES()        true
-
-typedef unsigned short u16;
-typedef unsigned int u32;
-typedef unsigned char u8;
+#if defined(NFC_V1_1)
+#define PG_2K_DATA_OP_MULTI_CYCLES()   false
+#else
+#define PG_2K_DATA_OP_MULTI_CYCLES()   true
+#endif
 
-#define ADDR_INPUT_SIZE                 8
-//----------------------------------------------------------------------------
-// Common device details.
-#define FLASH_Read_ID                   (0x90)
-#if CYGHWR_DEVS_FLASH_MXC_NAND_RESET_WORKAROUND
-#define FLASH_Reset                     0xFFFF
+#define ADDR_INPUT_SIZE                                        8
+#define NAND_MAIN_BUF0                                 (NFC_BASE + 0x000)
+#define NAND_MAIN_BUF1                                 (NFC_BASE + 0x200)
+#define NAND_MAIN_BUF2                                 (NFC_BASE + 0x400)
+#define NAND_MAIN_BUF3                                 (NFC_BASE + 0x600)
+#if defined(NFC_V1_1)
+#define NAND_MAIN_BUF4                                 (NFC_BASE + 0x800)
+#define NAND_MAIN_BUF5                                 (NFC_BASE + 0xA00)
+#define NAND_MAIN_BUF6                                 (NFC_BASE + 0xC00)
+#define NAND_MAIN_BUF7                                 (NFC_BASE + 0xE00)
+#define NAND_SPAR_BUF0                                 (NFC_BASE + 0x1000)
+#define NAND_SPAR_BUF1                                 (NFC_BASE + 0x1040)
+#define NAND_SPAR_BUF2                                 (NFC_BASE + 0x1080)
+#define NAND_SPAR_BUF3                                 (NFC_BASE + 0x10C0)
+#define NAND_SPAR_BUF4                                 (NFC_BASE + 0x1100)
+#define NAND_SPAR_BUF5                                 (NFC_BASE + 0x1140)
+#define NAND_SPAR_BUF6                                 (NFC_BASE + 0x1180)
+#define NAND_SPAR_BUF7                                 (NFC_BASE + 0x11C0)
+#define NFC_BUF_COUNT                                  8
+#define NFC_SPARE_BUF_SZ                               64
 #else
-#define FLASH_Reset                     (0xFF)
+#define NAND_SPAR_BUF0                                 (NFC_BASE + 0x800)
+#define NAND_SPAR_BUF1                                 (NFC_BASE + 0x810)
+#define NAND_SPAR_BUF2                                 (NFC_BASE + 0x820)
+#define NAND_SPAR_BUF3                                 (NFC_BASE + 0x830)
+#define NAND_RESERVED                                  (NFC_BASE + 0x840)
+#define NFC_BUF_COUNT                                  4
+#define NFC_SPARE_BUF_SZ                               16
 #endif
-#define FLASH_Read_Mode1                (0x00)
-#define FLASH_Read_Mode1_2K             (0x30)
-#define FLASH_Read_Mode2                (0x01)
-#define FLASH_Read_Mode3                (0x50)
-#define FLASH_Program                   (0x10)
-#define FLASH_Send_Data                 (0x80)
-#define FLASH_Status                    (0x70)
-#define FLASH_Block_Erase               (0x60)
-#define FLASH_Start_Erase               (0xD0)
 
-#define NAND_MAIN_BUF0                  (NFC_BASE + 0x000)
-#define NAND_MAIN_BUF1                  (NFC_BASE + 0x200)
-#define NAND_MAIN_BUF2                  (NFC_BASE + 0x400)
-#define NAND_MAIN_BUF3                  (NFC_BASE + 0x600)
-#define NAND_SPAR_BUF0                  (NFC_BASE + 0x800)
-#define NAND_SPAR_BUF1                  (NFC_BASE + 0x810)
-#define NAND_SPAR_BUF2                  (NFC_BASE + 0x820)
-#define NAND_SPAR_BUF3                  (NFC_BASE + 0x830)
-#define NAND_RESERVED                   (NFC_BASE + 0x840)
+#define NFC_BUFSIZE_REG                                        (NAND_REG_BASE + 0x00)
+#define RAM_BUFFER_ADDRESS_REG                 (NAND_REG_BASE + 0x04)
+#define NAND_FLASH_ADD_REG                             (NAND_REG_BASE + 0x06)
+#define NAND_FLASH_CMD_REG                             (NAND_REG_BASE + 0x08)
+#define NFC_CONFIGURATION_REG                  (NAND_REG_BASE + 0x0A)
+#define ECC_STATUS_RESULT_REG                  (NAND_REG_BASE + 0x0C)
+#define ECC_RSLT_MAIN_AREA_REG                 (NAND_REG_BASE + 0x0E)
+#define ECC_RSLT_SPARE_AREA_REG                        (NAND_REG_BASE + 0x10)
+#define NF_WR_PROT_REG                                 (NAND_REG_BASE + 0x12)
+#define NAND_FLASH_WR_PR_ST_REG                        (NAND_REG_BASE + 0x18)
+#define NAND_FLASH_CONFIG1_REG                 (NAND_REG_BASE + 0x1A)
+#define NAND_FLASH_CONFIG2_REG                 (NAND_REG_BASE + 0x1C)
+#if defined(NFC_V1_1)
+#define UNLOCK_START_BLK_ADD_REG               (NAND_REG_BASE + 0x20)
+#define UNLOCK_END_BLK_ADD_REG                 (NAND_REG_BASE + 0x22)
+#define UNLOCK_START_BLK_ADD1_REG              (NAND_REG_BASE + 0x24)
+#define UNLOCK_END_BLK_ADD1_REG                        (NAND_REG_BASE + 0x26)
+#define UNLOCK_START_BLK_ADD2_REG              (NAND_REG_BASE + 0x28)
+#define UNLOCK_END_BLK_ADD2_REG                        (NAND_REG_BASE + 0x2A)
+#define UNLOCK_START_BLK_ADD3_REG              (NAND_REG_BASE + 0x2C)
+#define UNLOCK_END_BLK_ADD3_REG                        (NAND_REG_BASE + 0x2E)
+#else
+#define UNLOCK_START_BLK_ADD_REG               (NAND_REG_BASE + 0x14)
+#define UNLOCK_END_BLK_ADD_REG                 (NAND_REG_BASE + 0x16)
+#endif
 
-#define NFC_BUFSIZE_REG                 (NAND_REG_BASE + 0x00)
-#define RAM_BUFFER_ADDRESS_REG          (NAND_REG_BASE + 0x04)
-#define NAND_FLASH_ADD_REG              (NAND_REG_BASE + 0x06)
-#define NAND_FLASH_CMD_REG              (NAND_REG_BASE + 0x08)
-#define NFC_CONFIGURATION_REG           (NAND_REG_BASE + 0x0A)
-#define ECC_STATUS_RESULT_REG           (NAND_REG_BASE + 0x0C)
-#define ECC_RSLT_MAIN_AREA_REG          (NAND_REG_BASE + 0x0E)
-#define ECC_RSLT_SPARE_AREA_REG         (NAND_REG_BASE + 0x10)
-#define NF_WR_PROT_REG                  (NAND_REG_BASE + 0x12)
-#define UNLOCK_START_BLK_ADD_REG        (NAND_REG_BASE + 0x14)
-#define UNLOCK_END_BLK_ADD_REG          (NAND_REG_BASE + 0x16)
-#define NAND_FLASH_WR_PR_ST_REG         (NAND_REG_BASE + 0x18)
-#define NAND_FLASH_CONFIG1_REG          (NAND_REG_BASE + 0x1A)
-#define NAND_FLASH_CONFIG2_REG          (NAND_REG_BASE + 0x1C)
+#define NUM_OF_CS_LINES                                        1
+#define NFC_BUFSIZE                                            0
 
 enum nfc_internal_buf {
-    RAM_BUF_0,
-    RAM_BUF_1,
-    RAM_BUF_2,
-    RAM_BUF_3,
+       RAM_BUF_0,
+       RAM_BUF_1,
+       RAM_BUF_2,
+       RAM_BUF_3,
+       RAM_BUF_4,
+       RAM_BUF_5,
+       RAM_BUF_6,
+       RAM_BUF_7,
 };
 
 enum nfc_output_mode {
-    FDO_PAGE_SPARE      = 0x0008,
-    FDO_SPARE_ONLY      = 0x1008,  // LSB has to be 0x08
-    FDO_FLASH_ID        = 0x0010,
-    FDO_FLASH_STATUS    = 0x0020,
-};
-
-/*!
- * Defined the "complete" address input operations which may involve
- * more than one cycle of single address input operation.
- */
-enum nfc_addr_ops {
-    ADDRESS_INPUT_READ_ID,
-    ADDRESS_INPUT_READ_PAGE,
-    ADDRESS_INPUT_PROGRAM_PAGE,
-    ADDRESS_INPUT_ERASE_BLOCK,
-};
-
-enum nfc_page_area {
-    NFC_SPARE_ONLY,
-    NFC_MAIN_ONLY,
-};
-
-enum {
-    MXC_NAND_8_BIT = 8,
-    MXC_NAND_16_BIT =  16,
-};
-
-enum {
-    NAND_SLC = 0,
-    NAND_MLC = 1,
+       FDO_PAGE_SPARE          = 0x0008,
+       FDO_SPARE_ONLY          = 0x1008,  // LSB has to be 0x08
+       FDO_FLASH_ID            = 0x0010,
+       FDO_FLASH_STATUS        = 0x0020,
 };
 
-// read column 464-465 byte but only 464 for bad block marker
-#define BAD_BLK_MARKER_464          (NAND_MAIN_BUF3 + 464)
-// read column 4-5 byte, but only 5 is used for swapped main area data
-#define BAD_BLK_MARKER_SP_5         (NAND_SPAR_BUF3 + 4)
+#define wait_for_auto_prog_done()
+#define nfc_reg_read(a)        readl(a)
+#define nfc_reg_write(v,a)     writel(v,a)
 
 // Polls the NANDFC to wait for an operation to complete
-static inline void wait_op_done(void)
-{
-       int mxc_nfc_wait_loop;
-       while (!(readw(NAND_FLASH_CONFIG2_REG) & NAND_FLASH_CONFIG2_INT_DONE)) {
-               for (mxc_nfc_wait_loop = 0; mxc_nfc_wait_loop < 100; mxc_nfc_wait_loop++);
-       }
-}
-
-int nfc_read_region(u32 la, u32 maddr, int len);
-int nfc_program_region(u32 la, u32 maddr, int len);
-int nfc_erase_region(u32 la, int len);
-
+#define wait_op_done() CYG_MACRO_START                                                                 \
+       volatile int mxc_nfc_wait_loop;                                                                         \
+       while (!(readw(NAND_FLASH_CONFIG2_REG) & NAND_FLASH_CONFIG2_INT_DONE)) { \
+               for (mxc_nfc_wait_loop = 0; mxc_nfc_wait_loop < 100; mxc_nfc_wait_loop++); \
+       }                                                                                                                                       \
+CYG_MACRO_END
 
 /*!
  * NAND flash data output operation (reading data from NAND flash)
  * @param buf_no    internal ram buffer number that will contain data
  *                  to be outputted from the NAND flash after operation done
  * @param mode      one of the mode defined in enum nfc_output_mode
+ * @param ecc_en    1 - ecc enabled; 0 - ecc disabled
  */
 static void NFC_DATA_OUTPUT(enum nfc_internal_buf buf_no, enum nfc_output_mode mode,
-                            int ecc_en)
+                                                       int ecc_en)
 {
-    u16 config1 = (ecc_en != 0) ? NAND_FLASH_CONFIG1_ECC_EN : 0;
+       u16 config1 = (ecc_en != 0) ? NAND_FLASH_CONFIG1_ECC_EN : 0;
 
-    config1 |= readw(NAND_FLASH_CONFIG1_REG);
+       config1 |= readw(NAND_FLASH_CONFIG1_REG);
 
-    if (mode == FDO_SPARE_ONLY) {
-        config1 |= NAND_FLASH_CONFIG1_SP_EN;
-#ifdef CYGPKG_HAL_ARM_MXC91221
-        config1 &= ~NAND_FLASH_CONFIG1_ECC_EN;
-#endif
-    }
+       if (mode == FDO_SPARE_ONLY) {
+               config1 |= NAND_FLASH_CONFIG1_SP_EN;
+       }
 
-    writew(config1, NAND_FLASH_CONFIG1_REG);
-    writew(buf_no, RAM_BUFFER_ADDRESS_REG);
-    writew(mode & 0xFF, NAND_FLASH_CONFIG2_REG);
-    wait_op_done();
+       writew(config1, NAND_FLASH_CONFIG1_REG);
+       writew(buf_no, RAM_BUFFER_ADDRESS_REG);
+       writew(mode & 0xFF, NAND_FLASH_CONFIG2_REG);
+       wait_op_done();
 }
 
 static void NFC_CMD_INPUT(u32 cmd)
 {
-    writew(cmd, NAND_FLASH_CMD_REG);
-    writew(NAND_FLASH_CONFIG2_FCMD_EN, NAND_FLASH_CONFIG2_REG);
-    wait_op_done();
+       writew(cmd, NAND_FLASH_CMD_REG);
+       writew(NAND_FLASH_CONFIG2_FCMD_EN, NAND_FLASH_CONFIG2_REG);
+       wait_op_done();
 }
 
 static u16 NFC_STATUS_READ(void)
 {
-    u16 flash_status;
-    u16 saved = readw(NAND_MAIN_BUF0);
+       u16 flash_status;
+       u16 saved = readw(NAND_MAIN_BUF0);
 
-    NFC_CMD_INPUT(FLASH_Status);
-    NFC_DATA_OUTPUT(RAM_BUF_0, FDO_FLASH_STATUS, 1);
-    flash_status = readw(NAND_MAIN_BUF0) & 0x00FF;
+       NFC_CMD_INPUT(FLASH_Status);
+       NFC_DATA_OUTPUT(RAM_BUF_0, FDO_FLASH_STATUS, 1);
+       flash_status = readw(NAND_MAIN_BUF0) & 0x00FF;
 
-    // restore
-    writew(saved, NAND_MAIN_BUF0); 
+       // restore
+       writew(saved, NAND_MAIN_BUF0);
 
-    return flash_status;
+       return flash_status;
 }
 
 /*!
@@ -226,32 +205,32 @@ static u16 NFC_STATUS_READ(void)
  * @param ecc_en    1 - ecc enabled; 0 - ecc disabled
  */
 static void NFC_DATA_INPUT(enum nfc_internal_buf buf_no, enum nfc_page_area area,
-                           int ecc_en)
+                                               int ecc_en)
 {
-    u16 config1 = (ecc_en != 0) ? NAND_FLASH_CONFIG1_ECC_EN : 0;
+       u16 config1 = (ecc_en != 0) ? NAND_FLASH_CONFIG1_ECC_EN : 0;
 
-    config1 |= readw(NAND_FLASH_CONFIG1_REG);
+       config1 |= readw(NAND_FLASH_CONFIG1_REG);
 
-    if (area == NFC_SPARE_ONLY) {
-        config1 |= NAND_FLASH_CONFIG1_SP_EN;
+       if (area == NFC_SPARE_ONLY) {
+               config1 |= NAND_FLASH_CONFIG1_SP_EN;
 #ifdef CYGPKG_HAL_ARM_MXC91221
-        config1 &= ~NAND_FLASH_CONFIG1_ECC_EN;
+               config1 &= ~NAND_FLASH_CONFIG1_ECC_EN;
 #endif
-    }
+       }
 
-    writew(config1, NAND_FLASH_CONFIG1_REG);
-    writew(buf_no, RAM_BUFFER_ADDRESS_REG);
+       writew(config1, NAND_FLASH_CONFIG1_REG);
+       writew(buf_no, RAM_BUFFER_ADDRESS_REG);
 
-    // start operation
-    writew(NAND_FLASH_CONFIG2_FDI_EN, NAND_FLASH_CONFIG2_REG);
-    wait_op_done();
+       // start operation
+       writew(NAND_FLASH_CONFIG2_FDI_EN, NAND_FLASH_CONFIG2_REG);
+       wait_op_done();
 }
 
 static void NFC_DATA_INPUT_2k(enum nfc_internal_buf buf_no)
 {
-    writew(buf_no, RAM_BUFFER_ADDRESS_REG);
-    writew(NAND_FLASH_CONFIG2_FDI_EN, NAND_FLASH_CONFIG2_REG);
-    wait_op_done();
+       writew(buf_no, RAM_BUFFER_ADDRESS_REG);
+       writew(NAND_FLASH_CONFIG2_FDI_EN, NAND_FLASH_CONFIG2_REG);
+       wait_op_done();
 }
 
 /*!
@@ -259,14 +238,19 @@ static void NFC_DATA_INPUT_2k(enum nfc_internal_buf buf_no)
  */
 static void NFC_PRESET(u32 max_block_count)
 {
-    // Unlock the internal RAM buffer
-    writew(NFC_CONFIGURATION_UNLOCKED, NFC_CONFIGURATION_REG);
-    // First Block to be unlocked
-    writew(0, UNLOCK_START_BLK_ADD_REG);
-    // Last Unlock Block
-    writew(max_block_count, UNLOCK_END_BLK_ADD_REG);
-    // Unlock Block Command
-    writew(NF_WR_PROT_UNLOCK, NF_WR_PROT_REG);
+       // Unlock the internal RAM buffer
+       writew(NFC_CONFIGURATION_UNLOCKED, NFC_CONFIGURATION_REG);
+       // First Block to be unlocked
+       writew(0, UNLOCK_START_BLK_ADD_REG);
+       // Last Unlock Block
+       writew(max_block_count, UNLOCK_END_BLK_ADD_REG);
+       // Unlock Block Command
+       writew(NF_WR_PROT_UNLOCK, NF_WR_PROT_REG);
+}
+
+static void NFC_SET_NFC_ACTIVE_CS(u32 cs_line)
+{
+       // not needed.
 }
 
 /*!
@@ -275,9 +259,37 @@ static void NFC_PRESET(u32 max_block_count)
  */
 static void NFC_ADDR_INPUT(u32 addr)
 {
-    writew(addr & ((1 << ADDR_INPUT_SIZE) - 1), NAND_FLASH_ADD_REG);
-    writew(NAND_FLASH_CONFIG2_FADD_EN, NAND_FLASH_CONFIG2_REG);
-    wait_op_done();
+       writew(addr & ((1 << ADDR_INPUT_SIZE) - 1), NAND_FLASH_ADD_REG);
+       writew(NAND_FLASH_CONFIG2_FADD_EN, NAND_FLASH_CONFIG2_REG);
+       wait_op_done();
 }
 
+#if defined(NFC_V1_1)
+#define NFC_ARCH_INIT() CYG_MACRO_START                                \
+       unsigned int tmp, reg;                                                  \
+       tmp = flash_dev_info->page_size / 512;                  \
+       if (flash_dev_info->spare_size) {                               \
+               writew((flash_dev_info->spare_size >> 1),       \
+                               ECC_RSLT_SPARE_AREA_REG);                       \
+       }                                                                                               \
+       writew(0x2, NFC_CONFIGURATION_REG);                             \
+       reg = readw(NAND_FLASH_CONFIG1_REG) | 0x800;    \
+       if ((flash_dev_info->spare_size / tmp) > 16)    \
+               reg &= ~1;                                                                      \
+       else                                                                                    \
+               reg |= 1;                                                                       \
+       writew(reg, NAND_FLASH_CONFIG1_REG);                    \
+CYG_MACRO_END
+#else
+#define NFC_ARCH_INIT()
+#endif /*NFC_V1_1*/
+
+#define NAND_ADD0_REG                          0xDEADDAED
+#define NAND_ADD8_REG                          0xDEADDAED
+#define NAND_CMD_REG                           0xDEADDAED
+#define NAND_LAUNCH_AUTO_PROG          0xDEADDAED
+#define NAND_STATUS_SUM_REG                    0xDEADDAED
+#define NAND_LAUNCH_AUTO_READ          0xDEADDAED
+#define NAND_LAUNCH_AUTO_ERASE         0xDEADDAED
+
 #endif // _MXC_NFC_H_