summaryrefslogtreecommitdiff
path: root/src/arch/lm4f120h5qr-stellaris/lm4f_cpp_wrapper.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/lm4f120h5qr-stellaris/lm4f_cpp_wrapper.c')
-rw-r--r--src/arch/lm4f120h5qr-stellaris/lm4f_cpp_wrapper.c177
1 files changed, 177 insertions, 0 deletions
diff --git a/src/arch/lm4f120h5qr-stellaris/lm4f_cpp_wrapper.c b/src/arch/lm4f120h5qr-stellaris/lm4f_cpp_wrapper.c
new file mode 100644
index 0000000..62f1c20
--- /dev/null
+++ b/src/arch/lm4f120h5qr-stellaris/lm4f_cpp_wrapper.c
@@ -0,0 +1,177 @@
+/*
+ * Copyright 2021 Daniel Friesel
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+#include <libopencm3/cm3/nvic.h>
+#include <libopencm3/cm3/systick.h>
+#include <libopencm3/lm4f/systemcontrol.h>
+#include <libopencm3/lm4f/rcc.h>
+#include <libopencm3/lm4f/gpio.h>
+#include <libopencm3/lm4f/nvic.h>
+#include <libopencm3/lm4f/uart.h>
+
+void arch_clock_init()
+{
+ // 16MHz Crystal -> 400 MHz PLL -> 80 MHz (/5)
+ rcc_sysclk_config(OSCSRC_MOSC, XTAL_16M, 5);
+}
+
+#ifdef WITH_LOOP
+volatile char run_loop = 1;
+
+void arch_init_loop()
+{
+ systick_clear();
+ systick_set_clocksource(STK_CSR_CLKSOURCE_AHB);
+ systick_set_frequency(2, F_CPU);
+ systick_counter_enable();
+ systick_interrupt_enable();
+
+ //periph_clock_enable(RCC_TIMER3);
+}
+
+void sys_tick_handler()
+{
+ run_loop = 1;
+}
+#endif
+
+void mp_uart_setup()
+{
+ gpio_set_af(GPIOA, 1, GPIO0 | GPIO1);
+
+ periph_clock_enable(RCC_UART0);
+
+ __asm__("nop");
+
+ uart_disable(UART0);
+
+ uart_clock_from_piosc(UART0);
+
+ uart_set_baudrate(UART0, 9600);
+ uart_set_databits(UART0, 8);
+ uart_set_parity(UART0, UART_PARITY_NONE);
+ uart_set_stopbits(UART0, 1);
+
+ uart_enable(UART0);
+}
+
+void mp_uart_send_blocking(char c)
+{
+ uart_send_blocking(UART0, c);
+}
+
+#define pb_0 8
+#define pc_0 16
+#define pd_0 24
+#define pe_0 32
+#define pf_0 40
+#define PIN_INVALID 45
+
+void mp_gpio_setup()
+{
+ const unsigned int outpins = GPIO1 | GPIO3 | GPIO2;
+
+ gpio_enable_ahb_aperture();
+
+ periph_clock_enable(RCC_GPIOA);
+ periph_clock_enable(RCC_GPIOB);
+ periph_clock_enable(RCC_GPIOC);
+ periph_clock_enable(RCC_GPIOD);
+ periph_clock_enable(RCC_GPIOE);
+ periph_clock_enable(RCC_GPIOF);
+
+ gpio_mode_setup(GPIOF, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, outpins);
+ gpio_set_output_config(GPIOF, GPIO_OTYPE_PP, GPIO_DRIVE_2MA, outpins);
+}
+
+void mp_gpio_input(unsigned char const pin)
+{
+ if (pin < pb_0) {
+ gpio_mode_setup(GPIOA, GPIO_MODE_INPUT, GPIO_PUPD_NONE, 1 << pin);
+ } else if (pin < pc_0) {
+ gpio_mode_setup(GPIOB, GPIO_MODE_INPUT, GPIO_PUPD_NONE, 1 << (pin - pb_0));
+ } else if (pin < pd_0) {
+ gpio_mode_setup(GPIOC, GPIO_MODE_INPUT, GPIO_PUPD_NONE, 1 << (pin - pc_0));
+ } else if (pin < pe_0) {
+ gpio_mode_setup(GPIOD, GPIO_MODE_INPUT, GPIO_PUPD_NONE, 1 << (pin - pd_0));
+ } else if (pin < pf_0) {
+ gpio_mode_setup(GPIOE, GPIO_MODE_INPUT, GPIO_PUPD_NONE, 1 << (pin - pe_0));
+ } else if (pin < PIN_INVALID) {
+ gpio_mode_setup(GPIOF, GPIO_MODE_INPUT, GPIO_PUPD_NONE, 1 << (pin - pf_0));
+ }
+}
+
+void mp_gpio_output(unsigned char const pin)
+{
+ if (pin < pb_0) {
+ gpio_mode_setup(GPIOA, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, 1 << pin);
+ } else if (pin < pc_0) {
+ gpio_mode_setup(GPIOB, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, 1 << (pin - pb_0));
+ } else if (pin < pd_0) {
+ gpio_mode_setup(GPIOC, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, 1 << (pin - pc_0));
+ } else if (pin < pe_0) {
+ gpio_mode_setup(GPIOD, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, 1 << (pin - pd_0));
+ } else if (pin < pf_0) {
+ gpio_mode_setup(GPIOE, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, 1 << (pin - pe_0));
+ } else if (pin < PIN_INVALID) {
+ gpio_mode_setup(GPIOF, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, 1 << (pin - pf_0));
+ }
+}
+
+unsigned int mp_gpio_read(unsigned char const pin) {
+ if (pin < pb_0) {
+ return gpio_read(GPIOA, 1 << pin);
+ } else if (pin < pc_0) {
+ return gpio_read(GPIOB, 1 << (pin-pb_0));
+ } else if (pin < pd_0) {
+ return gpio_read(GPIOC, 1 << (pin-pc_0));
+ } else if (pin < pe_0) {
+ return gpio_read(GPIOD, 1 << (pin-pd_0));
+ } else if (pin < pf_0) {
+ return gpio_read(GPIOE, 1 << (pin-pe_0));
+ } else if (pin < PIN_INVALID) {
+ return gpio_read(GPIOF, 1 << (pin-pf_0));
+ }
+}
+
+void mp_gpio_write(unsigned char const pin, unsigned char value) {
+ if (pin < pb_0) {
+ if (value) {
+ gpio_port_write(GPIOA, gpio_port_read(GPIOA) | (1 << pin));
+ } else {
+ gpio_port_write(GPIOA, gpio_port_read(GPIOA) & ~(1 << pin));
+ }
+ } else if (pin < pc_0) {
+ if (value) {
+ gpio_port_write(GPIOB, gpio_port_read(GPIOB) | (1 << (pin-pb_0)));
+ } else {
+ gpio_port_write(GPIOB, gpio_port_read(GPIOB) & ~(1 << (pin-pb_0)));
+ }
+ } else if (pin < pd_0) {
+ if (value) {
+ gpio_port_write(GPIOC, gpio_port_read(GPIOC) | (1 << (pin-pc_0)));
+ } else {
+ gpio_port_write(GPIOC, gpio_port_read(GPIOC) & ~(1 << (pin-pc_0)));
+ }
+ } else if (pin < pe_0) {
+ if (value) {
+ gpio_port_write(GPIOD, gpio_port_read(GPIOD) | (1 << (pin-pd_0)));
+ } else {
+ gpio_port_write(GPIOD, gpio_port_read(GPIOD) & ~(1 << (pin-pd_0)));
+ }
+ } else if (pin < pf_0) {
+ if (value) {
+ gpio_port_write(GPIOE, gpio_port_read(GPIOE) | (1 << (pin-pe_0)));
+ } else {
+ gpio_port_write(GPIOE, gpio_port_read(GPIOE) & ~(1 << (pin-pe_0)));
+ }
+ } else if (pin < PIN_INVALID) {
+ if (value) {
+ gpio_port_write(GPIOF, gpio_port_read(GPIOF) | (1 << (pin-pf_0)));
+ } else {
+ gpio_port_write(GPIOF, gpio_port_read(GPIOF) & ~(1 << (pin-pf_0)));
+ }
+ }
+}