microscope-ring-light/firmware/sk6812.S

48 lines
676 B
ArmAsm

.global sk6812_send_led
.equ BSRR_REGISTER, 0x48000018
.equ PINNUM, 3
.syntax unified
sk6812_send_led:
push {lr}
push {r4, r5, r6}
ldr r1, =BSRR_REGISTER
ldr r2, =(1<<PINNUM)
ldr r3, =(1<<(PINNUM+16))
ldr r4, =32
ldr r5, =0x80000000
_bitloop:
tst r0, r5
beq sk6812_send_zero
bne sk6812_send_one
_bitloop_ret:
lsls r0, r0, #1
subs r4, r4, #1
bne _bitloop
pop {r4, r5, r6}
pop {pc}
sk6812_send_one:
str r2, [r1]
ldr r6, =0x5
bl wait_r6
str r3, [r1]
ldr r6, =0x2
bl wait_r6
b _bitloop_ret
sk6812_send_zero:
str r2, [r1]
ldr r6, =0x1
bl wait_r6
str r3, [r1]
ldr r6, =0x5
bl wait_r6
b _bitloop_ret
wait_r6:
subs r6, r6, #1
bne wait_r6
bx lr