From 936fd0145896acbf55de496f036af55a01b80e82 Mon Sep 17 00:00:00 2001 From: "Luke T. Shumaker" Date: Fri, 15 Nov 2024 11:58:59 -0700 Subject: libhw_generic: Split into a separate library --- libhw_generic/include/libhw/generic/spi.h | 47 +++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 libhw_generic/include/libhw/generic/spi.h (limited to 'libhw_generic/include/libhw/generic/spi.h') diff --git a/libhw_generic/include/libhw/generic/spi.h b/libhw_generic/include/libhw/generic/spi.h new file mode 100644 index 0000000..2207a2c --- /dev/null +++ b/libhw_generic/include/libhw/generic/spi.h @@ -0,0 +1,47 @@ +/* libhw/generic/spi.h - Device-independent SPI definitions + * + * Copyright (C) 2024 Luke T. Shumaker + * SPDX-License-Identifier: AGPL-3.0-or-later + */ + +#ifndef _LIBHW_GENERIC_SPI_H_ +#define _LIBHW_GENERIC_SPI_H_ + +#include /* for size_t */ + +enum spi_mode { + SPI_MODE_0 = 0, /* clk_polarity=0 (idle low), clk_phase=0 (sample on rise) */ + SPI_MODE_1 = 1, /* clk_polarity=0 (idle low), clk_phase=1 (sample on fall) */ + SPI_MODE_2 = 2, /* clk_polarity=1 (idle high), clk_phase=0 (sample on rise) */ + SPI_MODE_3 = 3, /* clk_polarity=1 (idle high), clk_phase=1 (sample on fall) */ +}; + +struct bidi_iovec { + void *iov_read_dst; + void *iov_write_src; + size_t iov_len; +}; + +struct spi_vtable; + +typedef struct { + struct spi_vtable *vtable; +} implements_spi; + +/* This API assumes that an SPI frame is a multiple of 8-bits. + * + * It is my understanding that this is a common constraint of SPI + * hardware, and that the RP2040 is somewhat unusual in that it allows + * frames of any length 4-16 bits (we disconnect the CS pin from the + * PL022 SSP and manually GPIO it from the CPU in order to achieve + * longer frames). + * + * But, more relevantly: The W5500's protocol uses frames that are 4-N + * octets; so we have no need for an API that allows a + * non-multiple-of-8 number of bits. + */ +struct spi_vtable { + void (*readwritev)(implements_spi *, const struct bidi_iovec *iov, int iovcnt); +}; + +#endif /* _LIBHW_GENERIC_SPI_H_ */ -- cgit v1.2.3-2-g168b