#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); #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, &wb, 1); #endif WIZCHIP.CS._deselect(); WIZCHIP_CRITICAL_EXIT(); } uint8_t WIZCHIP_READ(uint32_t AddrSel) { 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); 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); WIZCHIP.IF.QSPI._read_qspi(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 = 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