Linux Audio

Check our new training course

Embedded Linux Audio

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

Bootlin logo

Elixir Cross Referencer

Loading...
/* spi.c - SPI test source file */

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

#include <zephyr.h>
#include <string.h>
#include <spi.h>
#include <misc/printk.h>

#define SPI_DRV_NAME CONFIG_SPI_0_NAME

#ifdef CONFIG_SPI_INTEL
#include <spi/spi_intel.h>
#if defined(CONFIG_SPI_1)
#define SPI_DRV_NAME CONFIG_SPI_1_NAME
#endif
#define SPI_SLAVE 0
#elif defined(CONFIG_SPI_DW)
#define SPI_MAX_CLK_FREQ_250KHZ 128
#define SPI_SLAVE 2
#elif defined(CONFIG_SPI_QMSI)
#define SPI_MAX_CLK_FREQ_250KHZ 128
#define SPI_SLAVE 1
#elif defined(CONFIG_SPI_MCUX)
#define SPI_MAX_CLK_FREQ_250KHZ KHZ(250)
#define SPI_SLAVE 0
#endif

unsigned char wbuf[16] = "Hello";
unsigned char rbuf[16] = {};

static void print_buf_hex(unsigned char *b, uint32_t len)
{
	for (; len > 0; len--) {
		printk("0x%x ", *(b++));
	}

	printk("\n");
}

struct spi_config spi_conf = {
	.config = SPI_MODE_CPOL | SPI_MODE_CPHA | (8 << 4),
	.max_sys_freq = SPI_MAX_CLK_FREQ_250KHZ,
};

static void _spi_show(struct spi_config *spi_conf)
{
	printk("SPI Configuration:\n");
	printk("\tbits per word: %u\n", SPI_WORD_SIZE_GET(spi_conf->config));
	printk("\tMode: %u\n", SPI_MODE(spi_conf->config));
	printk("\tMax speed Hz: 0x%X\n", spi_conf->max_sys_freq);
}

void main(void)
{
	struct device *spi;
	uint32_t len = 0;

	printk("==== SPI Test Application ====\n");

	spi = device_get_binding(SPI_DRV_NAME);
	if (!spi) {
		printk("SPI device not found\n");
		return;
	}

	printk("Running...\n");

	if (spi_configure(spi, &spi_conf) != 0) {
		printk("SPI config failed\n");
		return;
	}

	if (spi_slave_select(spi, SPI_SLAVE) != 0) {
		printk("SPI slave select failed\n");
		return;
	}

	_spi_show(&spi_conf);

	printk("Writing...\n");

	if (spi_write(spi, (uint8_t *) wbuf, 6) != 0) {
		printk("SPI write failed\n");
		return;
	}

	printk("SPI sent: %s\n", wbuf);
	print_buf_hex(wbuf, 6);

	strcpy((char *)wbuf, "So what then?");

	len = strlen((char *) wbuf);
	/*
	 * len does not include string terminator.
	 * Let's sent the terminator as well.
	 * Also make sure tx and rx have the same length.
	 */
	if (spi_transceive(spi, wbuf, len + 1, rbuf, len + 1) != 0) {
		printk("SPI transceive failed\n");
		return;
	}

	printk("SPI transceived: %s\n", rbuf);
	print_buf_hex(rbuf, 6);
}