/*********************************************************************** * File: start.S * Version: 1.0.0 * Copyright: 2011 (c) Guo Wenxue * Description: This ASM used to detect the four keys status, if it's pressed down * then call the C function to turn the buzzer beep and LED on * ChangeLog: 1, Release initial version on "Tue Mar 22 21:58:24 CST 2011" * ***********************************************************************/ #define pWTCON 0x53000000 /* Watch dog register address */ #define INTMSK 0x4A000008 /* Interupt-Controller base addresses */ #define INTSUBMSK 0x4A00001C #define GPFCON 0x56000050 #define GPFDAT 0x56000054 #define GPFUP 0x56000058 #define KEY2 0 /*KEY S2 use GPF0/EINT0 port*/ #define KEY3 2 /*KEY S3 use GPF2/EINT2 port*/ #define KEY4 3 /*KEY S4 use GPF3/EINT3 port*/ #define KEY5 4 /*KEY S5 use GPF4/EINT4 port*/ .text .align 2 .global _start _start: /* Disable watch dog */ ldr r0, =pWTCON /*Save pwTCON address in r0*/ mov r1, #0x0 /*Set r1=0x0*/ str r1, [r0] /*Move the data in r1 to the address specify by r0*/ /* mask all IRQs by setting all bits in the INTMR - default */ mov r1, #0xffffffff ldr r0, =INTMSK str r1, [r0] ldr r0, =INTSUBMSK ldr r1, =0x7fff /*There are 15 bits used in INTSUBMSK on S3C2440*/ str r1, [r0] /*Set Beep GPIO port as GPIO input mode*/ ldr r0, =GPFCON ldr r1, [r0] bic r1, r1, #0xf3 /* Set GPF0, GPF2, GPF3, as GPIO input mode(00)*/ bic r1, r1, #0x0300 /* Set GPF4 as GPIO input mode(00)*/ str r1, [r0] bl init_led_buzzer /*Call C function to init buzzer and LED GPIO port*/ loop_detect: bl turn_led_buzzer_off ldr r1, =GPFDAT /*Read the four key GPIO data port*/ ldr r2, [r1] /*Check Key2 pressed down or not*/ mov r0, #0 /*Turn LED0 on*/ tst r2, #0x1 bleq led_beep_on /*Check Key3 pressed down or not*/ mov r0, #1 /*Turn LED1 on*/ tst r2, #0x4 bleq led_beep_on /*Check Key4 pressed down or not*/ mov r0, #2 /*Turn LED2 on*/ tst r2, #0x8 bleq led_beep_on /*Check Key5 pressed down or not*/ mov r0, #3 /*Turn LED3 on*/ tst r2, #0x10 bleq led_beep_on /*No key pressed, detect again*/ b loop_detect led_beep_on: bl turn_led_buzzer_on /*Turn buzzer beep*/ @mov pc, lr /*Why mov lr, pc can not work?*/ b loop_detect /*Won't come here*/ halt_loop: b halt_loop