From c4cdeef09cb36f0e7e9d84571a023f59b33b7d1c Mon Sep 17 00:00:00 2001 From: Thomas White Date: Sat, 23 Jun 2018 17:50:16 +0200 Subject: More tidying up, proper SWI handler --- src/swi_handler.s | 70 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/swi_handler.s (limited to 'src/swi_handler.s') diff --git a/src/swi_handler.s b/src/swi_handler.s new file mode 100644 index 0000000..0d2082d --- /dev/null +++ b/src/swi_handler.s @@ -0,0 +1,70 @@ +/* + * swi_handler.s + * + * Copyright © 2018 Thomas White + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +.include "swi_numbers.h" + +.global swi_handler + +swi_handler: + STMDB R13!, { R12, LR} + + LDR R12, [LR, #-4] + BIC R12, R12, #0xff000000 + + CMP R12, #OS_GetGPIO + BEQ get_gpio + + CMP R12, #OS_SetGPIO + BEQ set_gpio + + CMP R12, #OS_ClearGPIO + BEQ clear_gpio + + CMP R12, #OS_GetCPUID + BEQ get_cpu_id + + LDMIA R13!, {R12, PC}^ + +get_gpio: + STMDB R13!, {R8} + LDR R8, =0x3f200000 + LDR R0, [R8, #0x34] @ GPLEV0 + LDMIA R13!, {R8} + LDMIA R13!, {R12, PC}^ + +set_gpio: + STMDB R13!, {R8} + LDR R8, =0x3f200000 + STR R1, [R8, #0x1c] @ GPSET0 + LDMIA R13!, {R8} + LDMIA R13!, {R12, PC}^ + +clear_gpio: + STMDB R13!, {R8} + LDR R8, =0x3f200000 + STR R1, [R8, #0x28] @ GPCLR0 + LDMIA R13!, {R8} + LDMIA R13!, {R12, PC}^ + +get_cpu_id: + MRC P15, 0, R0, C0, C0, 5 + AND R0, R0, #0x0f + LDMIA R13!, {R12, PC}^ + -- cgit v1.2.3