⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 star.asm

📁 基于OMAP的UART驱动和测试程序
💻 ASM
📖 第 1 页 / 共 2 页
字号:
*
* Go setup Memory and board specific bits prior to relocation.
*
    mov ip, lr          ; perserve link reg across call
    bl  platformsetup   ; go setup pll,mux,memory
    mov lr, ip          ; restore link
    mov pc, lr          ; back to my caller
    
   

*************************************************************************
*
* Interrupt handling
*
*************************************************************************

*
* IRQ stack frame.
*
S_FRAME_SIZE .SET    72

S_OLD_R0    .SET    68
S_PSR       .SET    64
S_PC        .SET    60
S_LR        .SET    56
S_SP        .SET    52

S_IP        .SET    48
S_FP        .SET    44
S_R10       .SET    40
S_R9        .SET    36
S_R8        .SET    32
S_R7        .SET    28
S_R6        .SET    24
S_R5        .SET    20
S_R4        .SET    16
S_R3        .SET    12
S_R2        .SET    8
S_R1        .SET    4
S_R0        .SET    0
MODE_SVC    .SET    0x13
I_BIT       .SET    0x80

CFG_MALLOC_LEN     .SET     (0x20000 + 128*1024)
CONFIG_STACKSIZE   .SET     (128*1024)
CFG_GBL_DATA_SIZE  .SET     128



*
* use bad_save_user_regs for abort/prefetch/undef/swi ...
* use irq_save_user_regs / irq_restore_user_regs for IRQ/FIQ handling
*

bad_save_user_regs    .macro  
    sub sp, sp, #S_FRAME_SIZE       ; carve out a frame on current user stack
    stmia   sp, {r0 - r12}          ; Save user registers (now in svc mode) r0-r12

    ldr r2, _armboot_start
    sub r2, r2, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)
    sub r2, r2, #(CFG_GBL_DATA_SIZE+8)      ; set base 2 words into abort stack
    ldmia   r2, {r2 - r3}                   ; get values for "aborted" pc and cpsr (into parm regs)
    add r0, sp, #S_FRAME_SIZE               ; grab pointer to old stack

    add r5, sp, #S_SP
    mov r1, lr
    stmia   r5, {r0 - r3}               ; save sp_SVC, lr_SVC, pc, cpsr
    mov r0, sp                          ; save current stack into r0 (param register)
    .endm

irq_save_user_regs    .macro  
    sub sp, sp, #S_FRAME_SIZE
    stmia   sp, {r0 - r12}                  ; Calling r0-r12
    add     r8, sp, #S_PC                   ; !!!! R8 NEEDS to be saved !!!! a reserved stack spot would be good.
    stmdb   r8, {sp, lr}^                   ; Calling SP, LR
    str     lr, [r8, #0]                    ; Save calling PC
    mrs     r6, spsr
    str     r6, [r8, #4]                    ; Save CPSR
    str     r0, [r8, #8]                    ; Save OLD_R0
    mov r0, sp
    .endm

irq_restore_user_regs    .macro
    ldmia   sp, {r0 - lr}^                  ; Calling r0 - lr
    mov r0, r0
    ldr lr, [sp, #S_PC]                     ; Get PC
    add sp, sp, #S_FRAME_SIZE
    subs    pc, lr, #4                      ; return & move spsr_svc into cpsr
    .endm

get_bad_stack   .macro
    ldr r13, _armboot_start                 ; setup our mode stack
    sub r13, r13, #(CONFIG_STACKSIZE+CFG_MALLOC_LEN)
    sub r13, r13, #(CFG_GBL_DATA_SIZE+8)    ; reserved a couple spots in abort stack

    str lr, [r13]                           ; save caller lr in position 0 of saved stack
    mrs lr, spsr                            ; get the spsr
    str lr, [r13, #4]                       ; save spsr in position 1 of saved stack

    mov r13, #MODE_SVC                      ; prepare SVC-Mode
    ;msr spsr_c, r13
    msr spsr, r13                           ; switch modes, make sure moves will execute
    mov lr, pc                              ; capture return pc
    movs    pc, lr                          ; jump to next instruction & switch modes.
    .endm

get_irq_stack    .macro                    ; setup IRQ stack
    ldr sp, IRQ_STACK_START
    .endm

get_fiq_stack    .macro                     ; setup FIQ stack
    ldr sp, FIQ_STACK_START
    .endm

*
* exception handlers
*
    .align  8
undefined_instruction:
    get_bad_stack
    bad_save_user_regs
    ;bl  do_undefined_instruction   ;;;该程序在C代码中

    .align  8
software_interrupt:
    get_bad_stack
    bad_save_user_regs
    ;bl  do_software_interrupt      ;;;该程序在C代码中

    .align  8
prefetch_abort:
    get_bad_stack
    bad_save_user_regs
    ;bl  do_prefetch_abort          ;;;该程序在C代码中

    .align  8
data_abort:
    get_bad_stack
    bad_save_user_regs
    ;bl  do_data_abort              ;;;该程序在C代码中

    .align  8
not_used:
    get_bad_stack
    bad_save_user_regs
    ;bl  do_not_used                ;;;该程序在C代码中"

    .if $$isdefed ("CONFIG_USE_I")

    .align  8
irq:
    get_irq_stack
    irq_save_user_regs
    ;bl  do_irq             ;;;该程序在C代码中
    irq_restore_user_regs

    .align  8
fiq:
    get_fiq_stack
* someone ought to write a more effiction fiq_save_user_regs*
    irq_save_user_regs
    ;bl  do_fiq             ;;;该程序在C代码中
    irq_restore_user_regs

    .else

    .align  8
irq:
    get_bad_stack
    bad_save_user_regs
    ;bl  do_irq             ;;;该程序在C代码中

    .align  8
fiq:
    get_bad_stack
    bad_save_user_regs
    ;bl  do_fiq             ;;;该程序在C代码中

    .endif

    .align  8
    .global reset_cpu
reset_cpu:
    ldr r1, rstctl1     ; get clkm1 reset ctl
    mov     r3, #0x3    ; dsp_en + arm_rst = global reset
    strh    r3, [r1]    ; force reset
    mov r0, r0
_loop_forever:
    b   _loop_forever


;***************************************************************************
;*  PROCESS INITIALIZATION TABLE.
;*
;*  THE TABLE CONSISTS OF A SEQUENCE OF RECORDS OF THE FOLLOWING FORMAT:
;*                                                                          
;*       .word  <length of data (bytes)>
;*       .word  <address of variable to initialize>                         
;*       .word  <data>
;*                                                                          
;*  THE INITIALIZATION TABLE IS TERMINATED WITH A ZERO LENGTH RECORD.
;*                                                                          
;***************************************************************************

tbl_addr: .set    R0
var_addr: .set    R1
length:   .set    R2
data:     .set    R3

auto_init:
	B	rec_chk

        ;*------------------------------------------------------
	;* PROCESS AN INITIALIZATION RECORD
        ;*------------------------------------------------------
record:	LDR	var_addr, [tbl_addr], #4   ;

        ;*------------------------------------------------------
	;* COPY THE INITIALIZATION DATA
        ;*------------------------------------------------------
	TST	var_addr, #3		   ; SEE IF DEST IS ALIGNED
	BNE     _bcopy			   ; IF NOT, COPY BYTES
	SUBS	length, length, #4	   ; IF length <= 3, ALSO
	BMI     _bcont			   ; COPY BYTES
_wcopy:	LDR	data, [tbl_addr], #4  	   ;
	STR	data, [var_addr], #4	   ; COPY A WORD OF DATA
	SUBS	length, length, #4	   ;
	BPL	_wcopy			   ;
_bcont:	ADDS	length, length, #4	   ;
	BEQ	_cont			   ;

_bcopy:	LDRB	data, [tbl_addr], #1       ;
	STRB	data, [var_addr], #1       ; COPY A BYTE OF DATA
	SUBS	length, length, #1	   ;
	BNE	_bcopy                     ;

_cont:	TST	tbl_addr, #0x3		   ; MAKE SURE THE ADDRESS
	BICNE	tbl_addr, tbl_addr, #0x3   ; IS WORD ALIGNED
	ADDNE	tbl_addr, tbl_addr, #4	   ;

rec_chk:LDR	length, [tbl_addr], #4     ; PROCESS NEXT
	CMP	length, #0                 ; RECORD IF LENGTH IS
	BNE	record                     ; NONZERO

    MOV	PC, LR


__stack:.usect	".stack", 0, 4
;    .ltorg

rstctl1         .word   0xfffece10
WDTIM_MODE      .word   0xfffec808
REG_IHL1_MIR    .word   0xfffecb04
REG_IHL2_MIR    .word   0xfffe0004
CK_DPLL1        .word   0xfffecf00

**********    测试程序的数据    **********
SRAM_SIZE           .WORD       0X8000
SRAM_START_POINT    .WORD   0X0

SDRAM_SIZE          .WORD        0X100000            ;暂时用1M
SDRAM_START_POINT   .WORD        0X10000000

FLASH_START_POINT  .WORD        0X0
FLASH_SIZE         .WORD        0X100000            ;暂时用1M

TEST_CONST          .WORD        0X55555555

******************************************************************************************    
    

⌨️ 快捷键说明

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