Skip to content

Commit

Permalink
Add ok03 exercise
Browse files Browse the repository at this point in the history
  • Loading branch information
mauri870 committed Dec 14, 2017
1 parent 3de2248 commit 6fe9256
Show file tree
Hide file tree
Showing 8 changed files with 112 additions and 6 deletions.
15 changes: 14 additions & 1 deletion kernel.ld
Original file line number Diff line number Diff line change
@@ -1,8 +1,21 @@
/*
* Very simple linker script, combing the text and data sections
* and putting them starting at address 0x800.
*/
SECTIONS {
.text 0x8000 : {
/* Put the initialisation code at 0x8000, leaving room for ARM
* and the stack. It also conforms to the standard expectations.
*/
.init 0x8000 : {
*(.init)
}

/* Put the rest of code next */
.text : {
*(.text)
}

/* Put the data after the code */
.data : {
*(.data)
}
Expand Down
3 changes: 1 addition & 2 deletions src/ok01/main.s
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@
@; A simple program to turn on 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

.section .text
_start:
ldr r0, =0x3f00b880 @; load the hex number 0x3f00b880 into register r0
@; this is the base address of the mailboxes
Expand Down
5 changes: 2 additions & 3 deletions src/ok02/main.s
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,8 @@
@; 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

.section .text
_start:
mov sp, #0x8000 @; set up the stack pointer

Expand Down Expand Up @@ -72,4 +71,4 @@ message:
.int 1 @; pin state
.int 0 @; signal the GPU that the message is over
size:
.int . - message @; size of the message
.int . - message @; size of the message
3 changes: 3 additions & 0 deletions src/ok03/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
# OK03 - Split our functions in multiple files for better organization

This exercise split our functions into separate files for better organization, this is basically all the difference from OK02.
13 changes: 13 additions & 0 deletions src/ok03/counter.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
@;
@; Counter functions to be used by this exercise
@;

.section .text
.global delay
delay:
mov r0, #0xF0000 @; start counter with a large value
delay1$:
sub r0, #1 @; subtract 1 from the counter
cmp r0, #0 @; check if counter reaches zero
bne delay1$ @; if not, branch to the delay1$ label
mov pc, lr @; return
36 changes: 36 additions & 0 deletions src/ok03/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/ok03/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
27 changes: 27 additions & 0 deletions src/ok03/main.s
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
@;
@; 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

bl delay @; branch to delay function

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

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 6fe9256

Please sign in to comment.