]> git.kernelconcepts.de Git - karo-tx-redboot.git/blobdiff - packages/hal/arm/mx27/karo/v1_0/include/hal_platform_setup.h
TX27:
[karo-tx-redboot.git] / packages / hal / arm / mx27 / karo / v1_0 / include / hal_platform_setup.h
index 6e55447f52824691c69cb83c572a9527dc02bf61..295e446ca750b3a5492f2a76469302d05c919c66 100644 (file)
 111:
        subs    r10, r10, #1
        bmi     113f
-       ldr     r9, =3600
+       mov     r9, #3600
 112:
        subs    r9, r9, #1
        bne     112b
-       b       111b
-       .ltorg
 113:
        .endm
 
        orr     r9, r9, #(1 << 2)       /* enable FPM */
        str     r9, [r10, #(SOC_CRM_CSCR - SOC_CRM_BASE)]
 
+       ldr     r9, [r10, #(SOC_CRM_PCCR1 - SOC_CRM_BASE)]
+       orr     r9, r9, #(1 << 24)      /* enable WDT clock */
+       str     r9, [r10, #(SOC_CRM_PCCR1 - SOC_CRM_BASE)]
+
+       /* Wait for clocks to be enabled */
+       mov     r10, #0x1000
+111:
+       subs    r10, r10, #1
+       bmi     113f
+       mov     r9, #3600
+112:
+       subs    r9, r9, #1
+       bne     112b
+113:
        ldr     r10, WDOG_BASE
-       mov     r9, #0
-       str     r9, [r10, #0]
+       /* enable watchdog timeout */
+       mov     r9, #0x0034
+       strh    r9, [r10, #0]
+       /* wait for watchdog to trigger */
+       b       .
        .endm
 // This macro represents the initial startup code for the platform
 // r11 is reserved to contain chip rev info in this file
@@ -252,6 +267,8 @@ NAND_Boot_Start:
        LED_ON
        /* Jump to SDRAM */
        bl      jump_to_sdram
+/* Code and all data used up to here must fit within the first 2KiB of FLASH ROM! */
+Now_in_SDRAM:
        LED_OFF
 NAND_Copy_Main:
        ldr     r0, NFC_BASE_W  //r0: nfc base. Reloaded after each page copying
@@ -266,7 +283,7 @@ NAND_Copy_Main:
        mov     r3, #(NAND_FLASH_CONFIG1_INT_MSK | NAND_FLASH_CONFIG1_ECC_EN)
        strh    r3, [r4, #NAND_FLASH_CONFIG1_REG_OFF]
 
-       //unlock internal buffer
+       // unlock internal buffer
        mov     r3, #0x2
        strh    r3, [r4, #0xA]
 
@@ -326,9 +343,9 @@ Nfc_Read_Page:
 Skip_bad_block:
 #ifdef CYGOPT_HAL_ARM_TX27_DEBUG
        LED_BLINK #1
-       b Skip_bad_block
+       b       Skip_bad_block
 #endif
-       add     r1, r1, #(TX27_NAND_BLKS_PER_PAGE*TX27_NAND_PAGE_SIZE)
+       add     r1, r1, #(TX27_NAND_BLKS_PER_PAGE * TX27_NAND_PAGE_SIZE)
        b       Nfc_Read_Page
 
 Copy_Good_Blk:
@@ -350,54 +367,25 @@ Copy_Good_Blk:
 NAND_Copy_Main_done:
 
 Normal_Boot_Continue:
-//     bl      jump_to_sdram
-// Code and all data used up to here must fit within the first 2KiB of FLASH ROM!
-#ifdef CYG_HAL_STARTUP_ROMRAM  /* enable running from RAM */
-       /* Copy image from flash to SDRAM first */
-       ldr     r0, =0xFFFFF000
-       and     r0, r0, pc
-       ldr     r1, MXC_REDBOOT_RAM_START
-       cmp     r0, r1
-       beq     HWInitialise_skip_SDRAM_copy
-
-       add     r2, r0, #REDBOOT_IMAGE_SIZE
-1:
-       ldmia   r0!, {r7-r14}
-       stmia   r1!, {r7-r14}
-       cmp     r0, r2
-       ble     1b
-
-       bl      jump_to_sdram
-Now_in_SDRAM:
-       LED_BLINK #3
-#endif /* CYG_HAL_STARTUP_ROMRAM */
-
-HWInitialise_skip_SDRAM_copy:
-       LED_BLINK #2
-
-init_cs0_sync_start:
        init_cs0_sync
 
 NAND_ClockSetup:
-       ldr     r1, =(SOC_CRM_BASE)
+       ldr     r1, SOC_CRM_BASE_W
        ldr     r2, [r1, #(SOC_CRM_PCDR0 - SOC_CRM_BASE)]
        bic     r2, r2, #0x0200
        orr     r2, r2, #0x01C0
-       ldr     r1, =(SOC_CRM_BASE)
        str     r2, [r1, #(SOC_CRM_PCDR0 - SOC_CRM_BASE)]
 
 /* end of NAND clock divider setup */
 
        // TLSbo76381: enable USB/PP/DMA burst override bits in GPCR
-       ldr     r1, =(SOC_SYSCTRL_GPCR)
+       ldr     r1, =SOC_SYSCTRL_GPCR
        ldr     r2, [r1]
        orr     r2, r2, #0x700
        str     r2, [r1]
 
        // Set up a stack [for calling C code]
-       ldr     r1, =__startup_stack
-       ldr     r2, =RAM_BANK0_BASE
-       orr     sp, r1, r2
+       ldr     sp, =__startup_stack
 
        LED_ON
        // Create MMU tables
@@ -423,9 +411,14 @@ NAND_ClockSetup:
 
        .macro init_clock
        ldr     r0, SOC_CRM_BASE_W
-       // disable MPLL/SPLL first
+       // disable PLL update first
        ldr     r1, [r0, #(SOC_CRM_CSCR - SOC_CRM_BASE)]
-       bic     r1, r1, #0x3
+       orr     r1, r1, #(1 << 31)
+#ifdef PLL_REF_CLK_32768HZ
+       orr     r1, r1, #(1 << 3)       // disable OSC26M
+#else
+       bic     r1, r1, #(1 << 3)       // enable 26MHz osc
+#endif
        str     r1, [r0, #(SOC_CRM_CSCR - SOC_CRM_BASE)]
 
        // configure MPCTL0
@@ -436,27 +429,20 @@ NAND_ClockSetup:
        ldr     r1, CRM_SPCTL0_VAL2_W
        str     r1, [r0, #(SOC_CRM_SPCTL0 - SOC_CRM_BASE)]
 
-       ldr r1, [r0, #(SOC_CRM_CSCR - SOC_CRM_BASE)]
-#ifdef PLL_REF_CLK_32768HZ
-       // Make sure to use CKIL
-       bic     r1, r1, #(3 << 16)
-#else
-       orr     r1, r1, #(3 << 16)              // select 26MHz
-#endif
-       orr     r1, r1, #0x000C0000             // restart SPLL and MPLL
-       orr     r1, r1, #0x00000003             // enable SPLL and MPLL
+       ldr     r1, [r0, #(SOC_CRM_CSCR - SOC_CRM_BASE)]
+       orr     r1, r1, #(0x3 << 18)    // SPLL_RESTART | MPLL_RESTART
+       orr     r1, r1, #(0x3 << 0)     // SPLL_ENABLE | MPLL_ENABLE
        str     r1, [r0, #(SOC_CRM_CSCR - SOC_CRM_BASE)]
 1:
        ldr     r1, [r0, #(SOC_CRM_CSCR - SOC_CRM_BASE)]
-       tst     r1, #0x000C0000
+       tst     r1, #(0x3 << 18)        // wait for SPLL/MPLL restart to clear
        bne     1b
 
        ldr     r1, SOC_CRM_CSCR2_W
        str     r1, [r0, #(SOC_CRM_CSCR - SOC_CRM_BASE)]
 
        // Set divider of H264_CLK to zero, NFC to 3.
-       ldr     r1, [r0, #(SOC_CRM_PCDR0 - SOC_CRM_BASE)]
-       bic     r1, r1, #0x0000FC00
+       ldr     r1, SOC_CRM_PCDR0_W
        str     r1, [r0, #(SOC_CRM_PCDR0 - SOC_CRM_BASE)]
 
        /* Configure PCDR1 */
@@ -470,11 +456,6 @@ NAND_ClockSetup:
        ldr     r1, [r0, #(SOC_CRM_PCCR1 - SOC_CRM_BASE)]
        orr     r1, r1, #0x0780
        str     r1, [r0, #(SOC_CRM_PCCR1 - SOC_CRM_BASE)]
-       // make default CLKO to be FCLK
-       ldr     r1, [r0, #(SOC_CRM_CCSR - SOC_CRM_BASE)]
-       and     r1, r1, #0xFFFFFFE0
-       orr     r1, r1, #0x7
-       str     r1, [r0, #(SOC_CRM_CCSR - SOC_CRM_BASE)]
        .endm //init_clock
 
        .macro init_cs0
@@ -782,8 +763,60 @@ SOC_MAX_MPR_VAL:           .word   0x00302145
 SOC_CRM_BASE_W:                        .word   SOC_CRM_BASE
 CRM_MPCTL0_VAL2_W:             .word   CRM_MPCTL0_VAL2
 CRM_SPCTL0_VAL2_W:             .word   CRM_SPCTL0_VAL2
-SOC_CRM_CSCR2_W:               .word   CRM_CSCR_VAL2
-SOC_CRM_PCDR1_W:               .word   0x09030913      // p1=20 p2=10 p3=4 p4=10
+
+#define AHBDIV                 (MPLL_REF_CLK_kHz * 2 / 3 / 1000 / CYGHWR_HAL_ARM_SOC_SYSTEM_CLOCK)
+
+#define CSCR_AHB_DIV(n)                ((((n) & 3) - 1) << 8)
+#define CSCR_ARM_DIV(n)                ((((n) & 3) - 1) << 12)
+#define CSCR_ARM_SRC(n)                ((!!(n)) << 15)
+#define CSCR_MCU_SEL(n)                ((!!(n)) << 16)
+#define CSCR_SP_SEL(n)         ((!!(n)) << 17)
+#define CSCR_USB_DIV(n)                ((((n) & 7) - 1) << 28)
+
+#define MPLL_CLK_DIV(khz)      ((MPLL_REF_CLK_kHz * 2 / 3 + (khz) - 1) / (khz) - 1)
+#define MPLL_CLK_DIV2(khz)     ((MPLL_REF_CLK_kHz * 4 / 3 + (khz) - 1) / (khz) - 4)
+#define SPLL_CLK_DIV(khz)      ((SPLL_REF_CLK_kHz + (khz) - 1) / (khz) - 1)
+#define SPLL_CLK_DIV2(khz)     ((SPLL_REF_CLK_kHz * 2 + (khz) - 1) / (khz) - 4)
+
+#define PCDR0_SSI2_DIV(pll, n) ((pll##_CLK_DIV2(n) & 0x3f) << 26)
+#define PCDR0_CLKO_DIV(n)      ((((n) - 1) & 0x7) << 22)
+#define PCDR0_SSI1_DIV(pll, n) ((pll##_CLK_DIV2(n) & 0x3f) << 16)
+#define PCDR0_H264_DIV(pll, n) ((pll##_CLK_DIV2(n) & 0x3f) << 10)
+#define PCDR0_NFC_DIV(n)       ((MPLL_CLK_DIV(n) & 0xf) << 6)
+#define PCDR0_MSHC_DIV(pll, n) ((pll##_CLK_DIV(n) & 0x3f) << 0)
+#define PCDR0_CLKO_EN          (1 << 25)
+
+#define PCDR1_PER1_DIV(n)      ((MPLL##_CLK_DIV(n) & 0x3f) << 0)
+#define PCDR1_PER2_DIV(n)      ((MPLL##_CLK_DIV(n) & 0x3f) << 8)
+#define PCDR1_PER3_DIV(n)      ((MPLL##_CLK_DIV(n) & 0x3f) << 16)
+#define PCDR1_PER4_DIV(n)      ((MPLL##_CLK_DIV(n) & 0x3f) << 24)
+
+#ifndef PLL_REF_CLK_32768HZ
+#define MPLL_SRC               (1 << 16)
+#define SPLL_SRC               (1 << 17)
+#define FPM_ENABLE             (1 << 2)
+#else
+#define MPLL_SRC               (0 << 16)
+#define SPLL_SRC               (0 << 17)
+#define FPM_ENABLE             (1 << 2)
+#endif
+
+SOC_CRM_CSCR2_W:               .word   0x03f00003 | \
+                                       FPM_ENABLE | MPLL_SRC | SPLL_SRC | \
+                                       CSCR_AHB_DIV(AHBDIV) | \
+                                       CSCR_ARM_DIV(1) | \
+                                       CSCR_USB_DIV(4) | \
+                                       CSCR_ARM_SRC(MPLL_REF_CLK_kHz / 1000 == CYGHWR_HAL_ARM_SOC_PROCESSOR_CLOCK)
+SOC_CRM_PCDR0_W:               .word   PCDR0_SSI2_DIV(MPLL, 66500) | \
+                                       PCDR0_CLKO_DIV(8) | PCDR0_CLKO_EN | \
+                                       PCDR0_SSI1_DIV(MPLL, 66500) | \
+                                       PCDR0_H264_DIV(MPLL, 133000) | \
+                                       PCDR0_NFC_DIV(16625) | \
+                                       PCDR0_MSHC_DIV(MPLL, 66500)
+SOC_CRM_PCDR1_W:               .word   PCDR1_PER1_DIV(13300) | \
+                                       PCDR1_PER2_DIV(26600) | \
+                                       PCDR1_PER3_DIV(66500) | \
+                                       PCDR1_PER4_DIV(26600)
 SOC_CRM_PCCR0_W:               .word   0x3108480F
 SOC_CS4_CTL_BASE_W:            .word   SOC_CS4_CTL_BASE
 CS4_CSCRU_VAL:                 .word   0x0000DCF6