]> code.bitgloo.com Git - clyne/calculator.git/commitdiff
SVC calls
authorClyne Sullivan <tullivan99@gmail.com>
Sat, 6 Jan 2018 18:38:34 +0000 (13:38 -0500)
committerClyne Sullivan <tullivan99@gmail.com>
Sat, 6 Jan 2018 18:38:34 +0000 (13:38 -0500)
.gitignore
include/lcd.h
src/lcd.c
src/main.c
src/stm32l4xx_it.c
src/svc.c [new file with mode: 0644]

index b2b7881495cb98e744e9da6f8a34f2d3510a1d45..7c35034f353f3d31b4ee2deedb8e57788d874395 100644 (file)
@@ -1,2 +1,3 @@
 out/*
 main.hex
+initrd.img
index 0962e08dfd59d11930feecc3e63d8612eaac555a..441d4637f029c1ffab6c712062e3099163463fda 100644 (file)
@@ -3,6 +3,9 @@
 
 #include <stdint.h>
 
+/**
+ * Direct access
+ */
 void lcd_init(void);
 
 void lcd_puts(const char *s);
@@ -11,4 +14,10 @@ void lcd_puth(int h);
 void lcd_putb(uint8_t b);
 void lcd_clear(void);
 
+/**
+ * Buffered/async access
+ */
+void lcd_handler(void);
+void lcd_put(const char *s);
+
 #endif // LCD_H_
index ca1c1a60550188e41217dc3c159579dcd4f0203d..1c29d5446683f63e395209df171d517d62fa7b88 100644 (file)
--- a/src/lcd.c
+++ b/src/lcd.c
@@ -1,6 +1,7 @@
 #include <lcd.h>
 #include <clock.h>
 #include <gpio.h>
+#include <string.h>
 
 #define LCD_D0 GPIO_PORT(A, 0)
 #define LCD_D1 GPIO_PORT(A, 1)
@@ -115,3 +116,38 @@ void lcd_init(void)
        delay(5);
        lcd_clear();
 }
+
+/**
+ * Task code
+ */
+
+static int bufpos = 0;
+static char buf[64];
+void lcd_clearbuf(void)
+{
+       bufpos = 0;
+       for (int i = 0; i < 32; i++)
+               buf[i] = 0;
+}
+
+void lcd_put(const char *s)
+{
+       int len = strlen(s);
+       int off = (bufpos + len < 64) ? len : 64 - bufpos;
+       strncpy(buf + bufpos, s, off);
+       bufpos += off;
+}
+
+void lcd_handler(void)
+{
+       lcd_init();
+       lcd_clearbuf();
+
+       while (1) {
+               if (buf[0] != '\0') {
+                       lcd_puts(buf);
+                       lcd_clearbuf();
+               }
+               delay(100);
+       }
+}
index e71e7129e977ad0ce58ac7e61da606a29d682d37..d974ebc23a411f8bc471d187bbd161ae476e06e6 100644 (file)
@@ -45,12 +45,20 @@ void kmain(void)
 {\r
        asm("cpsie i");\r
 \r
-       lcd_init();\r
+       task_start(lcd_handler, 128);\r
+       delay(200);\r
 \r
        char *s = initrd_getfile("test.txt");\r
-       lcd_puts(s);\r
+       const char *t = "Yoyoyo";\r
 \r
-       while (1)\r
-               delay(100);\r
+       asm("mov r0, %0; svc 2" :: "r" (s));\r
+       asm("mov r0, %0; svc 2" :: "r" (t));\r
+\r
+       while (1) {\r
+               gpio_dout(GPIOA, 5, 1);\r
+               delay(500);\r
+               gpio_dout(GPIOA, 5, 0);\r
+               delay(500);\r
+       }\r
 }\r
 \r
index 2aac023ccec3fc6dd4ad47b63453808d6285a955..368fed5f422598c86bfa6442cc508d238cdbf6cc 100644 (file)
@@ -4,31 +4,27 @@ void NMI_Handler(void) {}
 \r
 void HardFault_Handler(void)\r
 {\r
-       GPIOA->BSRR |= (1 << 5) | (1 << 6);\r
+       GPIOA->BSRR |= (1 << 5);\r
        while (1);\r
 }\r
 \r
 void MemManage_Handler(void)\r
 {\r
-       GPIOA->BSRR |= (1 << 5) | (1 << 6);\r
+       GPIOA->BSRR |= (1 << 5);\r
        while (1);\r
 }\r
 \r
 void BusFault_Handler(void)\r
 {\r
-       GPIOA->BSRR |= (1 << 5) | (1 << 6);\r
+       GPIOA->BSRR |= (1 << 5);\r
        while (1);\r
 }\r
 \r
 void UsageFault_Handler(void)\r
 {\r
-       GPIOA->BSRR |= (1 << 5) | (1 << 6);\r
+       GPIOA->BSRR |= (1 << 5);\r
        while (1);\r
 }\r
 \r
-void SVC_Handler(void) {\r
-\r
-}\r
-\r
 void DebugMon_Handler(void) {}\r
 \r
diff --git a/src/svc.c b/src/svc.c
new file mode 100644 (file)
index 0000000..507855d
--- /dev/null
+++ b/src/svc.c
@@ -0,0 +1,33 @@
+#include <stdint.h>
+#include <gpio.h>
+#include <clock.h>
+#include <lcd.h>
+
+void SVC_Handler(void) {
+       uint32_t *stack;
+       uint8_t index;
+
+       asm("\
+               mrs r0, psp; \
+               mov %0, r0; \
+               ldr r0, [r0, #24]; \
+               ldr %1, [r0, #-2]; \
+       " : "=r" (stack), "=r" (index));
+
+       gpio_mode(GPIOA, 6, OUTPUT);
+
+       switch (index) {
+       case 1:
+               gpio_dout(GPIOA, 6, 1);
+               for (int i = 0; i < 100000; i++)
+                       asm("");
+               gpio_dout(GPIOA, 6, 0);
+               break;
+       case 2:
+               lcd_put((char *)stack[0]);
+               break;
+       default:
+               break;
+       }
+}
+