gps4020_start.s

来自「eCos操作系统源码」· S 代码 · 共 217 行

S
217
字号
//-------------------------------------------------------------------//// gp4020_start.S////-------------------------------------------------------------------//// Copyright (C) 2003, MLB Associates.        //// This file contains basic startup code for the GPS4020 platform.// After initialization, it will call a single "C" function 'main()'//// Note: this program assumes that it has been downloaded into the// on-chip SRAM via the BOOTSTRAP mechanism, so on-chip SRAM is// located at address 0x00000000 and external ROM/FLASH is at// address 0x60000000//	.macro  lab,lbl.\lbl:  .long   \lbl    	.endm	.macro  blr	mov     pc,lr        .endm	    	.equ    MPC_BASE_ADDRESS,         0xE0008000	.equ    MPC_AREA1_CONFIG,         0x00000000	.equ    MPC_AREA2_CONFIG,         0x00000004	.equ    MPC_AREA3_CONFIG,         0x00000008	.equ    MPC_AREA4_CONFIG,         0x0000000C	.equ    GPIO_BASE_ADDRESS,        0xE0005000	.equ    GPIO_DIRECTION_REG_OFFSET,0x00000000	.equ    GPIO_READ_REG_OFFSET,     0x00000004	.equ    GPIO_WRITE_REG_OFFSET,    0x00000008	.equ    UART1_BASE_ADDRESS,       0xE0018000	.equ    UART_TXBUF,               0x00000010	.equ    UART_STATUS,              0x0000000C	.equ    UART_STATUS_TXEMPTY,      0x00000002	.text	.global __exception_handlers__exception_handlers:	 b       reset                           // 0x00	 ldr     pc,.undefined_instruction       // 0x04	 ldr     pc,.software_interrupt          // 0x08 start && software int	 ldr     pc,.abort_prefetch              // 0x0C	 ldr     pc,.abort_data                  // 0x10	 .word   0                               // unused	 ldr     pc,.IRQ                         // 0x18	 ldr     pc,.FIQ                         // 0x1C	                        	 .global vectorsvectors:	 .long   reset                           // 0x20	 lab     undefined_instruction           // 0x24	 lab     software_interrupt              // 0x28	 lab     abort_prefetch                  // 0x2C	 lab     abort_data                      // 0x30	 .word   0                               // 0x34	 lab     IRQ                             // 0x38	 lab     FIQ                             // 0x3C	.arm        @ AKA ".code32"	.align 2     @ Align code on 2^2 = 4 byte intervals	.global startstart:reset:          /*--------------------------------------------------------------------------*/// Setup the GPIO and the ARM registers// make GPIO[0..7] outputs - note: GPIO4 is used for Rx on UART1!	    	ldr     r1,=GPIO_BASE_ADDRESS	ldr    r0, [r1,#GPIO_DIRECTION_REG_OFFSET]	and    r0, r0, #0b00010000    @ 0 = output, 1 = input	str    r0, [r1,#GPIO_DIRECTION_REG_OFFSET]        @ Store value (DON'T use strb)        ldr     r1,=MPC_BASE_ADDRESS        ldr     r2,=0xFF00002D                  // 0x6xxxxxxx, 16bit R/W RAM        str     r2,[r1,#MPC_AREA1_CONFIG]        ldr     r1,=MPC_BASE_ADDRESS        ldr     r2,=0x00000069                  // 0x2xxxxxxx, 16bit R/W RAM        str     r2,[r1,#MPC_AREA2_CONFIG]        ldr     r2,[r1,#MPC_AREA3_CONFIG]        ldr     r2,=0x00000021                  // 0x4xxxxxxx, 16bit peripheral        str     r2,[r1,#MPC_AREA3_CONFIG]        ldr     r2,[r1,#MPC_AREA4_CONFIG]        ldr     r2,=0x0000006E                  // 0x0xxxxxxx, 32bit memory        str     r2,[r1,#MPC_AREA4_CONFIG]        	ldr     sp,=_stack                	bl      main10:     ldr     r1,=GPIO_BASE_ADDRESS	mov     r0,#0	str    r0, [r1,#GPIO_WRITE_REG_OFFSET]	b       10b//// Exception handlers//        undefined_instruction:      // 0x24	mov     r0,#0x24	b       exceptionsoftware_interrupt:         // 0x28	mov     r0,#0x28	b       exceptionabort_prefetch:             // 0x2C	mov     r0,#0x2C	b       exceptionabort_data:                 // 0x30	mov     r0,#0x30	b       exceptionIRQ:                        // 0x38	mov     r0,#0x38	b       exceptionFIQ:                        // 0x3C	mov     r0,#0x3C	b       exceptionexception:        mov     r8,lr       // Location of failure	mov     r9,r000:                     ldr     r1,=GPIO_BASE_ADDRESS	str    r9, [r1,#GPIO_WRITE_REG_OFFSET]	ldr     r3,=0x10000010:     nop	sub     r3,r3,#1	cmp     r3,#0	bne     10b	str     r3,[r1,#GPIO_WRITE_REG_OFFSET]	ldr     r3,=0x8000020:     nop	sub     r3,r3,#1	cmp     r3,#0	bne     20b	ldr     r1,=msg	bl      _puts	mov     r1,r8,lsr #24	bl      _puthex	mov     r1,r8,lsr #16	bl      _puthex	mov     r1,r8,lsr #8	bl      _puthex	mov     r1,r8	bl      _puthex	mov     r0,#'\n'	bl      _putc	mov     r0,#'\r'	bl      _putc	b       00b//// Write the character in r0//        _putc:          	ldr     r2,=UART1_BASE_ADDRESS10:     ldrb    r3,[r2,#UART_STATUS]	and     r3,r3,#UART_STATUS_TXEMPTY	cmp     r3,#0	beq     10b	strb    r0,[r2,#UART_TXBUF]	blr//// Write the string pointed to by r1//_puts:	mov     r7,lr10:     ldrb    r0,[r1],#1	cmp     r0,#0	moveq   pc,r7	bl      _putc	b       10b                                        //// Print the byte in r1 in hex//_puthex:	mov     r7,lr	mov     r2,r1,lsr #4	and     r2,r2,#0x0F	cmp     r2,#0x0A	addge   r2,r2,#'A'-'0'-0x0A        add     r0,r2,#'0'	bl      _putc	and     r2,r1,#0x0F	cmp     r2,#0x0A	addge   r2,r2,#'A'-'0'-0x0A        add     r0,r2,#'0'	bl      _putc	mov     lr,r7        	blrmsg:    .string "PC=0x"        	                                    	.section ".data"	.align  2_leds:  .long   0x77                .section ".bss"_stack_base:        .rept 512        .byte 0        .endr        .balign 16_stack:        .end

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?