From: Leandro Lucarella Date: Thu, 8 Dec 2005 20:47:35 +0000 (+0000) Subject: Bugfixes: X-Git-Tag: 0.1-recibe-matriz-raw-por-udp~16 X-Git-Url: https://git.llucax.com/z.facultad/66.09/etherled.git/commitdiff_plain/6d441bbe709092d070c21b92aeeabfb82cb5982f Bugfixes: 1) Se arregla problema con paquetes con tamaño impar. 2) Se vuelve para atrás el cambio del OVW (estaba basado en el driver de Linux que hace un manejo MUCHO más elegante del OVW porque puede darse el lujo de usar mucha memoria =) 3) Se obtiene la MAC de la placa de forma un poco más elegante. --- diff --git a/src/dp8390.c b/src/dp8390.c index 642c36f..30b3fb5 100644 --- a/src/dp8390.c +++ b/src/dp8390.c @@ -121,7 +121,7 @@ static void reset() SELECT_REG_PAGE(0); // Clear rx buffer overflow & packet received interrupt flags. - write_reg(ISR, OVW); + write_reg(ISR, PRX | OVW); // Re-itialise transmit configuration reg for normal operation. write_reg(TCR, MODE0); @@ -139,6 +139,8 @@ static void reset() */ bool netdev_init() { + byte i; + // Set IOR & IOW as they're active low. IOR = 1; IOW = 1; @@ -191,18 +193,11 @@ bool netdev_init() write_reg(RSAR0, 0u); // En la dirección 0x0000 write_reg(RSAR1, 0u); write_reg(CR, READ); // Comienza lectura - eth_addr_local[0] = read_reg(RDMA); - read_reg(RDMA); // Ignoramos porque viene como un word - eth_addr_local[1] = read_reg(RDMA); - read_reg(RDMA); // Ignoramos porque viene como un word - eth_addr_local[2] = read_reg(RDMA); - read_reg(RDMA); // Ignoramos porque viene como un word - eth_addr_local[3] = read_reg(RDMA); - read_reg(RDMA); // Ignoramos porque viene como un word - eth_addr_local[4] = read_reg(RDMA); - read_reg(RDMA); // Ignoramos porque viene como un word - eth_addr_local[5] = read_reg(RDMA); - read_reg(RDMA); // Ignoramos porque viene como un word + for (i = 0; i < ETH_ADDR_SIZE; ++i) + { + eth_addr_local[i] = read_reg(RDMA); + read_reg(RDMA); // Ignoramos porque viene como un word + } // Abort/ complete DMA operation. ABORT_DMA(STOP); @@ -226,12 +221,8 @@ bool netdev_init() write_reg(CURR, RX_PAGE_START + 1); // Set physical address - write_reg(PAR0, eth_addr_local[0]); - write_reg(PAR1, eth_addr_local[1]); - write_reg(PAR2, eth_addr_local[2]); - write_reg(PAR3, eth_addr_local[3]); - write_reg(PAR4, eth_addr_local[4]); - write_reg(PAR5, eth_addr_local[5]); + for (i = 0; i < ETH_ADDR_SIZE; ++i) + write_reg(PAR_BASE + i, eth_addr_local[i]); // Restart RTL8019AS. write_reg(CR, START); @@ -427,7 +418,7 @@ byte netdev_recv_start() // Initiate DMA transfer of packet data. write_reg(CR, READ); - + return buf_hdr.len; } return 0; diff --git a/src/dp8390.h b/src/dp8390.h index 2f0f9b8..a11854c 100644 --- a/src/dp8390.h +++ b/src/dp8390.h @@ -137,6 +137,7 @@ sbit NICE = CTRL_PORT^2; // A7, usado para activar placa de red // Each enable bit correspons with an interrupt flag in ISR // Page 1 read/write registers. +#define PAR_BASE REG_BASE + 0x01 // Physical address register base address #define PAR0 REG_BASE + 0x01 // Physical address register 0 #define PAR1 REG_BASE + 0x02 // Physical address register 1 #define PAR2 REG_BASE + 0x03 // Physical address register 2 diff --git a/src/main.c b/src/main.c index c679ac8..419ad41 100644 --- a/src/main.c +++ b/src/main.c @@ -74,12 +74,10 @@ void main(void) // Nuestro protocolo, por ahora un simple echo! for (i = 8; i < udp_dgram_len; ++i) // 8 por la cabecera UDP { - leds0 = ~netdev_recv_byte(); - leds1 = ~i; - sleep(8); + printb(netdev_recv_byte(), 0x00); } - i = (udp_dgram_len % 2) ? udp_dgram_len : (udp_dgram_len + 1); - for (i += 34; i < len; ++i) // 8 por la cabecera UDP + //i = (udp_dgram_len % 2) ? (udp_dgram_len - 1) : udp_dgram_len; + for (i += 34; i < len; ++i) // 8 por las cabeceras eth+IP netdev_recv_byte(); drop: netdev_recv_end();