You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
			
		
		
		
		
			
		
			
				
	
	
		
			226 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			C
		
	
			
		
		
	
	
			226 lines
		
	
	
		
			8.4 KiB
		
	
	
	
		
			C
		
	
| //*****************************************************************************
 | |
| //
 | |
| //! \file w5300.h
 | |
| //! \brief W5300 HAL implement File.
 | |
| //! \version 1.0.0
 | |
| //! \date 2015/05/01
 | |
| //! \par  Revision history
 | |
| //!       <2015/05/01> 1st Released for integrating with ioLibrary 
 | |
| //!        Download the latest version directly from GitHub. Please visit the our GitHub repository for ioLibrary.
 | |
| //!        >> https://github.com/Wiznet/ioLibrary_Driver
 | |
| //! \author MidnightCow
 | |
| //! \copyright
 | |
| //!
 | |
| //! Copyright (c)  2015, WIZnet Co., LTD.
 | |
| //! All rights reserved.
 | |
| //! 
 | |
| //! Redistribution and use in source and binary forms, with or without 
 | |
| //! modification, are permitted provided that the following conditions 
 | |
| //! are met: 
 | |
| //! 
 | |
| //!     * Redistributions of source code must retain the above copyright 
 | |
| //! notice, this list of conditions and the following disclaimer. 
 | |
| //!     * Redistributions in binary form must reproduce the above copyright
 | |
| //! notice, this list of conditions and the following disclaimer in the
 | |
| //! documentation and/or other materials provided with the distribution. 
 | |
| //!     * Neither the name of the <ORGANIZATION> nor the names of its 
 | |
| //! contributors may be used to endorse or promote products derived 
 | |
| //! from this software without specific prior written permission. 
 | |
| //! 
 | |
| //! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 | |
| //! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 | |
| //! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 | |
| //! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 | |
| //! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 | |
| //! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 | |
| //! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 | |
| //! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 | |
| //! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 | |
| //! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 
 | |
| //! THE POSSIBILITY OF SUCH DAMAGE.
 | |
| //
 | |
| //*****************************************************************************
 | |
| 
 | |
| #include <stdint.h>
 | |
| #include "wizchip_conf.h"
 | |
| 
 | |
| #if _WIZCHIP_ == 5300
 | |
| 
 | |
|    extern uint8_t sock_remained_byte[_WIZCHIP_SOCK_NUM_];
 | |
|    extern uint8_t sock_pack_info[_WIZCHIP_SOCK_NUM_];
 | |
| 
 | |
| 
 | |
| /***********************
 | |
|  * Basic I/O  Function *
 | |
|  ***********************/
 | |
|  
 | |
| void     WIZCHIP_WRITE(uint32_t AddrSel, uint16_t wb )
 | |
| {
 | |
|    WIZCHIP_CRITICAL_ENTER();
 | |
|    WIZCHIP.CS._select();
 | |
| 
 | |
| #if ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_) )
 | |
|    #if(_WIZCHIP_IO_BUS_WIDTH_ == 8)
 | |
|       WIZCHIP.IF.BUS._write_data(AddrSel,  (uint8_t)(wb>>8));
 | |
|       WIZCHIP.IF.BUS._write_data(WIZCHIP_OFFSET_INC(AddrSel,1),(uint8_t)wb);
 | |
|    #elif(_WIZCHIP_IO_BUS_WIDTH_ == 16)
 | |
|       WIZCHIP.IF.BUS._write_data(AddrSel,  wb);   
 | |
|    #else
 | |
|       #error "Abnoraml _WIZCHIP_IO_BUS_WIDTH_. Should be 8 or 16"
 | |
|    #endif
 | |
| #elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
 | |
|    #if(_WIZCHIP_IO_BUS_WIDTH_ == 8)
 | |
|       WIZCHIP.IF.BUS._write_data(IDM_AR,                      (uint8_t)(AddrSel >> 8));
 | |
|       WIZCHIP.IF.BUS._write_data(WIZCHIP_OFFSET_INC(IDM_AR,1),(uint8_t)AddrSel);
 | |
|       WIZCHIP.IF.BUS._write_data(IDM_DR,(uint8_t)(wb>>8));
 | |
|       WIZCHIP.IF.BUS._write_data(WIZCHIP_OFFSET_INC(IDM_DR,1),(uint8_t)wb);         
 | |
|    #elif(_WIZCHIP_IO_BUS_WIDTH_ == 16)
 | |
|       WIZCHIP.IF.BUS._write_data(IDM_AR, (uint16_t)AddrSel);
 | |
|       WIZCHIP.IF.BUS._write_data(IDM_DR, wb);
 | |
|    #else
 | |
|       #error "Abnoraml _WIZCHIP_IO_BUS_WIDTH_. Should be 8 or 16"
 | |
|    #endif
 | |
| #else
 | |
|    #error "Unknown _WIZCHIP_IO_MODE_ in W5300. !!!"
 | |
| #endif
 | |
| 
 | |
|    WIZCHIP.CS._deselect();
 | |
|    WIZCHIP_CRITICAL_EXIT();
 | |
| }
 | |
| 
 | |
| uint16_t WIZCHIP_READ(uint32_t AddrSel)
 | |
| {
 | |
|    uint16_t ret;
 | |
| 
 | |
|    WIZCHIP_CRITICAL_ENTER();
 | |
|    WIZCHIP.CS._select();
 | |
| 
 | |
| #if ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_) )
 | |
|    #if (_WIZCHIP_IO_BUS_WIDTH_ == 8)
 | |
|       ret = (((uint16_t)WIZCHIP.IF.BUS._read_data(AddrSel)) << 8) | 
 | |
|             (((uint16_t)WIZCHIP.IF.BUS._read_data(WIZCHIP_OFFSET_INC(AddrSel,1))) & 0x00FF) ;   
 | |
|    #elif(_WIZCHIP_IO_BUS_WIDTH_ == 16)
 | |
|       ret = WIZCHIP.IF.BUS._read_data(AddrSel);
 | |
|    #else
 | |
|       #error "Abnoraml _WIZCHIP_IO_BUS_WIDTH_. Should be 8 or 16"
 | |
|    #endif         
 | |
| #elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
 | |
|    #if(_WIZCHIP_IO_BUS_WIDTH_ == 8)
 | |
|       WIZCHIP.IF.BUS._write_data(IDM_AR,                      (uint8_t)(AddrSel >> 8));
 | |
|       WIZCHIP.IF.BUS._write_data(WIZCHIP_OFFSET_INC(IDM_AR,1),(uint8_t)AddrSel);
 | |
|       ret = (((uint16_t)WIZCHIP.IF.BUS._read_data(IDM_DR)) << 8) | 
 | |
|             (((uint16_t)WIZCHIP.IF.BUS._read_data(WIZCHIP_OFFSET_INC(IDM_DR,1))) & 0x00FF);
 | |
|    #elif(_WIZCHIP_IO_BUS_WIDTH_ == 16)
 | |
|       WIZCHIP.IF.BUS._write_data(IDM_AR, (uint16_t)AddrSel);
 | |
|       ret = WIZCHIP.IF.BUS._read_data(IDM_DR);
 | |
|    #else
 | |
|       #error "Abnoraml _WIZCHIP_IO_BUS_WIDTH_. Should be 8 or 16"
 | |
|    #endif
 | |
| #else
 | |
|    #error "Unknown _WIZCHIP_IO_MODE_ in W5300. !!!"
 | |
| #endif
 | |
| 
 | |
|    WIZCHIP.CS._deselect();
 | |
|    WIZCHIP_CRITICAL_EXIT();
 | |
|    return ret;
 | |
| }
 | |
| 
 | |
| 
 | |
| void setTMSR(uint8_t sn,uint8_t tmsr)
 | |
| {
 | |
|    uint16_t tmem;
 | |
|    tmem = WIZCHIP_READ(WIZCHIP_OFFSET_INC(TMS01R, (sn & 0xFE)));
 | |
|    if(sn & 0x01)  tmem = (tmem & 0xFF00) | (((uint16_t)tmsr ) & 0x00FF) ;
 | |
|    else tmem =  (tmem & 0x00FF) | (((uint16_t)tmsr) << 8) ;
 | |
|    WIZCHIP_WRITE(WIZCHIP_OFFSET_INC(TMS01R, (sn & 0xFE)),tmem);
 | |
| }
 | |
|    
 | |
| uint8_t getTMSR(uint8_t sn)
 | |
| {
 | |
|    if(sn & 0x01)
 | |
|       return (uint8_t)(WIZCHIP_READ(WIZCHIP_OFFSET_INC(TMS01R, (sn & 0xFE))) & 0x00FF);
 | |
|    return (uint8_t)(WIZCHIP_READ(WIZCHIP_OFFSET_INC(TMS01R, (sn & 0xFE))) >> 8);
 | |
| }
 | |
| 
 | |
| void setRMSR(uint8_t sn,uint8_t rmsr)
 | |
| {
 | |
|    uint16_t rmem;
 | |
|    rmem = WIZCHIP_READ(WIZCHIP_OFFSET_INC(RMS01R, (sn & 0xFE)));
 | |
|    if(sn & 0x01)  rmem = (rmem & 0xFF00) | (((uint16_t)rmsr ) & 0x00FF) ;
 | |
|    else rmem =  (rmem & 0x00FF) | (((uint16_t)rmsr) << 8) ;
 | |
|    WIZCHIP_WRITE(WIZCHIP_OFFSET_INC(RMS01R, (sn & 0xFE)),rmem);
 | |
| }
 | |
|    
 | |
| uint8_t getRMSR(uint8_t sn)
 | |
| {
 | |
|    if(sn & 0x01)
 | |
|       return (uint8_t)(WIZCHIP_READ(WIZCHIP_OFFSET_INC(RMS01R, (sn & 0xFE))) & 0x00FF);
 | |
|    return (uint8_t)(WIZCHIP_READ(WIZCHIP_OFFSET_INC(RMS01R, (sn & 0xFE))) >> 8);
 | |
| }
 | |
| 
 | |
| uint32_t getSn_TX_FSR(uint8_t sn)
 | |
| {
 | |
|    uint32_t free_tx_size=0;
 | |
|    uint32_t free_tx_size1=1;
 | |
|    while(1)
 | |
|    {
 | |
|       free_tx_size = (((uint32_t)WIZCHIP_READ(Sn_TX_FSR(sn))) << 16) | 
 | |
|                      (((uint32_t)WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),2))) & 0x0000FFFF);                           // read
 | |
|       if(free_tx_size == free_tx_size1) break;  // if first == sencond, Sn_TX_FSR value is valid.                                                          
 | |
|       free_tx_size1 = free_tx_size;             // save second value into first                                                   
 | |
|    }                                                                       
 | |
|    return free_tx_size;                                                    
 | |
| }                                                                          
 | |
| 
 | |
| uint32_t getSn_RX_RSR(uint8_t sn)
 | |
| {
 | |
|    uint32_t received_rx_size=0;
 | |
|    uint32_t received_rx_size1=1;
 | |
|    while(1)
 | |
|    {
 | |
|       received_rx_size = (((uint32_t)WIZCHIP_READ(Sn_RX_RSR(sn))) << 16) | 
 | |
|                          (((uint32_t)WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),2))) & 0x0000FFFF);
 | |
|       if(received_rx_size == received_rx_size1) break;                                                                         
 | |
|       received_rx_size1 = received_rx_size;                                      // if first == sencond, Sn_RX_RSR value is valid.
 | |
|    }                                                                             // save second value into first                
 | |
|    return received_rx_size + (uint32_t)((sock_pack_info[sn] & 0x02) ? 1 : 0);   
 | |
| }
 | |
| 
 | |
| 
 | |
| void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint32_t len)
 | |
| {
 | |
|    uint32_t i = 0;
 | |
|    if(len == 0)  return;
 | |
|    
 | |
|    for(i = 0; i < len ; i += 2)
 | |
|       setSn_TX_FIFOR(sn, (((uint16_t)wizdata[i]) << 8) | (((uint16_t)wizdata[i+1]) & 0x00FF))
 | |
| }
 | |
| 
 | |
| void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint32_t len)
 | |
| {
 | |
|    uint16_t rd = 0;
 | |
|    uint32_t i = 0;
 | |
|    
 | |
|    if(len == 0) return;
 | |
|       
 | |
|    for(i = 0; i < len; i++)
 | |
|    {
 | |
|       if((i & 0x01)==0)
 | |
|       {
 | |
|          rd = getSn_RX_FIFOR(sn);
 | |
|          wizdata[i]   = (uint8_t)(rd >> 8);
 | |
|       }
 | |
|       else  wizdata[i] = (uint8_t)rd;  // For checking the memory access violation
 | |
|    }
 | |
|    sock_remained_byte[sn] = (uint8_t)rd; // back up the remaind fifo byte.
 | |
| }
 | |
| 
 | |
| void wiz_recv_ignore(uint8_t sn, uint32_t len)
 | |
| {
 | |
|    uint32_t i = 0;
 | |
|    for(i = 0; i < len ; i += 2) getSn_RX_FIFOR(sn);
 | |
| }
 | |
| 
 | |
| 
 | |
| #endif
 |