Skip to content

Commit

Permalink
Add ok04 exercise
Browse files Browse the repository at this point in the history
  • Loading branch information
mauri870 committed Dec 14, 2017
1 parent 325cf03 commit a26227e
Show file tree
Hide file tree
Showing 5 changed files with 103 additions and 0 deletions.
7 changes: 7 additions & 0 deletions src/ok04/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# OK04 - How to use the timer to flash the 'OK' or 'ACT' LED at precise intervals

The OK04 lesson builds on OK03 by teaching how to use the timer to flash the 'OK' or 'ACT' LED at precise intervals.

## References

http://www.studica.com/blog/raspberry-pi-timer-embedded-environments
16 changes: 16 additions & 0 deletions src/ok04/counter.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
@;
@; Counter functions to be used by this exercise
@;

.section .text
.global delay
delay:
ldr r1, =0x3F000000 @; pi peripheral address
orr r1, r1, #0x3000 @; r6 = r1 | 0x3000 = 0x3F003000 timer base address
ldr r2, [r1, #0x4] @; time in microseconds given by the timer
delay1$:
ldr r3, [r1, #0x4] @; get timer in microseconds in each iteration
sub r3, r3, r2 @; current timer - initial timer
cmp r3, r0 @; compare time elapsed with desired timer
blt delay1$ @; if elapsed time < desired timer repeat the loop
mov pc, lr @; return
36 changes: 36 additions & 0 deletions src/ok04/led.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
@;
@; Functions to interact with the leds
@;

.section .text
.global set_led_state
set_led_state:
push {lr} @; save address the function should return to
mov r1, r0 @; move the led state to r1
ldr r0, =message @; load the message into r0
mov r2, #0
str r2, [r0, #0x4] @; reset request code
str r2, [r0, #0x10] @; reset request/response size
mov r2, #130
str r2, [r0, #0x14] @; reset pin number

str r1, [r0, #0x18] @; overwrite the led state
add r0, #8 @; add the channel 8 as the last 4 bits of the message
bl mailbox_write
pop {pc} @; return

.section .data
.align 4 @; last 4 bits of the next label set to 0 (16-byte alligned)
message:
.int size @; message header contains the size of the message
.int 0 @; request code 0

.int 0x00038041 @; header tag ID
.int 8 @; size of tag data
.int 0 @; request/response size

.int 130 @; pin number
.int 1 @; pin state
.int 0 @; signal the GPU that the message is over
size:
.int . - message @; size of the message
16 changes: 16 additions & 0 deletions src/ok04/mailbox.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
@;
@; Functions to interact with the mailbox
@;

.section .text
.global mailbox_write
mailbox_write:
ldr r1, =0x3f00b880 @; load the hex number =0x3f00b880 into register r1
@; this is the base address of the mailboxes
wait$:
ldr r2, [r1, #0x18] @; load r2 with the address of the offset 0x18 for mailbox 0 (read mailbox)
tst r2, #0x80000000 @; check if the full flag is set
bne wait$ @; branch to wait$ label if the full flag is not set

str r0, [r1, #0x20] @; put the message into mailbox 1 write register, which is at offset 0x20 from the base address
mov pc, lr @; return
28 changes: 28 additions & 0 deletions src/ok04/main.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
@;
@; A simple program to blink the OK/ACT LED on Raspberry Pi 3
@;

.section .init @; kernel initialization code must be on 0x8000
.global _start @; define _start label globally available for the linker
_start:
mov sp, #0x8000 @; set up the stack pointer
b _main @; branch to main routine

.section .text
_main:
loop$: @; main loop
ldr r0, =0xf4240 @; delay in microseconds (1s)
bl delay @; branch to delay function

@; enable led
mov r0, #1 @; led state 1 = on
bl set_led_state @; set led state

ldr r0, =0xf4240 @; delay in microseconds (1s)
bl delay @; branch to delay function

@; disable led
mov r0, #0 @; led state 0 = off
bl set_led_state @; set led state

b loop$ @; branch to main loop$

0 comments on commit a26227e

Please sign in to comment.