s3c2440按鍵程序

==================================
VECTOR.S
由於抖動的原因,所以我這裏進行了2次加法
=================================== 
b reset
b undef
b soft
b resstop
b datstop
.word 0x00

.equ    SUBSRCPND,0x4a000018
.equ    SRCPND,   0x4a000000
.equ    INTPND,   0x4a000010

.equ    EINTPND,  0x560000a8


.equ GPBCON,0x56000010
.equ GPBDAT, 0x56000014

.equ GPB5,  (1<<(5*2))
.equ GPB6,  (1<<(6*2))
.equ GPB7,  (1<<(7*2))
.equ GPB8,  (1<<(8*2))

.equ GPBVALUE, (GPB5|GPB6|GPB7|GPB8)

.equ GPB5_DATA,   (0<<5)
.equ GPB6_DATA,   (1<<6)
.equ GPB7_DATA,   (1<<7)
.equ GPB8_DATA,   (0<<8)

.equ GPB5_DATA_T,   (1<<5)
.equ GPB6_DATA_T,   (0<<6)
.equ GPB7_DATA_T,   (0<<7)
.equ GPB8_DATA_T,   (1<<8)

.equ GPB_DATA, (GPB5_DATA|GPB6_DATA|GPB7_DATA|GPB8_DATA)
.equ GPB_DATA_T, (GPB5_DATA_T|GPB6_DATA_T|GPB7_DATA_T|GPB8_DATA_T)
 b irq
b firq

reset:
        nop
        nop
        nop
undef:
        nop
        nop
        nop
soft:
        nop
        nop
        nop
resstop:
        nop
        nop
        nop
datstop:
        nop
        nop
        nop
irq:

        clear_bit:
                ldr     sp,=0x32000000
                sub     lr,lr,#4
                stmfd   sp!,{r0-r12,r14}

                ldr     r0,=SUBSRCPND
                ldr     r1,[r0]
                str     r1,[r0]

                ldr     r0,=INTPND
                ldr     r1,=SRCPND
                ldr     r2,[r0]
                str     r2,[r1]

                str     r2,[r0]
/*******************EINTPND INIT*******************/
                ldr     r0,=EINTPND
                ldr     r1,[r0]
                str     r1,[r0]


        feed_dog:

        led:

                ldr     r0,=GPBCON
                ldr     r1,=GPBVALUE
                str     r1,[r0]


                ldr     r4,=0x31000000
                ldr     r0,[r4]
                add     r0,r0,#1
                str     r0,[r4]
                and     r0,r0,#0x00000001
                cmp     r0,#0   

                beq     twocal
                b       recover
twocal:
                ldr     r4,=0x31100000
                ldr     r0,[r4]
                add     r0,r0,#1
                str     r0,[r4]
                and     r0,r0,#0x00000001
                cmp     r0,#1

                beq     led_style_two
                blt     led_style_one

        led_style_one:
                ldr     r0,=GPBDAT
                ldr     r1,=GPB_DATA
                str     r1,[r0]
                b       recover
        led_style_two:
                ldr     r0,=GPBDAT
                ldr     r1,=GPB_DATA_T
                str     r1,[r0]
                b       recover
        recover:
                ldmfd   sp!,{r0-r12,pc}^

firq:
        nop
        nop
        nop
================================================
key.S
================================================ 
.equ  INTMSK,0x4A000008

.equ  GPGCON,0X56000060
.equ  GPGDAT,0X56000064
.equ  GPGUP ,0X56000068

.equ  EXTINT1,0X5600008C
.equ  EINTMSK,0x560000A4
begin:
        stmfd sp!,{r0-r4,lr}

/**************INTMSK INIT**********************/
        ldr     r0,=INTMSK
        ldr     r1,[r0]
.equ    INTMSK_DATA,0xffffffdf
        ldr     r2,=INTMSK_DATA
        and     r1,r1,r2
        str     r1,[r0]
/**************EINTMSK INIT********************/
        ldr     r0,=EINTMSK
        ldr     r1,[r0]
.equ    EXTINT1_MSK,0xfffffeff
        ldr     r2,=EXTINT1_MSK
        and     r1,r1,r2
        str     r1,[r0]

 /************EXTINT1 INIT**********************/
        ldr     r0,=EXTINT1
        ldr     r1,[r0]
.equ    EXTINT1_DATA,0xfffffff8
        ldr     r2,=EXTINT1_DATA
        mov     r3,#0x02
        and     r1,r1,r2
        orr     r1,r1,r3
        str     r1,[r0]
/*****************GPGCON INIT******************/
/*
      interrupt method

*/

        ldr     r0,=GPGCON
.equ    GPGCON_DATA,0x0000002
        ldr     r1,[r0]
        ldr     r2,=0xfffffffe
        ldr     r3,=GPGCON_DATA
        orr     r1,r1,r3
        and     r1,r1,r2
        str     r1,[r0]

/*   輪詢
        ldr     r0,=GPGCON
        ldr     r1,[r0]
        ldr     r2,=0xfffffffc
        and     r1,r1,r2
        str     r1,[r0]
*/
/*****************GPGDAT INIT*****************/
/*read things*/
/*
check:
        ldr     r0,=GPGDAT
        ldr     r1,[r0]
        and     r1,#0x0001
        cmp     r1,#0
        beq     led
        b       off
led:
.equ GPBCON,0x56000010
.equ GPBDAT, 0x56000014

.equ GPB5,  (1<<(5*2))
.equ GPB6,  (1<<(6*2))
.equ GPB7,  (1<<(7*2))
.equ GPB8,  (1<<(8*2))

.equ GPBVALUE, (GPB5|GPB6|GPB7|GPB8)

.equ GPB5_DATA,   (0<<5)
.equ GPB6_DATA,   (1<<6)
.equ GPB7_DATA,   (1<<7)
.equ GPB8_DATA,   (0<<8)
.equ GPB_DATA, (GPB5_DATA|GPB6_DATA|GPB7_DATA|GPB8_DATA)
                ldr     r0,=GPBCON
                ldr     r1,=GPBVALUE
                str     r1,[r0]

                ldr     r0,=GPBDAT
                ldr     r1,=GPB_DATA
                str     r1,[r0]
                b       check

off:
.equ GPB5_DATA_1,   (1<<5)
.equ GPB6_DATA_1,   (0<<6)
.equ GPB7_DATA_1,   (0<<7)
.equ GPB8_DATA_1,   (1<<8)
.equ GPB_DATA_1, (GPB5_DATA_1|GPB6_DATA_1|GPB7_DATA_1|GPB8_DATA_1)
                ldr     r0,=GPBCON
                ldr     r1,=GPBVALUE
                str     r1,[r0]

                ldr     r0,=GPBDAT
                ldr     r1,=GPB_DATA_1
                str     r1,[r0]
                b       check

*/
/*****************GPGUP INIT*****************/
        ldr     r0,=GPGUP
        ldr     r1,[r0]
        mov     r2,#0xfe
        and     r1,r1,r2
        str     r1,[r0]


return:
        ldmfd sp!,{r0-r4,pc}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章