From: Leandro Lucarella Date: Thu, 8 Dec 2005 07:40:24 +0000 (+0000) Subject: Arregla problema de la recepción de más de un paquete. X-Git-Tag: 0.1-recibe-matriz-raw-por-udp~20 X-Git-Url: https://git.llucax.com/z.facultad/66.09/etherled.git/commitdiff_plain/a54d8f292cffe00cf141efc7d6c49cbb598c1d21 Arregla problema de la recepción de más de un paquete. En realidad no arregla nada, porque el problema era no terminar de leer todos los datos del DMA y los datos se leen sólo a modo de prueba, pero la necesidad de leer completo un DMA será tenida en cuenta cuando se implemente el protocolo nuestro (o mejor aún en el módulo de la DP8390). --- diff --git a/src/dp8390.c b/src/dp8390.c index 946ebc7..3ca44fd 100644 --- a/src/dp8390.c +++ b/src/dp8390.c @@ -318,9 +318,6 @@ void netdev_send_end() */ 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) { @@ -378,7 +375,6 @@ byte netdev_recv_start() // 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; @@ -401,30 +397,26 @@ byte netdev_recv_start() 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); @@ -464,10 +456,9 @@ uint16 netdev_recv_word() 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); } diff --git a/src/main.c b/src/main.c index e0f6b2e..c679ac8 100644 --- a/src/main.c +++ b/src/main.c @@ -30,10 +30,11 @@ void main(void) 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); @@ -71,10 +72,15 @@ void main(void) 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(); }