aboutsummaryrefslogtreecommitdiff
path: root/src/arm/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/arm/common')
-rw-r--r--src/arm/common/io.c71
-rw-r--r--src/arm/common/io.h28
-rw-r--r--src/arm/common/strings.c119
-rw-r--r--src/arm/common/strings.h33
-rw-r--r--src/arm/common/svc_interface.h11
5 files changed, 262 insertions, 0 deletions
diff --git a/src/arm/common/io.c b/src/arm/common/io.c
new file mode 100644
index 0000000..bf9e0e3
--- /dev/null
+++ b/src/arm/common/io.c
@@ -0,0 +1,71 @@
+#include <stddef.h>
+
+#include "io.h"
+#include "strings.h"
+
+void puts(char string[])
+{
+ prints(string);
+
+ putchar('\n');
+ putchar('\r');
+}
+
+void prints(char string[])
+{
+ for (size_t i = 0; string[i]; i++)
+ putchar(string[i]);
+}
+
+void error(char string[])
+{
+ prints("ERROR! ");
+ puts(string);
+ while (1);
+}
+
+void printdec(uint32_t number)
+{
+ char buf[11];
+
+ uint32_to_decstring(number, buf);
+
+ prints(buf);
+}
+
+void printhex(uint32_t number)
+{
+ char buf[9];
+
+ uint32_to_hexstring(number, buf);
+
+ prints(buf);
+}
+
+void printbin(uint32_t number)
+{
+ char buf[33];
+
+ uint32_to_binstring(number, buf);
+
+ prints(buf);
+}
+
+void printdect(uint32_t number)
+{
+ char buf[11];
+
+ uint32_to_decstringt(number, buf);
+
+ prints(buf);
+}
+
+void printhext(uint32_t number)
+{
+ char buf[9];
+
+ uint32_to_hexstringt(number, buf);
+
+ prints(buf);
+}
+
diff --git a/src/arm/common/io.h b/src/arm/common/io.h
new file mode 100644
index 0000000..dcad76e
--- /dev/null
+++ b/src/arm/common/io.h
@@ -0,0 +1,28 @@
+#ifndef IO_H
+#define IO_H
+
+#include <stdint.h>
+
+// putchar() and getchar() are not part of io.c, but it's useful to
+// have those symbols declared here
+void putchar(char c);
+
+char getchar(void);
+
+void puts(char string[]);
+
+void prints(char string[]);
+
+void error(char string[]);
+
+void printdec(uint32_t number);
+
+void printhex(uint32_t number);
+
+void printbin(uint32_t number);
+
+void printdect(uint32_t number);
+
+void printhext(uint32_t number);
+
+#endif // IO_H
diff --git a/src/arm/common/strings.c b/src/arm/common/strings.c
new file mode 100644
index 0000000..368d7dc
--- /dev/null
+++ b/src/arm/common/strings.c
@@ -0,0 +1,119 @@
+#include "strings.h"
+
+void uint32_to_dec(uint32_t number, char buf[10])
+{
+ for (int i = 0; i < 10; i++)
+ {
+ buf[10 - 1 - i] = '0' + (number % 10);
+ number /= 10;
+ }
+}
+
+void uint32_to_hex(uint32_t number, char buf[8])
+{
+ for (int i = 0; i < 8; i++)
+ {
+ unsigned char quadbit = (number >> ((8 - i - 1) * 4)) & 0xf;
+ buf[i] = quadbit > 9 ? quadbit - 10 + 'a' : quadbit + '0';
+ }
+}
+
+void uint32_to_bin(uint32_t number, char buf[32])
+{
+ for (int i = 0; i < 32; i++)
+ buf[i] = ((number >> (32 - i - 1)) & 1) ? '1' : '0';
+}
+
+void uint32_to_decstring(uint32_t number, char buf[11])
+{
+ uint32_to_dec(number, buf);
+ buf[10] = '\0';
+}
+
+void uint32_to_hexstring(uint32_t number, char buf[9])
+{
+ uint32_to_hex(number, buf);
+ buf[8] = '\0';
+}
+
+void uint32_to_binstring(uint32_t number, char buf[33])
+{
+ uint32_to_bin(number, buf);
+ buf[32] = '\0';
+}
+
+void trim_0s(char string[])
+{
+ size_t i;
+ for (i = 0; string[i] == '0'; i++);
+
+ size_t j = 0;
+
+ if (!string[i])
+ string[j++] = string[--i];
+
+ do
+ string[j] = string[i + j];
+ while (string[j++]);
+}
+
+void uint32_to_decstringt(uint32_t number, char buf[11])
+{
+ uint32_to_decstring(number, buf);
+ trim_0s(buf);
+}
+
+void uint32_to_hexstringt(uint32_t number, char buf[9])
+{
+ uint32_to_hexstring(number, buf);
+ trim_0s(buf);
+}
+
+size_t strlen(char string[])
+{
+ size_t len;
+
+ for (len = 0; string[len]; len++);
+
+ return len;
+}
+
+void memcpy(void *dst, void *src, size_t nbytes)
+{
+ size_t iter;
+
+ // copying by word is faster than by byte,
+ // but can easily cause alignment faults, so we resign from it...
+ for (iter = 0; iter < nbytes ; iter++)
+ ((volatile uint8_t*) dst)[iter] = ((uint8_t*) src)[iter];
+}
+
+// keep in mind memset is also needed for array initialization, like
+// uint32_t buf[16] = {0};
+// gcc compiles this to memset call
+
+void *memset(void *s, int c, size_t n)
+{
+ volatile char *mem = s;
+
+ for (size_t i = 0; i < n; i++)
+ mem[i] = c;
+
+ return s;
+}
+
+char *strcat(char *dst, const char *src)
+{
+ char *where_to_append;
+
+ for (where_to_append = dst; *where_to_append; where_to_append++);
+
+ size_t i;
+
+ for (i = 0; src[i]; i++)
+ ((char volatile*) where_to_append)[i] = src[i];
+
+ ((char volatile*) where_to_append)[i] = '\0';
+
+ return dst;
+}
diff --git a/src/arm/common/strings.h b/src/arm/common/strings.h
new file mode 100644
index 0000000..aff0533
--- /dev/null
+++ b/src/arm/common/strings.h
@@ -0,0 +1,33 @@
+#ifndef STRINGS_H
+#define STRINGS_H
+
+#include <stddef.h>
+#include <stdint.h>
+
+void uint32_to_dec(uint32_t number, char buf[10]);
+
+void uint32_to_hex(uint32_t number, char buf[8]);
+
+void uint32_to_bin(uint32_t number, char buf[32]);
+
+void uint32_to_decstring(uint32_t number, char buf[11]);
+
+void uint32_to_hexstring(uint32_t number, char buf[9]);
+
+void uint32_to_binstring(uint32_t number, char buf[33]);
+
+void trim_0s(char string[]);
+
+void uint32_to_decstringt(uint32_t number, char buf[11]);
+
+void uint32_to_hexstringt(uint32_t number, char buf[9]);
+
+size_t strlen(char string[]);
+
+void memcpy(void *dst, void *src, size_t nbytes);
+
+void *memset(void *s, int c, size_t n);
+
+char *strcat(char *dst, const char *src);
+
+#endif // STRINGS_H
diff --git a/src/arm/common/svc_interface.h b/src/arm/common/svc_interface.h
new file mode 100644
index 0000000..aa478ce
--- /dev/null
+++ b/src/arm/common/svc_interface.h
@@ -0,0 +1,11 @@
+#ifndef SVC_INTERFACE_H
+#define SVC_INTERFACE_H
+
+enum svc_type
+ {
+ UART_PUTCHAR,
+ UART_GETCHAR,
+ UART_WRITE
+ };
+
+#endif // SVC_INTERFACE_H