[Cryptech-Commits] [sw/stm32] 05/09: put some generic CLI code in mgmt-cli.c

git at cryptech.is git at cryptech.is
Wed May 18 19:16:16 UTC 2016


This is an automated email from the git hooks/post-receive script.

fredrik at thulin.net pushed a commit to branch master
in repository sw/stm32.

commit 257ac2f7f8ed55427821df6c6dc8a3438a45ec11
Author: Fredrik Thulin <fredrik at thulin.net>
AuthorDate: Tue May 17 15:22:37 2016 +0200

    put some generic CLI code in mgmt-cli.c
---
 projects/cli-test/Makefile   |   2 +-
 projects/cli-test/cli-test.c | 160 ++++++++++++-------------------------------
 projects/cli-test/mgmt-cli.c | 124 +++++++++++++++++++++++++++++++++
 projects/cli-test/mgmt-cli.h |  50 ++++++++++++++
 4 files changed, 220 insertions(+), 116 deletions(-)

diff --git a/projects/cli-test/Makefile b/projects/cli-test/Makefile
index 8fde727..f3976e4 100644
--- a/projects/cli-test/Makefile
+++ b/projects/cli-test/Makefile
@@ -1,6 +1,6 @@
 TEST = cli-test
 
-OBJS = crc32.o
+OBJS = crc32.o mgmt-cli.o
 
 CFLAGS += -I$(LIBCLI_DIR)
 LIBS += $(LIBCLI_DIR)/libcli.a
diff --git a/projects/cli-test/cli-test.c b/projects/cli-test/cli-test.c
index edbc056..86e11ce 100644
--- a/projects/cli-test/cli-test.c
+++ b/projects/cli-test/cli-test.c
@@ -1,38 +1,47 @@
 /*
+ * cli-test.c
+ * ---------
  * Test code with a small CLI on the management interface
  *
+ * Copyright (c) 2016, NORDUnet A/S All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * - Redistributions of source code must retain the above copyright notice,
+ *   this list of conditions and the following disclaimer.
+ *
+ * - 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.
+ *
+ * - Neither the name of the NORDUnet 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.
  */
 #include "stm32f4xx_hal.h"
 #include "stm-init.h"
 #include "stm-led.h"
 #include "stm-uart.h"
+#include "mgmt-cli.h"
 
 #include <string.h>
-#include <libcli.h>
-
-#define DELAY() HAL_Delay(250)
 
 
-void uart_cli_print(struct cli_def *cli __attribute__ ((unused)), const char *buf)
-{
-    char crlf[] = "\r\n";
-    uart_send_string2(STM_UART_MGMT, buf);
-    uart_send_string2(STM_UART_MGMT, crlf);
-}
-
-int uart_cli_read(struct cli_def *cli __attribute__ ((unused)), void *buf, size_t count)
-{
-    if (uart_recv_char2(STM_UART_MGMT, buf, count) != HAL_OK) {
-	return -1;
-    }
-    return 1;
-}
+extern uint32_t update_crc(uint32_t crc, uint8_t *buf, int len);
 
-int uart_cli_write(struct cli_def *cli __attribute__ ((unused)), const void *buf, size_t count)
-{
-    uart_send_bytes(STM_UART_MGMT, (uint8_t *) buf, count);
-    return (int) count;
-}
 
 int cmd_show_cpuspeed(struct cli_def *cli, const char *command, char *argv[], int argc)
 {
@@ -45,8 +54,6 @@ int cmd_show_cpuspeed(struct cli_def *cli, const char *command, char *argv[], in
     return CLI_OK;
 }
 
-extern uint32_t update_crc(uint32_t crc, uint8_t *buf, int len);
-
 int cmd_filetransfer(struct cli_def *cli, const char *command, char *argv[], int argc)
 {
     uint32_t filesize = 0, crc = 0, my_crc = 0, n = 4096, counter = 0;
@@ -82,58 +89,9 @@ int cmd_filetransfer(struct cli_def *cli, const char *command, char *argv[], int
 
 int cmd_reboot(struct cli_def *cli, const char *command, char *argv[], int argc)
 {
+    cli_print(cli, "\n\n\nRebooting\n\n\n");
     HAL_NVIC_SystemReset();
-}
-
-int embedded_cli_loop(struct cli_def *cli)
-{
-    unsigned char c;
-    int n = 0;
-    static struct cli_loop_ctx ctx;
-
-    memset(&ctx, 0, sizeof(ctx));
-    ctx.insertmode = 1;
-
-    cli->state = CLI_STATE_LOGIN;
-
-    /* start off in unprivileged mode */
-    cli_set_privilege(cli, PRIVILEGE_UNPRIVILEGED);
-    cli_set_configmode(cli, MODE_EXEC, NULL);
-
-    cli_error(cli, "%s", cli->banner);
-
-    while (1) {
-	cli_loop_start_new_command(cli, &ctx);
-	HAL_GPIO_TogglePin(LED_PORT, LED_YELLOW);
-
-	while (1) {
-	    HAL_GPIO_TogglePin(LED_PORT, LED_BLUE);
-
-	    cli_loop_show_prompt(cli, &ctx);
-
-	    n = cli_loop_read_next_char(cli, &ctx, &c);
-	    //cli_print(cli, "Next char: '%c' (n == %i)", c, n);
-	    if (n == CLI_LOOP_CTRL_BREAK)
-		break;
-	    if (n == CLI_LOOP_CTRL_CONTINUE)
-		continue;
-
-	    n = cli_loop_process_char(cli, &ctx, c);
-	    if (n == CLI_LOOP_CTRL_BREAK)
-		break;
-	    if (n == CLI_LOOP_CTRL_CONTINUE)
-		continue;
-	}
-
-	if (ctx.l < 0) break;
-
-	//cli_print(cli, "Process command: '%s'", ctx.cmd);
-	n = cli_loop_process_cmd(cli, &ctx);
-	if (n == CLI_LOOP_CTRL_BREAK)
-	    break;
-    }
-
-    return CLI_OK;
+    while (1) {};
 }
 
 int check_auth(const char *username, const char *password)
@@ -148,6 +106,8 @@ int check_auth(const char *username, const char *password)
 int
 main()
 {
+    int i;
+    static struct cli_def cli;
     struct cli_command cmd_show_s = {(char *) "show", NULL, 0, NULL, PRIVILEGE_UNPRIVILEGED, MODE_EXEC, NULL, NULL, NULL};
     struct cli_command cmd_show_cpuspeed_s = {(char *) "cpuspeed", cmd_show_cpuspeed, 0,
                                              (char *) "Show the speed at which the CPU currently operates",
@@ -159,26 +119,13 @@ main()
 				       (char *) "Reboot the STM32",
 				       PRIVILEGE_UNPRIVILEGED, MODE_EXEC, NULL, NULL, NULL};
 
-    char crlf[] = "\r\n";
-    uint8_t tx = 'A';
-    uint8_t rx = 0;
-    uint8_t upper = 0;
-    struct cli_def cli;
-
-    memset(&cli, 0, sizeof(cli));
-
     stm_init();
 
-    HAL_GPIO_WritePin(LED_PORT, LED_RED, GPIO_PIN_SET);
+    led_on(LED_RED);
 
-    cli_init(&cli);
-    cli_read_callback(&cli, uart_cli_read);
-    cli_write_callback(&cli, uart_cli_write);
-    cli_print_callback(&cli, uart_cli_print);
-    cli_set_banner(&cli, "libcli on an STM32");
-    cli_set_hostname(&cli, "cryptech");
+    mgmt_cli_init(&cli);
+    led_on(LED_YELLOW);
     cli_set_auth_callback(&cli, check_auth);
-    cli_telnet_protocol(&cli, 0);
 
     cli_register_command2(&cli, &cmd_show_s, NULL);
     cli_register_command2(&cli, &cmd_show_cpuspeed_s, &cmd_show_s);
@@ -187,32 +134,15 @@ main()
 
     cli_register_command2(&cli, &cmd_reboot_s, NULL);
 
-    HAL_GPIO_WritePin(LED_PORT, LED_RED, GPIO_PIN_RESET);
-    HAL_GPIO_WritePin(LED_PORT, LED_GREEN, GPIO_PIN_SET);
+    led_off(LED_RED);
+    led_on(LED_GREEN);
 
     embedded_cli_loop(&cli);
 
-    while (1) {
-	led_toggle(LED_GREEN);
-
-	uart_send_char2(STM_UART_USER, tx + upper);
-	uart_send_char2(STM_UART_MGMT, tx + upper);
-	DELAY();
-
-	if (uart_recv_char2(STM_UART_USER, &rx, 0) == HAL_OK ||
-	    uart_recv_char2(STM_UART_MGMT, &rx, 0) == HAL_OK) {
-	    led_toggle(LED_YELLOW);
-	    if (rx == '\r') {
-		upper = upper == 0 ? ('a' - 'A'):0;
-	    }
-	}
+    cli_print(&cli, "Rebooting in 3 seconds");
+    HAL_Delay(3000);
+    HAL_NVIC_SystemReset();
 
-	if (tx++ == 'Z') {
-	    /* linefeed after each alphabet */
-	    uart_send_string2(STM_UART_USER, crlf);
-	    uart_send_string2(STM_UART_MGMT, crlf);
-	    tx = 'A';
-	    led_toggle(LED_BLUE);
-	}
-    }
+    /* NOT REACHED */
+    Error_Handler();
 }
diff --git a/projects/cli-test/mgmt-cli.c b/projects/cli-test/mgmt-cli.c
new file mode 100644
index 0000000..8d53515
--- /dev/null
+++ b/projects/cli-test/mgmt-cli.c
@@ -0,0 +1,124 @@
+/*
+ * mgmt-cli.c
+ * ---------
+ * Management CLI code.
+ *
+ * Copyright (c) 2016, NORDUnet A/S All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * - Redistributions of source code must retain the above copyright notice,
+ *   this list of conditions and the following disclaimer.
+ *
+ * - 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.
+ *
+ * - Neither the name of the NORDUnet 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.
+ */
+#include "stm32f4xx_hal.h"
+#include "stm-init.h"
+#include "stm-led.h"
+#include "stm-uart.h"
+#include "mgmt-cli.h"
+
+#include <string.h>
+
+void uart_cli_print(struct cli_def *cli __attribute__ ((unused)), const char *buf)
+{
+    char crlf[] = "\r\n";
+    uart_send_string2(STM_UART_MGMT, buf);
+    uart_send_string2(STM_UART_MGMT, crlf);
+}
+
+int uart_cli_read(struct cli_def *cli __attribute__ ((unused)), void *buf, size_t count)
+{
+    if (uart_recv_char2(STM_UART_MGMT, buf, count) != HAL_OK) {
+	return -1;
+    }
+    return 1;
+}
+
+int uart_cli_write(struct cli_def *cli __attribute__ ((unused)), const void *buf, size_t count)
+{
+    uart_send_bytes(STM_UART_MGMT, (uint8_t *) buf, count);
+    return (int) count;
+}
+
+int embedded_cli_loop(struct cli_def *cli)
+{
+    unsigned char c;
+    int n = 0;
+    static struct cli_loop_ctx ctx;
+
+    memset(&ctx, 0, sizeof(ctx));
+    ctx.insertmode = 1;
+
+    cli->state = CLI_STATE_LOGIN;
+
+    /* start off in unprivileged mode */
+    cli_set_privilege(cli, PRIVILEGE_UNPRIVILEGED);
+    cli_set_configmode(cli, MODE_EXEC, NULL);
+
+    cli_error(cli, "%s", cli->banner);
+
+    while (1) {
+	cli_loop_start_new_command(cli, &ctx);
+	HAL_GPIO_TogglePin(LED_PORT, LED_YELLOW);
+
+	while (1) {
+	    HAL_GPIO_TogglePin(LED_PORT, LED_BLUE);
+
+	    cli_loop_show_prompt(cli, &ctx);
+
+	    n = cli_loop_read_next_char(cli, &ctx, &c);
+
+	    //cli_print(cli, "Next char: '%c' (n == %i)", c, n);
+	    if (n == CLI_LOOP_CTRL_BREAK)
+		break;
+	    if (n == CLI_LOOP_CTRL_CONTINUE)
+		continue;
+
+	    n = cli_loop_process_char(cli, &ctx, c);
+	    if (n == CLI_LOOP_CTRL_BREAK)
+		break;
+	    if (n == CLI_LOOP_CTRL_CONTINUE)
+		continue;
+	}
+
+	if (ctx.l < 0) break;
+
+	//cli_print(cli, "Process command: '%s'", ctx.cmd);
+	n = cli_loop_process_cmd(cli, &ctx);
+	if (n == CLI_LOOP_CTRL_BREAK)
+	    break;
+    }
+
+    return CLI_OK;
+}
+
+void mgmt_cli_init(struct cli_def *cli)
+{
+    cli_init(cli);
+    cli_read_callback(cli, uart_cli_read);
+    cli_write_callback(cli, uart_cli_write);
+    cli_print_callback(cli, uart_cli_print);
+    cli_set_banner(cli, "Cryptech Alpha");
+    cli_set_hostname(cli, "cryptech");
+    cli_telnet_protocol(cli, 0);
+}
diff --git a/projects/cli-test/mgmt-cli.h b/projects/cli-test/mgmt-cli.h
new file mode 100644
index 0000000..2f1f139
--- /dev/null
+++ b/projects/cli-test/mgmt-cli.h
@@ -0,0 +1,50 @@
+/*
+ * mgmt-cli.h
+ * ---------
+ * Management CLI code.
+ *
+ * Copyright (c) 2016, NORDUnet A/S All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ * - Redistributions of source code must retain the above copyright notice,
+ *   this list of conditions and the following disclaimer.
+ *
+ * - 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.
+ *
+ * - Neither the name of the NORDUnet 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.
+ */
+
+#ifndef __STM32_MGMT_CLI_H
+#define __STM32_MGMT_CLI_H
+
+#include "stm32f4xx_hal.h"
+#include <libcli.h>
+
+extern void uart_cli_print(struct cli_def *cli __attribute__ ((unused)), const char *buf);
+extern int uart_cli_read(struct cli_def *cli __attribute__ ((unused)), void *buf, size_t count);
+extern int uart_cli_write(struct cli_def *cli __attribute__ ((unused)), const void *buf, size_t count);
+extern int embedded_cli_loop(struct cli_def *cli);
+extern void mgmt_cli_init(struct cli_def *cli);
+
+extern __IO ITStatus MgmtUartDataReceived;
+extern __IO ITStatus MgmtUartShouldCli;
+
+#endif /* __STM32_MGMT_CLI_H */



More information about the Commits mailing list