*/
byte netdev_recv_start()
{
- // Indicamos que no se leyó el paquete
- persistent.next_pkt = 0;
-
// Check if the rx buffer has overflowed.
if (read_reg(ISR) & OVW)
{
// Check if last packet has been removed from rx buffer.
if(bnry == current)
{
- print(0x0000);
// Clear packet received interrupt flag.
write_reg(ISR, PRX | RXE);
return 0u;
buf_hdr.next = read_reg(RDMA);
// Indicamos cual es el próximo paquete para cuando termine
+ // FIXME poner más lindo para que consuma menos memoria
persistent.next_pkt = buf_hdr.next - 1;
- printb(bnry, 0x03);
- printb(current, 0x07);
- printb(buf_hdr.next, 0x0f);
-
// Retrieve packet data length and subtract CRC bytes.
buf_hdr.len = read_reg(RDMA) - sizeof(struct buf_hdr_t);
// Si es muy grande, muy chico o hubo error, lo descartamos
if ((buf_hdr.len < MIN_PACKET_LEN) || (buf_hdr.len > MAX_PACKET_LEN)
|| ((buf_hdr.status & 0x0F) != RXSOK)
- || (current = read_reg(RDMA))) // Parte alta del tamaño
+ || read_reg(RDMA)) // Parte alta del tamaño
{
- printb(buf_hdr.next, 0x1f);
- printb(buf_hdr.status, 0x3f);
- printb(buf_hdr.len, 0x7f);
- printb(current, 0xff);
+ // Abort/ complete DMA operation.
+ ABORT_DMA(START);
+
+ // Advance boundary pointer to next packet start.
+ write_reg(BNRY, persistent.next_pkt);
+
return 0;
}
- // Abort/ complete DMA operation.
- ABORT_DMA(START);
-
// Set remote DMA start address registers to packet data.
write_reg(RSAR0, sizeof(struct buf_hdr_t));
write_reg(RSAR1, bnry);
void netdev_recv_end()
{
// Abort/ complete DMA operation.
- ABORT_DMA(STOP);
+ ABORT_DMA(START);
// Advance boundary pointer to next packet start.
- if (persistent.next_pkt)
- write_reg(BNRY, persistent.next_pkt);
+ write_reg(BNRY, persistent.next_pkt);
}
while (1) // Forever
{
- uint16 len = netdev_recv_start();
+ byte i;
+ byte len = netdev_recv_start();
printb(len, 0x1);
- if (!len) // no recibimos nada
- goto drop; // Tiramos el paquete
+ if (!len) // no recibimos nada (válido)
+ continue; // Probamos de nuevo
// Tenemos algo!
//print(0x2);
printb(udp_dgram_len, 0x40);
// TODO
// Nuestro protocolo, por ahora un simple echo!
- for (len = 8; len < udp_dgram_len; len += 2) // 8 por la cabecera UDP
+ for (i = 8; i < udp_dgram_len; ++i) // 8 por la cabecera UDP
{
- print(netdev_recv_word());
+ leds0 = ~netdev_recv_byte();
+ leds1 = ~i;
+ sleep(8);
}
+ i = (udp_dgram_len % 2) ? udp_dgram_len : (udp_dgram_len + 1);
+ for (i += 34; i < len; ++i) // 8 por la cabecera UDP
+ netdev_recv_byte();
drop:
netdev_recv_end();
}