/* SPDX-License-Identifier: BSD-3-Clause */
|
/*
|
* Copyright (c) 2020-2021 Rockchip Electronics Co., Ltd.
|
*/
|
|
#ifndef _HAL_SPI_MEM_H_
|
#define _HAL_SPI_MEM_H_
|
|
#define BIT(nr) (1UL << (nr))
|
/** SPI Memory host mode */
|
#define HAL_SPI_CPHA BIT(0) /**< clock phase */
|
#define HAL_SPI_CPOL BIT(1) /**< clock polarity */
|
#define HAL_SPI_MODE_0 (0 | 0) /**< (original MicroWire) */
|
#define HAL_SPI_MODE_1 (0 | HAL_SPI_CPHA)
|
#define HAL_SPI_MODE_2 (HAL_SPI_CPOL | 0)
|
#define HAL_SPI_MODE_3 (HAL_SPI_CPOL | HAL_SPI_CPHA)
|
#define HAL_SPI_CS_HIGH BIT(2) /**< CS active high */
|
#define HAL_SPI_LSB_FIRST BIT(3) /**< per-word bits-on-wire */
|
#define HAL_SPI_3WIRE BIT(4) /**< SI/SO signals shared */
|
#define HAL_SPI_LOOP BIT(5) /**< loopback mode */
|
#define HAL_SPI_SLAVE BIT(6) /**< slave mode */
|
#define HAL_SPI_PREAMBLE BIT(7) /**< Skip preamble bytes */
|
#define HAL_SPI_TX_BYTE BIT(8) /**< transmit with 1 wire byte */
|
#define HAL_SPI_TX_DUAL BIT(9) /**< transmit with 2 wires */
|
#define HAL_SPI_TX_QUAD BIT(10) /**< transmit with 4 wires */
|
#define HAL_SPI_RX_SLOW BIT(11) /**< receive with 1 wire slow */
|
#define HAL_SPI_RX_DUAL BIT(12) /**< receive with 2 wires */
|
#define HAL_SPI_RX_QUAD BIT(13) /**< receive with 4 wires */
|
#define HAL_SPI_XIP BIT(14) /**< support spi flash xip mode */
|
|
/** SPI Memory host xfer flags */
|
#define HAL_SPI_XFER_BEGIN BIT(0) /**< Assert CS before transfer */
|
#define HAL_SPI_XFER_END BIT(1) /**< Deassert CS after transfer */
|
#define HAL_SPI_XFER_ONCE (HAL_SPI_XFER_BEGIN | HAL_SPI_XFER_END)
|
|
#define JEDEC_MFR(id) (((id) >> 16) & 0xff)
|
|
#define HAL_SPI_MEM_OP_FORMAT(__cmd, __addr, __dummy, __data) \
|
{ \
|
.cmd = __cmd, \
|
.addr = __addr, \
|
.dummy = __dummy, \
|
.data = __data, \
|
}
|
|
#define HAL_SPI_MEM_OP_CMD(__opcode, __buswidth) \
|
{ \
|
.buswidth = __buswidth, \
|
.opcode = __opcode, \
|
}
|
|
#define HAL_SPI_MEM_OP_ADDR(__nbytes, __val, __buswidth) \
|
{ \
|
.nbytes = __nbytes, \
|
.val = __val, \
|
.buswidth = __buswidth, \
|
}
|
|
#define HAL_SPI_MEM_OP_NO_ADDR \
|
{ \
|
.nbytes = 0, \
|
.val = 0, \
|
.buswidth = 0, \
|
}
|
|
#define HAL_SPI_MEM_OP_DUMMY(__nbytes, __buswidth) \
|
{ \
|
.a2dIdle = 0, \
|
.nbytes = __nbytes, \
|
.buswidth = __buswidth, \
|
}
|
|
#define HAL_SPI_MEM_OP_NO_DUMMY \
|
{ \
|
.a2dIdle = 0, \
|
.nbytes = 0, \
|
.buswidth = 0, \
|
}
|
|
#define HAL_SPI_MEM_OP_DATA_IN(__nbytes, __buf, __buswidth) \
|
{ \
|
.dir = HAL_SPI_MEM_DATA_IN, \
|
.nbytes = __nbytes, \
|
.buf.in = __buf, \
|
.buswidth = __buswidth, \
|
}
|
|
#define HAL_SPI_MEM_OP_DATA_OUT(__nbytes, __buf, __buswidth) \
|
{ \
|
.dir = HAL_SPI_MEM_DATA_OUT, \
|
.nbytes = __nbytes, \
|
.buf.out = __buf, \
|
.buswidth = __buswidth, \
|
}
|
|
#define HAL_SPI_MEM_OP_NO_DATA \
|
{ \
|
.dir = HAL_SPI_MEM_DATA_IN, \
|
.nbytes = 0, \
|
.buf.out = NULL, \
|
.buswidth = 0, \
|
}
|
|
/* Max len case: cmd(1) + addr(4) + dummy(4) */
|
#define HAL_SPI_OP_LEN_MAX 0x10
|
|
/***************************** Structure Definition **************************/
|
|
enum SPI_MEM_DATA_DIR {
|
HAL_SPI_MEM_DATA_IN,
|
HAL_SPI_MEM_DATA_OUT,
|
};
|
|
struct HAL_SPI_MEM_OP {
|
struct {
|
uint8_t buswidth;
|
uint8_t opcode;
|
} cmd;
|
|
struct {
|
uint8_t nbytes;
|
uint8_t buswidth;
|
uint32_t val;
|
} addr;
|
|
struct {
|
uint8_t a2dIdle;
|
uint8_t nbytes;
|
uint8_t buswidth;
|
} dummy;
|
|
struct {
|
uint8_t buswidth;
|
enum SPI_MEM_DATA_DIR dir;
|
unsigned int nbytes;
|
/**< buf.{in,out} must be DMA-able. */
|
union {
|
void *in;
|
const void *out;
|
} buf;
|
} data;
|
};
|
|
#define HAL_SPI_MEM_OP(__cmd, __addr, __dummy, __data) \
|
{ \
|
.cmd = __cmd, \
|
.addr = __addr, \
|
.dummy = __dummy, \
|
.data = __data, \
|
}
|
|
#endif
|