memhandle Enc28J60Network::receivePacket() { uint8_t rxstat; uint16_t len; // check if a packet has been received and buffered //if( !(readReg(EIR) & EIR_PKTIF) ){ // The above does not work. See Rev. B4 Silicon Errata point 6. if (readReg(EPKTCNT) != 0) { uint16_t readPtr = nextPacketPtr+6 > RXSTOP_INIT ? nextPacketPtr+6-RXSTOP_INIT+RXSTART_INIT : nextPacketPtr+6; // Set the read pointer to the start of the received packet writeRegPair(ERDPTL, nextPacketPtr); // read the next packet pointer nextPacketPtr = readOp(ENC28J60_READ_BUF_MEM, 0); nextPacketPtr |= readOp(ENC28J60_READ_BUF_MEM, 0) << 8; // read the packet length (see datasheet page 43) len = readOp(ENC28J60_READ_BUF_MEM, 0); len |= readOp(ENC28J60_READ_BUF_MEM, 0) << 8; len -= 4; //remove the CRC count // read the receive status (see datasheet page 43) rxstat = readOp(ENC28J60_READ_BUF_MEM, 0); //rxstat |= readOp(ENC28J60_READ_BUF_MEM, 0) << 8; #ifdef ENC28J60DEBUG Serial.print("receivePacket ["); Serial.print(readPtr,HEX); Serial.print("-"); Serial.print((readPtr+len) % (RXSTOP_INIT+1),HEX); Serial.print("], next: "); Serial.print(nextPacketPtr,HEX); Serial.print(", stat: "); Serial.print(rxstat,HEX); Serial.print(", count: "); Serial.print(readReg(EPKTCNT)); Serial.print(" -> "); Serial.println((rxstat & 0x80)!=0 ? "OK" : "failed"); #endif // decrement the packet counter indicate we are done with this packet writeOp(ENC28J60_BIT_FIELD_SET, ECON2, ECON2_PKTDEC); // check CRC and symbol errors (see datasheet page 44, table 7-3): // The ERXFCON.CRCEN is set by default. Normally we should not // need to check this. if ((rxstat & 0x80) != 0) { receivePkt.begin = readPtr; receivePkt.size = len; #ifdef ENC28J60DEBUG Serial.print("receivePkt.size="); Serial.println(len); #endif return UIP_RECEIVEBUFFERHANDLE; } // Move the RX read pointer to the start of the next received packet // This frees the memory we just read out setERXRDPT(); } return (NOBLOCK); }
void Enc28J60Network::copyPacket(memhandle dest_pkt, memaddress dest_pos, memhandle src_pkt, memaddress src_pos, uint16_t len) { memblock *dest = &blocks[dest_pkt]; memblock *src = src_pkt == UIP_RECEIVEBUFFERHANDLE ? &receivePkt : &blocks[src_pkt]; memblock_mv_cb(dest->begin+dest_pos,src->begin+src_pos,len); // Move the RX read pointer to the start of the next received packet // This frees the memory we just read out setERXRDPT(); }
void Enc28J60Network::copyPacket(memhandle dest_pkt, memaddress dest_pos, memhandle src_pkt, memaddress src_pos, uint16_t len) { memblock *dest = &blocks[dest_pkt]; memblock *src = src_pkt == UIP_RECEIVEBUFFERHANDLE ? &receivePkt : &blocks[src_pkt]; memaddress start = src_pkt == UIP_RECEIVEBUFFERHANDLE && src->begin + src_pos > RXSTOP_INIT ? src->begin + src_pos-RXSTOP_INIT+RXSTART_INIT : src->begin + src_pos; enc28J60_mempool_block_move_callback(dest->begin+dest_pos,start,len); // Move the RX read pointer to the start of the next received packet // This frees the memory we just read out setERXRDPT(); }
void Enc28J60Network::freePacket() { setERXRDPT(); }