diff --git a/boards/GENERIC_SPC563/board.c b/boards/GENERIC_SPC563/board.c
index 254d72dcc..63e882851 100644
--- a/boards/GENERIC_SPC563/board.c
+++ b/boards/GENERIC_SPC563/board.c
@@ -49,6 +49,7 @@ void hwinit1(void) {
SIU.PCR[GPIO_BUTTON3].R = 0x0100; /* IBE. */
SIU.PCR[GPIO_BUTTON4].R = 0x0100; /* IBE. */
SIU.PCR[GPIO_SCI_A_TX].R = 0x0500; /* Primary | IBE. */
+ SIU.PCR[GPIO_SCI_A_RX].R = 0x0500; /* Primary | IBE. */
/*
* HAL initialization.
diff --git a/boards/GENERIC_SPC563/board.h b/boards/GENERIC_SPC563/board.h
index 5c7af7b60..78213a1ae 100644
--- a/boards/GENERIC_SPC563/board.h
+++ b/boards/GENERIC_SPC563/board.h
@@ -41,6 +41,7 @@
* I/O definitions.
*/
#define GPIO_SCI_A_TX 89
+#define GPIO_SCI_A_RX 90
#define GPIO_BUTTON1 179
#define GPIO_BUTTON2 181
diff --git a/demos/PPC-SPC563-GCC/Makefile b/demos/PPC-SPC563-GCC/Makefile
index 65b19bc35..057de4ae0 100644
--- a/demos/PPC-SPC563-GCC/Makefile
+++ b/demos/PPC-SPC563-GCC/Makefile
@@ -55,7 +55,8 @@ CSRC = $(PORTSRC) \
$(PLATFORMSRC) \
$(BOARDSRC) \
$(CHIBIOS)/os/various/evtimer.c \
- $(CHIBIOS)/os/various/memstreams.c \
+ $(CHIBIOS)/os/various/shell.c \
+ $(CHIBIOS)/os/various/syscalls.c \
main.c
# C++ sources here.
@@ -109,7 +110,7 @@ CPPWARN = -Wall -Wextra
#
# List all default C defines here, like -D_DEBUG=1
-DDEFS =
+DDEFS = -DPPC_VARIANT=PPC_VARIANT_e200z3
# List all default ASM defines here, like -D_DEBUG=1
DADEFS =
diff --git a/demos/PPC-SPC563-GCC/main.c b/demos/PPC-SPC563-GCC/main.c
index df59fd598..db05b1283 100644
--- a/demos/PPC-SPC563-GCC/main.c
+++ b/demos/PPC-SPC563-GCC/main.c
@@ -17,13 +17,97 @@
along with this program. If not, see .
*/
+#include
+
#include "ch.h"
#include "hal.h"
#include "test.h"
-#include "memstreams.h"
+#include "shell.h"
-int a = 1234;
-uint8_t report_buffer[8192];
+#define SHELL_WA_SIZE THD_WA_SIZE(1024)
+#define TEST_WA_SIZE THD_WA_SIZE(256)
+
+static void cmd_mem(BaseChannel *chp, int argc, char *argv[]) {
+ size_t n, size;
+ char buf[52];
+
+ (void)argv;
+ if (argc > 0) {
+ shellPrintLine(chp, "Usage: mem");
+ return;
+ }
+ n = chHeapStatus(NULL, &size);
+ siprintf(buf, "core free memory : %i bytes", chCoreFree());
+ shellPrintLine(chp, buf);
+ siprintf(buf, "heap fragments : %i", n);
+ shellPrintLine(chp, buf);
+ siprintf(buf, "heap free total : %i bytes", size);
+ shellPrintLine(chp, buf);
+}
+
+static void cmd_threads(BaseChannel *chp, int argc, char *argv[]) {
+ static const char *states[] = {
+ "READY",
+ "CURRENT",
+ "SUSPENDED",
+ "WTSEM",
+ "WTMTX",
+ "WTCOND",
+ "SLEEPING",
+ "WTEXIT",
+ "WTOREVT",
+ "WTANDEVT",
+ "SNDMSG",
+ "WTMSG",
+ "FINAL"
+ };
+ Thread *tp;
+ char buf[60];
+
+ (void)argv;
+ if (argc > 0) {
+ shellPrintLine(chp, "Usage: threads");
+ return;
+ }
+ shellPrintLine(chp, " addr stack prio refs state time");
+ tp = chRegFirstThread();
+ do {
+ siprintf(buf, "%8p %8p %4u %4i %9s %u",
+ tp, tp->p_ctx.sp, (unsigned int)tp->p_prio, tp->p_refs - 1,
+ states[tp->p_state], (unsigned int)tp->p_time);
+ shellPrintLine(chp, buf);
+ tp = chRegNextThread(tp);
+ } while (tp != NULL);
+}
+
+static void cmd_test(BaseChannel *chp, int argc, char *argv[]) {
+ Thread *tp;
+
+ (void)argv;
+ if (argc > 0) {
+ shellPrintLine(chp, "Usage: test");
+ return;
+ }
+ tp = chThdCreateFromHeap(NULL, TEST_WA_SIZE, chThdGetPriority(),
+ TestThread, chp);
+ if (tp == NULL) {
+ shellPrintLine(chp, "out of memory");
+ return;
+ }
+ chThdWait(tp);
+}
+
+static const ShellCommand commands[] = {
+ {"mem", cmd_mem},
+ {"threads", cmd_threads},
+ {"test", cmd_test},
+ {NULL, NULL}
+};
+
+static const ShellConfig shell_cfg1 = {
+ (BaseChannel *)&SD1,
+ commands
+};
/*
* LEDs blinker thread, times are in milliseconds.
@@ -32,7 +116,7 @@ static WORKING_AREA(waThread1, 128);
static msg_t Thread1(void *arg) {
(void)arg;
-
+
SIU.GPDO[GPIO_LED1].R = 1;
SIU.GPDO[GPIO_LED2].R = 1;
SIU.GPDO[GPIO_LED3].R = 1;
@@ -64,6 +148,7 @@ static msg_t Thread1(void *arg) {
* on entry.
*/
int main(int argc, char **argv) {
+ Thread *shelltp = NULL;
(void)argc;
(void)argv;
@@ -73,6 +158,11 @@ int main(int argc, char **argv) {
*/
sdStart(&SD1, NULL);
+ /*
+ * Shell manager initialization.
+ */
+ shellInit();
+
/*
* Creates the blinker thread.
*/
@@ -82,6 +172,13 @@ int main(int argc, char **argv) {
* Normal main() thread activity.
*/
while (TRUE) {
+
+ if (!shelltp)
+ shelltp = shellCreate(&shell_cfg1, SHELL_WA_SIZE, NORMALPRIO);
+ else if (chThdTerminated(shelltp)) {
+ chThdRelease(shelltp); /* Recovers memory of the previous shell. */
+ shelltp = NULL; /* Triggers spawning of a new shell. */
+ }
if (SIU.GPDI[GPIO_BUTTON1].B.PDI) {
volatile msg_t result;
#if 0
diff --git a/os/kernel/templates/chcore.h b/os/kernel/templates/chcore.h
index 0e78dbcf5..e3fa8f0b9 100644
--- a/os/kernel/templates/chcore.h
+++ b/os/kernel/templates/chcore.h
@@ -46,9 +46,7 @@
#define CH_ARCHITECTURE_VARIANT_NAME ""
/**
- * @brief Base type for stack alignment.
- * @details This type is used only for stack alignment reasons thus can be
- * anything from a char to a double.
+ * @brief Base type for stack and memory alignment.
*/
typedef uint8_t stkalign_t;
diff --git a/os/ports/GCC/PPC/SPC56x/vectors.s b/os/ports/GCC/PPC/SPC56x/vectors.s
index 4b7e68ffe..3c8aed6a6 100644
--- a/os/ports/GCC/PPC/SPC56x/vectors.s
+++ b/os/ports/GCC/PPC/SPC56x/vectors.s
@@ -40,7 +40,7 @@
* override the weak symbol declared here.
*/
.section .vectors
- .align 2
+ .align 4
.globl _vectors
_vectors:
.long vector0
diff --git a/os/ports/GCC/PPC/chcore.h b/os/ports/GCC/PPC/chcore.h
index 1351531f5..477b51f59 100644
--- a/os/ports/GCC/PPC/chcore.h
+++ b/os/ports/GCC/PPC/chcore.h
@@ -39,27 +39,46 @@
#define ENABLE_WFI_IDLE 0
#endif
+/* Core variants identifiers.*/
+#define PPC_VARIANT_e200z3 3 /**< e200z3 core identifier. */
+#define PPC_VARIANT_e200z4 4 /**< e200z4 core identifier. */
+
+/**
+ * @brief Core variant selector.
+ * @details This setting affects the predefined architecture strings and
+ * possibly code paths and structures into the port layer.
+ */
+#if !defined(PPC_VARIANT) || defined(__DOXYGEN__)
+#define PPC_VARIANT PPC_VARIANT_e200z3
+#endif
+
/**
* @brief Unique macro for the implemented architecture.
*/
-#define CH_ARCHITECTURE_PPCE200Z
+#define CH_ARCHITECTURE_PPC
/**
* @brief Name of the implemented architecture.
*/
-#define CH_ARCHITECTURE_NAME "PowerPC"
+#define CH_ARCHITECTURE_NAME "PowerPC"
/**
- * @brief Name of the architecture variant (optional).
+ * @brief Name of the architecture variant.
*/
-#define CH_CORE_VARIANT_NAME "e200zX"
+#if (PPC_VARIANT == PPC_VARIANT_e200z3) || defined(__DOXYGEN__)
+#define CH_CORE_VARIANT_NAME "e200z3"
+#elif PPC_VARIANT == PPC_VARIANT_e200z4
+#define CH_CORE_VARIANT_NAME "e200z4"
+#else
+#error "unknown PowerPC variant specified"
+#endif
/**
- * @brief Base type for stack alignment.
- * @details This type is used only for stack alignment reasons thus can be
- * anything from a char to a double.
+ * @brief Base type for stack and memory alignment.
*/
-typedef uint64_t stkalign_t;
+typedef struct {
+ uint8_t a[8];
+} stkalign_t __attribute__((aligned(8)));
/**
* @brief Generic PPC register.
diff --git a/os/various/shell.c b/os/various/shell.c
index 41c78b1d8..8a0fd4d45 100644
--- a/os/various/shell.c
+++ b/os/various/shell.c
@@ -28,6 +28,7 @@
#include
#include "ch.h"
+#include "hal.h"
#include "shell.h"
#if SHELL_USE_IPRINTF
@@ -84,13 +85,25 @@ static void cmd_info(BaseChannel *chp, int argc, char *argv[]) {
return;
}
- shellPrint(chp, "Kernel version ");
+ shellPrint(chp, "Kernel version: ");
shellPrintLine(chp, CH_KERNEL_VERSION);
- shellPrint(chp, "Architecture ");
- shellPrintLine(chp, CH_ARCHITECTURE_NAME);
#ifdef __GNUC__
- shellPrint(chp, "GCC Version ");
+ shellPrint(chp, "GCC Version: ");
shellPrintLine(chp, __VERSION__);
+#endif
+ shellPrint(chp, "Architecture: ");
+ shellPrintLine(chp, CH_ARCHITECTURE_NAME);
+#ifdef CH_CORE_VARIANT_NAME
+ shellPrint(chp, "Core Variant: ");
+ shellPrintLine(chp, CH_CORE_VARIANT_NAME);
+#endif
+#ifdef PLATFORM_NAME
+ shellPrint(chp, "Platform: ");
+ shellPrintLine(chp, PLATFORM_NAME);
+#endif
+#ifdef BOARD_NAME
+ shellPrint(chp, "Board: ");
+ shellPrintLine(chp, BOARD_NAME);
#endif
}