1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/tests/riotboot_flashwrite/main.c
2021-06-07 08:55:34 +02:00

130 lines
3.5 KiB
C

/*
* Copyright (C) 2016 Kaspar Schleiser <kaspar@schleiser.de>
*
* 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 <kaspar@schleiser.de>
* @}
*/
#include <stdio.h>
#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 <slot number>");
}
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 <slot number>", 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;
}