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

/*
 * Copyright (c) 2015 Intel Corporation.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#include <zephyr.h>

#if defined(CONFIG_STDOUT_CONSOLE)
#include <stdio.h>
#define PRINT printf
#else
#include <misc/printk.h>
#define PRINT printk
#endif

#include <string.h>
#include <spi.h>
#define SPI_DRV_NAME "SPI_0"

#ifdef CONFIG_SPI_INTEL
#include <spi/spi_intel.h>
#if defined(CONFIG_SPI_INTEL_PORT_1)
#define SPI_DRV_NAME "SPI_1"
#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
#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--) {
		PRINT("0x%x ", *(b++));
	}

	PRINT("\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)
{
	PRINT("SPI Configuration:\n");
	PRINT("\tbits per word: %u\n", SPI_WORD_SIZE_GET(spi_conf->config));
	PRINT("\tMode: %u\n", SPI_MODE(spi_conf->config));
	PRINT("\tMax speed Hz: 0x%X\n", spi_conf->max_sys_freq);
}

void main(void)
{
	struct device *spi;

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

	spi = device_get_binding(SPI_DRV_NAME);

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

	spi_configure(spi, &spi_conf);
	spi_slave_select(spi, SPI_SLAVE);

	_spi_show(&spi_conf);

	PRINT("Writing...\n");
	spi_write(spi, (uint8_t *) wbuf, 6);

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

	strcpy(wbuf, "So what then?");
	spi_transceive(spi, wbuf, 14, rbuf, 16);

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