*/
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);
*/
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);
// Initiate DMA transfer of packet data.
write_reg(CR, READ);
-
+
return buf_hdr.len;
}
return 0;
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);
}