[Cryptech-Commits] [sw/stm32] 06/12: Add test program for libcli based CLI.

git at cryptech.is git at cryptech.is
Mon May 16 09:43:19 UTC 2016


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

fredrik at thulin.net pushed a commit to branch ft-alpha_board_bringup
in repository sw/stm32.

commit c670d7b194eea62d6fd6f9de0ae4025abe076ad4
Author: Fredrik Thulin <fredrik at thulin.net>
AuthorDate: Fri May 13 12:52:38 2016 +0200

    Add test program for libcli based CLI.
---
 projects/cli-test/Makefile   |  21 ++++++
 projects/cli-test/cli-test.c | 165 +++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 186 insertions(+)

diff --git a/projects/cli-test/Makefile b/projects/cli-test/Makefile
new file mode 100644
index 0000000..1f1f890
--- /dev/null
+++ b/projects/cli-test/Makefile
@@ -0,0 +1,21 @@
+TEST = cli-test
+
+CFLAGS += -I$(LIBCLI_DIR)
+LIBS += $(LIBCLI_DIR)/libcli.a
+
+all: $(TEST:=.elf)
+
+%.elf: %.o $(BOARD_OBJS) $(LIBS)
+	$(CC) $(CFLAGS) $^ -o $@ -T$(LDSCRIPT) -g -Wl,-Map=$*.map
+	$(OBJCOPY) -O ihex $*.elf $*.hex
+	$(OBJCOPY) -O binary $*.elf $*.bin
+	$(OBJDUMP) -St $*.elf >$*.lst
+	$(SIZE) $*.elf
+
+clean:
+	rm -f *.o
+	rm -f *.elf
+	rm -f *.hex
+	rm -f *.bin
+	rm -f *.map
+	rm -f *.lst
diff --git a/projects/cli-test/cli-test.c b/projects/cli-test/cli-test.c
new file mode 100644
index 0000000..2f246a5
--- /dev/null
+++ b/projects/cli-test/cli-test.c
@@ -0,0 +1,165 @@
+/*
+ * Test code with a small CLI on the management interface
+ *
+ */
+#include "stm32f4xx_hal.h"
+#include "stm-init.h"
+#include "stm-led.h"
+#include "stm-uart.h"
+
+#include <string.h>
+#include <libcli.h>
+
+#define DELAY() HAL_Delay(250)
+
+int cmd_show_cpuspeed(struct cli_def *cli, const char *command, char *argv[], int argc)
+{
+    volatile uint32_t hclk;
+
+    hclk = HAL_RCC_GetHCLKFreq();
+    cli_print(cli, "HCLK: %li (%i MHz)", hclk, (int) hclk / 1000 / 1000);
+    return CLI_OK;
+}
+
+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;
+}
+
+int check_auth(const char *username, const char *password)
+{
+    if (strcasecmp(username, "ct") != 0)
+	return CLI_ERROR;
+    if (strcasecmp(password, "ct") != 0)
+	return CLI_ERROR;
+    return CLI_OK;
+}
+
+int
+main()
+{
+    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",
+                                             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);
+
+    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");
+    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);
+
+    HAL_GPIO_WritePin(LED_PORT, LED_RED, GPIO_PIN_RESET);
+    HAL_GPIO_WritePin(LED_PORT, LED_GREEN, GPIO_PIN_SET);
+
+    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;
+	    }
+	}
+
+	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);
+	}
+    }
+}



More information about the Commits mailing list