2018-01-18 09:59:49 +08:00
|
|
|
/*
|
|
|
|
* Copyright Runtime.io 2018. All rights reserved.
|
|
|
|
*
|
|
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
|
|
*/
|
|
|
|
|
|
|
|
/** @file
|
|
|
|
* @brief Shell transport for the mcumgr SMP protocol.
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include <string.h>
|
|
|
|
#include <zephyr.h>
|
|
|
|
#include <init.h>
|
|
|
|
#include "net/buf.h"
|
2018-08-09 14:18:18 +08:00
|
|
|
#include "shell/legacy_shell.h"
|
2018-01-18 09:59:49 +08:00
|
|
|
#include "mgmt/mgmt.h"
|
|
|
|
#include "mgmt/serial.h"
|
|
|
|
#include "mgmt/buf.h"
|
|
|
|
#include "mgmt/smp.h"
|
|
|
|
|
|
|
|
struct device;
|
|
|
|
|
|
|
|
static struct zephyr_smp_transport smp_shell_transport;
|
|
|
|
|
|
|
|
static struct mcumgr_serial_rx_ctxt smp_shell_rx_ctxt;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Processes a single line (i.e., a single SMP frame)
|
|
|
|
*/
|
|
|
|
static int smp_shell_rx_line(const char *line, void *arg)
|
|
|
|
{
|
|
|
|
struct net_buf *nb;
|
|
|
|
int line_len;
|
|
|
|
|
|
|
|
/* Strip the trailing newline. */
|
|
|
|
line_len = strlen(line) - 1;
|
|
|
|
|
|
|
|
nb = mcumgr_serial_process_frag(&smp_shell_rx_ctxt, line, line_len);
|
|
|
|
if (nb != NULL) {
|
|
|
|
zephyr_smp_rx_req(&smp_shell_transport, nb);
|
|
|
|
}
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static u16_t smp_shell_get_mtu(const struct net_buf *nb)
|
|
|
|
{
|
|
|
|
return CONFIG_MCUMGR_SMP_SHELL_MTU;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int smp_shell_tx_raw(const void *data, int len, void *arg)
|
|
|
|
{
|
|
|
|
/* Cast away const. */
|
|
|
|
k_str_out((void *)data, len);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int smp_shell_tx_pkt(struct zephyr_smp_transport *zst,
|
|
|
|
struct net_buf *nb)
|
|
|
|
{
|
|
|
|
int rc;
|
|
|
|
|
|
|
|
rc = mcumgr_serial_tx_pkt(nb->data, nb->len, smp_shell_tx_raw, NULL);
|
|
|
|
mcumgr_buf_free(nb);
|
|
|
|
|
|
|
|
return rc;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int smp_shell_init(struct device *dev)
|
|
|
|
{
|
|
|
|
ARG_UNUSED(dev);
|
|
|
|
|
|
|
|
zephyr_smp_transport_init(&smp_shell_transport, smp_shell_tx_pkt,
|
2018-07-17 01:22:05 +08:00
|
|
|
smp_shell_get_mtu, NULL, NULL);
|
2018-01-18 09:59:49 +08:00
|
|
|
shell_register_mcumgr_handler(smp_shell_rx_line, NULL);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
SYS_INIT(smp_shell_init, APPLICATION, CONFIG_APPLICATION_INIT_PRIORITY);
|