Basic enc29j80 init logic exercised

git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@2650 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
patacongo
2010-05-04 01:28:47 +00:00
parent d8a9c604d5
commit a7b7d5695d
4 changed files with 34 additions and 29 deletions
+3 -2
View File
@@ -897,8 +897,9 @@
Two configurations have been verified: (1) The board boots and passes the OS test Two configurations have been verified: (1) The board boots and passes the OS test
with console output visible on UART0, and the NuttShell <a href="NuttShell.html">(NSH)</a> with console output visible on UART0, and the NuttShell <a href="NuttShell.html">(NSH)</a>
is fully functional with interrupt driven serial console. An SPI driver is available is fully functional with interrupt driven serial console. An SPI driver is available
but untested (because the Olimex card slot appears to accept only MMC cards; I have but only partially tested. Additional features are needed: USB driver, MMC/SD integration,
only SD cards). Additional features are needed: USB driver, MMC integration, to name two. to name two. And ENC29J60 Ethernet driver for add-on hardware is under development and
should be available in the NuttX 5.5 release.
</p> </p>
<p> <p>
<b>Development Environments:</b> <b>Development Environments:</b>
+1 -8
View File
@@ -154,8 +154,6 @@ void up_netinitialize(void)
/* Get the SPI port */ /* Get the SPI port */
nllvdbg("Initializing SPI port %d\n", ENC28J60_SPI_PORTNO);
spi = up_spiinitialize(ENC28J60_SPI_PORTNO); spi = up_spiinitialize(ENC28J60_SPI_PORTNO);
if (!spi) if (!spi)
{ {
@@ -172,13 +170,8 @@ void up_netinitialize(void)
return; return;
} }
nllvdbg("Successfully initialized SPI port %d\n", ENC28J60_SPI_PORTNO);
/* Bind the SPI port to the ENC28J60 driver */ /* Bind the SPI port to the ENC28J60 driver */
nllvdbg("Binding SPI port %d to ENC28J60 device %d\n",
ENC28J60_SPI_PORTNO, ENC28J60_DEVNO);
ret = enc_initialize(spi, ENC28J60_DEVNO, ENC28J60_IRQ); ret = enc_initialize(spi, ENC28J60_DEVNO, ENC28J60_IRQ);
if (ret < 0) if (ret < 0)
{ {
@@ -187,7 +180,7 @@ void up_netinitialize(void)
return; return;
} }
nllvdbg("Successfuly bound SPI port %d ENC28J60 device %d\n", nllvdbg("Bound SPI port %d to ENC28J60 device %d\n",
ENC28J60_SPI_PORTNO, ENC28J60_DEVNO); ENC28J60_SPI_PORTNO, ENC28J60_DEVNO);
} }
#endif /* CONFIG_NET_ENC28J60 */ #endif /* CONFIG_NET_ENC28J60 */
+7 -6
View File
@@ -42,6 +42,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#include <debug.h>
#include <nuttx/spi.h> #include <nuttx/spi.h>
@@ -525,7 +526,7 @@ static inline void spi_drain(FAR struct str71x_spidev_s *priv)
{ {
(void)spi_getreg(priv, STR71X_BSPI_RXR_OFFSET); (void)spi_getreg(priv, STR71X_BSPI_RXR_OFFSET);
} }
while (spi_getreg(priv, STR71X_BSPI_CSR2_OFFSET & STR71X_BSPICSR2_RFNE) != 0); while ((spi_getreg(priv, STR71X_BSPI_CSR2_OFFSET) & STR71X_BSPICSR2_RFNE) != 0);
} }
/**************************************************************************** /****************************************************************************
@@ -556,7 +557,7 @@ static void spi_select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool sel
reg16 = spi_getreg(priv, STR71X_GPIO_PD_OFFSET); reg16 = spi_getreg(priv, STR71X_GPIO_PD_OFFSET);
if (selected) if (selected)
{ {
/* Enable slave select (low enables) */ /* Enable slave select (low enables) */
reg16 &= ~priv->csbit; reg16 &= ~priv->csbit;
spi_putreg(priv, STR71X_GPIO_PD_OFFSET, reg16); spi_putreg(priv, STR71X_GPIO_PD_OFFSET, reg16);
@@ -565,12 +566,12 @@ static void spi_select(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool sel
{ {
/* Disable slave select (low enables) */ /* Disable slave select (low enables) */
reg16 |= priv->csbit; reg16 |= priv->csbit;
spi_putreg(priv, STR71X_GPIO_PD_OFFSET, reg16); spi_putreg(priv, STR71X_GPIO_PD_OFFSET, reg16);
/* And drain the FIFOs */ /* And drain the FIFOs */
spi_drain(priv); spi_drain(priv);
} }
} }
+23 -13
View File
@@ -871,7 +871,7 @@ static int enc_transmit(FAR struct enc_driver_s *priv)
#endif #endif
/* Verify that the hardware is ready to send another packet. The driver /* Verify that the hardware is ready to send another packet. The driver
* start a transmission process by setting ECON1.TXRTS. When the packet is * starts a transmission process by setting ECON1.TXRTS. When the packet is
* finished transmitting or is aborted due to an error/cancellation, the * finished transmitting or is aborted due to an error/cancellation, the
* ECON1.TXRTS bit will be cleared. * ECON1.TXRTS bit will be cleared.
* *
@@ -1620,9 +1620,9 @@ static int enc_ifup(struct uip_driver_s *dev)
FAR struct enc_driver_s *priv = (FAR struct enc_driver_s *)dev->d_private; FAR struct enc_driver_s *priv = (FAR struct enc_driver_s *)dev->d_private;
int ret; int ret;
ndbg("Bringing up: %d.%d.%d.%d\n", nlldbg("Bringing up: %d.%d.%d.%d\n",
dev->d_ipaddr & 0xff, (dev->d_ipaddr >> 8) & 0xff, dev->d_ipaddr & 0xff, (dev->d_ipaddr >> 8) & 0xff,
(dev->d_ipaddr >> 16) & 0xff, dev->d_ipaddr >> 24 ); (dev->d_ipaddr >> 16) & 0xff, dev->d_ipaddr >> 24 );
/* Initialize Ethernet interface, set the MAC address, and make sure that /* Initialize Ethernet interface, set the MAC address, and make sure that
* the ENC28J80 is not in power save mode. * the ENC28J80 is not in power save mode.
@@ -1739,12 +1739,18 @@ static int enc_txavail(struct uip_driver_s *dev)
if (priv->bifup) if (priv->bifup)
{ {
/* Check if the hardware is ready to send another packet. The driver
* starts a transmission process by setting ECON1.TXRTS. When the packet is
* finished transmitting or is aborted due to an error/cancellation, the
* ECON1.TXRTS bit will be cleared.
*/
/* Check if there is room in the hardware to hold another outgoing packet. */ if ((enc_rdgreg(priv, ENC_ECON1) & ECON1_TXRTS) == 0)
{
/* The interface is up and TX is idle; poll uIP for new XMIT data */
/* If so, then poll uIP for new XMIT data */ (void)uip_poll(&priv->dev, enc_uiptxpoll);
}
(void)uip_poll(&priv->dev, enc_uiptxpoll);
} }
irqrestore(flags); irqrestore(flags);
@@ -1786,6 +1792,8 @@ static int enc_txavail(struct uip_driver_s *dev)
static void enc_pwrsave(FAR struct enc_driver_s *priv) static void enc_pwrsave(FAR struct enc_driver_s *priv)
{ {
nllvdbg("Set PWRSV\n");
/* 1. Turn off packet reception by clearing ECON1.RXEN. */ /* 1. Turn off packet reception by clearing ECON1.RXEN. */
enc_bfcgreg(priv, ENC_ECON1, ECON1_RXEN); enc_bfcgreg(priv, ENC_ECON1, ECON1_RXEN);
@@ -1844,6 +1852,8 @@ static void enc_pwrsave(FAR struct enc_driver_s *priv)
static void enc_pwrfull(FAR struct enc_driver_s *priv) static void enc_pwrfull(FAR struct enc_driver_s *priv)
{ {
nllvdbg("Clear PWRSV\n");
/* 1. Wake-up by clearing ECON2.PWRSV. */ /* 1. Wake-up by clearing ECON2.PWRSV. */
enc_bfcgreg(priv, ENC_ECON2, ECON2_PWRSV); enc_bfcgreg(priv, ENC_ECON2, ECON2_PWRSV);
@@ -1912,7 +1922,7 @@ static int enc_reset(FAR struct enc_driver_s *priv)
{ {
uint8_t regval; uint8_t regval;
ndbg("Entry\n"); nlldbg("Reset\n");
/* Configure SPI for the ENC28J60 */ /* Configure SPI for the ENC28J60 */
@@ -1971,10 +1981,10 @@ static int enc_reset(FAR struct enc_driver_s *priv)
regval = enc_rdbreg(priv, ENC_EREVID); regval = enc_rdbreg(priv, ENC_EREVID);
if (regval == 0x00 || regval == 0xff) if (regval == 0x00 || regval == 0xff)
{ {
ndbg("Bad Rev ID: %0x\n", regval); nlldbg("Bad Rev ID: %0x\n", regval);
return -ENODEV; return -ENODEV;
} }
nvdbg("Rev ID: %02x\n", regval); nllvdbg("Rev ID: %02x\n", regval);
/* Set filter mode: unicast OR broadcast AND crc valid */ /* Set filter mode: unicast OR broadcast AND crc valid */
@@ -2004,11 +2014,11 @@ static int enc_reset(FAR struct enc_driver_s *priv)
enc_wrbreg(priv, ENC_MACON3, enc_wrbreg(priv, ENC_MACON3,
MACON3_PADCFG0 | MACON3_TXCRCEN | MACON3_FRMLNEN | MACON3_FULDPX); MACON3_PADCFG0 | MACON3_TXCRCEN | MACON3_FRMLNEN | MACON3_FULDPX);
/* set Non-Back-to-Back Inter-Packet Gap */ /* Set Non-Back-to-Back Inter-Packet Gap */
enc_wrbreg(priv, ENC_MAIPGL, 0x12); enc_wrbreg(priv, ENC_MAIPGL, 0x12);
/* set ack-to-Back Inter-Packet Gap */ /* Set ack-to-Back Inter-Packet Gap */
enc_wrbreg(priv, ENC_MABBIPG, 0x15); enc_wrbreg(priv, ENC_MABBIPG, 0x15);
#endif #endif