-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #3 from mauri870/feature/ok04
Add ok04 exercise
- Loading branch information
Showing
5 changed files
with
103 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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$ |