From a54d8f292cffe00cf141efc7d6c49cbb598c1d21 Mon Sep 17 00:00:00 2001 From: Leandro Lucarella Date: Thu, 8 Dec 2005 07:40:24 +0000 Subject: [PATCH] =?utf8?q?Arregla=20problema=20de=20la=20recepci=C3=B3n=20?= =?utf8?q?de=20m=C3=A1s=20de=20un=20paquete.=20En=20realidad=20no=20arregl?= =?utf8?q?a=20nada,=20porque=20el=20problema=20era=20no=20terminar=20de=20?= =?utf8?q?leer=20todos=20los=20datos=20del=20DMA=20y=20los=20datos=20se=20?= =?utf8?q?leen=20s=C3=B3lo=20a=20modo=20de=20prueba,=20pero=20la=20necesid?= =?utf8?q?ad=20de=20leer=20completo=20un=20DMA=20ser=C3=A1=20tenida=20en?= =?utf8?q?=20cuenta=20cuando=20se=20implemente=20el=20protocolo=20nuestro?= =?utf8?q?=20(o=20mejor=20a=C3=BAn=20en=20el=20m=C3=B3dulo=20de=20la=20DP8?= =?utf8?q?390).?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/dp8390.c | 29 ++++++++++------------------- src/main.c | 16 +++++++++++----- 2 files changed, 21 insertions(+), 24 deletions(-) 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(); } -- 2.43.0