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
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:
- 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; } ...
enc28j60_emac.cpp@2:19d290369c66, 2021-03-27 (annotated)
- Committer:
- hudakz
- Date:
- Sat Mar 27 22:52:41 2021 +0000
- Revision:
- 2:19d290369c66
- Parent:
- 1:bce04bfc41fe
- Child:
- 3:aa88808326b9
Mbed OS Ethernet MAC (EMAC) driver for the ENC28J60 Ethernet controller. This a simplified fork of https://github.com/tobiasjaster/ENC28J60-EMAC-Driver published by Tobias Jaster.
Who changed what in which revision?
User | Revision | Line number | New 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 | 2:19d290369c66 | 18 | #include "mbed_interface.h" |
hudakz | 2:19d290369c66 | 19 | #include "mbed_wait_api.h" |
hudakz | 2:19d290369c66 | 20 | #include "mbed_assert.h" |
hudakz | 2:19d290369c66 | 21 | #include "netsocket/nsapi_types.h" |
hudakz | 2:19d290369c66 | 22 | #include "mbed_shared_queues.h" |
hudakz | 0:b599e748252c | 23 | |
hudakz | 2:19d290369c66 | 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 | 2:19d290369c66 | 32 | ENC28J60_EMAC::ENC28J60_EMAC() : |
hudakz | 2:19d290369c66 | 33 | _enc28j60(new ENC28J60(ENC28J60_MOSI, ENC28J60_MISO, ENC28J60_SCK, ENC28J60_CS)), |
hudakz | 2:19d290369c66 | 34 | _prev_link_status_up(PHY_STATE_LINK_DOWN), |
hudakz | 2:19d290369c66 | 35 | _link_status_task_handle(0), |
hudakz | 2:19d290369c66 | 36 | _receive_task_handle(0), |
hudakz | 2:19d290369c66 | 37 | _memory_manager(NULL) |
hudakz | 2:19d290369c66 | 38 | { } |
hudakz | 0:b599e748252c | 39 | |
hudakz | 0:b599e748252c | 40 | /** |
hudakz | 0:b599e748252c | 41 | * @brief |
hudakz | 2:19d290369c66 | 42 | * @note Allocates buffer chain from a pool and filles it with incoming packet. |
hudakz | 2:19d290369c66 | 43 | * @param |
hudakz | 2:19d290369c66 | 44 | * @retval Data from incoming packet |
hudakz | 2:19d290369c66 | 45 | */ |
hudakz | 2:19d290369c66 | 46 | emac_mem_buf_t* ENC28J60_EMAC::low_level_input() |
hudakz | 2:19d290369c66 | 47 | { |
hudakz | 2:19d290369c66 | 48 | emac_mem_buf_t* chain; |
hudakz | 2:19d290369c66 | 49 | emac_mem_buf_t* buf; |
hudakz | 2:19d290369c66 | 50 | packet_t packet; |
hudakz | 2:19d290369c66 | 51 | |
hudakz | 2:19d290369c66 | 52 | if (_enc28j60->getPacketInfo(&packet) != ENC28J60_ERROR_OK) { |
hudakz | 2:19d290369c66 | 53 | return NULL; |
hudakz | 2:19d290369c66 | 54 | } |
hudakz | 2:19d290369c66 | 55 | |
hudakz | 2:19d290369c66 | 56 | if (packet.payload.len == 0) { |
hudakz | 2:19d290369c66 | 57 | return NULL; |
hudakz | 2:19d290369c66 | 58 | } |
hudakz | 2:19d290369c66 | 59 | |
hudakz | 2:19d290369c66 | 60 | // Allocate a buffer chain from the memory pool. |
hudakz | 2:19d290369c66 | 61 | chain = _memory_manager->alloc_pool(packet.payload.len, ENC28J60_BUFF_ALIGNMENT); |
hudakz | 2:19d290369c66 | 62 | buf = chain; |
hudakz | 2:19d290369c66 | 63 | |
hudakz | 2:19d290369c66 | 64 | // Iterate through the buffer chain and fill it with packet payload. |
hudakz | 2:19d290369c66 | 65 | while (buf != NULL) { |
hudakz | 2:19d290369c66 | 66 | packet.payload.buf = (uint8_t*)_memory_manager->get_ptr(buf); |
hudakz | 2:19d290369c66 | 67 | packet.payload.len = (uint16_t) (_memory_manager->get_len(buf)); |
hudakz | 2:19d290369c66 | 68 | |
hudakz | 2:19d290369c66 | 69 | // Fill the ethernet stack buffer with packet payload received by ENC28J60. |
hudakz | 2:19d290369c66 | 70 | _enc28j60->readPacket(&packet); |
hudakz | 2:19d290369c66 | 71 | |
hudakz | 2:19d290369c66 | 72 | buf = _memory_manager->get_next(buf); |
hudakz | 2:19d290369c66 | 73 | } |
hudakz | 2:19d290369c66 | 74 | |
hudakz | 2:19d290369c66 | 75 | // Return the buffer chain filled with packet payload. |
hudakz | 2:19d290369c66 | 76 | return chain; |
hudakz | 2:19d290369c66 | 77 | } |
hudakz | 2:19d290369c66 | 78 | |
hudakz | 2:19d290369c66 | 79 | /** |
hudakz | 2:19d290369c66 | 80 | * @brief Receive task. |
hudakz | 2:19d290369c66 | 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 | 2:19d290369c66 | 85 | void ENC28J60_EMAC::receive_task() |
hudakz | 2:19d290369c66 | 86 | { |
hudakz | 2:19d290369c66 | 87 | emac_mem_buf_t* payload; |
hudakz | 2:19d290369c66 | 88 | |
hudakz | 2:19d290369c66 | 89 | _ethLockMutex.lock(); |
hudakz | 2:19d290369c66 | 90 | payload = low_level_input(); |
hudakz | 2:19d290369c66 | 91 | if (payload != NULL) { |
hudakz | 2:19d290369c66 | 92 | if (_emac_link_input_cb) { |
hudakz | 2:19d290369c66 | 93 | _emac_link_input_cb(payload); // pass packet payload to the ethernet stack |
hudakz | 2:19d290369c66 | 94 | _memory_manager->free(payload); |
hudakz | 2:19d290369c66 | 95 | } |
hudakz | 2:19d290369c66 | 96 | } |
hudakz | 2:19d290369c66 | 97 | |
hudakz | 2:19d290369c66 | 98 | _enc28j60->freeRxBuffer(); // make room in ENC28J60 receive buffer for new packets |
hudakz | 2:19d290369c66 | 99 | _ethLockMutex.unlock(); |
hudakz | 2:19d290369c66 | 100 | } |
hudakz | 2:19d290369c66 | 101 | |
hudakz | 2:19d290369c66 | 102 | |
hudakz | 2:19d290369c66 | 103 | /** |
hudakz | 2:19d290369c66 | 104 | * @brief |
hudakz | 2:19d290369c66 | 105 | * @note Passes a packet payload from the ethernet stack to ENC28J60 for transmittion |
hudakz | 2:19d290369c66 | 106 | * @param |
hudakz | 2:19d290369c66 | 107 | * @retval |
hudakz | 2:19d290369c66 | 108 | */ |
hudakz | 2:19d290369c66 | 109 | bool ENC28J60_EMAC::link_out(emac_mem_buf_t* buf) |
hudakz | 0:b599e748252c | 110 | { |
hudakz | 2:19d290369c66 | 111 | emac_mem_buf_t* chain = buf; |
hudakz | 2:19d290369c66 | 112 | packet_t packet; |
hudakz | 2:19d290369c66 | 113 | enc28j60_error_t error; |
hudakz | 2:19d290369c66 | 114 | |
hudakz | 2:19d290369c66 | 115 | if (buf == NULL) { |
hudakz | 2:19d290369c66 | 116 | return false; |
hudakz | 2:19d290369c66 | 117 | } |
hudakz | 2:19d290369c66 | 118 | |
hudakz | 2:19d290369c66 | 119 | _ethLockMutex.lock(); |
hudakz | 2:19d290369c66 | 120 | // Iterate through the buffer chain and fill the packet with payload. |
hudakz | 2:19d290369c66 | 121 | while (buf != NULL) { |
hudakz | 2:19d290369c66 | 122 | packet.payload.buf = (uint8_t *) (_memory_manager->get_ptr(buf)); |
hudakz | 2:19d290369c66 | 123 | packet.payload.len = _memory_manager->get_len(buf); |
hudakz | 2:19d290369c66 | 124 | error = _enc28j60->loadPacketInTxBuffer(&packet); |
hudakz | 2:19d290369c66 | 125 | if (error != ENC28J60_ERROR_OK) { |
hudakz | 2:19d290369c66 | 126 | _memory_manager->free(chain); |
hudakz | 2:19d290369c66 | 127 | _ethLockMutex.unlock(); |
hudakz | 2:19d290369c66 | 128 | return false; |
hudakz | 2:19d290369c66 | 129 | } |
hudakz | 2:19d290369c66 | 130 | |
hudakz | 2:19d290369c66 | 131 | error = _enc28j60->transmitPacket(&packet); |
hudakz | 2:19d290369c66 | 132 | if (error != ENC28J60_ERROR_OK) { |
hudakz | 2:19d290369c66 | 133 | _memory_manager->free(chain); |
hudakz | 2:19d290369c66 | 134 | _ethLockMutex.unlock(); |
hudakz | 2:19d290369c66 | 135 | return false; |
hudakz | 2:19d290369c66 | 136 | } |
hudakz | 2:19d290369c66 | 137 | |
hudakz | 2:19d290369c66 | 138 | buf = _memory_manager->get_next(buf); |
hudakz | 2:19d290369c66 | 139 | } |
hudakz | 2:19d290369c66 | 140 | |
hudakz | 2:19d290369c66 | 141 | _memory_manager->free(chain); |
hudakz | 2:19d290369c66 | 142 | _ethLockMutex.unlock(); |
hudakz | 2:19d290369c66 | 143 | |
hudakz | 2:19d290369c66 | 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 | 2:19d290369c66 | 153 | void ENC28J60_EMAC::link_status_task() |
hudakz | 0:b599e748252c | 154 | { |
hudakz | 2:19d290369c66 | 155 | uint16_t phy_basic_status_reg_value = 0; |
hudakz | 2:19d290369c66 | 156 | bool current_link_status_up = false; |
hudakz | 0:b599e748252c | 157 | |
hudakz | 2:19d290369c66 | 158 | /* Get current status */ |
hudakz | 0:b599e748252c | 159 | |
hudakz | 2:19d290369c66 | 160 | _ethLockMutex.lock(); |
hudakz | 2:19d290369c66 | 161 | _enc28j60->phyRead(PHSTAT2, &phy_basic_status_reg_value); |
hudakz | 0:b599e748252c | 162 | |
hudakz | 2:19d290369c66 | 163 | current_link_status_up = (bool) ((phy_basic_status_reg_value & PHSTAT2_LSTAT) != 0); |
hudakz | 0:b599e748252c | 164 | |
hudakz | 2:19d290369c66 | 165 | /* Compare with previous state */ |
hudakz | 2:19d290369c66 | 166 | if (current_link_status_up != _prev_link_status_up) { |
hudakz | 2:19d290369c66 | 167 | if (_emac_link_state_cb) { |
hudakz | 2:19d290369c66 | 168 | _emac_link_state_cb(current_link_status_up); |
hudakz | 2:19d290369c66 | 169 | } |
hudakz | 0:b599e748252c | 170 | |
hudakz | 2:19d290369c66 | 171 | _prev_link_status_up = current_link_status_up; |
hudakz | 2:19d290369c66 | 172 | } |
hudakz | 0:b599e748252c | 173 | |
hudakz | 2:19d290369c66 | 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 | 2:19d290369c66 | 183 | bool ENC28J60_EMAC::power_up() |
hudakz | 0:b599e748252c | 184 | { |
hudakz | 2:19d290369c66 | 185 | volatile uint32_t timeout = 500; |
hudakz | 2:19d290369c66 | 186 | _enc28j60->writeOp(ENC28J60_BIT_FIELD_CLR, ECON2, ECON2_PWRSV); |
hudakz | 2:19d290369c66 | 187 | while (_enc28j60->readReg(ESTAT_CLKRDY) == 0) { |
hudakz | 2:19d290369c66 | 188 | ThisThread::sleep_for(1ms); |
hudakz | 2:19d290369c66 | 189 | timeout--; |
hudakz | 2:19d290369c66 | 190 | if (timeout == 0) { |
hudakz | 2:19d290369c66 | 191 | return false; |
hudakz | 2:19d290369c66 | 192 | } |
hudakz | 0:b599e748252c | 193 | } |
hudakz | 0:b599e748252c | 194 | |
hudakz | 2:19d290369c66 | 195 | /* Trigger thread to deal with any RX packets that arrived |
hudakz | 2:19d290369c66 | 196 | * before receiver_thread was started */ |
hudakz | 2:19d290369c66 | 197 | _receive_task_handle = mbed::mbed_event_queue()->call_every |
hudakz | 2:19d290369c66 | 198 | ( |
hudakz | 2:19d290369c66 | 199 | RECEIVE_TASK_PERIOD_MS, |
hudakz | 2:19d290369c66 | 200 | mbed::callback(this, &ENC28J60_EMAC::receive_task) |
hudakz | 2:19d290369c66 | 201 | ); |
hudakz | 0:b599e748252c | 202 | |
hudakz | 2:19d290369c66 | 203 | _prev_link_status_up = PHY_STATE_LINK_DOWN; |
hudakz | 2:19d290369c66 | 204 | mbed::mbed_event_queue()->call(mbed::callback(this, &ENC28J60_EMAC::link_status_task)); |
hudakz | 0:b599e748252c | 205 | |
hudakz | 2:19d290369c66 | 206 | /* Allow the Link Status task to detect the initial link state */ |
hudakz | 2:19d290369c66 | 207 | ThisThread::sleep_for(10ms); |
hudakz | 2:19d290369c66 | 208 | _link_status_task_handle = mbed::mbed_event_queue()->call_every |
hudakz | 2:19d290369c66 | 209 | ( |
hudakz | 2:19d290369c66 | 210 | LINK_STATUS_TASK_PERIOD_MS, |
hudakz | 2:19d290369c66 | 211 | mbed::callback(this, &ENC28J60_EMAC::link_status_task) |
hudakz | 2:19d290369c66 | 212 | ); |
hudakz | 0:b599e748252c | 213 | |
hudakz | 2:19d290369c66 | 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 | 2:19d290369c66 | 223 | uint32_t ENC28J60_EMAC::get_mtu_size() const |
hudakz | 0:b599e748252c | 224 | { |
hudakz | 2:19d290369c66 | 225 | return ENC28J60_ETH_MTU_SIZE; |
hudakz | 0:b599e748252c | 226 | } |
hudakz | 0:b599e748252c | 227 | |
hudakz | 0:b599e748252c | 228 | /** |
hudakz | 2:19d290369c66 | 229 | * @brief |
hudakz | 2:19d290369c66 | 230 | * @note |
hudakz | 0:b599e748252c | 231 | * @param |
hudakz | 0:b599e748252c | 232 | * @retval |
hudakz | 0:b599e748252c | 233 | */ |
hudakz | 2:19d290369c66 | 234 | uint32_t ENC28J60_EMAC::get_align_preference() const |
hudakz | 0:b599e748252c | 235 | { |
hudakz | 2:19d290369c66 | 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 | 2:19d290369c66 | 245 | void ENC28J60_EMAC::get_ifname(char* name, uint8_t size) const |
hudakz | 0:b599e748252c | 246 | { |
hudakz | 2:19d290369c66 | 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 | 2:19d290369c66 | 256 | uint8_t ENC28J60_EMAC::get_hwaddr_size() const |
hudakz | 0:b599e748252c | 257 | { |
hudakz | 2:19d290369c66 | 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 | 2:19d290369c66 | 267 | bool ENC28J60_EMAC::get_hwaddr(uint8_t* addr) const |
hudakz | 0:b599e748252c | 268 | { |
hudakz | 2:19d290369c66 | 269 | enc28j60_error_t error = _enc28j60->readMacAddr((char*)addr); |
hudakz | 2:19d290369c66 | 270 | if (error == ENC28J60_ERROR_OK) { |
hudakz | 2:19d290369c66 | 271 | return true; |
hudakz | 2:19d290369c66 | 272 | } |
hudakz | 2:19d290369c66 | 273 | else { |
hudakz | 2:19d290369c66 | 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 | 2:19d290369c66 | 284 | void ENC28J60_EMAC::set_hwaddr(const uint8_t* addr) |
hudakz | 0:b599e748252c | 285 | { |
hudakz | 2:19d290369c66 | 286 | if (!addr) { |
hudakz | 2:19d290369c66 | 287 | return; |
hudakz | 0:b599e748252c | 288 | } |
hudakz | 0:b599e748252c | 289 | |
hudakz | 2:19d290369c66 | 290 | memcpy(_hwaddr, addr, sizeof _hwaddr); |
hudakz | 2:19d290369c66 | 291 | _ethLockMutex.lock(); |
hudakz | 0:b599e748252c | 292 | |
hudakz | 2:19d290369c66 | 293 | enc28j60_error_t error = _enc28j60->writeMacAddr((char*)addr); |
hudakz | 2:19d290369c66 | 294 | _ethLockMutex.unlock(); |
hudakz | 2:19d290369c66 | 295 | if (error) { |
hudakz | 2:19d290369c66 | 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 | 2:19d290369c66 | 306 | void ENC28J60_EMAC::set_link_input_cb(emac_link_input_cb_t input_cb) |
hudakz | 0:b599e748252c | 307 | { |
hudakz | 2:19d290369c66 | 308 | _emac_link_input_cb = input_cb; |
hudakz | 2:19d290369c66 | 309 | } |
hudakz | 0:b599e748252c | 310 | |
hudakz | 2:19d290369c66 | 311 | /** |
hudakz | 2:19d290369c66 | 312 | * @brief |
hudakz | 2:19d290369c66 | 313 | * @note |
hudakz | 2:19d290369c66 | 314 | * @param |
hudakz | 2:19d290369c66 | 315 | * @retval |
hudakz | 2:19d290369c66 | 316 | */ |
hudakz | 2:19d290369c66 | 317 | void ENC28J60_EMAC::set_link_state_cb(emac_link_state_change_cb_t state_cb) |
hudakz | 2:19d290369c66 | 318 | { |
hudakz | 2:19d290369c66 | 319 | _emac_link_state_cb = state_cb; |
hudakz | 2:19d290369c66 | 320 | } |
hudakz | 0:b599e748252c | 321 | |
hudakz | 2:19d290369c66 | 322 | /** |
hudakz | 2:19d290369c66 | 323 | * @brief |
hudakz | 2:19d290369c66 | 324 | * @note |
hudakz | 2:19d290369c66 | 325 | * @param |
hudakz | 2:19d290369c66 | 326 | * @retval |
hudakz | 2:19d290369c66 | 327 | */ |
hudakz | 2:19d290369c66 | 328 | void ENC28J60_EMAC::add_multicast_group(const uint8_t* addr) |
hudakz | 2:19d290369c66 | 329 | { |
hudakz | 2:19d290369c66 | 330 | // No action for now |
hudakz | 2:19d290369c66 | 331 | } |
hudakz | 0:b599e748252c | 332 | |
hudakz | 2:19d290369c66 | 333 | /** |
hudakz | 2:19d290369c66 | 334 | * @brief |
hudakz | 2:19d290369c66 | 335 | * @note |
hudakz | 2:19d290369c66 | 336 | * @param |
hudakz | 2:19d290369c66 | 337 | * @retval |
hudakz | 2:19d290369c66 | 338 | */ |
hudakz | 2:19d290369c66 | 339 | void ENC28J60_EMAC::remove_multicast_group(const uint8_t* addr) |
hudakz | 2:19d290369c66 | 340 | { |
hudakz | 2:19d290369c66 | 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 | 2:19d290369c66 | 350 | void ENC28J60_EMAC::set_all_multicast(bool all) |
hudakz | 0:b599e748252c | 351 | { |
hudakz | 2:19d290369c66 | 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 | 2:19d290369c66 | 361 | void ENC28J60_EMAC::power_down() |
hudakz | 0:b599e748252c | 362 | { |
hudakz | 2:19d290369c66 | 363 | _enc28j60->disableMacRecv(); |
hudakz | 2:19d290369c66 | 364 | if (_enc28j60->readReg(ESTAT_RXBUSY) != 0) { |
hudakz | 2:19d290369c66 | 365 | _enc28j60->enableMacRecv(); |
hudakz | 2:19d290369c66 | 366 | return; |
hudakz | 2:19d290369c66 | 367 | } |
hudakz | 0:b599e748252c | 368 | |
hudakz | 2:19d290369c66 | 369 | if (_enc28j60->readReg(ECON1_TXRTS) != 0) { |
hudakz | 2:19d290369c66 | 370 | _enc28j60->enableMacRecv(); |
hudakz | 2:19d290369c66 | 371 | return; |
hudakz | 0:b599e748252c | 372 | } |
hudakz | 0:b599e748252c | 373 | |
hudakz | 2:19d290369c66 | 374 | _enc28j60->writeOp(ENC28J60_BIT_FIELD_SET, ECON2, ECON2_VRPS); |
hudakz | 2:19d290369c66 | 375 | _enc28j60->writeOp(ENC28J60_BIT_FIELD_SET, ECON2, ECON2_PWRSV); |
hudakz | 2:19d290369c66 | 376 | } |
hudakz | 2:19d290369c66 | 377 | |
hudakz | 2:19d290369c66 | 378 | /** |
hudakz | 2:19d290369c66 | 379 | * @brief |
hudakz | 2:19d290369c66 | 380 | * @note |
hudakz | 2:19d290369c66 | 381 | * @param |
hudakz | 2:19d290369c66 | 382 | * @retval |
hudakz | 2:19d290369c66 | 383 | */ |
hudakz | 2:19d290369c66 | 384 | void ENC28J60_EMAC::set_memory_manager(EMACMemoryManager& mem_mngr) |
hudakz | 2:19d290369c66 | 385 | { |
hudakz | 2:19d290369c66 | 386 | _memory_manager = &mem_mngr; |
hudakz | 0:b599e748252c | 387 | } |
hudakz | 2:19d290369c66 | 388 | |
hudakz | 2:19d290369c66 | 389 | /** |
hudakz | 2:19d290369c66 | 390 | * @brief |
hudakz | 2:19d290369c66 | 391 | * @note |
hudakz | 2:19d290369c66 | 392 | * @param |
hudakz | 2:19d290369c66 | 393 | * @retval |
hudakz | 2:19d290369c66 | 394 | */ |
hudakz | 2:19d290369c66 | 395 | ENC28J60_EMAC& ENC28J60_EMAC::get_instance() |
hudakz | 2:19d290369c66 | 396 | { |
hudakz | 2:19d290369c66 | 397 | static ENC28J60_EMAC emac; |
hudakz | 2:19d290369c66 | 398 | return emac; |
hudakz | 2:19d290369c66 | 399 | } |
hudakz | 2:19d290369c66 | 400 | |
hudakz | 2:19d290369c66 | 401 | EMAC& EMAC::get_default_instance() |
hudakz | 2:19d290369c66 | 402 | { |
hudakz | 2:19d290369c66 | 403 | return ENC28J60_EMAC::get_instance(); |
hudakz | 2:19d290369c66 | 404 | } |