EMAC driver for the ENC28J60 Ethernet controller. This is a simplified fork of https://github.com/tobiasjaster/ENC28J60-EMAC-Driver published by Tobias Jaster.

Dependents:   MQTT_Hello MQTT_HelloENC28J60

EMAC driver for the ENC28J60 Ethernet controller

https://os.mbed.com/media/uploads/hudakz/enc28j60_module01.jpg

This is a fork (the INT and RST pins are not used) of the ENC28J60-EMAC driver published by Tobias Jaster at

https://github.com/tobiasjaster/ENC28J60-EMAC-Driver

Usage:

  • Connect the ENC28J60 module to the Mbed board as follows:

https://os.mbed.com/media/uploads/hudakz/enc28j60-emac.png

  • Import (add) this ENC28J60-EMAC library to your program.
  • Add a "mbed_app.json" file with the following content to the root directory of your program:

    {
        "target_overrides": {
            "*": {
                "platform.callback-nontrivial": true,
                "enc28j60-emac.mosi":  "D11",
                "enc28j60-emac.miso":  "D12",
                "enc28j60-emac.sck" :  "D13",
                "enc28j60-emac.cs"  :  "D10"
            }
        }
    }
  • Replace "D11", ..., "D10" with the actual pin names you selected on the Mbed board to be used for the SPI communication.
  • To set the MAC address define an array with the desired address bytes and call the "set_hwaddr(mac)" function before calling the network interface "connect" function.

For example:

    const uint8_t       MAC[6] = { 0, 1, 2, 3, 4, 5 };
    EthernetInterface   net;
 
    int main()
    {
        net.get_emac().set_hwaddr(MAC);             // set MAC address
        if (net.connect() != 0) {
            printf("Error: Unable to connect to the network.\n");
            return -1;
        }
     ...
Committer:
hudakz
Date:
Fri Mar 26 15:58:28 2021 +0000
Revision:
0:b599e748252c
Child:
1:bce04bfc41fe
Mbed OS Ethernet MAC (EMAC) driver for the ENC28J60 Ethernet controller.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
hudakz 0:b599e748252c 1 /*
hudakz 0:b599e748252c 2 * Copyright (c) 2019 Tobias Jaster
hudakz 0:b599e748252c 3 *
hudakz 0:b599e748252c 4 * Modified by Zoltan Hudak
hudakz 0:b599e748252c 5 *
hudakz 0:b599e748252c 6 * Licensed under the Apache License, Version 2.0 (the "License");
hudakz 0:b599e748252c 7 * you may not use this file except in compliance with the License.
hudakz 0:b599e748252c 8 * You may obtain a copy of the License at
hudakz 0:b599e748252c 9 *
hudakz 0:b599e748252c 10 * http://www.apache.org/licenses/LICENSE-2.0
hudakz 0:b599e748252c 11 *
hudakz 0:b599e748252c 12 * Unless required by applicable law or agreed to in writing, software
hudakz 0:b599e748252c 13 * distributed under the License is distributed on an "AS IS" BASIS,
hudakz 0:b599e748252c 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
hudakz 0:b599e748252c 15 * See the License for the specific language governing permissions and
hudakz 0:b599e748252c 16 * limitations under the License.
hudakz 0:b599e748252c 17 */
hudakz 0:b599e748252c 18 #include "mbed_interface.h"
hudakz 0:b599e748252c 19 #include "mbed_wait_api.h"
hudakz 0:b599e748252c 20 #include "mbed_assert.h"
hudakz 0:b599e748252c 21 #include "netsocket/nsapi_types.h"
hudakz 0:b599e748252c 22 #include "mbed_shared_queues.h"
hudakz 0:b599e748252c 23
hudakz 0:b599e748252c 24 #include "enc28j60_emac.h"
hudakz 0:b599e748252c 25
hudakz 0:b599e748252c 26 /**
hudakz 0:b599e748252c 27 * @brief
hudakz 0:b599e748252c 28 * @note
hudakz 0:b599e748252c 29 * @param
hudakz 0:b599e748252c 30 * @retval
hudakz 0:b599e748252c 31 */
hudakz 0:b599e748252c 32 W5500_EMAC::W5500_EMAC() :
hudakz 0:b599e748252c 33 _enc28j60(new ENC28J60(ENC28J60_MOSI, ENC28J60_MISO, ENC28J60_SCK, ENC28J60_CS)),
hudakz 0:b599e748252c 34 _prev_link_status_up(PHY_STATE_LINK_DOWN),
hudakz 0:b599e748252c 35 _link_status_task_handle(0),
hudakz 0:b599e748252c 36 _receive_task_handle(0),
hudakz 0:b599e748252c 37 _memory_manager(NULL)
hudakz 0:b599e748252c 38 { }
hudakz 0:b599e748252c 39
hudakz 0:b599e748252c 40 /**
hudakz 0:b599e748252c 41 * @brief
hudakz 0:b599e748252c 42 * @note Allocates buffer chain from a pool and filles it with incoming packet.
hudakz 0:b599e748252c 43 * @param
hudakz 0:b599e748252c 44 * @retval Data from incoming packet
hudakz 0:b599e748252c 45 */
hudakz 0:b599e748252c 46 emac_mem_buf_t* W5500_EMAC::low_level_input()
hudakz 0:b599e748252c 47 {
hudakz 0:b599e748252c 48 emac_mem_buf_t* chain;
hudakz 0:b599e748252c 49 emac_mem_buf_t* buf;
hudakz 0:b599e748252c 50 packet_t packet;
hudakz 0:b599e748252c 51
hudakz 0:b599e748252c 52 if (_enc28j60->getPacketInfo(&packet) != ENC28J60_ERROR_OK) {
hudakz 0:b599e748252c 53 return NULL;
hudakz 0:b599e748252c 54 }
hudakz 0:b599e748252c 55
hudakz 0:b599e748252c 56 if (packet.payload.len == 0) {
hudakz 0:b599e748252c 57 return NULL;
hudakz 0:b599e748252c 58 }
hudakz 0:b599e748252c 59
hudakz 0:b599e748252c 60 // Allocate a buffer chain from the memory pool.
hudakz 0:b599e748252c 61 chain = _memory_manager->alloc_pool(packet.payload.len, ENC28J60_BUFF_ALIGNMENT);
hudakz 0:b599e748252c 62 buf = chain;
hudakz 0:b599e748252c 63
hudakz 0:b599e748252c 64 // Iterate through the buffer chain and fill it with packet payload.
hudakz 0:b599e748252c 65 while (buf != NULL) {
hudakz 0:b599e748252c 66 packet.payload.buf = (uint8_t*)_memory_manager->get_ptr(buf);
hudakz 0:b599e748252c 67 packet.payload.len = (uint16_t) (_memory_manager->get_len(buf));
hudakz 0:b599e748252c 68
hudakz 0:b599e748252c 69 // Fill the ethernet stack buffer with packet payload received by ENC28J60.
hudakz 0:b599e748252c 70 _enc28j60->readPacket(&packet);
hudakz 0:b599e748252c 71
hudakz 0:b599e748252c 72 buf = _memory_manager->get_next(buf);
hudakz 0:b599e748252c 73 }
hudakz 0:b599e748252c 74
hudakz 0:b599e748252c 75 // Return the buffer chain filled with packet payload.
hudakz 0:b599e748252c 76 return chain;
hudakz 0:b599e748252c 77 }
hudakz 0:b599e748252c 78
hudakz 0:b599e748252c 79 /**
hudakz 0:b599e748252c 80 * @brief Receive task.
hudakz 0:b599e748252c 81 * @note Passes packet payload received by ENC28J60 to the ethernet stack
hudakz 0:b599e748252c 82 * @param
hudakz 0:b599e748252c 83 * @retval
hudakz 0:b599e748252c 84 */
hudakz 0:b599e748252c 85 void W5500_EMAC::receive_task()
hudakz 0:b599e748252c 86 {
hudakz 0:b599e748252c 87 emac_mem_buf_t* payload;
hudakz 0:b599e748252c 88
hudakz 0:b599e748252c 89 _ethLockMutex.lock();
hudakz 0:b599e748252c 90 payload = low_level_input();
hudakz 0:b599e748252c 91 if (payload != NULL) {
hudakz 0:b599e748252c 92 if (_emac_link_input_cb) {
hudakz 0:b599e748252c 93 _emac_link_input_cb(payload); // pass packet payload to the ethernet stack
hudakz 0:b599e748252c 94 _memory_manager->free(payload);
hudakz 0:b599e748252c 95 }
hudakz 0:b599e748252c 96 }
hudakz 0:b599e748252c 97
hudakz 0:b599e748252c 98 _enc28j60->freeRxBuffer(); // make room in ENC28J60 receive buffer for new packets
hudakz 0:b599e748252c 99 _ethLockMutex.unlock();
hudakz 0:b599e748252c 100 }
hudakz 0:b599e748252c 101
hudakz 0:b599e748252c 102
hudakz 0:b599e748252c 103 /**
hudakz 0:b599e748252c 104 * @brief
hudakz 0:b599e748252c 105 * @note Passes a packet payload from the ethernet stack to ENC28J60 for transmittion
hudakz 0:b599e748252c 106 * @param
hudakz 0:b599e748252c 107 * @retval
hudakz 0:b599e748252c 108 */
hudakz 0:b599e748252c 109 bool W5500_EMAC::link_out(emac_mem_buf_t* buf)
hudakz 0:b599e748252c 110 {
hudakz 0:b599e748252c 111 emac_mem_buf_t* chain = buf;
hudakz 0:b599e748252c 112 packet_t packet;
hudakz 0:b599e748252c 113 enc28j60_error_t error;
hudakz 0:b599e748252c 114
hudakz 0:b599e748252c 115 if (buf == NULL) {
hudakz 0:b599e748252c 116 return false;
hudakz 0:b599e748252c 117 }
hudakz 0:b599e748252c 118
hudakz 0:b599e748252c 119 _ethLockMutex.lock();
hudakz 0:b599e748252c 120 // Iterate through the buffer chain and fill the packet with payload.
hudakz 0:b599e748252c 121 while (buf != NULL) {
hudakz 0:b599e748252c 122 packet.payload.buf = (uint8_t *) (_memory_manager->get_ptr(buf));
hudakz 0:b599e748252c 123 packet.payload.len = _memory_manager->get_len(buf);
hudakz 0:b599e748252c 124 error = _enc28j60->loadPacketInTxBuffer(&packet);
hudakz 0:b599e748252c 125 if (error != ENC28J60_ERROR_OK) {
hudakz 0:b599e748252c 126 _memory_manager->free(chain);
hudakz 0:b599e748252c 127 _ethLockMutex.unlock();
hudakz 0:b599e748252c 128 return false;
hudakz 0:b599e748252c 129 }
hudakz 0:b599e748252c 130
hudakz 0:b599e748252c 131 error = _enc28j60->transmitPacket(&packet);
hudakz 0:b599e748252c 132 if (error != ENC28J60_ERROR_OK) {
hudakz 0:b599e748252c 133 _memory_manager->free(chain);
hudakz 0:b599e748252c 134 _ethLockMutex.unlock();
hudakz 0:b599e748252c 135 return false;
hudakz 0:b599e748252c 136 }
hudakz 0:b599e748252c 137
hudakz 0:b599e748252c 138 buf = _memory_manager->get_next(buf);
hudakz 0:b599e748252c 139 }
hudakz 0:b599e748252c 140
hudakz 0:b599e748252c 141 _memory_manager->free(chain);
hudakz 0:b599e748252c 142 _ethLockMutex.unlock();
hudakz 0:b599e748252c 143
hudakz 0:b599e748252c 144 return true;
hudakz 0:b599e748252c 145 }
hudakz 0:b599e748252c 146
hudakz 0:b599e748252c 147 /**
hudakz 0:b599e748252c 148 * @brief
hudakz 0:b599e748252c 149 * @note
hudakz 0:b599e748252c 150 * @param
hudakz 0:b599e748252c 151 * @retval
hudakz 0:b599e748252c 152 */
hudakz 0:b599e748252c 153 void W5500_EMAC::link_status_task()
hudakz 0:b599e748252c 154 {
hudakz 0:b599e748252c 155 uint16_t phy_basic_status_reg_value = 0;
hudakz 0:b599e748252c 156 bool current_link_status_up = false;
hudakz 0:b599e748252c 157
hudakz 0:b599e748252c 158 /* Get current status */
hudakz 0:b599e748252c 159
hudakz 0:b599e748252c 160 _ethLockMutex.lock();
hudakz 0:b599e748252c 161 _enc28j60->phyRead(PHSTAT2, &phy_basic_status_reg_value);
hudakz 0:b599e748252c 162
hudakz 0:b599e748252c 163 current_link_status_up = (bool) ((phy_basic_status_reg_value & PHSTAT2_LSTAT) != 0);
hudakz 0:b599e748252c 164
hudakz 0:b599e748252c 165 /* Compare with previous state */
hudakz 0:b599e748252c 166 if (current_link_status_up != _prev_link_status_up) {
hudakz 0:b599e748252c 167 if (_emac_link_state_cb) {
hudakz 0:b599e748252c 168 _emac_link_state_cb(current_link_status_up);
hudakz 0:b599e748252c 169 }
hudakz 0:b599e748252c 170
hudakz 0:b599e748252c 171 _prev_link_status_up = current_link_status_up;
hudakz 0:b599e748252c 172 }
hudakz 0:b599e748252c 173
hudakz 0:b599e748252c 174 _ethLockMutex.unlock();
hudakz 0:b599e748252c 175 }
hudakz 0:b599e748252c 176
hudakz 0:b599e748252c 177 /**
hudakz 0:b599e748252c 178 * @brief
hudakz 0:b599e748252c 179 * @note
hudakz 0:b599e748252c 180 * @param
hudakz 0:b599e748252c 181 * @retval
hudakz 0:b599e748252c 182 */
hudakz 0:b599e748252c 183 bool W5500_EMAC::power_up()
hudakz 0:b599e748252c 184 {
hudakz 0:b599e748252c 185 volatile uint32_t timeout = 500;
hudakz 0:b599e748252c 186 _enc28j60->writeOp(ENC28J60_BIT_FIELD_CLR, ECON2, ECON2_PWRSV);
hudakz 0:b599e748252c 187 while (_enc28j60->readReg(ESTAT_CLKRDY) == 0) {
hudakz 0:b599e748252c 188 ThisThread::sleep_for(1ms);
hudakz 0:b599e748252c 189 timeout--;
hudakz 0:b599e748252c 190 if (timeout == 0) {
hudakz 0:b599e748252c 191 return false;
hudakz 0:b599e748252c 192 }
hudakz 0:b599e748252c 193 }
hudakz 0:b599e748252c 194
hudakz 0:b599e748252c 195 /* Trigger thread to deal with any RX packets that arrived
hudakz 0:b599e748252c 196 * before receiver_thread was started */
hudakz 0:b599e748252c 197 _receive_task_handle = mbed::mbed_event_queue()->call_every
hudakz 0:b599e748252c 198 (
hudakz 0:b599e748252c 199 RECEIVE_TASK_PERIOD_MS,
hudakz 0:b599e748252c 200 mbed::callback(this, &W5500_EMAC::receive_task)
hudakz 0:b599e748252c 201 );
hudakz 0:b599e748252c 202
hudakz 0:b599e748252c 203 _prev_link_status_up = PHY_STATE_LINK_DOWN;
hudakz 0:b599e748252c 204 mbed::mbed_event_queue()->call(mbed::callback(this, &W5500_EMAC::link_status_task));
hudakz 0:b599e748252c 205
hudakz 0:b599e748252c 206 /* Allow the Link Status task to detect the initial link state */
hudakz 0:b599e748252c 207 ThisThread::sleep_for(10ms);
hudakz 0:b599e748252c 208 _link_status_task_handle = mbed::mbed_event_queue()->call_every
hudakz 0:b599e748252c 209 (
hudakz 0:b599e748252c 210 LINK_STATUS_TASK_PERIOD_MS,
hudakz 0:b599e748252c 211 mbed::callback(this, &W5500_EMAC::link_status_task)
hudakz 0:b599e748252c 212 );
hudakz 0:b599e748252c 213
hudakz 0:b599e748252c 214 return true;
hudakz 0:b599e748252c 215 }
hudakz 0:b599e748252c 216
hudakz 0:b599e748252c 217 /**
hudakz 0:b599e748252c 218 * @brief
hudakz 0:b599e748252c 219 * @note
hudakz 0:b599e748252c 220 * @param
hudakz 0:b599e748252c 221 * @retval
hudakz 0:b599e748252c 222 */
hudakz 0:b599e748252c 223 uint32_t W5500_EMAC::get_mtu_size() const
hudakz 0:b599e748252c 224 {
hudakz 0:b599e748252c 225 return ENC28J60_ETH_MTU_SIZE;
hudakz 0:b599e748252c 226 }
hudakz 0:b599e748252c 227
hudakz 0:b599e748252c 228 /**
hudakz 0:b599e748252c 229 * @brief
hudakz 0:b599e748252c 230 * @note
hudakz 0:b599e748252c 231 * @param
hudakz 0:b599e748252c 232 * @retval
hudakz 0:b599e748252c 233 */
hudakz 0:b599e748252c 234 uint32_t W5500_EMAC::get_align_preference() const
hudakz 0:b599e748252c 235 {
hudakz 0:b599e748252c 236 return ENC28J60_BUFF_ALIGNMENT;
hudakz 0:b599e748252c 237 }
hudakz 0:b599e748252c 238
hudakz 0:b599e748252c 239 /**
hudakz 0:b599e748252c 240 * @brief
hudakz 0:b599e748252c 241 * @note
hudakz 0:b599e748252c 242 * @param
hudakz 0:b599e748252c 243 * @retval
hudakz 0:b599e748252c 244 */
hudakz 0:b599e748252c 245 void W5500_EMAC::get_ifname(char* name, uint8_t size) const
hudakz 0:b599e748252c 246 {
hudakz 0:b599e748252c 247 memcpy(name, ENC28J60_ETH_IF_NAME, (size < sizeof(ENC28J60_ETH_IF_NAME)) ? size : sizeof(ENC28J60_ETH_IF_NAME));
hudakz 0:b599e748252c 248 }
hudakz 0:b599e748252c 249
hudakz 0:b599e748252c 250 /**
hudakz 0:b599e748252c 251 * @brief
hudakz 0:b599e748252c 252 * @note
hudakz 0:b599e748252c 253 * @param
hudakz 0:b599e748252c 254 * @retval
hudakz 0:b599e748252c 255 */
hudakz 0:b599e748252c 256 uint8_t W5500_EMAC::get_hwaddr_size() const
hudakz 0:b599e748252c 257 {
hudakz 0:b599e748252c 258 return ENC28J60_HWADDR_SIZE;
hudakz 0:b599e748252c 259 }
hudakz 0:b599e748252c 260
hudakz 0:b599e748252c 261 /**
hudakz 0:b599e748252c 262 * @brief
hudakz 0:b599e748252c 263 * @note
hudakz 0:b599e748252c 264 * @param
hudakz 0:b599e748252c 265 * @retval
hudakz 0:b599e748252c 266 */
hudakz 0:b599e748252c 267 bool W5500_EMAC::get_hwaddr(uint8_t* addr) const
hudakz 0:b599e748252c 268 {
hudakz 0:b599e748252c 269 enc28j60_error_t error = _enc28j60->readMacAddr((char*)addr);
hudakz 0:b599e748252c 270 if (error == ENC28J60_ERROR_OK) {
hudakz 0:b599e748252c 271 return true;
hudakz 0:b599e748252c 272 }
hudakz 0:b599e748252c 273 else {
hudakz 0:b599e748252c 274 return false;
hudakz 0:b599e748252c 275 }
hudakz 0:b599e748252c 276 }
hudakz 0:b599e748252c 277
hudakz 0:b599e748252c 278 /**
hudakz 0:b599e748252c 279 * @brief
hudakz 0:b599e748252c 280 * @note
hudakz 0:b599e748252c 281 * @param
hudakz 0:b599e748252c 282 * @retval
hudakz 0:b599e748252c 283 */
hudakz 0:b599e748252c 284 void W5500_EMAC::set_hwaddr(const uint8_t* addr)
hudakz 0:b599e748252c 285 {
hudakz 0:b599e748252c 286 if (!addr) {
hudakz 0:b599e748252c 287 return;
hudakz 0:b599e748252c 288 }
hudakz 0:b599e748252c 289
hudakz 0:b599e748252c 290 memcpy(_hwaddr, addr, sizeof _hwaddr);
hudakz 0:b599e748252c 291 _ethLockMutex.lock();
hudakz 0:b599e748252c 292
hudakz 0:b599e748252c 293 enc28j60_error_t error = _enc28j60->writeMacAddr((char*)addr);
hudakz 0:b599e748252c 294 _ethLockMutex.unlock();
hudakz 0:b599e748252c 295 if (error) {
hudakz 0:b599e748252c 296 return;
hudakz 0:b599e748252c 297 }
hudakz 0:b599e748252c 298 }
hudakz 0:b599e748252c 299
hudakz 0:b599e748252c 300 /**
hudakz 0:b599e748252c 301 * @brief
hudakz 0:b599e748252c 302 * @note
hudakz 0:b599e748252c 303 * @param
hudakz 0:b599e748252c 304 * @retval
hudakz 0:b599e748252c 305 */
hudakz 0:b599e748252c 306 void W5500_EMAC::set_link_input_cb(emac_link_input_cb_t input_cb)
hudakz 0:b599e748252c 307 {
hudakz 0:b599e748252c 308 _emac_link_input_cb = input_cb;
hudakz 0:b599e748252c 309 }
hudakz 0:b599e748252c 310
hudakz 0:b599e748252c 311 /**
hudakz 0:b599e748252c 312 * @brief
hudakz 0:b599e748252c 313 * @note
hudakz 0:b599e748252c 314 * @param
hudakz 0:b599e748252c 315 * @retval
hudakz 0:b599e748252c 316 */
hudakz 0:b599e748252c 317 void W5500_EMAC::set_link_state_cb(emac_link_state_change_cb_t state_cb)
hudakz 0:b599e748252c 318 {
hudakz 0:b599e748252c 319 _emac_link_state_cb = state_cb;
hudakz 0:b599e748252c 320 }
hudakz 0:b599e748252c 321
hudakz 0:b599e748252c 322 /**
hudakz 0:b599e748252c 323 * @brief
hudakz 0:b599e748252c 324 * @note
hudakz 0:b599e748252c 325 * @param
hudakz 0:b599e748252c 326 * @retval
hudakz 0:b599e748252c 327 */
hudakz 0:b599e748252c 328 void W5500_EMAC::add_multicast_group(const uint8_t* addr)
hudakz 0:b599e748252c 329 {
hudakz 0:b599e748252c 330 // No action for now
hudakz 0:b599e748252c 331 }
hudakz 0:b599e748252c 332
hudakz 0:b599e748252c 333 /**
hudakz 0:b599e748252c 334 * @brief
hudakz 0:b599e748252c 335 * @note
hudakz 0:b599e748252c 336 * @param
hudakz 0:b599e748252c 337 * @retval
hudakz 0:b599e748252c 338 */
hudakz 0:b599e748252c 339 void W5500_EMAC::remove_multicast_group(const uint8_t* addr)
hudakz 0:b599e748252c 340 {
hudakz 0:b599e748252c 341 // No action for now
hudakz 0:b599e748252c 342 }
hudakz 0:b599e748252c 343
hudakz 0:b599e748252c 344 /**
hudakz 0:b599e748252c 345 * @brief
hudakz 0:b599e748252c 346 * @note
hudakz 0:b599e748252c 347 * @param
hudakz 0:b599e748252c 348 * @retval
hudakz 0:b599e748252c 349 */
hudakz 0:b599e748252c 350 void W5500_EMAC::set_all_multicast(bool all)
hudakz 0:b599e748252c 351 {
hudakz 0:b599e748252c 352 // No action for now
hudakz 0:b599e748252c 353 }
hudakz 0:b599e748252c 354
hudakz 0:b599e748252c 355 /**
hudakz 0:b599e748252c 356 * @brief
hudakz 0:b599e748252c 357 * @note
hudakz 0:b599e748252c 358 * @param
hudakz 0:b599e748252c 359 * @retval
hudakz 0:b599e748252c 360 */
hudakz 0:b599e748252c 361 void W5500_EMAC::power_down()
hudakz 0:b599e748252c 362 {
hudakz 0:b599e748252c 363 _enc28j60->disableMacRecv();
hudakz 0:b599e748252c 364 if (_enc28j60->readReg(ESTAT_RXBUSY) != 0) {
hudakz 0:b599e748252c 365 _enc28j60->enableMacRecv();
hudakz 0:b599e748252c 366 return;
hudakz 0:b599e748252c 367 }
hudakz 0:b599e748252c 368
hudakz 0:b599e748252c 369 if (_enc28j60->readReg(ECON1_TXRTS) != 0) {
hudakz 0:b599e748252c 370 _enc28j60->enableMacRecv();
hudakz 0:b599e748252c 371 return;
hudakz 0:b599e748252c 372 }
hudakz 0:b599e748252c 373
hudakz 0:b599e748252c 374 _enc28j60->writeOp(ENC28J60_BIT_FIELD_SET, ECON2, ECON2_VRPS);
hudakz 0:b599e748252c 375 _enc28j60->writeOp(ENC28J60_BIT_FIELD_SET, ECON2, ECON2_PWRSV);
hudakz 0:b599e748252c 376 }
hudakz 0:b599e748252c 377
hudakz 0:b599e748252c 378 /**
hudakz 0:b599e748252c 379 * @brief
hudakz 0:b599e748252c 380 * @note
hudakz 0:b599e748252c 381 * @param
hudakz 0:b599e748252c 382 * @retval
hudakz 0:b599e748252c 383 */
hudakz 0:b599e748252c 384 void W5500_EMAC::set_memory_manager(EMACMemoryManager& mem_mngr)
hudakz 0:b599e748252c 385 {
hudakz 0:b599e748252c 386 _memory_manager = &mem_mngr;
hudakz 0:b599e748252c 387 }
hudakz 0:b599e748252c 388
hudakz 0:b599e748252c 389 /**
hudakz 0:b599e748252c 390 * @brief
hudakz 0:b599e748252c 391 * @note
hudakz 0:b599e748252c 392 * @param
hudakz 0:b599e748252c 393 * @retval
hudakz 0:b599e748252c 394 */
hudakz 0:b599e748252c 395 W5500_EMAC& W5500_EMAC::get_instance()
hudakz 0:b599e748252c 396 {
hudakz 0:b599e748252c 397 static W5500_EMAC emac;
hudakz 0:b599e748252c 398 return emac;
hudakz 0:b599e748252c 399 }
hudakz 0:b599e748252c 400
hudakz 0:b599e748252c 401 EMAC& EMAC::get_default_instance()
hudakz 0:b599e748252c 402 {
hudakz 0:b599e748252c 403 return W5500_EMAC::get_instance();
hudakz 0:b599e748252c 404 }