w5300.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. //*****************************************************************************
  2. //
  3. //! \file w5300.h
  4. //! \brief W5300 HAL implement File.
  5. //! \version 1.0.0
  6. //! \date 2015/05/01
  7. //! \par Revision history
  8. //! <2015/05/01> 1st Released for integrating with ioLibrary
  9. //! Download the latest version directly from GitHub. Please visit the our GitHub repository for ioLibrary.
  10. //! >> https://github.com/Wiznet/ioLibrary_Driver
  11. //! \author MidnightCow
  12. //! \copyright
  13. //!
  14. //! Copyright (c) 2015, WIZnet Co., LTD.
  15. //! All rights reserved.
  16. //!
  17. //! Redistribution and use in source and binary forms, with or without
  18. //! modification, are permitted provided that the following conditions
  19. //! are met:
  20. //!
  21. //! * Redistributions of source code must retain the above copyright
  22. //! notice, this list of conditions and the following disclaimer.
  23. //! * Redistributions in binary form must reproduce the above copyright
  24. //! notice, this list of conditions and the following disclaimer in the
  25. //! documentation and/or other materials provided with the distribution.
  26. //! * Neither the name of the <ORGANIZATION> nor the names of its
  27. //! contributors may be used to endorse or promote products derived
  28. //! from this software without specific prior written permission.
  29. //!
  30. //! THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
  31. //! AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  32. //! IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  33. //! ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  34. //! LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  35. //! CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  36. //! SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  37. //! INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  38. //! CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  39. //! ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
  40. //! THE POSSIBILITY OF SUCH DAMAGE.
  41. //
  42. //*****************************************************************************
  43. #include <stdint.h>
  44. #include "wizchip_conf.h"
  45. #if _WIZCHIP_ == 5300
  46. extern uint8_t sock_remained_byte[_WIZCHIP_SOCK_NUM_];
  47. extern uint8_t sock_pack_info[_WIZCHIP_SOCK_NUM_];
  48. /***********************
  49. * Basic I/O Function *
  50. ***********************/
  51. void WIZCHIP_WRITE(uint32_t AddrSel, uint16_t wb )
  52. {
  53. WIZCHIP_CRITICAL_ENTER();
  54. WIZCHIP.CS._select();
  55. #if ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_) )
  56. #if(_WIZCHIP_IO_BUS_WIDTH_ == 8)
  57. WIZCHIP.IF.BUS._write_data(AddrSel, (uint8_t)(wb>>8));
  58. WIZCHIP.IF.BUS._write_data(WIZCHIP_OFFSET_INC(AddrSel,1),(uint8_t)wb);
  59. #elif(_WIZCHIP_IO_BUS_WIDTH_ == 16)
  60. WIZCHIP.IF.BUS._write_data(AddrSel, wb);
  61. #else
  62. #error "Abnoraml _WIZCHIP_IO_BUS_WIDTH_. Should be 8 or 16"
  63. #endif
  64. #elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
  65. #if(_WIZCHIP_IO_BUS_WIDTH_ == 8)
  66. WIZCHIP.IF.BUS._write_data(IDM_AR, (uint8_t)(AddrSel >> 8));
  67. WIZCHIP.IF.BUS._write_data(WIZCHIP_OFFSET_INC(IDM_AR,1),(uint8_t)AddrSel);
  68. WIZCHIP.IF.BUS._write_data(IDM_DR,(uint8_t)(wb>>8));
  69. WIZCHIP.IF.BUS._write_data(WIZCHIP_OFFSET_INC(IDM_DR,1),(uint8_t)wb);
  70. #elif(_WIZCHIP_IO_BUS_WIDTH_ == 16)
  71. WIZCHIP.IF.BUS._write_data(IDM_AR, (uint16_t)AddrSel);
  72. WIZCHIP.IF.BUS._write_data(IDM_DR, wb);
  73. #else
  74. #error "Abnoraml _WIZCHIP_IO_BUS_WIDTH_. Should be 8 or 16"
  75. #endif
  76. #else
  77. #error "Unknown _WIZCHIP_IO_MODE_ in W5300. !!!"
  78. #endif
  79. WIZCHIP.CS._deselect();
  80. WIZCHIP_CRITICAL_EXIT();
  81. }
  82. uint16_t WIZCHIP_READ(uint32_t AddrSel)
  83. {
  84. uint16_t ret;
  85. WIZCHIP_CRITICAL_ENTER();
  86. WIZCHIP.CS._select();
  87. #if ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_) )
  88. #if (_WIZCHIP_IO_BUS_WIDTH_ == 8)
  89. ret = (((uint16_t)WIZCHIP.IF.BUS._read_data(AddrSel)) << 8) |
  90. (((uint16_t)WIZCHIP.IF.BUS._read_data(WIZCHIP_OFFSET_INC(AddrSel,1))) & 0x00FF) ;
  91. #elif(_WIZCHIP_IO_BUS_WIDTH_ == 16)
  92. ret = WIZCHIP.IF.BUS._read_data(AddrSel);
  93. #else
  94. #error "Abnoraml _WIZCHIP_IO_BUS_WIDTH_. Should be 8 or 16"
  95. #endif
  96. #elif ( (_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_) )
  97. #if(_WIZCHIP_IO_BUS_WIDTH_ == 8)
  98. WIZCHIP.IF.BUS._write_data(IDM_AR, (uint8_t)(AddrSel >> 8));
  99. WIZCHIP.IF.BUS._write_data(WIZCHIP_OFFSET_INC(IDM_AR,1),(uint8_t)AddrSel);
  100. ret = (((uint16_t)WIZCHIP.IF.BUS._read_data(IDM_DR)) << 8) |
  101. (((uint16_t)WIZCHIP.IF.BUS._read_data(WIZCHIP_OFFSET_INC(IDM_DR,1))) & 0x00FF);
  102. #elif(_WIZCHIP_IO_BUS_WIDTH_ == 16)
  103. WIZCHIP.IF.BUS._write_data(IDM_AR, (uint16_t)AddrSel);
  104. ret = WIZCHIP.IF.BUS._read_data(IDM_DR);
  105. #else
  106. #error "Abnoraml _WIZCHIP_IO_BUS_WIDTH_. Should be 8 or 16"
  107. #endif
  108. #else
  109. #error "Unknown _WIZCHIP_IO_MODE_ in W5300. !!!"
  110. #endif
  111. WIZCHIP.CS._deselect();
  112. WIZCHIP_CRITICAL_EXIT();
  113. return ret;
  114. }
  115. void setTMSR(uint8_t sn,uint8_t tmsr)
  116. {
  117. uint16_t tmem;
  118. tmem = WIZCHIP_READ(WIZCHIP_OFFSET_INC(TMS01R, (sn & 0xFE)));
  119. if(sn & 0x01) tmem = (tmem & 0xFF00) | (((uint16_t)tmsr ) & 0x00FF) ;
  120. else tmem = (tmem & 0x00FF) | (((uint16_t)tmsr) << 8) ;
  121. WIZCHIP_WRITE(WIZCHIP_OFFSET_INC(TMS01R, (sn & 0xFE)),tmem);
  122. }
  123. uint8_t getTMSR(uint8_t sn)
  124. {
  125. if(sn & 0x01)
  126. return (uint8_t)(WIZCHIP_READ(WIZCHIP_OFFSET_INC(TMS01R, (sn & 0xFE))) & 0x00FF);
  127. return (uint8_t)(WIZCHIP_READ(WIZCHIP_OFFSET_INC(TMS01R, (sn & 0xFE))) >> 8);
  128. }
  129. void setRMSR(uint8_t sn,uint8_t rmsr)
  130. {
  131. uint16_t rmem;
  132. rmem = WIZCHIP_READ(WIZCHIP_OFFSET_INC(RMS01R, (sn & 0xFE)));
  133. if(sn & 0x01) rmem = (rmem & 0xFF00) | (((uint16_t)rmsr ) & 0x00FF) ;
  134. else rmem = (rmem & 0x00FF) | (((uint16_t)rmsr) << 8) ;
  135. WIZCHIP_WRITE(WIZCHIP_OFFSET_INC(RMS01R, (sn & 0xFE)),rmem);
  136. }
  137. uint8_t getRMSR(uint8_t sn)
  138. {
  139. if(sn & 0x01)
  140. return (uint8_t)(WIZCHIP_READ(WIZCHIP_OFFSET_INC(RMS01R, (sn & 0xFE))) & 0x00FF);
  141. return (uint8_t)(WIZCHIP_READ(WIZCHIP_OFFSET_INC(RMS01R, (sn & 0xFE))) >> 8);
  142. }
  143. uint32_t getSn_TX_FSR(uint8_t sn)
  144. {
  145. uint32_t free_tx_size=0;
  146. uint32_t free_tx_size1=1;
  147. while(1)
  148. {
  149. free_tx_size = (((uint32_t)WIZCHIP_READ(Sn_TX_FSR(sn))) << 16) |
  150. (((uint32_t)WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_TX_FSR(sn),2))) & 0x0000FFFF); // read
  151. if(free_tx_size == free_tx_size1) break; // if first == sencond, Sn_TX_FSR value is valid.
  152. free_tx_size1 = free_tx_size; // save second value into first
  153. }
  154. return free_tx_size;
  155. }
  156. uint32_t getSn_RX_RSR(uint8_t sn)
  157. {
  158. uint32_t received_rx_size=0;
  159. uint32_t received_rx_size1=1;
  160. while(1)
  161. {
  162. received_rx_size = (((uint32_t)WIZCHIP_READ(Sn_RX_RSR(sn))) << 16) |
  163. (((uint32_t)WIZCHIP_READ(WIZCHIP_OFFSET_INC(Sn_RX_RSR(sn),2))) & 0x0000FFFF);
  164. if(received_rx_size == received_rx_size1) break;
  165. received_rx_size1 = received_rx_size; // if first == sencond, Sn_RX_RSR value is valid.
  166. } // save second value into first
  167. return received_rx_size + (uint32_t)((sock_pack_info[sn] & 0x02) ? 1 : 0);
  168. }
  169. void wiz_send_data(uint8_t sn, uint8_t *wizdata, uint32_t len)
  170. {
  171. uint32_t i = 0;
  172. if(len == 0) return;
  173. for(i = 0; i < len ; i += 2)
  174. setSn_TX_FIFOR(sn, (((uint16_t)wizdata[i]) << 8) | (((uint16_t)wizdata[i+1]) & 0x00FF))
  175. }
  176. void wiz_recv_data(uint8_t sn, uint8_t *wizdata, uint32_t len)
  177. {
  178. uint16_t rd = 0;
  179. uint32_t i = 0;
  180. if(len == 0) return;
  181. for(i = 0; i < len; i++)
  182. {
  183. if((i & 0x01)==0)
  184. {
  185. rd = getSn_RX_FIFOR(sn);
  186. wizdata[i] = (uint8_t)(rd >> 8);
  187. }
  188. else wizdata[i] = (uint8_t)rd; // For checking the memory access violation
  189. }
  190. sock_remained_byte[sn] = (uint8_t)rd; // back up the remaind fifo byte.
  191. }
  192. void wiz_recv_ignore(uint8_t sn, uint32_t len)
  193. {
  194. uint32_t i = 0;
  195. for(i = 0; i < len ; i += 2) getSn_RX_FIFOR(sn);
  196. }
  197. #endif