]> git.kernelconcepts.de Git - karo-tx-redboot.git/blobdiff - packages/hal/arm/mx27/ads/v2_0/include/hal_platform_setup.h
unified MX27, MX25, MX37 trees
[karo-tx-redboot.git] / packages / hal / arm / mx27 / ads / v2_0 / include / hal_platform_setup.h
index 8c8f71f2704dd8aaf1e118b322225e70defb8cde..c3b21c5a21583da76e4e38763a8be8465ab9e927 100644 (file)
@@ -59,6 +59,8 @@
 
 #define CYGHWR_HAL_ROM_VADDR        0x0
 
+//#define NFC_2K_BI_SWAP
+
 // This macro represents the initial startup code for the platform
 // r11 is reserved to contain chip rev info in this file
     .macro  _platform_setup1
@@ -69,6 +71,22 @@ FSL_BOARD_SETUP_START:
     mcr 15, 0, r0, c8, c7, 0    /* invalidate TLBs */
     mcr 15, 0, r0, c7, c10, 4   /* Drain the write buffer */
 
+    mov r0, #NFC_BASE
+    add r1, r0, #0x400
+    cmp pc, r0
+    blo init_aipi_start
+    cmp pc, r1
+    bhi init_aipi_start
+#ifdef NFC_2K_BI_SWAP
+    ldr r3, [r0, #0x7D0]    // load word at addr 464 of last 512 RAM buffer
+    and r3, r3, #0xFFFFFF00 // mask off the LSB
+    ldr r4, [r0, #0x834]    // load word at addr 4 of the 3rd spare area buffer
+    mov r4, r4, lsr #8      // shift it to get the byte at addr 5
+    and r4, r4, #0xFF       // throw away upper 3 bytes
+    add r3, r4, r3          // construct the word
+    str r3, [r0, #0x7D0]    // write back
+#endif
+
 init_aipi_start:
     init_aipi
 
@@ -80,7 +98,9 @@ init_aipi_start:
     ldr r0, SOC_SYSCTRL_BASE_W
     mov r1, #0x03
     str r1, [r0, #(SOC_SYSCTRL_PCSR - SOC_SYSCTRL_BASE)]
-    mov r1, #0xFFFFFFC9
+    ldr r1, [r0, #(SOC_SYSCTRL_FMCR - SOC_SYSCTRL_BASE)]
+    and r1, r1, #0xFFFFFFF0
+    orr r1, r1, #9
     str r1, [r0, #(SOC_SYSCTRL_FMCR - SOC_SYSCTRL_BASE)]
 
 init_max_start:
@@ -117,6 +137,7 @@ HWInitialise_skip_SDRAM_setup:
     blo Normal_Boot_Continue
     cmp pc, r2
     bhi Normal_Boot_Continue
+
 NAND_Boot_Start:
     /* Copy image from flash to SDRAM first */
     ldr r1, MXC_REDBOOT_ROM_START
@@ -137,33 +158,42 @@ NAND_Boot_Start:
     nop
     nop
 
+NAND_Copy_Main:
+    // Check if x16/2kb page
+    ldr r7, SOC_SYSCTRL_BASE_W
+    ldr r7, [r7, #0x14]
+    ands r7, r7, #(1 << 5)
+
     mov r0, #NAND_FLASH_BOOT
     ldr r1, AVIC_VECTOR0_ADDR_W
     str r0, [r1]
     mov r0, #MXCFIS_NAND
     ldr r1, AVIC_VECTOR1_ADDR_W
     str r0, [r1]
-NAND_Copy_Main:
+
     ldr r0, NFC_BASE_W   //r0: nfc base. Reloaded after each page copying
     mov r1, #0x800       //r1: starting flash addr to be copied. Updated constantly
-    add r2, r0, #0x200   //r2: end of 1st RAM buf. Doesn't change
+    add r2, r0, #0x800     //2K Page:: r2: end of 1st RAM buf. Doesn't change
+    addeq r2, r0, #0x200   //512 Page:: r2: end of 1st RAM buf. Doesn't change
     add r12, r0, #0xE00  //r12: NFC register base. Doesn't change
-    ldr r14, MXC_REDBOOT_ROM_START
-    add r13, r14, #REDBOOT_IMAGE_SIZE //r13: end of SDRAM address for copying. Doesn't change
-    add r14, r14, r1     //r14: starting SDRAM address for copying. Updated constantly
+    ldr r11, MXC_REDBOOT_ROM_START
+    add r13, r11, #REDBOOT_IMAGE_SIZE //r13: end of SDRAM address for copying. Doesn't change
+    add r11, r11, r1     //r11: starting SDRAM address for copying. Updated constantly
 
     //unlock internal buffer
     mov r3, #0x2
     strh r3, [r12, #0xA]
 
 Nfc_Read_Page:
-//  writew(FLASH_Read_Mode1, NAND_FLASH_CMD_REG);
-    mov r3, #0x0;
-    strh r3, [r12, #NAND_FLASH_CMD_REG_OFF]
-    mov r3, #NAND_FLASH_CONFIG2_FCMD_EN;
-    strh r3, [r12, #NAND_FLASH_CONFIG2_REG_OFF]
-    do_wait_op_done
-
+//  NFC_CMD_INPUT(FLASH_Read_Mode1);
+    mov r3, #0x0
+    nfc_cmd_input
+
+    // Check if x16/2kb page
+    ldr r7, SOC_SYSCTRL_BASE_W
+    ldr r7, [r7, #0x14]
+    ands r7, r7, #(1 << 5)
+    bne nfc_addr_ops_2kb
 //    start_nfc_addr_ops(ADDRESS_INPUT_READ_PAGE, addr, nflash_dev_info->base_mask);
     mov r3, r1
     do_addr_input       //1st addr cycle
@@ -171,29 +201,77 @@ Nfc_Read_Page:
     do_addr_input       //2nd addr cycle
     mov r3, r1, lsr #17
     do_addr_input       //3rd addr cycle
-
     mov r3, r1, lsr #25
     do_addr_input       //4th addr cycle
+    b end_of_nfc_addr_ops
+
+nfc_addr_ops_2kb:
+//    start_nfc_addr_ops(ADDRESS_INPUT_READ_PAGE, addr, nflash_dev_info->base_mask);
+    mov r3, #0
+    do_addr_input       //1st addr cycle
+    mov r3, #0
+    do_addr_input       //2nd addr cycle
+    mov r3, r1, lsr #11
+    do_addr_input       //3rd addr cycle
+    mov r3, r1, lsr #19
+    do_addr_input       //4th addr cycle
+    mov r3, r1, lsr #27
+    do_addr_input       //4th addr cycle
 
+//    NFC_CMD_INPUT(FLASH_Read_Mode1_2K);
+    mov r3, #0x30
+    nfc_cmd_input
 
+end_of_nfc_addr_ops:
 //    NFC_DATA_OUTPUT(buf, FDO_PAGE_SPARE_VAL);
-//        writew(NAND_FLASH_CONFIG1_ECC_EN, NAND_FLASH_CONFIG1_REG);
-    mov r3, #(NAND_FLASH_CONFIG1_ECC_EN)
-    strh r3, [r12, #NAND_FLASH_CONFIG1_REG_OFF]
-
-//        writew(buf_no, RAM_BUFFER_ADDRESS_REG);
-    mov r3, #0
-    strh r3, [r12, #RAM_BUFFER_ADDRESS_REG_OFF]
-//        writew(FDO_PAGE_SPARE_VAL & 0xFF, NAND_FLASH_CONFIG2_REG);
-    mov r3, #FDO_PAGE_SPARE_VAL
-    strh r3, [r12, #NAND_FLASH_CONFIG2_REG_OFF]
-//        wait_op_done();
-    do_wait_op_done
+//        writew(NAND_FLASH_CONFIG1_INT_MSK | NAND_FLASH_CONFIG1_ECC_EN,
+//               NAND_FLASH_CONFIG1_REG);
+    mov r8, #0
+    bl nfc_data_output
+    bl do_wait_op_done
+    // Check if x16/2kb page
+    ldr r7, SOC_SYSCTRL_BASE_W
+    ldr r7, [r7, #0x14]
+    ands r7, r7, #(1 << 5)
+    beq nfc_addr_data_output_done_512
+
+// For 2K page - 2nd 512
+    mov r8, #1
+    bl nfc_data_output
+    bl do_wait_op_done
+
+// 3rd 512
+    mov r8, #2
+    bl nfc_data_output
+    bl do_wait_op_done
+
+// 4th 512
+    mov r8, #3
+    bl nfc_data_output
+    bl do_wait_op_done
+// end of 4th
+#ifdef NFC_2K_BI_SWAP
+    ldr r3, [r0, #0x7D0]    // load word at addr 464 of last 512 RAM buffer
+    and r3, r3, #0xFFFFFF00 // mask off the LSB
+    ldr r4, [r0, #0x834]    // load word at addr 4 of the 3rd spare area buffer
+    mov r4, r4, lsr #8      // shift it to get the byte at addr 5
+    and r4, r4, #0xFF       // throw away upper 3 bytes
+    add r3, r4, r3          // construct the word
+    str r3, [r0, #0x7D0]    // write back
+#endif
+    // check for bad block
+    mov r3, r1, lsl #(32-17)    // get rid of block number
+    cmp r3, #(0x800 << (32-17)) // check if not page 0 or 1
+    b nfc_addr_data_output_done
 
+nfc_addr_data_output_done_512:
     // check for bad block
-    mov r3, r1, lsl #(32-5-9)
-    cmp r3, #(512 << (32-5-9))
-    bhi Copy_Good_Blk
+    mov r3, r1, lsl #(32-5-9)    // get rid of block number
+    cmp r3, #(512 << (32-5-9))   // check if not page 0 or 1
+
+nfc_addr_data_output_done:
+    b Copy_Good_Blk // workaround for now. See ENGR00067497
+//    bhi Copy_Good_Blk
     add r4, r0, #0x800  //r3 -> spare area buf 0
     ldrh r4, [r4, #0x4]
     and r4, r4, #0xFF00
@@ -203,21 +281,45 @@ Nfc_Read_Page:
     cmp r3, #0x0
     beq Skip_bad_block
     // even suckier since we already read the first page!
-    sub r14, r14, #512  //rewind 1 page for the sdram pointer
-    sub r1, r1, #512    //rewind 1 page for the flash pointer
+
+    // Check if x16/2kb page
+    ldr r7, SOC_SYSCTRL_BASE_W
+    ldr r7, [r7, #0x14]
+    ands r7, r7, #(1 << 5)
+
+    subeq r11, r11, #512  //rewind 1 page for the sdram pointer
+    subeq r1, r1, #512    //rewind 1 page for the flash pointer
+
+    // for 2k page
+    subne r11, r11, #0x800  //rewind 1 page for the sdram pointer
+    subne r1, r1, #0x800    //rewind 1 page for the flash pointer
+
 Skip_bad_block:
-    add r1, r1, #(32*512)
+    // Check if x16/2kb page
+    ldr r7, SOC_SYSCTRL_BASE_W
+    ldr r7, [r7, #0x14]
+    ands r7, r7, #(1 << 5)
+
+    addeq r1, r1, #(32*512)
+    addne r1, r1, #(64*2048)
+
     b Nfc_Read_Page
 Copy_Good_Blk:
     //copying page
 1:  ldmia r0!, {r3-r10}
-    stmia r14!, {r3-r10}
+    stmia r11!, {r3-r10}
     cmp r0, r2
     blo 1b
-    cmp r14, r13
+    cmp r11, r13
     bge NAND_Copy_Main_done
-    add r1, r1, #0x200
-    ldr r0, NFC_BASE_W
+    // Check if x16/2kb page
+    ldr r7, SOC_SYSCTRL_BASE_W
+    ldr r7, [r7, #0x14]
+    ands r7, r7, #(1 << 5)
+
+    addeq r1, r1, #0x200
+    addne r1, r1, #0x800
+    mov r0, #NFC_BASE
     b Nfc_Read_Page
 
 NAND_Copy_Main_done:
@@ -303,6 +405,24 @@ NAND_ClockSetup:
 
     .endm                       // _platform_setup1
 
+do_wait_op_done:
+    1:
+        ldrh r3, [r12, #NAND_FLASH_CONFIG2_REG_OFF]
+        ands r3, r3, #NAND_FLASH_CONFIG2_INT_DONE
+        beq 1b
+    bx lr     // do_wait_op_done
+
+nfc_data_output:
+    mov r3, #(NAND_FLASH_CONFIG1_INT_MSK | NAND_FLASH_CONFIG1_ECC_EN)
+    strh r3, [r12, #NAND_FLASH_CONFIG1_REG_OFF]
+
+    // writew(buf_no, RAM_BUFFER_ADDRESS_REG);
+    strh r8, [r12, #RAM_BUFFER_ADDRESS_REG_OFF]
+    // writew(FDO_PAGE_SPARE_VAL & 0xFF, NAND_FLASH_CONFIG2_REG);
+    mov r3, #FDO_PAGE_SPARE_VAL
+    strh r3, [r12, #NAND_FLASH_CONFIG2_REG_OFF]
+    bx lr
+
 #else // defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
 #define PLATFORM_SETUP1
 #endif
@@ -447,7 +567,7 @@ NAND_ClockSetup:
         str r1, [r0, #CSCRA_OFFSET]
     .endm /* init_cs0_sync */
 
-    .macro init_cs4: /* ADS board expanded IOs */
+    .macro init_cs4 /* ADS board expanded IOs */
         ldr r1, SOC_CS4_CTL_BASE_W
         ldr r2, CS4_CSCRU_0x0000DCF6
         str r2, [r1, #CSCRU_OFFSET]
@@ -519,9 +639,18 @@ NAND_ClockSetup:
         ldr r1, [r1]
         ands r1, r1, #0xF0000000
         // add Latency on CAS only for TO2
-        ldreq r1, SDRAM_0x00795729
-        ldrne r1, SDRAM_0x00795429
-
+       // TO 1.0's ID = 0x0 ==>> CAS = 3
+       bne 2f
+        ldr r1, SDRAM_0x00795729
+       b 3f
+       // now handles TO 2.x
+    2:
+       ands r1, r1, #0xE0000000
+       // TO 2.0's ID = 0x1 => CAS = 4 due to the MPEG4 issue
+       ldreq r1, SDRAM_0x00795429
+        // subesquent TO's are OK w/ CAS = 3
+        ldrne r1, SDRAM_0x00795729
+    3:
         str r1, [r0, #0x4]
         ldr r1, SDRAM_0x92200000
         str r1, [r0, #0x0]
@@ -539,21 +668,19 @@ NAND_ClockSetup:
         str r1, [r0, #0x0]
     .endm   // setup_sdram_ddr
 
-    .macro do_wait_op_done
-    1:
-        ldrh r3, [r12, #NAND_FLASH_CONFIG2_REG_OFF]
-        ands r3, r3, #NAND_FLASH_CONFIG2_INT_DONE
-        beq 1b
-        mov r3, #0x0
+    .macro nfc_cmd_input
+        strh r3, [r12, #NAND_FLASH_CMD_REG_OFF]
+        mov r3, #NAND_FLASH_CONFIG2_FCMD_EN;
         strh r3, [r12, #NAND_FLASH_CONFIG2_REG_OFF]
-    .endm   // do_wait_op_done
+        bl do_wait_op_done
+    .endm   // nfc_cmd_input
 
     .macro do_addr_input
         and r3, r3, #0xFF
         strh r3, [r12, #NAND_FLASH_ADD_REG_OFF]
         mov r3, #NAND_FLASH_CONFIG2_FADD_EN
         strh r3, [r12, #NAND_FLASH_CONFIG2_REG_OFF]
-        do_wait_op_done
+        bl do_wait_op_done
     .endm   // do_addr_input
 
 #define PLATFORM_VECTORS         _platform_vectors