Debug fixes

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@429 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo 2007-12-05 23:51:41 +00:00
parent 98f35925e5
commit cba8fa9596

View File

@ -47,6 +47,7 @@
#include <sys/types.h>
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <debug.h>
@ -109,6 +110,11 @@
# undef CONFIG_NET_C5471_BASET10
#endif
/* This should be disabled unless you are performing very low level debug */
#undef CONFIG_C5471_NET_DUMPBUFFER
//#define CONFIG_C5471_NET_DUMPBUFFER 1
/* Timing values ************************************************************/
/* TX poll deley = 1 seconds. CLK_TCK=number of clock ticks per second */
@ -226,7 +232,7 @@
/* Bits 3-5: reserved */
#define EIM_INTEN_ENET0_ERR 0x00000004 /* Bit 2: ENET0 error interrupt */
#define EIM_INTEN_ENET0_TX 0x00000002 /* Bit 1: ENET0 TX interrupt */
#define EIM_INTEN_ENET0_RX 0x00000001 /* Bit 0" ENET0 RX interrupt */
#define EIM_INTEN_ENET0_RX 0x00000001 /* Bit 0: ENET0 RX interrupt */
/* ENET0_ADRMODE_EN bit settings */
@ -393,6 +399,64 @@ static void c5471_macassign(struct c5471_driver_s *c5471);
* Private Functions
****************************************************************************/
/****************************************************************************
* Name: c5471_dumpbuffer
*
* Description
* Debug only
*
****************************************************************************/
#ifdef CONFIG_C5471_NET_DUMPBUFFER
static void c5471_dumpbuffer(const char *buffer, ssize_t nbytes)
{
#if defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_NET)
char line[128];
int ch;
int i;
int j;
for (i = 0; i < nbytes; i += 16)
{
sprintf(line, "%04x: ", i);
for (j = 0; j < 16; j++)
{
if (i + j < nbytes)
{
sprintf(&line[strlen(line)], "%02x", buffer[i+j] );
}
else
{
strcpy(&line[strlen(line)], " ");
}
if (j == 7 || j == 15)
{
strcpy(&line[strlen(line)], " ");
}
}
for ( j = 0; j < 16; j++)
{
if (i + j < nbytes)
{
ch = buffer[i+j];
sprintf(&line[strlen(line)], "%c", ch >= 0x20 && ch <= 0x7e ? ch : '.');
}
if (j == 7 || j == 15)
{
strcpy(&line[strlen(line)], " ");
}
}
ndbg("%s\n", line);
}
#endif
}
#else
# define c5471_dumpbuffer(buffer,nbytes)
#endif
/****************************************************************************
* Name: c5471_mdtxbit
*
@ -419,9 +483,12 @@ static void c5471_mdtxbit (int bit_state)
* out the MDIO pin.
*/
/* config MDIO as output pin. */
/* Config MDIO as output pin. */
putreg32((getreg32(GPIO_CIO) & ~GPIO_CIO_MDIO), GPIO_CIO);
/* Select the the bit output state */
if (bit_state)
{
/* set MDIO state high. */
@ -448,7 +515,7 @@ static void c5471_mdtxbit (int bit_state)
/* release MDIO */
putreg32((getreg32(GPIO_CIO)|GPIO_CIO_MDIO), GPIO_CIO);
putreg32((getreg32(GPIO_CIO) | GPIO_CIO_MDIO), GPIO_CIO);
nop();
nop();
@ -499,7 +566,7 @@ static int c5471_mdrxbit (void)
/* MDCLK rising edge */
putreg32((getreg32(GPIO_IO)|GPIO_IO_MDCLK), GPIO_IO);
putreg32((getreg32(GPIO_IO) | GPIO_IO_MDCLK), GPIO_IO);
nop();
nop();
nop();
@ -536,7 +603,9 @@ static void c5471_mdwrite (int adr, int reg, int data)
/* preamble: 11111111111111111111111111111111 */
for (i = 0; i < 32; i++)
c5471_mdtxbit(1);
{
c5471_mdtxbit(1);
}
/* start of frame: 01 */
@ -564,7 +633,7 @@ static void c5471_mdwrite (int adr, int reg, int data)
reg = reg << 1;
}
/* turnaround time: ZZ */
/* Turnaround time: ZZ */
c5471_mdtxbit(1);
c5471_mdtxbit(0);
@ -597,7 +666,9 @@ static int c5471_mdread (int adr, int reg)
/* preamble: 11111111111111111111111111111111 */
for (i = 0; i < 32; i++)
c5471_mdtxbit(1);
{
c5471_mdtxbit(1);
}
/* start of frame: 01 */
@ -792,7 +863,7 @@ static inline void c5471_incrxcpu(struct c5471_driver_s *c5471)
c5471->c_rxcpudesc += 2*sizeof(uint32);
}
nvdbg("RX CPU desc: %08x\n", c5471->c_txcpudesc);
nvdbg("RX CPU desc: %08x\n", c5471->c_rxcpudesc);
}
/****************************************************************************
@ -829,6 +900,8 @@ static int c5471_transmit(struct c5471_driver_s *c5471)
c5471->c_lastdescstart = c5471->c_rxcpudesc;
nvdbg("Packet size: %d RX CPU desc: %08x\n", nbytes, c5471->c_rxcpudesc);
c5471_dumpbuffer(dev->d_buf, dev->d_len);
while (nbytes)
{
/* Verify that the hardware is ready to send another packet */
@ -1021,7 +1094,7 @@ void c5471_rxstatus(int *numbytes)
{
/* Loop back around to base of descriptor queue. */
desc = getreg32(EIM_CPU_RXBA) + EIM_RAM_START;
desc = getreg32(EIM_CPU_TXBA) + EIM_RAM_START;
}
else
{
@ -1120,24 +1193,28 @@ static void c5471_receive(struct c5471_driver_s *c5471)
break;
}
/* Get the size of the frame from words #0 and #1 of the descriptor
* and update the accumulated packet size
*/
framelen = (getreg32(c5471->c_txcpudesc) & EIM_TXDESC_BYTEMASK);
packetlen += framelen;
/* Words #2 and #3 of descriptor */
/* Check if the received packet will fit within the uIP packet buffer */
packetmem = (uint16*)getreg32(c5471->c_txcpudesc + 1);
/* Divide by 2 with round up to get the number of 16-bit words. */
nshorts = (framelen + 1) >> 1;
nvdbg("Reading framelen: %d packetlen: %d nshorts: %d packetment: %p\n",
framelen, packetlen, nshorts, packetmem);
for (i = 0 ; i < nshorts; i++, j++)
if (packetlen < (CONFIG_NET_BUFSIZE + 4))
{
/* Check if the received packet will fit without the uIP packet buffer */
/* Get the packet memory from words #2 and #3 of descriptor */
if (packetlen < (CONFIG_NET_BUFSIZE - 4))
packetmem = (uint16*)getreg32(c5471->c_txcpudesc + sizeof(uint32));
/* Divide by 2 with round up to get the number of 16-bit words. */
nshorts = (framelen + 1) >> 1;
nvdbg("Reading framelen: %d packetlen: %d nshorts: %d packetmen: %p\n",
framelen, packetlen, nshorts, packetmem);
for (i = 0 ; i < nshorts; i++, j++)
{
/* Copy the data data from the hardware to c5471->c_dev.d_buf 16-bits at
* a time.
@ -1146,6 +1223,10 @@ static void c5471_receive(struct c5471_driver_s *c5471)
((uint16*)dev->d_buf)[j] = htons(packetmem[i]);
}
}
else
{
nvdbg("Discarding framelen: %d packetlen\n", framelen, packetlen);
}
if (getreg32(c5471->c_txcpudesc) & EIM_TXDESC_LIF)
{
@ -1173,20 +1254,22 @@ static void c5471_receive(struct c5471_driver_s *c5471)
packetlen -= 4;
#ifdef CONFIG_C5471_NET_STATS
/* Increment the count of received packets */
/* Increment the count of received packets */
c5471->c_rxpackets++;
c5471->c_rxpackets++;
#endif
/* If we successfully transferred the data into the uIP buffer, then pass it on
* to uIP for processing.
*/
if (packetlen > 0 && packetlen < (CONFIG_NET_BUFSIZE / sizeof(uint16)))
if (packetlen > 0 && packetlen < CONFIG_NET_BUFSIZE)
{
/* Set amount of data in c5471->c_dev.d_len. */
dev->d_len = packetlen;
nvdbg("Received packet, packetlen: %d type: %02x\n", packetlen, BUF->type);
c5471_dumpbuffer(dev->d_buf, dev->d_len);
/* We only accept IP packets of the configured type and ARP packets */
@ -1234,6 +1317,7 @@ static void c5471_receive(struct c5471_driver_s *c5471)
{
/* Increment the count of dropped packets */
ndbg("Too big! packetlen: %d\n", packetlen);
c5471->c_rxdropped++;
}
#endif
@ -1270,7 +1354,7 @@ static inline void c5471_txstatus(void)
{
for (;;)
{
txstatus |= (getreg32(desc) & EIM_TXDESC_STATUSMASK);
txstatus |= (getreg32(desc) & EIM_RXDESC_STATUSMASK);
if (desc == c5471->c_lastdescend)
{
break;
@ -1748,13 +1832,15 @@ static void c5471_eimconfig(struct c5471_driver_s *c5471)
/* TX ENET 0 */
putreg32((desc & 0x0000ffff), ENET0_TDBA); /* 16bit offset address */
ndbg("TX ENET0 desc: %08x pbuf: %08x\n", desc, pbuf);
putreg32((desc & 0x0000ffff), ENET0_TDBA); /* 16-bit offset address */
for (i = NUM_DESC_TX-1; i >= 0; i--)
{
if (i == 0)
val = EIM_TXDESC_WRAP_NEXT;
else
val = EIM_TXDESC_WRAP_FIRST;
val |= EIM_TXDESC_OWN_HOST|EIM_TXDESC_INTRE|EIM_TXDESC_PADCRC|EIM_PACKET_BYTES;
putreg32(val, desc);
@ -1766,19 +1852,21 @@ static void c5471_eimconfig(struct c5471_driver_s *c5471)
putreg32(0, pbuf);;
pbuf += EIM_PACKET_BYTES;
putreg32(0, pbuf);;
putreg32(0, pbuf);
pbuf += sizeof(uint32); /* Ether Module's "Buffer Usage Word" */
}
/* RX ENET 0 */
putreg32((desc & 0x0000ffff), ENET0_RDBA); /* 16bit offset address */
ndbg("RX ENET0 desc: %08x pbuf: %08x\n", desc, pbuf);
putreg32((desc & 0x0000ffff), ENET0_RDBA); /* 16-bit offset address */
for (i = NUM_DESC_RX-1; i >= 0; i--)
{
if (i == 0)
val = EIM_RXDESC_WRAP_NEXT;
else
val = EIM_RXDESC_WRAP_FIRST;
val |= EIM_RXDESC_OWN_ENET|EIM_RXDESC_INTRE|EIM_RXDESC_PADCRC|EIM_PACKET_BYTES;
putreg32(val, desc);
@ -1796,8 +1884,9 @@ static void c5471_eimconfig(struct c5471_driver_s *c5471)
/* TX CPU */
ndbg("TX CPU desc: %08x pbuf: %08x\n", desc, pbuf);
c5471->c_txcpudesc = desc;
putreg32((desc & 0x0000ffff), EIM_CPU_TXBA); /* 16bit offset address */
putreg32((desc & 0x0000ffff), EIM_CPU_TXBA); /* 16-bit offset address */
for (i = NUM_DESC_TX-1; i >= 0; i--)
{
/* Set words 1+2 of the TXDESC */
@ -1806,24 +1895,27 @@ static void c5471_eimconfig(struct c5471_driver_s *c5471)
val = EIM_TXDESC_WRAP_NEXT;
else
val = EIM_TXDESC_WRAP_FIRST;
val |= EIM_TXDESC_OWN_HOST|EIM_TXDESC_INTRE|EIM_TXDESC_PADCRC|EIM_PACKET_BYTES;
putreg32(val, desc);
desc += sizeof(uint32);
putreg32(pbuf, desc);
desc += sizeof(uint32);
putreg(pbuf, 0);
putreg(0, pbuf);
pbuf += EIM_PACKET_BYTES;
putreg(pbuf, 0);
putreg(0, pbuf);
pbuf += sizeof(uint32); /* Ether Module's "Buffer Usage Word" */
}
/* RX CPU */
ndbg("RX CPU desc: %08x pbuf: %08x\n", desc, pbuf);
c5471->c_rxcpudesc = desc;
putreg32((desc & 0x0000ffff), EIM_CPU_RXBA); /* 16bit offset address */
putreg32((desc & 0x0000ffff), EIM_CPU_RXBA); /* 16-bit offset address */
for (i = NUM_DESC_RX-1; i >= 0; i--)
{
/* Set words 1+2 of the RXDESC */
@ -1832,6 +1924,7 @@ static void c5471_eimconfig(struct c5471_driver_s *c5471)
val = EIM_RXDESC_WRAP_NEXT;
else
val = EIM_RXDESC_WRAP_FIRST;
val |= EIM_RXDESC_OWN_ENET|EIM_RXDESC_INTRE|EIM_RXDESC_PADCRC|EIM_PACKET_BYTES;
putreg32(val, desc);
@ -1846,6 +1939,7 @@ static void c5471_eimconfig(struct c5471_driver_s *c5471)
putreg32(0, pbuf);;
pbuf += sizeof(uint32); /* Ether Module's "Buffer Usage Word" */
}
ndbg("END desc: %08x pbuf: %08x\n", desc, pbuf);
/* Save the descriptor packet size */
@ -1928,9 +2022,13 @@ static void c5471_eimconfig(struct c5471_driver_s *c5471)
static void c5471_reset(struct c5471_driver_s *c5471)
{
#if (CONFIG_C5471_ETHERNET_PHY == ETHERNET_PHY_LU3X31T_T64)
ndbg("EIM reset\n");
c5471_eimreset(c5471);
#endif
ndbg("PHY init\n");
c5471_phyinit();
ndbg("EIM config\n");
c5471_eimconfig(c5471);
}