Forked PololuLedStrip and modified it to work with the KL25Z. Renamed it to Adafruit_NeoPixel.

Fork of PololuLedStrip by David Grayson

led_strip_write_color.s

Committer:
DavidEGrayson
Date:
2013-03-01
Revision:
8:1578776ceac5
Parent:
7:9a088f042ee0
Child:
9:6ffb85d69eaf

File content as of revision 8:1578776ceac5:

    AREA asm_func, CODE, READONLY
    EXPORT led_strip_write_color
    IMPORT led_strip_write_delays

    MACRO
    delay $id
    ldr r5, =led_strip_write_delays
    ldrb r5, [r5, $id]
    lsl r5, r5, #1
    ldr r4, =delay_region_end
    sub r4, r4, r5
    blx r4
    MEND

led_strip_write_color
    ; Register usage:
    ; These are the first 4 arguments to the method:
    ;   R0:  pointer to the color to send
    ;   R1:  pointer to the register for setting the pin
    ;   R2:  pointer to the register for clearing the pin
    ;   R3:  pin mask
    ; Additionally, we use these registers:
    ;   R4:  temporary register
    ;   R5:  temporary register
    ;   R6: shift register that holds the 24-bit color
    ;   R7:  the number of bits we still need to send
    ;   R13: Link Register, holds return addresses.

    push {r4, r5, r6, r7, lr}  ; Push those registers so we can restore them later.
    
    ldr r6, [r0]       ; Read the color.  Now we have:     xxBbGgRr
    rbit r6, r6        ; Reverse the order of the bits:    rRgGbBxx
    rev r6, r6         ; Reverse the order of the bytes:   xxbBgGrR
    mov r7, #24        ; Initialize the loop counter register.
    
send_led_strip_bit
    str r3, [r1]       ; Drive the line high.
    rrxs r6, r6        ; Rotate right through carry.
    
    delay #0
    
    it cc              ; If the bit to send it 0...
    strcc r3, [r2]     ; Drive the line low.

    delay #1

    it cs              ; If the bit to send is 1...
    strcs r3, [r2]     ; Drive the line low.
    
    delay #2
    
    subs r7, r7, #1           ; Decrement the loop counter.
    bne send_led_strip_bit    ; Send another bit if we have not reached zero.
    
led_strip_asm_end
    pop {r4, r5, r6, r7, lr}
    bx lr
    

delay_region
    ; The following is 128 nops.
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop

    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop

    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop

    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop

    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop

    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop

    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop

    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
delay_region_end
    bx lr    ; return
    
    END