/* * Copyright (C) 2016 Kaspar Schleiser * * This file is subject to the terms and conditions of the GNU Lesser * General Public License v2.1. See the file LICENSE in the top level * directory for more details. */ /** * @ingroup tests * @{ * * @file * @brief riotboot_flashwrite test application * * @author Kaspar Schleiser * @} */ #include #include "thread.h" #include "irq.h" #include "net/nanocoap_sock.h" #include "shell.h" #include "riotboot/slot.h" #include "riotboot/flashwrite.h" #define COAP_INBUF_SIZE (256U) /* Extend stacksize of nanocoap server thread */ static char _nanocoap_server_stack[THREAD_STACKSIZE_DEFAULT + THREAD_EXTRA_STACKSIZE_PRINTF]; #define NANOCOAP_SERVER_QUEUE_SIZE (8) static msg_t _nanocoap_server_msg_queue[NANOCOAP_SERVER_QUEUE_SIZE]; #define MAIN_QUEUE_SIZE (8) static msg_t _main_msg_queue[MAIN_QUEUE_SIZE]; static void *_nanocoap_server_thread(void *arg) { (void)arg; /* nanocoap_server uses gnrc sock which uses gnrc which needs a msg queue */ msg_init_queue(_nanocoap_server_msg_queue, NANOCOAP_SERVER_QUEUE_SIZE); /* initialize nanocoap server instance */ uint8_t buf[COAP_INBUF_SIZE]; sock_udp_ep_t local = { .port=COAP_PORT, .family=AF_INET6 }; nanocoap_server(&local, buf, sizeof(buf)); return NULL; } static int cmd_print_riotboot_hdr(int argc, char **argv) { (void)argc; (void)argv; int current_slot = riotboot_slot_current(); if (current_slot != -1) { /* Sometimes, udhcp output messes up the following printfs. That * confuses the test script. As a workaround, just disable interrupts * for a while. */ unsigned state = irq_disable(); riotboot_slot_print_hdr(current_slot); irq_restore(state); } else { puts("[FAILED] You're not running riotboot"); } return 0; } static int cmd_print_current_slot(int argc, char **argv) { (void)argc; (void)argv; /* Sometimes, udhcp output messes up the following printfs. That * confuses the test script. As a workaround, just disable interrupts * for a while. */ unsigned state = irq_disable(); printf("Running from slot %d\n", riotboot_slot_current()); irq_restore(state); return 0; } static int cmd_riotboot_invalidate(int argc, char **argv) { if (argc < 2) { puts("usage: riotboot-invalidate "); } riotboot_flashwrite_invalidate(atoi(argv[1])); return 0; } static const shell_command_t shell_commands[] = { { "current-slot", "Print current slot number", cmd_print_current_slot }, { "riotboot-hdr", "Print current slot header", cmd_print_riotboot_hdr }, { "riotboot-invalidate", "Invalidate slot ", cmd_riotboot_invalidate }, { NULL, NULL, NULL } }; int main(void) { puts("riotboot_flashwrite test application"); cmd_print_current_slot(0, NULL); cmd_print_riotboot_hdr(0, NULL); /* start nanocoap server thread */ thread_create(_nanocoap_server_stack, sizeof(_nanocoap_server_stack), THREAD_PRIORITY_MAIN - 1, THREAD_CREATE_STACKTEST, _nanocoap_server_thread, NULL, "nanocoap server"); /* the shell contains commands that receive packets via GNRC and thus needs a msg queue */ msg_init_queue(_main_msg_queue, MAIN_QUEUE_SIZE); puts("Starting the shell"); char line_buf[SHELL_DEFAULT_BUFSIZE]; shell_run(shell_commands, line_buf, SHELL_DEFAULT_BUFSIZE); return 0; }