out/*
main.hex
+initrd.img
#include <stdint.h>
+/**
+ * Direct access
+ */
void lcd_init(void);
void lcd_puts(const char *s);
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_
#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)
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);
+ }
+}
{\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
\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
--- /dev/null
+#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;
+ }
+}
+