📄 rominit.s
字号:
init_dram:/* Disable refresh Cycles */ ldr r9, L$LIXP425_SDRAM_REFRESH ldr r0, L$LIXP425_SDRAM_REFRESH_DISABLE str r0, [r9, #0] /* Disable Refresh Cycle */ DELAY (0x4000, r0)/* Issue a NOP Command to all SDRAM devices */ ldr r9, L$LIXP425_SDRAM_INSTRUCTION ldr r0, L$LIXP425_SDRAM_IR_NOP_CMD str r0, [r9, #0] /* Issue NOP cmd to SDRAM */ DELAY (0x4000, r0) ldr r9, L$LIXP425_SDRAM_REFRESH ldr r0, L$LIXDP425_SDRAM_CONFIG_REFRESH_CNT str r0, [r9, #0] /* Set refresh value */ DELAY (0x4000, r0)/* Send a PrechargeAll Command to all SDRAM devices */ ldr r9, L$LIXP425_SDRAM_INSTRUCTION ldr r0, L$LIXP425_SDRAM_IR_PRECHARGE_ALL_CMD str r0, [r9, #0] /* Precharge all */ DELAY (0x4000, r0)/* Send 8 AutoRefresh Command. There should Trc cycles between every * AutoRefresh. Trc = 70ns for devices used here, */ ldr r9, L$LIXP425_SDRAM_INSTRUCTION ldr r0, L$LIXP425_SDRAM_IR_AUTOREFRESH_CMD str r0, [r9, #0] /* Auto Refresh #1 */ DELAY (0x100, r0) str r0, [r9, #0] /* Auto Refresh #2 */ DELAY (0x100, r0) str r0, [r9, #0] /* Auto Refresh #3 */ DELAY (0x100, r0) str r0, [r9, #0] /* Auto Refresh #4 */ DELAY (0x100, r0) str r0, [r9, #0] /* Auto Refresh #5 */ DELAY (0x100, r0) str r0, [r9, #0] /* Auto Refresh #6 */ DELAY (0x100, r0) str r0, [r9, #0] /* Auto Refresh #7 */ DELAY (0x100, r0) str r0, [r9, #0] /* Auto Refresh #8 */ DELAY (0x100, r0)/* Send Mode Reg Set Cmd with CAS Latency 3 */ ldr r9, L$LIXP425_SDRAM_INSTRUCTION ldr r0, L$LIXP425_SDRAM_IR_MODE_SET_CAS3_CMD str r0, [r9, #0] /* Send Mode Select Command */ DELAY (0x4000, r0) ldr r9, L$LIXP425_SDRAM_INSTRUCTION ldr r0, L$LIXP425_SDRAM_IR_NORMAL_OPERATION_CMD str r0, [r9, #0x00000000] /* Issue a Normal Operation command */#endif /* INIT_SDRAM *//*************** SDRAM Config Complete ***************************************/ /* DebugOutVal INFO_CODE_9 */ mov r0, #0x0009 bl FUNC(SevenSegDisplay)/* Enable Coprocessors access */ ldr r0, =0x001 mcr p15, 0, r0, c15, c1, 0 mcr p15, 0, r0, c7, c10, 4 /* Drain write/fill buffers */ CPWAIT (r0) /* wait for the write to happen */ CPWAIT (r0) /* wait for the write to happen *//* Invalidate I-Cache, D-Cache, and BTB */ mcr p15, 0, r0, c7, c7, 0 CPWAIT (r0) /* Wait *//* Set the CS0 setting for Flash to optimum timings. */ ldr r0, L$LIXP425_EXP_CS0_REG ldr r1, L$LIXDP425_FLASH_CS_DEFAULT str r1, [r0] /* DebugOutVal INFO_CODE_C */ mov r0, #0x000c bl FUNC(SevenSegDisplay)/*** Enable Write Buffer Coalescing ***/#if XSCALE_WB_COAL_ENABLE mcr p15, 0, r0, c7, c10, 4 /* Drain write/fill buffers */ CPWAIT (r0) /* wait for the write to happen */ CPWAIT (r0) /* wait for the write to happen */ mrc p15, 0, r0, c1, c0, 1 /* Read Auxiliary Control Reg */ and r0, r0, #0xfffffffe /* Enable Coalescing */ mcr p15, 0, r0, c1, c0, 1 /* Write Auxiliary Control Reg */ CPWAIT (r0) /* wait for the write to happen */ NOP NOP#endifwarm_start:/* Disable Interrupts */ MRS r1, cpsr /* get current status */ ORR r1, r1, #I_BIT | F_BIT /* disable IRQ and FIQ */ MSR cpsr, r1/* Interrupts Disabled */ ldr r0, L$LIXP425_ICMR /* Zero-out Interrupt Mask */ mov r2, #0x0 str r2, [r0]/* 3: Jump to here + New Flash Location. We could jump up to location in * Flash, but we have already copied enough code to low ram to continue code * execution from here */ ldr r0, =IXP425_EXPANSION_BUS_BASE2 orr r0, r0, pc mov pc, r0/* 4: Write to Expansion Bus controller to swap Flash & Ram */ ldr r0, L$LIXP425_EXP_CNFG0 ldr r1, [r0] and r1, r1,#0x7FFFFFFF str r1, [r0]/* End of switch , should now be running in Flash in its relocated position.*/ /* DebugOutVal INFO_CODE_D */ mov r0, #0x000d bl FUNC(SevenSegDisplay)/* Enable Coprocessors access */ ldr r0, =0x001 mcr p15, 0, r0, c15, c1, 0 mcr p15, 0, r0, c7, c10, 4 /* Drain write/fill buffers */ CPWAIT (r0) /* wait for the write to happen */ CPWAIT (r0) /* wait for the write to happen */#ifdef ROM_ENABLES_MMU/* Enable the MMU */ /* Update the seven segment display */ mov r0, #0x00A1 bl FUNC(SevenSegDisplay) /* Invalidate the entire instruction cache */ ldr r0, =0x0 mcr p15, 0, r0, c7, c5, 0 CPWAIT (r0) /* Update the seven segment display */ mov r0, #0x00A2 bl FUNC(SevenSegDisplay) /* Set Translation Table Base */ LDR r0, L$_romL1PTable mcr p15, 0, r0, c2, c0, 0 /* Set Translation Table Base Register*/ CPWAIT (r0) /* Wait */ /* Update the seven segment display */ mov r0, #0x00A3 bl FUNC(SevenSegDisplay) /* Invalidate the Instruction and Data TLBs */ ldr r0, =0x0 mcr p15, 0, r0, c8, c7, 0 CPWAIT (r0) /* Update the seven segment display */ mov r0, #0x00A4 bl FUNC(SevenSegDisplay) /* Set Domain Access Control Register */ mov r0, #0xFFFFFFFF /* Set All 16 domains to mgr access*/ mcr p15, 0, r0, c3, c0, 0 /* Set Domain Permissions */ CPWAIT (r0) /* Wait */ /* Update the seven segment display */ mov r0, #0x00A5 bl FUNC(SevenSegDisplay) /* Enable LE Data coherence operation, no effect until MMU * is enabled. */ ldr r0, L$LIXP425_EXP_CNFG1 ldr r1, [r0] orr r1, r1, #IXP425_EXP_CFG1_BYTE_SWAP_EN str r1, [r0] /* Update the seven segment display */ mov r0, #0x00A6 bl FUNC(SevenSegDisplay) /* Enable Data Cache */ mrc p15, 0, r0, c1, c0, 0 /* Read Control Reg */ orr r0, r0, #0x00000004 /* Enable Data Cache */ mcr p15, 0, r0, c1, c0, 0 /* Write Back */ CPWAIT (r0) /* Wait */ /* Update the seven segment display */ mov r0, #0x00A7 bl FUNC(SevenSegDisplay) /* Enable Instruction Cache */ mrc p15, 0, r0, c1, c0, 0 /* Read Control Register*/ orr r0, r0, #0x1000 /* Set I-Cache bit */ mcr p15, 0, r0, c1, c0, 0 /* Write Back Control Register */ CPWAIT (r0) /* Wait */ /* Update the seven segment display */ mov r0, #0x00A8 bl FUNC(SevenSegDisplay) /* Turn on the MMU - At this stage we are still executing from ROM * so we will still be in address coherency mode after the MMU * switches on */ mrc p15, 0, r9, c1, c0, 0 /* Get CP reg 15 value into r1 */ orr r9, r9, #0x1 /* Set Bit 0 of CP15 register 1 */ mcr p15, 0, r9, c1, c0, 0 /* Save new CP15 Reg 1 value */ CPWAIT (r0) /* wait for it */ /* Update the seven segment display */ mov r0, #0x00A9 bl FUNC(SevenSegDisplay) #endif /* ROM_ENABLES_MMU was defined *//* Enable Branch Target Buffer */ mrc p15, 0, r0, c1, c0, 0 /* Read Control Reg */ orr r0, r0, #0x00000800 /* Enable BTB */ mcr p15, 0, r0, c1, c0, 0 /* Write Back the Control Reg */ CPWAIT (r0) /* Wait *//* Enable trap for mis-aligned data */ mrc p15, 0, r0, c1, c0, 0 /* Read Control Reg */ orr r0, r0, #0x00000002 /* set alignment trap bit */ mcr p15, 0, r0, c1, c0, 0 /* Write Back the Control Reg */ CPWAIT (r0) /* Wait *//******************************************************************************//******************************************************************************/ /* DebugOutVal INFO_CODE_E */ mov r0, #0x000e bl FUNC(SevenSegDisplay)vxWorks_boot:/* Now jump to the code that starts the whole vxWorks boot process */ mov r0, r8 ldr sp, L$STACK_ADDR ldr pc, L$StrtInFlash/******************************************************************************//******************************************************************************/UARTVString:/* Do nothing as byte reads from flash not allowed */ mov pc, lr ldr r10, =IXP425_UART1_BASEUARTNextChar: ldrb r1, [r0], #1 teq r1, #0 beq URATTxDone /* UARTTextOut r10, r1, r2 */ and r1, r1, #0xff/* Modified, don't even check if there is room in the transfer fifo just do it. * TODO : remove later, on real card *//* ldr r10, =IXP425_UART1_BASE ldr r2, [r10, #UART_LineStatus] TST r2. #UARTLSR_TXHoldingEmpty BEQ 10b*/ strb r1, [r10, #UART_Transmit] /* Start- Included to slow down writes to simultor : TODO: Remove later */ DELAY (0x200, r3)/*End- Included to slow down writes to simultor : TODO: Remove later */ B UARTNextCharURATTxDone: mov r1, #13 /* UARTTx r10, r1, r2 */ mov r1, #10 strb r1, [r10, #UART_Transmit] /* UARTTx r10, r1, r2 */ strb r1, [r10, #UART_Transmit] mov pc, lr/* Better not to use r0, r1, r2 and r10s. Uses r0, r10 */UARTStart: ldr r10, =IXP425_UART1_BASE ldr r0, =UART_DMABodgeDelayUARTDelay: subs r0, r0, #1 bne UARTDelay/* Enable access to divisor registers */ mov r0, #UARTLCR_DivisorLatchAccess strb r0, [r10, #UART_LineControl] ldr r0, =UART_DMABodgeDelayUARTDelay1: subs r0, r0, #1 bne UARTDelay1 /* select baud rate */ ldr r0, =BaudRateDivisor_9600 strb r0, [r10, #UART_DivisorLatchLSB] mov r0, r0, LSR #8 strb r0, [r10, #UART_DivisorLatchMSB] /* 8 data, 1 stop, no parity */ mov r0, #UARTLCR_CharLength8 | UARTLCR_StopBits1 /* also disable access to divisor regs */ strb r0, [r10, #UART_LineControl] /* no irqs , but enable the UART on IXP425 */ mov r0, #0x40 strb r0, [r10, #UART_InterruptEnable] mov r0, #UARTFCR_Enable strb r0, [r10, #UART_FIFOControl] /* turn fifos on */ mov r0, #UARTFCR_RXReset | ARTFCR_TXReset | UARTFCR_Mode0RXRDYTXRDY | UARTFCR_RXTrigger1 strb r0, [r10, #UART_FIFOControl] /* make DTR active, RTS inactive, stop other end */ mov r0, #UARTMCR_DTRActive strb r0, [r10, #UART_ModemControl] mov pc, lr/******************************************************************************//******************************************************************************/_ARM_FUNCTION(SevenSegDisplay)#ifdef INCLUDE_IXDP425_LED_DEBUG ldr r6, L$LED_DISPLAY strh r0, [r6]#endif mov pc, lr/******************************************************************************//******************************************************************************/#ifdef _DIAB_TOOL .ltorg#endif /* _DIAB_TOOL */ .align 4#ifdef ROM_ENABLES_MMU/* The MMU translation table address needs to be a physical address */L$_romL1PTable: .long ROM_TEXT_ADRS + FUNC(romL1PTable) - FUNC(romInit)#endifL$LIXP425_ICMR: .long IXP425_ICMRL$LIXP425_EXP_CNFG0: .long IXP425_EXP_CNFG0L$LIXP425_EXP_CNFG1: .long IXP425_EXP_CNFG1L$StrtInRam: .long FUNC(romStart) - FUNC(romInit)L$StrtInFlash: .long ROM_TEXT_ADRS + FUNC(romStart) - FUNC(romInit)L$STACK_ADDR: .long STACK_ADRSL$FlashDramSwapSize: .long BOOT_ROM_RELOCATE_SIZEL$LIXP425_EXP_CS0_REG: .long IXP425_EXP_CS0_REGL$LIXDP425_FLASH_CS_DEFAULT: .long IXDP425_FLASH_CS_DEFAULT/* SDRAM Literals */L$LIXP425_SDRAM_CONFIG_BASE: .long IXP425_SDRAM_CONFIG_BASEL$LSDRAM_CONFIG_32MEG: .long SDRAM_CONFIG_32MEGL$LSDRAM_CONFIG_64MEG: .long SDRAM_CONFIG_64MEGL$LSDRAM_CONFIG_128MEG: .long SDRAM_CONFIG_128MEGL$LSDRAM_CONFIG_256MEG: .long SDRAM_CONFIG_256MEGL$LIXP425_SDRAM_CONFIG: .long IXP425_SDRAM_CONFIGL$LIXP425_SDRAM_REFRESH: .long IXP425_SDRAM_REFRESHL$LIXP425_SDRAM_REFRESH_DISABLE: .long IXP425_SDRAM_REFRESH_DISABLEL$LIXP425_SDRAM_INSTRUCTION: .long IXP425_SDRAM_INSTRUCTIONL$LIXP425_SDRAM_IR_NOP_CMD: .long IXP425_SDRAM_IR_NOP_CMDL$LIXDP425_SDRAM_CONFIG_REFRESH_CNT: .long IXDP425_SDRAM_CONFIG_REFRESH_CNTL$LIXP425_SDRAM_IR_PRECHARGE_ALL_CMD: .long IXP425_SDRAM_IR_PRECHARGE_ALL_CMDL$LIXP425_SDRAM_IR_AUTOREFRESH_CMD: .long IXP425_SDRAM_IR_AUTOREFRESH_CMDL$LIXP425_SDRAM_IR_MODE_SET_CAS3_CMD: .long IXP425_SDRAM_IR_MODE_SET_CAS3_CMDL$LIXP425_SDRAM_IR_NORMAL_OPERATION_CMD: .long IXP425_SDRAM_IR_NORMAL_OPERATION_CMD/* DebugOutInitLiteral */L$CS2_REG: .long 0xc4000008L$CS2_VAL: .long 0xBFFF0002L$LED_DISPLAY: .long IXDP425_7SEG_BASE /* MMU Translation Table statically defined in ROM and used during bootrom * bring up. The application code transistions to using its own translation * table. * Each entry corresponds to a megabyte of virtual address space and is a * section descriptor, containing the physical address for the megabyte of * virtual address space. * * A Level 1 page table must be 16 kilobyte-aligned WHEN IT IS IN THE FLASH * DEVICE. * Please refer to target.nr for a diagram of the IXP425 memory map * N.B. There _MUST_ not be any empty addressable regions in the table, i.e * the count variable must increment sequentially from 0 to 0xfff. If * it does not then table entries _will_ be in the wrong position! */#ifdef ROM_ENABLES_MMU
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -