2026-04-03 21:47:48 +09:00
|
|
|
#include "w6300.h"
|
|
|
|
|
|
|
|
|
|
void WIZCHIP_WRITE(uint32_t AddrSel, uint8_t wb) {
|
|
|
|
|
uint8_t opcode = 0;
|
|
|
|
|
uint16_t ADDR = 0;
|
|
|
|
|
WIZCHIP_CRITICAL_ENTER();
|
|
|
|
|
WIZCHIP.CS._select();
|
|
|
|
|
#if (_WIZCHIP_IO_MODE_ & 0xff00) & _WIZCHIP_IO_MODE_BUS_
|
|
|
|
|
uint8_t tAD[4];
|
|
|
|
|
tAD[0] = (uint8_t)((AddrSel & 0x00FF0000) >> 16);
|
|
|
|
|
tAD[1] = (uint8_t)((AddrSel & 0x0000FF00) >> 8);
|
|
|
|
|
tAD[2] = (uint8_t)(AddrSel & 0x000000ff);
|
|
|
|
|
tAD[3] = wb;
|
|
|
|
|
WIZCHIP.IF.BUS._write_data_buf(IDM_AR0, tAD, 4, 1);
|
2026-04-03 22:37:43 +09:00
|
|
|
#else
|
2026-04-03 21:47:48 +09:00
|
|
|
opcode = (uint8_t)((AddrSel & 0x000000FF) | (_W6300_SPI_WRITE_) | (_WIZCHIP_QSPI_MODE_));
|
|
|
|
|
ADDR = (uint16_t)((AddrSel & 0x00ffff00) >> 8);
|
|
|
|
|
WIZCHIP.IF.QSPI._write_qspi(opcode, ADDR, &wb, 1);
|
|
|
|
|
#endif
|
|
|
|
|
WIZCHIP.CS._deselect();
|
|
|
|
|
WIZCHIP_CRITICAL_EXIT();
|
|
|
|
|
}
|
|
|
|
|
|
2026-04-03 22:37:43 +09:00
|
|
|
uint8_t WIZCHIP_READ(uint32_t AddrSel) {
|
2026-04-03 21:47:48 +09:00
|
|
|
uint8_t ret[2] = {0,};
|
|
|
|
|
uint8_t opcode = 0;
|
|
|
|
|
uint16_t ADDR = 0;
|
|
|
|
|
WIZCHIP_CRITICAL_ENTER();
|
|
|
|
|
WIZCHIP.CS._select();
|
|
|
|
|
#if (_WIZCHIP_IO_MODE_ & 0xff00) & _WIZCHIP_IO_MODE_BUS_
|
|
|
|
|
uint8_t tAD[3];
|
|
|
|
|
tAD[0] = (uint8_t)((AddrSel & 0x00FF0000) >> 16);
|
|
|
|
|
tAD[1] = (uint8_t)((AddrSel & 0x0000FF00) >> 8);
|
|
|
|
|
tAD[2] = (uint8_t)(AddrSel & 0x000000ff);
|
|
|
|
|
WIZCHIP.IF.BUS._write_data_buf(IDM_AR0, tAD, 3, 1);
|
|
|
|
|
ret[0] = WIZCHIP.IF.BUS._read_data(IDM_DR);
|
|
|
|
|
#else
|
|
|
|
|
opcode = (uint8_t)((AddrSel & 0x000000FF) | (_W6300_SPI_READ_) | (_WIZCHIP_QSPI_MODE_));
|
|
|
|
|
ADDR = (uint16_t)((AddrSel & 0x00ffff00) >> 8);
|
|
|
|
|
WIZCHIP.IF.QSPI._read_qspi(opcode, ADDR, ret, 1);
|
|
|
|
|
#endif
|
|
|
|
|
WIZCHIP.CS._deselect();
|
|
|
|
|
WIZCHIP_CRITICAL_EXIT();
|
|
|
|
|
return ret[0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WIZCHIP_WRITE_BUF(uint32_t AddrSel, uint8_t* pBuf, datasize_t len) {
|
|
|
|
|
uint8_t opcode = 0;
|
|
|
|
|
uint16_t ADDR = 0;
|
|
|
|
|
WIZCHIP_CRITICAL_ENTER();
|
|
|
|
|
WIZCHIP.CS._select();
|
|
|
|
|
#if (_WIZCHIP_IO_MODE_ & 0xff00) & _WIZCHIP_IO_MODE_BUS_
|
|
|
|
|
uint8_t tAD[3];
|
|
|
|
|
tAD[0] = (uint8_t)((AddrSel & 0x00FF0000) >> 16);
|
|
|
|
|
tAD[1] = (uint8_t)((AddrSel & 0x0000FF00) >> 8);
|
|
|
|
|
tAD[2] = (uint8_t)(AddrSel & 0x000000ff);
|
|
|
|
|
WIZCHIP.IF.BUS._write_data_buf(IDM_AR0, tAD, 3, 1);
|
|
|
|
|
WIZCHIP.IF.BUS._write_data_buf(IDM_DR, pBuf, len, 0);
|
|
|
|
|
#else
|
|
|
|
|
opcode = (uint8_t)((AddrSel & 0x000000FF) | (_W6300_SPI_WRITE_) | (_WIZCHIP_QSPI_MODE_));
|
|
|
|
|
ADDR = (uint16_t)((AddrSel & 0x00ffff00) >> 8);
|
2026-04-03 22:37:43 +09:00
|
|
|
WIZCHIP.IF.QSPI._write_qspi(opcode, ADDR, pBuf, len);
|
2026-04-03 21:47:48 +09:00
|
|
|
WIZCHIP.CS._deselect();
|
|
|
|
|
WIZCHIP_CRITICAL_EXIT();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void WIZCHIP_READ_BUF(uint32_t AddrSel, uint8_t* pBuf, datasize_t len) {
|
|
|
|
|
uint8_t opcode = 0;
|
|
|
|
|
uint16_t ADDR = 0;
|
|
|
|
|
WIZCHIP_CRITICAL_ENTER();
|
|
|
|
|
WIZCHIP.CS._select();
|
|
|
|
|
#if _WIZCHIP_IO_MODE_ & _WIZCHIP_IO_MODE_BUS_
|
|
|
|
|
uint8_t tAD[3];
|
|
|
|
|
tAD[0] = (uint8_t)((AddrSel & 0x00FF0000) >> 16);
|
|
|
|
|
tAD[1] = (uint8_t)((AddrSel & 0x0000FF00) >> 8);
|
|
|
|
|
tAD[2] = (uint8_t)(AddrSel & 0x000000ff);
|
|
|
|
|
WIZCHIP.IF.BUS._write_data_buf(IDM_AR0, tAD, 3, 1);
|
|
|
|
|
WIZCHIP.IF.BUS._read_data_buf(IDM_DR, pBuf, len, 0);
|
|
|
|
|
#else
|
|
|
|
|
opcode = (uint8_t)((AddrSel & 0x000000FF) | (_W6300_SPI_READ_) | (_WIZCHIP_QSPI_MODE_));
|
|
|
|
|
ADDR = (uint16_t)((AddrSel & 0x00ffff00) >> 8);
|
2026-04-03 22:37:43 +09:00
|
|
|
WIZCHIP.IF.QSPI._read_qspi(opcode, ADDR, pBuf, len);
|
2026-04-03 21:47:48 +09:00
|
|
|
WIZCHIP.CS._deselect();
|
|
|
|
|
WIZCHIP_CRITICAL_EXIT();
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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) {
|
2026-04-03 22:37:43 +09:00
|
|
|
uint16_t ptr = getSn_TX_WR(sn);
|
|
|
|
|
uint32_t addrsel = ((uint32_t)ptr << 8) + WIZCHIP_TXBUF_BLOCK(sn);
|
2026-04-03 21:47:48 +09:00
|
|
|
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) {
|
2026-04-03 22:37:43 +09:00
|
|
|
if (len == 0) return;
|
|
|
|
|
uint16_t ptr = getSn_RX_RD(sn);
|
|
|
|
|
uint32_t addrsel = ((uint32_t)ptr << 8) + WIZCHIP_RXBUF_BLOCK(sn);
|
2026-04-03 21:47:48 +09:00
|
|
|
WIZCHIP_READ_BUF(addrsel, wizdata, len);
|
|
|
|
|
ptr += len;
|
|
|
|
|
setSn_RX_RD(sn, ptr);
|
|
|
|
|
}
|
2026-04-03 22:37:43 +09:00
|
|
|
|
2026-04-03 21:47:48 +09:00
|
|
|
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) {
|
2026-04-03 22:37:43 +09:00
|
|
|
for (uint32_t i = 0; i < milliseconds; i++) {
|
2026-04-03 21:47:48 +09:00
|
|
|
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);
|
2026-04-03 22:37:43 +09:00
|
|
|
while (getPHYACR());
|
2026-04-03 21:47:48 +09:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
uint16_t wiz_mdio_read(uint8_t phyregaddr) {
|
|
|
|
|
setPHYRAR(phyregaddr);
|
|
|
|
|
setPHYACR(PHYACR_READ);
|
2026-04-03 22:37:43 +09:00
|
|
|
while (getPHYACR());
|
2026-04-03 21:47:48 +09:00
|
|
|
return getPHYDOR();
|
|
|
|
|
}
|
|
|
|
|
#endif
|