C++-ize W6300 driver: remove vtable indirection, constexpr pins, pragma once

This commit is contained in:
Ian Gulliver
2026-04-04 16:22:37 +09:00
parent dec8d0c68d
commit 92e00476da
16 changed files with 967 additions and 1655 deletions

108
w6300/w6300.cpp Normal file
View File

@@ -0,0 +1,108 @@
#include "w6300.h"
#include "wizchip_qspi_pio.h"
static uint8_t make_opcode(uint32_t addr, uint8_t rw) {
return static_cast<uint8_t>((addr & 0xFF) | rw | _WIZCHIP_QSPI_MODE_);
}
static uint16_t make_addr(uint32_t addr) {
return static_cast<uint16_t>((addr & 0x00FFFF00) >> 8);
}
void WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb) {
WIZCHIP_CRITICAL_ENTER();
wizchip_pio_frame_start();
wizchip_pio_write(make_opcode(AddrSel, W6300_SPI_WRITE), make_addr(AddrSel), &wb, 1);
wizchip_pio_frame_end();
WIZCHIP_CRITICAL_EXIT();
}
uint8_t WIZCHIP_READ(uint32_t AddrSel) {
uint8_t ret[2] = {0};
WIZCHIP_CRITICAL_ENTER();
wizchip_pio_frame_start();
wizchip_pio_read(make_opcode(AddrSel, W6300_SPI_READ), make_addr(AddrSel), ret, 1);
wizchip_pio_frame_end();
WIZCHIP_CRITICAL_EXIT();
return ret[0];
}
void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, datasize_t len) {
WIZCHIP_CRITICAL_ENTER();
wizchip_pio_frame_start();
wizchip_pio_write(make_opcode(AddrSel, W6300_SPI_WRITE), make_addr(AddrSel), pBuf, len);
wizchip_pio_frame_end();
WIZCHIP_CRITICAL_EXIT();
}
void WIZCHIP_READ_BUF(uint32_t AddrSel, uint8_t* pBuf, datasize_t len) {
WIZCHIP_CRITICAL_ENTER();
wizchip_pio_frame_start();
wizchip_pio_read(make_opcode(AddrSel, W6300_SPI_READ), make_addr(AddrSel), pBuf, len);
wizchip_pio_frame_end();
WIZCHIP_CRITICAL_EXIT();
}
uint16_t getSn_TX_FSR(uint8_t sn) {
uint16_t prev_val = -1, val = 0;
do {
prev_val = val;
val = WIZCHIP_READ(_Sn_TX_FSR_(sn));
val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(_Sn_TX_FSR_(sn), 1));
} while (val != prev_val);
return val;
}
uint16_t getSn_RX_RSR(uint8_t sn) {
uint16_t prev_val = -1, val = 0;
do {
prev_val = val;
val = WIZCHIP_READ(_Sn_RX_RSR_(sn));
val = (val << 8) + WIZCHIP_READ(WIZCHIP_OFFSET_INC(_Sn_RX_RSR_(sn), 1));
} while (val != prev_val);
return val;
}
void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint16_t len) {
uint16_t ptr = getSn_TX_WR(sn);
uint32_t addrsel = ((uint32_t)ptr << 8) + WIZCHIP_TXBUF_BLOCK(sn);
WIZCHIP_WRITE_BUF(addrsel, wizdata, len);
ptr += len;
setSn_TX_WR(sn, ptr);
}
void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len) {
if (len == 0) return;
uint16_t ptr = getSn_RX_RD(sn);
uint32_t addrsel = ((uint32_t)ptr << 8) + WIZCHIP_RXBUF_BLOCK(sn);
WIZCHIP_READ_BUF(addrsel, wizdata, len);
ptr += len;
setSn_RX_RD(sn, ptr);
}
void wiz_recv_ignore(uint8_t sn, uint16_t len) {
setSn_RX_RD(sn, getSn_RX_RD(sn) + len);
}
void wiz_delay_ms(uint32_t milliseconds) {
for (uint32_t i = 0; i < milliseconds; i++) {
setTCNTRCLR(0xff);
while (getTCNTR() < 0x0a) {}
}
}
#if (_PHY_IO_MODE_ == _PHY_IO_MODE_MII_)
void wiz_mdio_write(uint8_t phyregaddr, uint16_t var) {
setPHYRAR(phyregaddr);
setPHYDIR(var);
setPHYACR(PHYACR_WRITE);
while (getPHYACR());
}
uint16_t wiz_mdio_read(uint8_t phyregaddr) {
setPHYRAR(phyregaddr);
setPHYACR(PHYACR_READ);
while (getPHYACR());
return getPHYDOR();
}
#endif