Linux preempt-rt

Check our new training course

Real-Time Linux with PREEMPT_RT

Check our new training course
with Creative Commons CC-BY-SA
lecture and lab materials

Bootlin logo

Elixir Cross Referencer

/*
 * Copyright (c) 2015 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr.h>
#include <stdio.h>
#include <zephyr/types.h>
#include <string.h>
#include <drivers/uart.h>
#include <sys/byteorder.h>

#define BUF_MAXSIZE	256
#define SLEEP_TIME	500

static struct device *uart1_dev;
static u8_t rx_buf[BUF_MAXSIZE];
static u8_t tx_buf[BUF_MAXSIZE];
static u8_t nci_reset[] = {0x20, 0x00, 0x01, 0x00};

static void msg_dump(const char *s, u8_t *data, unsigned len)
{
	unsigned i;

	printf("%s: ", s);
	for (i = 0U; i < len; i++) {
		printf("%02x ", data[i]);
	}
	printf("(%u bytes)\n", len);
}

static void uart1_isr(struct device *x)
{
	int len = uart_fifo_read(uart1_dev, rx_buf, BUF_MAXSIZE);

	ARG_UNUSED(x);
	msg_dump(__func__, rx_buf, len);
}

static void uart1_init(void)
{
	uart1_dev = device_get_binding("UART_1");

	uart_irq_callback_set(uart1_dev, uart1_isr);
	uart_irq_rx_enable(uart1_dev);

	printf("%s() done\n", __func__);
}

void main(void)
{
	u32_t *size = (u32_t *)tx_buf;

	printf("Sample app running on: %s\n", CONFIG_ARCH);

	uart1_init();

	/* 4 bytes for the payload's length */
	UNALIGNED_PUT(sys_cpu_to_be32(sizeof(nci_reset)), size);

	/* NFC Controller Interface reset cmd */
	memcpy(tx_buf + sizeof(u32_t), nci_reset, sizeof(nci_reset));

	/*
	 * Peer will receive: 0x00 0x00 0x00 0x04 0x20 0x00 0x01 0x00
	 *	                nci_reset size   +    nci_reset cmd
	 */
	uart_fifo_fill(uart1_dev, tx_buf, sizeof(u32_t) + sizeof(nci_reset));

	while (1) {
		k_sleep(SLEEP_TIME);
	}
}