- /*
- *
- * FILE : MPC5604B_M27V_HWInit.c
- *
- * DESCRIPTION:
- * This file contains all MPC5604B_M27V derivative needed initializations,
- * and all initializations for the MPC5604B_M27V boards which are supported.
- * This includes setting up the External Bus Interface to allow access
- * to memory on the external bus, and ensuring there is a valid entry in
- * the MMU for the external memory access.
- */
- /*---------------------------------------------------------------------------*/
- /* Includes */
- /*---------------------------------------------------------------------------*/
- #include "MPC5604B_M27V.h" /* MPC56xx platform development header */
- #include "MPC5604B_M27V_HWInit.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*******************************************************/
- /* MPC5604B_M27V derivative specific hardware initialization */
- /*******************************************************/
- /* Symbol L2SRAM_LOCATION is defined in the application linker command
- file (.lcf) It is defined to the start of the internal SRAM in the
- MPC5604B_M27V.
- */
- /*lint -esym(752, L2SRAM_LOCATION) */
- extern long L2SRAM_LOCATION;
- __asm void INIT_Derivative(void)
- {
- nofralloc
- /* MPC5604B_M27V SRAM initialization code */
- lis r11,L2SRAM_LOCATION[url=home.php?mod=space&uid=945]@h[/url] /* Base of SRAM, 64-bit word aligned */
- ori r11,r11,L2SRAM_LOCATION@l
- li r12,256 /* Loops to cover 32K SRAM; 32k/4 bytes/32 GPRs = 384 */
- mtctr r12
- init_l2sram_loop:
- stmw r0,0(r11) /* Write 32 GPRs to SRAM */
- addi r11,r11,128 /* Inc the ram ptr; 32 GPRs * 4 bytes = 128B */
- bdnz init_l2sram_loop /* Loop for 32k of SRAM */
- blr
- }
- /*******************************************************/
- /* MPC5604B_M27V boards specific hardware initializations */
- /*******************************************************/
- /** This macro allows to use C defined address with the inline assembler */
- #define MAKE_HLI_COMPATIBLE(hli_name, c_expr) enum { hli_name=/*lint -e30*/((int)(c_expr)) };
- /*----------------------------------------------------------------------------*/
- /* Function declarations */
- /*----------------------------------------------------------------------------*/
- /* Initialize a set of contiguous PCRs */
- __asm void InitPCRs(void);
- /* Initialize the SIU External Bus Interface */
- __asm void __initSIUExtBusInterface(void);
- /* Initialize the used EBI Chip Selects */
- __asm void __initEBIChipSelects(void);
- /* Write one MMU Table Entry */
- __asm void WriteMMUTableEntry( void );
- /* Initialize the needed MMU Table entries */
- __asm void __initMMUExternalMemory(void);
- /*----------------------------------------------------------------------------*/
- /* Function implementations */
- /*----------------------------------------------------------------------------*/
- __asm void INIT_ExternalBusAndMemory(void)
- {
- nofralloc
- mflr r28
-
- /* Initialize the SIU External Bus Interface */
- bl __initSIUExtBusInterface
- /* Initialize the used EBI Chip Selects */
- bl __initEBIChipSelects
- /* Initialize the needed MMU Table entries */
- bl __initMMUExternalMemory
-
- mtlr r28
-
- blr
- }
- /*----------------------------------------------------------------------------*/
- /* External Memory Locations from lcf file */
- /*----------------------------------------------------------------------------*/
- #if INIT_USED_BOARD==MPC5604B_M27VDEMO_AXM_0321
- /* Symbol AXM_0321_EXTERNAL_RAM is defined in the application linker command file (.lcf)
- It is defined to the start of the external memory on the MPC5604B_M27VDEMO_AXM-0321 board
- */
- extern unsigned long AXM_0321_EXTERNAL_RAM[];
- #endif
- /*----------------------------------------------------------------------------*/
- /* SIU External Bus Interface */
- /*----------------------------------------------------------------------------*/
- /* Initialize a set of contiguous PCRs: */
- /* r3: the firts PCR to initialize */
- /* r4: the value to write in the PCRs */
- /* r5: the number of PCRs to initialize */
- __asm void InitPCRs(void)
- {
- nofralloc
- mtctr r5 /* intialize ctr with the number of PCRs to initialize */
- pcr_init_loop:
- sth r4,0(r3) /* Write r4 to current PCR address */
- addi r3,r3, 2 /* Inc the memory ptr by 2 to point to the next PCR */
- bdnz pcr_init_loop /* Loop for ctr PCRs */
- blr
- }
- /* Initialize the SIU External Bus Interface */
- __asm void __initSIUExtBusInterface(void)
- {
- MAKE_HLI_COMPATIBLE(SIU_PCR0,&SIU.PCR[0].R)
- MAKE_HLI_COMPATIBLE(SIU_PCR4,&SIU.PCR[4].R)
- MAKE_HLI_COMPATIBLE(SIU_PCR28,&SIU.PCR[28].R)
- MAKE_HLI_COMPATIBLE(SIU_PCR62,&SIU.PCR[62].R)
- MAKE_HLI_COMPATIBLE(SIU_PCR64,&SIU.PCR[64].R)
- MAKE_HLI_COMPATIBLE(SIU_PCR68,&SIU.PCR[68].R)
- nofralloc
- mflr r27
- /* This initializes the MPC5604B_M27V external bus
- Set up the pins
- Address bus PCR 4 - 27
- Configure address bus pins
- */
- lis r3,SIU_PCR4@h /* First PCR Address bus is PCR 4 */
- ori r3,r3,SIU_PCR4@l
- li r5,24 /* Loop counter to get all address bus PCR (4 to 27) -> 24 PCRs */
- li r4, 0x0440 /* PCRs initialization value */
- bl InitPCRs
- /* Data bus PCR 28-59
- Configure data bus pins
- */
- lis r3,SIU_PCR28@h /* First PCR for data bus is PCR 28 */
- ori r3,r3,SIU_PCR28@l
- li r5,32 /* Loop counter to get all data bus PCR (28-59) -> 32 PCRs */
- li r4, 0x0440 /* PCRs initialization value */
- bl InitPCRs
- /* Configure minimum bus control pins
- RD/WR & BDIP PCR 62/63
- */
- lis r3,SIU_PCR62@h /* First PCR for is PCR 62 */
- ori r3,r3,SIU_PCR62@l
- li r5,2 /* Loop counter to get all PCR (62-63) -> 2 PCRs */
- li r4, 0x0440 /* PCRs initialization value */
- bl InitPCRs
- /* WE[0-4] PCR 64-67
- */
- lis r3,SIU_PCR64@h /* First PCR for is PCR 64 */
- ori r3,r3,SIU_PCR64@l
- li r5,4 /* Loop counter to get all PCR (64-67) -> 4 PCRs */
- li r4, 0x0443 /* PCRs initialization value */
- bl InitPCRs
- /* OE & TS
- */
- lis r3,SIU_PCR68@h /* First PCR for is PCR 68 */
- ori r3,r3,SIU_PCR68@l
- li r5,2 /* Loop counter to get all PCR (68-69) -> 2 PCRs */
- li r4, 0x0443 /* PCRs initialization value */
- bl InitPCRs
-
- /* Configure the chip selects
- CS[0-3]
- */
- lis r3,SIU_PCR0@h /* First PCR for is PCR 0 */
- ori r3,r3,SIU_PCR0@l
- li r5,4 /* Loop counter to get all PCR (0-3) -> 4 PCRs */
- li r4, 0x0443 /* PCRs initialization value */
- bl InitPCRs
-
- mtlr r27
-
- blr
- }
- /*----------------------------------------------------------------------------*/
- /* EBI Chip Selects */
- /*----------------------------------------------------------------------------*/
- /* Initialize the used EBI Chip Selects */
- __asm void __initEBIChipSelects(void)
- {
- #if INIT_USED_BOARD==MPC5604B_M27VDEMO_AXM_0321
- MAKE_HLI_COMPATIBLE(EBBI_CS0_BR,&EBI.CS[0].BR.R)
- MAKE_HLI_COMPATIBLE(EBBI_CS0_OR,&EBI.CS[0].OR.R)
- #endif
- nofralloc
- #if INIT_USED_BOARD==MPC5604B_M27VDEMO_AXM_0321
- /* CY7C1338 512K External SRAM - 4 beat burst, 0 wait
- Set up Memory Controller CS0 [url=home.php?mod=space&uid=72445]@[/url] AXM_0321_EXTERNAL_RAM
- */
- /* EBI.CS[0].BR.R = (unsigned long)AXM_0321_EXTERNAL_RAM | 0x41UL;
- */
- lis r3,AXM_0321_EXTERNAL_RAM@h
- addi r0,r3,AXM_0321_EXTERNAL_RAM@l
- ori r0,r0,0x0041
- lis r3,EBBI_CS0_BR@h
- ori r3,r3,EBBI_CS0_BR@l
- stw r0,0(r3)
- /* EBI.CS[0].OR.R = 0xfff80000;
- */
- lis r0,0xfff8
- lis r3,EBBI_CS0_OR@h
- ori r3,r3,EBBI_CS0_OR@l
- stw r0,0(r3)
- #endif
- blr
- }
- /*----------------------------------------------------------------------------*/
- /* Writing to MMU Table Entries */
- /*----------------------------------------------------------------------------*/
- /* Write one MMU Table Entry: */
- /* r3, r4, r5 and r6 must hold */
- /* the values of MAS0, MAS1, MAS2 and MAS3 */
- __asm void WriteMMUTableEntry( void )
- {
- nofralloc
- /* Write MMU Assist Register 0 (MAS0); SPR 624 */
- mtspr 624, r3
- /* Write MMU Assist Register 1 (MAS1); SPR 625 */
- mtspr 625, r4
- /* Write MMU Assist Register 2 (MAS2); SPR 626 */
- mtspr 626, r5
- /* Write MMU Assist Register 3 (MAS3); SPR 627 */
- mtspr 627, r6
- /* Write the table entry */
- tlbwe
- blr
- }
- /* Initialize the needed MMU Table entries */
- __asm void __initMMUExternalMemory(void)
- {
- #if INIT_USED_BOARD==MPC5604B_M27VDEMO_AXM_0321
- /* Set up MMU for External Memory
- Base address = 0x2000_0000
- 16 MByte Memory Space, Not Guarded, Cachable, All Access
- */
- MAKE_HLI_COMPATIBLE(AXM_0321_EXT_RAM_MAS0_VALUE,MAS0_VALUE(2))
- /* 16 MB memory space, valid, protected, global which matches with all process IDs */
- MAKE_HLI_COMPATIBLE(AXM_0321_EXT_RAM_MAS1_VALUE,MAS1_VALUE(V_VALID, IPROT_PROTECTED, TID_GLOBAL, 0, TSIZE_16MB))
- MAKE_HLI_COMPATIBLE(AXM_0321_EXT_RAM_MAS2_FLAGS,MAS2_FLAGS(SHARED_CACHE_STATE_NOT_USED, WRITE_BACK, CACHEABLE, MEM_COHERENCE_NREQ, NOT_GUARDED, BIG_ENDIAN ))
- MAKE_HLI_COMPATIBLE(AXM_0321_EXT_RAM_MAS3_FLAGS,MAS3_FLAGS(READ_WRITE_EXECUTE))
- #endif
- nofralloc
- mflr r27
- #if INIT_USED_BOARD==MPC5604B_M27VDEMO_AXM_0321
- /* load r3 with MAS0 value */
- lis r3,AXM_0321_EXT_RAM_MAS0_VALUE@h
- ori r3,r3,AXM_0321_EXT_RAM_MAS0_VALUE@l
-
- /* load r4 with MAS1 value */
- lis r4,AXM_0321_EXT_RAM_MAS1_VALUE@h
- ori r4,r4,AXM_0321_EXT_RAM_MAS1_VALUE@l
-
- /* load r5 with the external RAM address from the lcf file */
- lis r5,AXM_0321_EXTERNAL_RAM@h
- ori r5,r5,AXM_0321_EXTERNAL_RAM@l
-
- /* mask with 0xfffff000 */
- clrrwi r5,r5,12
-
- /* copy the masked external ram address to r6 also */
- mr r6,r5
-
- /* end MAS2 setup in r3 */
- ori r5,r5,AXM_0321_EXT_RAM_MAS2_FLAGS@l
-
- /* end MAS3 setup in r4 */
- ori r6,r6,AXM_0321_EXT_RAM_MAS3_FLAGS@l
-
- /* write the MMU entry defined through r3, r4, r5 and r6 */
- bl WriteMMUTableEntry
- #endif
- mtlr r27
- blr
- }
- #ifdef __cplusplus
- }
- #endif