summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEvan Lojewski <github@meklort.com>2020-07-18 10:34:49 -0600
committerGitHub <noreply@github.com>2020-07-18 10:34:49 -0600
commitfb75521c041370e045eb1812aa257d5ebd2ffd32 (patch)
tree15ef244dbb8bb05b4ba3b461a77aa36e7c216425
parent437967699cf69896e6bb9c50979dbc17a4850ced (diff)
downloadbcm5719-ortega-fb75521c041370e045eb1812aa257d5ebd2ffd32.tar.gz
bcm5719-ortega-fb75521c041370e045eb1812aa257d5ebd2ffd32.zip
debug: Enable the ape console on Port 0 (needed for SPI prints) and Port 1. (#92)
-rw-r--r--ape/main.c13
-rw-r--r--include/types.h6
-rw-r--r--libs/Network/include/Network.h6
-rw-r--r--libs/printf/ape_console.h52
-rw-r--r--libs/printf/ape_putchar.c48
5 files changed, 102 insertions, 23 deletions
diff --git a/ape/main.c b/ape/main.c
index f4db64a..6fecba0 100644
--- a/ape/main.c
+++ b/ape/main.c
@@ -61,6 +61,7 @@
#include <types.h>
#ifndef CXX_SIMULATOR
+#include <ape_console.h>
#include <printf.h>
#endif
@@ -335,16 +336,8 @@ bool handle_reset(void)
void __attribute__((noreturn)) __start()
{
- bool full_init = false;
- if (handle_reset() || SHM.RcpuWritePointer.r32 > sizeof(SHM.RcpuPrintfBuffer) || SHM.RcpuReadPointer.r32 > sizeof(SHM.RcpuPrintfBuffer) ||
- SHM.RcpuHostReadPointer.r32 > sizeof(SHM.RcpuPrintfBuffer))
- {
- full_init = true;
-
- SHM.RcpuWritePointer.r32 = 0;
- SHM.RcpuReadPointer.r32 = 0;
- SHM.RcpuHostReadPointer.r32 = 0;
- }
+ bool full_init = handle_reset();
+ full_init = full_init || reset_ape_console();
printf("APE v" STRINGIFY(VERSION_MAJOR) "." STRINGIFY(VERSION_MINOR) "." STRINGIFY(VERSION_PATCH) " NCSI Port " STRINGIFY(NETWORK_PORT) "\n");
gPort = Network_getPort(NETWORK_PORT);
diff --git a/include/types.h b/include/types.h
index 8f17085..5f0fce0 100644
--- a/include/types.h
+++ b/include/types.h
@@ -100,4 +100,10 @@ typedef union {
#define _STRINGIFY(__STR__) #__STR__
#define STRINGIFY(__STR__) _STRINGIFY(__STR__)
+#ifdef CXX_SIMULATOR
+#define VOLATILE
+#else
+#define VOLATILE volatile
+#endif
+
#endif /* !TYPES_H */
diff --git a/libs/Network/include/Network.h b/libs/Network/include/Network.h
index c6aa260..ab621d6 100644
--- a/libs/Network/include/Network.h
+++ b/libs/Network/include/Network.h
@@ -54,12 +54,6 @@
#include <APE_SHM_CHANNEL0.h>
#include <types.h>
-#ifdef CXX_SIMULATOR
-#define VOLATILE
-#else
-#define VOLATILE volatile
-#endif
-
typedef struct
{
/* Port Registers */
diff --git a/libs/printf/ape_console.h b/libs/printf/ape_console.h
new file mode 100644
index 0000000..d2d80fd
--- /dev/null
+++ b/libs/printf/ape_console.h
@@ -0,0 +1,52 @@
+////////////////////////////////////////////////////////////////////////////////
+///
+/// @file ape_console.h
+///
+/// @project
+///
+/// @brief APE printf support Routines
+///
+////////////////////////////////////////////////////////////////////////////////
+///
+////////////////////////////////////////////////////////////////////////////////
+///
+/// @copyright Copyright (c) 2020, Evan Lojewski
+/// @cond
+///
+/// All rights reserved.
+///
+/// Redistribution and use in source and binary forms, with or without
+/// modification, are permitted provided that the following conditions are met:
+/// 1. Redistributions of source code must retain the above copyright notice,
+/// this list of conditions and the following disclaimer.
+/// 2. Redistributions in binary form must reproduce the above copyright notice,
+/// this list of conditions and the following disclaimer in the documentation
+/// and/or other materials provided with the distribution.
+/// 3. Neither the name of the copyright holder nor the
+/// names of its contributors may be used to endorse or promote products
+/// derived from this software without specific prior written permission.
+///
+////////////////////////////////////////////////////////////////////////////////
+///
+/// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+/// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+/// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+/// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+/// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+/// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+/// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+/// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+/// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+/// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+/// POSSIBILITY OF SUCH DAMAGE.
+/// @endcond
+////////////////////////////////////////////////////////////////////////////////
+
+#ifndef APE_CONSOLE_H
+#define APE_CONSOLE_H
+
+#include <types.h>
+
+bool reset_ape_console(void);
+
+#endif /* APE_CONSOLE_H */
diff --git a/libs/printf/ape_putchar.c b/libs/printf/ape_putchar.c
index ea96a89..50fd5df 100644
--- a/libs/printf/ape_putchar.c
+++ b/libs/printf/ape_putchar.c
@@ -43,25 +43,59 @@
////////////////////////////////////////////////////////////////////////////////
#include <printf.h>
-#include <em100_putchar.h>
+#include <ape_console.h>
#include <APE_SHM.h>
+#include <APE_SHM1.h>
-void _putchar(char character)
+static bool reset_ape_console_internal(VOLATILE SHM_t *port)
+{
+ if (port->RcpuWritePointer.r32 > sizeof(port->RcpuPrintfBuffer) ||
+ port->RcpuReadPointer.r32 > sizeof(port->RcpuPrintfBuffer) ||
+ port->RcpuHostReadPointer.r32 > sizeof(port->RcpuPrintfBuffer))
+ {
+ port->RcpuWritePointer.r32 = 0;
+ port->RcpuReadPointer.r32 = 0;
+ port->RcpuHostReadPointer.r32 = 0;
+
+ return true;
+ }
+
+ return false;
+}
+
+bool reset_ape_console(void)
+{
+ bool was_reset = false;
+ was_reset = was_reset || reset_ape_console_internal(&SHM);
+ was_reset = was_reset || reset_ape_console_internal(&SHM1);
+
+ return was_reset;
+}
+
+
+static void ape_putchar(char character, VOLATILE SHM_t *port)
{
- uint32_t write_pointer = SHM.RcpuWritePointer.r32;
+ uint32_t write_pointer = port->RcpuWritePointer.r32;
uint32_t word_pointer = write_pointer / 4;
uint32_t byte_index = write_pointer % 4;
uint32_t byte_mask = 0xFF << (byte_index * 8);
- uint32_t new_word = SHM.RcpuPrintfBuffer[word_pointer].r32 & ~byte_mask;
+ uint32_t new_word = port->RcpuPrintfBuffer[word_pointer].r32 & ~byte_mask;
new_word |= character << (byte_index * 8);
- SHM.RcpuPrintfBuffer[word_pointer].r32 = new_word;
+ port->RcpuPrintfBuffer[word_pointer].r32 = new_word;
write_pointer++;
- if(write_pointer >= sizeof(SHM.RcpuPrintfBuffer))
+ if(write_pointer >= sizeof(port->RcpuPrintfBuffer))
{
write_pointer = 0;
}
- SHM.RcpuWritePointer.r32 = write_pointer;
+ port->RcpuWritePointer.r32 = write_pointer;
+}
+
+
+void _putchar(char character)
+{
+ ape_putchar(character, &SHM);
+ ape_putchar(character, &SHM1);
}
OpenPOWER on IntegriCloud