From 02064576e8dc31509dc91a0681ba80f2c9615d2f Mon Sep 17 00:00:00 2001
From: Karl Palsson <karlp@tweak.net.au>
Date: Sun, 10 Apr 2016 13:22:17 +0000
Subject: qemu test sample from daniellinux:

soruced originally from: https://github.com/libopencm3/libopencm3/pull/613

edited to drop the use of bin files, and switch to devices.data
---
 tests/qemu/Makefile  | 40 ++++++++++++++++++++++++++++++++++++
 tests/qemu/README.md | 20 ++++++++++++++++++
 tests/qemu/main.c    | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 118 insertions(+)
 create mode 100644 tests/qemu/Makefile
 create mode 100644 tests/qemu/README.md
 create mode 100644 tests/qemu/main.c

(limited to 'tests')

diff --git a/tests/qemu/Makefile b/tests/qemu/Makefile
new file mode 100644
index 0000000..67e84ab
--- /dev/null
+++ b/tests/qemu/Makefile
@@ -0,0 +1,40 @@
+##
+## This file is part of the libopencm3 project.
+##
+## This library is free software: you can redistribute it and/or modify
+## it under the terms of the GNU Lesser General Public License as published by
+## the Free Software Foundation, either version 3 of the License, or
+## (at your option) any later version.
+##
+## This library 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 Lesser General Public License for more details.
+##
+## You should have received a copy of the GNU Lesser General Public License
+## along with this library.  If not, see <http://www.gnu.org/licenses/>.
+##
+
+BOARD = lm3s
+PROJECT = qemu-$(BOARD)
+BUILD_DIR = bin-$(BOARD)
+
+SHARED_DIR = ../shared
+
+CFILES = main.c
+
+VPATH += $(SHARED_DIR)
+
+INCLUDES += $(patsubst %,-I%, . $(SHARED_DIR))
+
+OPENCM3_DIR=../../libopencm3
+
+DEVICE=lm3s6965
+
+include ../../rules.mk
+
+qemu: $(PROJECT).elf
+	qemu-system-arm -semihosting -M lm3s6965evb --kernel $^ -serial stdio
+
+qemu-dbg: $(PROJECT).elf
+	qemu-system-arm -semihosting -M lm3s6965evb --kernel $^ -serial stdio -S -gdb tcp::3333
diff --git a/tests/qemu/README.md b/tests/qemu/README.md
new file mode 100644
index 0000000..4f02adb
--- /dev/null
+++ b/tests/qemu/README.md
@@ -0,0 +1,20 @@
+This project is used as a demonstrator on how to run a small baremetal application
+on a LM3S6965 board, which can be emulated on qemu as well (using qemu-system-arm
+with -M lm3s6965evb).
+
+For this reason, this application is not portable to other platforms at the moment.
+
+To execute in qemu run:
+
+`make qemu`
+
+To debug using gcc run:
+
+`make qemu-dbg`
+
+and then attach a gdb to localhost tcp port 3333.
+
+Requirements:
+qemu-system-arm
+openocd
+
diff --git a/tests/qemu/main.c b/tests/qemu/main.c
new file mode 100644
index 0000000..863ce9e
--- /dev/null
+++ b/tests/qemu/main.c
@@ -0,0 +1,58 @@
+#include <libopencm3/cm3/nvic.h>
+#include <libopencm3/cm3/systick.h>
+
+
+/* LM3S Specifics, usart and RCC */
+#include <libopencm3/lm3s/rcc.h>
+#include <libopencm3/lm3s/usart.h>
+
+static volatile uint32_t jiffies = 0u;
+
+static void printbanner(void)
+{
+    char msg[] = "One second elapsed!\r\n";
+    char *c = msg;
+    while (*c != 0) {
+        usart_send(USART0_BASE, (uint16_t )*c);
+        c++;
+    }
+}
+
+void sys_tick_handler(void)
+{
+    jiffies++;
+}
+
+static inline uint32_t systick_app_config(uint32_t n_ticks)
+{
+    /* constant from systick_set_reload -- as this returns something that's
+     *      * not void, this is the only possible error condition */
+    if (n_ticks & ~0x00FFFFFF) {
+        return 1;
+    }
+
+    systick_set_reload(n_ticks);
+    systick_set_clocksource(1);
+    systick_interrupt_enable();
+    systick_counter_enable();
+
+    return 0;
+}
+
+#define HZ 1000
+
+int main(void)
+{
+    uint32_t last_time = 0;
+    rcc_clock_setup_in_xtal_8mhz_out_50mhz();
+    systick_app_config(HZ);
+
+    nvic_set_priority(NVIC_SYSTICK_IRQ, 0);
+    jiffies = 0;
+    while(1) {
+        if (jiffies > HZ) {
+            printbanner();
+            jiffies = 0;
+        }
+    }
+}
-- 
cgit