diff options
Diffstat (limited to 'misc/blink.s')
-rw-r--r-- | misc/blink.s | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/misc/blink.s b/misc/blink.s new file mode 100644 index 0000000..46e6eff --- /dev/null +++ b/misc/blink.s @@ -0,0 +1,103 @@ +.syntax unified +.cpu cortex-m0plus +.thumb + +.equ IO_BANK0_BASE, 0x40014000 +.equ GPIO25_STATUS, (IO_BANK0_BASE + 0x0c8) +.equ GPIO25_CTRL, (IO_BANK0_BASE + 0x0cc) + +.equ SIO_BASE, 0xd0000000 +.equ GPIO_OUT_SET_OFST, 0x014 +.equ GPIO_OUT_XOR_OFST, 0x01c +.equ GPIO_OE_SET_OFST, 0x024 + +.equ ATOMIC_CLEAR, 0x3000 + +.type setup_led, %function +.global setup_led + +setup_led: + ldr r1, =GPIO25_CTRL + movs r0, 5 // SIO function = 5 + str r0, [r1, 0] + ldr r1, =SIO_BASE + movs r0, 1 + lsls r0, 25 // GPIO 25 (LED) output enable + str r0, [r1, GPIO_OE_SET_OFST] + bx lr + +.type led_on, %function +.global led_on + +led_on: + ldr r1, =SIO_BASE + movs r0, 1 + lsls r0, 25 + str r0, [r1, GPIO_OUT_SET_OFST] +1: + b 1b + +.type blink, %function +.global blink + +blink: + ldr r1, =SIO_BASE + movs r0, 1 + lsls r0, 25 +1: + str r0, [r1, GPIO_OUT_XOR_OFST] + bl delay_1s + b 1b + +.type long_blink, %function +.global long_blink + +long_blink: + push {lr} + ldr r1, =SIO_BASE + movs r0, 1 + lsls r0, 25 + bl delay_1s + str r0, [r1, GPIO_OUT_XOR_OFST] + bl delay_1s + str r0, [r1, GPIO_OUT_XOR_OFST] + bl delay_1s + pop {pc} + +.type blinkN, %function +.global blinkN + +blinkN: + push {lr} + ldr r1, =SIO_BASE + movs r2, 1 + lsls r2, 25 + tst r0, r0 + beq done +on_then_off: + str r2, [r1, GPIO_OUT_XOR_OFST] + bl delay_quick + str r2, [r1, GPIO_OUT_XOR_OFST] + bl delay_quick + subs r0, 1 + bne on_then_off +done: + pop {pc} + +.type blink_hex, %function +.global blink_hex + +blink_hex: + push {lr} + movs r4, r0 + movs r5, 0xf +1: + ands r0, r5 + bl blinkN + lsrs r4, 4 + beq 2f + bl long_blink + movs r0, r4 + b 1b +2: + pop {pc} |