|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [UNIKRAFT/PLAT_RASPI PATCH 10/13] plats/raspi: Adding serial console support
Adding serial console support.
Signed-off-by: Santiago Pagani <santiagopagani@xxxxxxxxx>
---
console.c | 77 +++++++++++++++++++
include/raspi/console.h | 30 ++++++++
include/raspi/serial_console.h | 32 ++++++++
serial_console.c | 130 +++++++++++++++++++++++++++++++++
4 files changed, 269 insertions(+)
create mode 100644 console.c
create mode 100644 include/raspi/console.h
create mode 100644 include/raspi/serial_console.h
create mode 100644 serial_console.c
diff --git a/console.c b/console.c
new file mode 100644
index 0000000..8f4b08c
--- /dev/null
+++ b/console.c
@@ -0,0 +1,77 @@
+/* SPDX-License-Identifier: ISC */
+/*
+ * Authors: Dan Williams
+ * Martin Lucina
+ * Felipe Huici <felipe.huici@xxxxxxxxx>
+ * Florian Schmidt <florian.schmidt@xxxxxxxxx>
+ * Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
+ * Santiago Pagani <santiagopagani@xxxxxxxxx>
+ *
+ * Copyright (c) 2015-2017 IBM
+ * Copyright (c) 2016-2017 Docker, Inc.
+ * Copyright (c) 2020, NEC Laboratories Europe GmbH, NEC Corporation.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software
+ * for any purpose with or without fee is hereby granted, provided
+ * that the above copyright notice and this permission notice appear
+ * in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <uk/plat/console.h>
+#include <uk/config.h>
+#include <uk/essentials.h>
+#if (CONFIG_RASPI_PRINTF_SERIAL_CONSOLE || CONFIG_RASPI_DEBUG_SERIAL_CONSOLE
|| CONFIG_RASPI_KERNEL_SERIAL_CONSOLE)
+#include <raspi/serial_console.h>
+#endif
+
+void _libraspiplat_init_console(void)
+{
+#if (CONFIG_RASPI_PRINTF_SERIAL_CONSOLE || CONFIG_RASPI_DEBUG_SERIAL_CONSOLE
|| CONFIG_RASPI_KERNEL_SERIAL_CONSOLE)
+ _libraspiplat_init_serial_console();
+#endif
+}
+
+int ukplat_coutd(const char *buf __maybe_unused, unsigned int len)
+{
+ for (unsigned int i = 0; i < len; i++) {
+#if (CONFIG_RASPI_PRINTF_SERIAL_CONSOLE || CONFIG_RASPI_DEBUG_SERIAL_CONSOLE)
+ _libraspiplat_serial_putc(buf[i]);
+#endif
+ }
+ return len;
+}
+
+int ukplat_coutk(const char *buf __maybe_unused, unsigned int len)
+{
+ for (unsigned int i = 0; i < len; i++) {
+#if (CONFIG_RASPI_PRINTF_SERIAL_CONSOLE || CONFIG_RASPI_KERNEL_SERIAL_CONSOLE)
+ _libraspiplat_serial_putc(buf[i]);
+#endif
+ }
+ return len;
+}
+
+int ukplat_cink(char *buf __maybe_unused, unsigned int maxlen __maybe_unused)
+{
+ int ret __maybe_unused;
+ unsigned int num = 0;
+
+#if (CONFIG_RASPI_PRINTF_SERIAL_CONSOLE || CONFIG_RASPI_KERNEL_SERIAL_CONSOLE)
+ while (num < maxlen
+ && (ret = _libraspiplat_serial_getc()) >= 0) {
+ *(buf++) = (char) ret;
+ num++;
+ }
+#endif
+ return (int) num;
+}
diff --git a/include/raspi/console.h b/include/raspi/console.h
new file mode 100644
index 0000000..2e1b94f
--- /dev/null
+++ b/include/raspi/console.h
@@ -0,0 +1,30 @@
+/* SPDX-License-Identifier: ISC */
+/* Copyright (c) 2015, IBM
+ * (c) 2020, NEC Laboratories Europe GmbH, NEC Corporation.
+ * All rights reserved.
+ *
+ * Author(s): Dan Williams <djwillia@xxxxxxxxxx>
+ * Simon Kuenzer <simon.kuenzer@xxxxxxxxx>
+ * Santiago Pagani <santiagopagani@xxxxxxxxx>
+ *
+ * Permission to use, copy, modify, and/or distribute this software
+ * for any purpose with or without fee is hereby granted, provided
+ * that the above copyright notice and this permission notice appear
+ * in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef __RASPI_CONSOLE_H__
+#define __RASPI_CONSOLE_H__
+
+void _libraspiplat_init_console(void);
+
+#endif /* __RASPI_CONSOLE_H__ */
diff --git a/include/raspi/serial_console.h b/include/raspi/serial_console.h
new file mode 100644
index 0000000..75e95c7
--- /dev/null
+++ b/include/raspi/serial_console.h
@@ -0,0 +1,32 @@
+/* SPDX-License-Identifier: ISC */
+/*
+ * Authors: Dafna Hirschfeld <dafna3@xxxxxxxxx>
+ * Santiago Pagani <santiagopagani@xxxxxxxxx>
+ *
+ * Copyright (c) 2018 Dafna Hirschfeld <dafna3@xxxxxxxxx>
+ * Copyright (c) 2020, NEC Laboratories Europe GmbH, NEC Corporation.
+ * All rights reserved.
+ *
+ * Permission to use, copy, modify, and/or distribute this software
+ * for any purpose with or without fee is hereby granted, provided
+ * that the above copyright notice and this permission notice appear
+ * in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL
+ * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE
+ * AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#ifndef __RASPI_SERIAL_CONSOLE_H__
+#define __RASPI_SERIAL_CONSOLE_H__
+
+void _libraspiplat_init_serial_console(void);
+void _libraspiplat_serial_putc(char a);
+int _libraspiplat_serial_getc(void);
+
+#endif /* __RASPI_SERIAL_CONSOLE_H__ */
diff --git a/serial_console.c b/serial_console.c
new file mode 100644
index 0000000..a3d3da1
--- /dev/null
+++ b/serial_console.c
@@ -0,0 +1,130 @@
+/*
+ * Copyright (C) 2018, bzt (bztsrc@github),
https://github.com/bztsrc/raspi3-tutorial
+ * Copyright (C) 2020, Santiago Pagani <santiagopagani@xxxxxxxxx>
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+ * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+ * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ */
+
+#include <raspi/sysregs.h>
+#include <raspi/mbox.h>
+
+/* PL011 UART registers */
+#define UART0_DR ((volatile unsigned int*)(MMIO_BASE+0x00201000))
+#define UART0_FR ((volatile unsigned int*)(MMIO_BASE+0x00201018))
+#define UART0_IBRD ((volatile unsigned int*)(MMIO_BASE+0x00201024))
+#define UART0_FBRD ((volatile unsigned int*)(MMIO_BASE+0x00201028))
+#define UART0_LCRH ((volatile unsigned int*)(MMIO_BASE+0x0020102C))
+#define UART0_CR ((volatile unsigned int*)(MMIO_BASE+0x00201030))
+#define UART0_IMSC ((volatile unsigned int*)(MMIO_BASE+0x00201038))
+#define UART0_ICR ((volatile unsigned int*)(MMIO_BASE+0x00201044))
+
+static char prev_sent_char = '\0';
+
+static void wait_cycles(unsigned int n)
+{
+ if (n) {
+ while (n--) {
+ asm volatile("nop");
+ }
+ }
+}
+
+static unsigned int serial_tx_buffer_full(void)
+{
+ return *UART0_FR&0x20;
+}
+
+static unsigned int serial_rx_buffer_empty(void)
+{
+ return *UART0_FR&0x10;
+}
+
+/**
+ * Set baud rate and characteristics (115200 8N1) and map to GPIO
+ */
+void _libraspiplat_init_serial_console()
+{
+ register unsigned int r;
+
+ /* initialize UART */
+ *UART0_CR = 0; // turn off UART0
+
+ /* set up clock for consistent divisor values */
+ mbox[0] = 9*4;
+ mbox[1] = MBOX_REQUEST;
+ mbox[2] = MBOX_TAG_SETCLKRATE; // set clock rate
+ mbox[3] = 12;
+ mbox[4] = 8;
+ mbox[5] = 2; // UART clock
+ mbox[6] = 4000000; // 4Mhz
+ mbox[7] = 0; // clear turbo
+ mbox[8] = MBOX_TAG_LAST;
+ mbox_call(MBOX_CH_PROP);
+
+ /* map UART0 to GPIO pins */
+ r=*GPFSEL1;
+ r&=~((7<<12)|(7<<15)); // gpio14, gpio15
+ r|=(4<<12)|(4<<15); // alt0
+ *GPFSEL1 = r;
+ *GPPUD = 0; // enable pins 14 and 15
+ wait_cycles(150);
+ *GPPUDCLK0 = (1<<14)|(1<<15);
+ wait_cycles(150);
+ *GPPUDCLK0 = 0; // flush GPIO setup
+
+ *UART0_ICR = 0x7FF; // clear interrupts
+ *UART0_IBRD = 2; // 115200 baud
+ *UART0_FBRD = 0xB;
+ *UART0_LCRH = 0b11<<5; // 8n1
+ *UART0_CR = 0x301; // enable Tx, Rx, FIFO
+}
+
+/**
+ * Send a character
+ */
+void _libraspiplat_serial_putc(char c)
+{
+ if ((c == '\n') && (prev_sent_char != '\r'))
+ _libraspiplat_serial_putc('\r');
+
+ // Wait until we can send
+ do{
+ asm volatile("nop");
+ } while (serial_tx_buffer_full());
+
+ // Write the character to the buffer
+ *UART0_DR = c;
+ prev_sent_char = c;
+}
+
+/**
+ * Receive a character
+ */
+int _libraspiplat_serial_getc(void)
+{
+ if (serial_rx_buffer_empty())
+ return -1;
+
+ char r;
+ r = (char)(*UART0_DR);
+ return (int)r;
+}
--
2.17.1
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |