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);
*/
bool netdev_init()
{
+ byte i;
+
// Set IOR & IOW as they're active low.
IOR = 1;
IOW = 1;
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);
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);
// Initiate DMA transfer of packet data.
write_reg(CR, READ);
-
+
return buf_hdr.len;
}
return 0;
// 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
// 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();