Files
w5500-eth/Ethernet/W6300/w6300.c
2025-12-10 17:55:05 +03:00

274 lines
8.3 KiB
C

//*****************************************************************************
//
//! \file W6300.c
//! \brief W6300 HAL Implements file.
//! \version 1.0.0
//! \date 2019/01/01
//! \par Revision history
//! <2019/01/01> 1st Release
//! \author MidnightCow
//! \copyright
//!
//! Copyright (c) 2019, WIZnet Co., LTD.
//!
//! Permission is hereby granted, free of charge, to any person obtaining a copy
//! of this software and associated documentation files (the "Software"), to deal
//! in the Software without restriction, including without limitation the rights
//! to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
//! copies of the Software, and to permit persons to whom the Software is
//! furnished to do so, subject to the following conditions:
//!
//! The above copyright notice and this permission notice shall be included in
//! all copies or substantial portions of the Software.
//!
//! THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
//! IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
//! FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
//! AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
//! LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
//! OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
//! SOFTWARE.
//!
//*****************************************************************************
#include "w6300.h"
#if 0
#define _WIZCHIP_SPI_VDM_OP_ 0x00
#define _WIZCHIP_SPI_FDM_LEN1_ 0x01
#define _WIZCHIP_SPI_FDM_LEN2_ 0x02
#define _WIZCHIP_SPI_FDM_LEN4_ 0x03
#endif
//
// If you want to use SPI FDM mode, Feel free contact to WIZnet.
// http://forum.wiznet.io
//
#if _WIZCHIP_ == 6300
////////////////////////////////////////////////////////////////////////////////////////
#define _W6300_SPI_OP_ _WIZCHIP_SPI_VDM_OP_
#define _W6300_SPI_READ_ (0x00 << 5) ///< SPI interface Read operation in Control Phase
#define _W6300_SPI_WRITE_ (0x01 << 5) ///< SPI interface Write operation in Control Phase
//////////////////////////////////////////////////
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);
#else //w6300 QSPI MODE
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();
}
uint8_t WIZCHIP_READ(uint32_t AddrSel) {
//uint8_t ret;
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);
WIZCHIP.IF.QSPI._write_qspi(opcode, ADDR, pBuf, len);//by_lihan
//qspi_write_buf(opcode, ADDR, pBuf, len);
WIZCHIP.CS._deselect();
WIZCHIP_CRITICAL_EXIT();
#endif
}
void WIZCHIP_READ_BUF(uint32_t AddrSel, uint8_t* pBuf, datasize_t len) {
uint8_t ret;
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);
WIZCHIP.IF.QSPI._read_qspi(opcode, ADDR, pBuf, len);//by_lihan
//qspi_read_buf(opcode, ADDR, pBuf, len);
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) {
uint16_t ptr = 0;
uint32_t addrsel = 0;
ptr = getSn_TX_WR(sn);
addrsel = ((uint32_t)ptr << 8) + WIZCHIP_TXBUF_BLOCK(sn);
WIZCHIP_WRITE_BUF(addrsel, wizdata, len);
ptr += len;
setSn_TX_WR(sn, ptr);
}
#if 0
#define ETHERNET_BUF_MAX_SIZE_TEMP (1024 * 32 )
void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len) {
uint16_t ptr = 0;
uint32_t addrsel = 0;
if (len == 0) {
return;
}
ptr = getSn_RX_RD(sn);
if (ptr + len > 0xFFFF) {
addrsel = ((uint32_t)ptr << 8) + WIZCHIP_RXBUF_BLOCK(sn);
uint16_t size = 0xFFFF - ptr;
WIZCHIP_READ_BUF(addrsel, wizdata, size);
wizdata += size;
size = len - size;
addrsel = WIZCHIP_RXBUF_BLOCK(sn);
WIZCHIP_READ_BUF(addrsel, wizdata, size);
} else {
addrsel = ((uint32_t)ptr << 8) + WIZCHIP_RXBUF_BLOCK(sn);
WIZCHIP_READ_BUF(addrsel, wizdata, len);
}
ptr += len;
ptr %= 0xFFFF ;
setSn_RX_RD(sn, ptr);
}
#else
void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint16_t len) {
uint16_t ptr = 0;
uint32_t addrsel = 0;
if (len == 0) {
return;
}
ptr = getSn_RX_RD(sn);
addrsel = ((uint32_t)ptr << 8) + WIZCHIP_RXBUF_BLOCK(sn);
WIZCHIP_READ_BUF(addrsel, wizdata, len);
ptr += len;
setSn_RX_RD(sn, ptr);
}
#endif
void wiz_recv_ignore(uint8_t sn, uint16_t len) {
setSn_RX_RD(sn, getSn_RX_RD(sn) + len);
}
#if 1
// 20231019 taylor
void wiz_delay_ms(uint32_t milliseconds) {
uint32_t i;
for (i = 0 ; i < milliseconds ; i++) {
//Write any values to clear the TCNTCLKR register
setTCNTRCLR(0xff);
// Wait until counter register value reaches 10.(10 = 1ms : TCNTR is 100us tick counter register)
while (getTCNTR() < 0x0a) {}
}
}
#endif
/// @cond DOXY_APPLY_CODE
#if (_PHY_IO_MODE_ == _PHY_IO_MODE_MII_)
/// @endcond
void wiz_mdio_write(uint8_t phyregaddr, uint16_t var) {
setPHYRAR(phyregaddr);
setPHYDIR(var);
setPHYACR(PHYACR_WRITE);
while (getPHYACR()); //wait for command complete
}
uint16_t wiz_mdio_read(uint8_t phyregaddr) {
setPHYRAR(phyregaddr);
setPHYACR(PHYACR_READ);
while (getPHYACR()); //wait for command complete
return getPHYDOR();
}
/// @cond DOXY_APPLY_CODE
#endif
/// @endcond
////////////////////////////////////////////////////////////////////////////////////////
#endif