summaryrefslogtreecommitdiff
path: root/libhw_cr/w5500_ll.h
diff options
context:
space:
mode:
Diffstat (limited to 'libhw_cr/w5500_ll.h')
-rw-r--r--libhw_cr/w5500_ll.h91
1 files changed, 8 insertions, 83 deletions
diff --git a/libhw_cr/w5500_ll.h b/libhw_cr/w5500_ll.h
index aa41e7a..eeb2fb7 100644
--- a/libhw_cr/w5500_ll.h
+++ b/libhw_cr/w5500_ll.h
@@ -1,4 +1,4 @@
-/* libhw_cr/w5500_ll.h - Low-level header library for the WIZnet W5500 chip
+/* libhw_cr/w5500_ll.h - Low-level library for the WIZnet W5500 chip
*
* Based entirely on the W5500 datasheet, v1.1.0.
* https://docs.wiznet.io/img/products/w5500/W5500_ds_v110e.pdf
@@ -13,8 +13,7 @@
#include <stdint.h> /* for uint{n}_t */
#include <string.h> /* for memcmp() */
-#include <libmisc/alloc.h> /* for stack_alloc() */
-#include <libmisc/assert.h> /* for assert(), static_assert() */
+#include <libmisc/assert.h> /* for static_assert() */
#include <libmisc/endian.h> /* for uint16be_t */
#include <libhw/generic/net.h> /* for struct net_eth_addr, struct net_ip4_addr */
@@ -53,102 +52,28 @@
#define CTL_OM_FDM2 0b10 /* fixed-length data mode: 2 byte data length */
#define CTL_OM_FDM4 0b11 /* fixed-length data mode: 4 byte data length */
-#if CONFIG_W5500_LL_DEBUG
-static void fmt_print_ctl_block(lo_interface fmt_dest, uint8_t b) {
- static char *strs[] = {
- "RES",
- "REG",
- "TX",
- "RX",
- };
- fmt_print("CTL_BLOCK_SOCK(", (base10, (((b)>>5) & 0b111)), ", ", strs[((b)>>3)&0b11], ")");
-}
-#endif
-
/* Even though SPI is a full-duplex protocol, the W5500's spiframe on top of it is only half-duplex.
* Lame. */
-static inline void
#if CONFIG_W5500_LL_DEBUG
#define w5500ll_writev(...) _w5500ll_writev(__func__, __VA_ARGS__)
-_w5500ll_writev(const char *func,
+void _w5500ll_writev(const char *func,
#else
-w5500ll_writev(
+void w5500ll_writev(
#endif
lo_interface spi spidev, uint16_t addr, uint8_t block,
const struct iovec *iov, int iovcnt,
- size_t skip, size_t max)
-{
- assert(!LO_IS_NULL(spidev));
- assert((block & ~CTL_MASK_BLOCK) == 0);
- assert(iov);
- assert(iovcnt > 0);
-#if CONFIG_W5500_LL_DEBUG
- log_n_debugln(W5500_LL,
- func, "(): w5500ll_write(spidev",
- ", addr=", (base16_u16_, addr),
- ", block=", (ctl_block, block),
- ", iov",
- ", iovcnt=", iovcnt,
- ")");
-#endif
+ size_t skip, size_t max);
- uint8_t header[] = {
- (uint8_t)((addr >> 8) & 0xFF),
- (uint8_t)(addr & 0xFF),
- (block & CTL_MASK_BLOCK) | CTL_W | CTL_OM_VDM,
- };
- int inner_cnt = 1+io_slice_cnt(iov, iovcnt, skip, max);
- struct duplex_iovec *inner = stack_alloc(inner_cnt, struct duplex_iovec);
- inner[0] = (struct duplex_iovec){
- .iov_read_to = IOVEC_DISCARD,
- .iov_write_from = header,
- .iov_len = sizeof(header),
- };
- io_slice_wr_to_duplex(&inner[1], iov, iovcnt, skip, max);
- LO_CALL(spidev, readwritev, inner, inner_cnt);
-}
-
-static inline void
#if CONFIG_W5500_LL_DEBUG
#define w5500ll_readv(...) _w5500ll_read(__func__, __VA_ARGS__)
-_w5500ll_readv(const char *func,
+void _w5500ll_readv(const char *func,
#else
-w5500ll_readv(
+void w5500ll_readv(
#endif
lo_interface spi spidev, uint16_t addr, uint8_t block,
const struct iovec *iov, int iovcnt,
- size_t max)
-{
- assert(!LO_IS_NULL(spidev));
- assert((block & ~CTL_MASK_BLOCK) == 0);
- assert(iov);
- assert(iovcnt > 0);
-#if CONFIG_W5500_LL_DEBUG
- log_n_debugln(W5500_LL,
- func, "(): w5500ll_read(spidev",
- ", addr=", (base16_u16_, addr),
- ", block=", (ctl_block, block),
- ", iov",
- ", iovcnt=", iovcnt,
- ")");
-#endif
-
- uint8_t header[] = {
- (uint8_t)((addr >> 8) & 0xFF),
- (uint8_t)(addr & 0xFF),
- (block & CTL_MASK_BLOCK) | CTL_R | CTL_OM_VDM,
- };
- int inner_cnt = 1+io_slice_cnt(iov, iovcnt, 0, max);
- struct duplex_iovec *inner = stack_alloc(inner_cnt, struct duplex_iovec);
- inner[0] = (struct duplex_iovec){
- .iov_read_to = IOVEC_DISCARD,
- .iov_write_from = header,
- .iov_len = sizeof(header),
- };
- io_slice_rd_to_duplex(&inner[1], iov, iovcnt, 0, max);
- LO_CALL(spidev, readwritev, inner, inner_cnt);
-}
+ size_t max);
/* Common chip-wide registers. ***********************************************/