static int nd_send(netdev2_t *netdev, const struct iovec *data, unsigned count) { enc28j60_t *dev = (enc28j60_t *)netdev; uint8_t ctrl = 0; int c = 0; mutex_lock(&dev->devlock); #ifdef MODULE_NETSTATS_L2 netdev->stats.tx_bytes += count; #endif /* set write pointer */ cmd_w_addr(dev, ADDR_WRITE_PTR, BUF_TX_START); /* write control byte and the actual data into the buffer */ cmd_wbm(dev, &ctrl, 1); for (int i = 0; i < count; i++) { c += data[i].iov_len; cmd_wbm(dev, (uint8_t *)data[i].iov_base, data[i].iov_len); } /* set TX end pointer */ cmd_w_addr(dev, ADDR_TX_END, cmd_r_addr(dev, ADDR_WRITE_PTR) - 1); /* trigger the send process */ cmd_bfs(dev, REG_ECON1, -1, ECON1_TXRTS); mutex_unlock(&dev->devlock); return c; }
static int nd_recv(netdev2_t *netdev, char *buf, int max_len, void *info) { enc28j60_t *dev = (enc28j60_t *)netdev; uint8_t head[6]; size_t size; uint16_t next; (void)info; mutex_lock(&dev->devlock); /* set read pointer to RX read address */ cmd_w_addr(dev, ADDR_READ_PTR, cmd_r_addr(dev, ADDR_RX_READ)); /* read packet header */ cmd_rbm(dev, head, 6); /* TODO: care for endianess */ next = (uint16_t)((head[1] << 8) | head[0]); size = (size_t)((head[3] << 8) | head[2]) - 4; /* discard CRC */ if (buf != NULL) { /* read packet content into the supplied buffer */ if (size <= max_len) { cmd_rbm(dev, (uint8_t *)buf, size); } else { DEBUG("[enc28j60] recv: unable to get packet - buffer too small\n"); size = 0; } /* release memory */ cmd_w_addr(dev, ADDR_RX_READ, next); cmd_bfs(dev, REG_ECON2, -1, ECON2_PKTDEC); } mutex_unlock(&dev->devlock); return (int)size; }