summaryrefslogtreecommitdiff
path: root/nuttx/configs/olimex-strp711/src
diff options
context:
space:
mode:
Diffstat (limited to 'nuttx/configs/olimex-strp711/src')
-rwxr-xr-xnuttx/configs/olimex-strp711/src/up_enc28j60.c52
-rw-r--r--nuttx/configs/olimex-strp711/src/up_spi.c58
2 files changed, 68 insertions, 42 deletions
diff --git a/nuttx/configs/olimex-strp711/src/up_enc28j60.c b/nuttx/configs/olimex-strp711/src/up_enc28j60.c
index 63a21067f..fcb68b5bb 100755
--- a/nuttx/configs/olimex-strp711/src/up_enc28j60.c
+++ b/nuttx/configs/olimex-strp711/src/up_enc28j60.c
@@ -36,8 +36,10 @@
/*
* ENC28J60 Module
*
- * The ENC28J60 module does not come on the Olimex-STR-P711, but this describes
- * how I have connected it:
+ * The ENC28J60 module does not come on the Olimex-STR-P711, but this
+ * describes how I have connected it. NOTE that the ENC28J60 requires an
+ * external interrupt (XTI) pin. The only easily accessible XTI pins are on
+ * SPI0/1 so you can't have both SPI0 and 1 together with this configuration.
*
* Module CON5 QFN ENC2860 Description
* --------------- -------------------------------------------------------
@@ -53,7 +55,7 @@
* 6 5 NET RST 6 ~RESET Active-low device Reset input
*
* For the Olimex STR-P711, the ENC28J60 module is placed on SPI0 and uses
- * P0.3 for CS, P1.4 for an interrupt, and P1.5 as a reset:
+ * P0.3 for CS, P0.6 for an interrupt, and P0.4 as a reset:
*
* Module CON5 Olimex STR-P711 Connection
* --------------- -------------------------------------------------------
@@ -64,14 +66,14 @@
* 5 5 GND SPI0-1 GND
* 10 J9-1 3V3 SPI0-6 3.3V
* 9 2 WOL NC
- * 8 3 NET INT TMR1_EXT-5 P1.4 input P1.4/T1.ICAPA/T1.EXTCLK
+ * 8 3 NET INT SPI1-5 P0.6 XTI 11 P0.6/S1.SCLK
* 7 4 CLKOUT NC
- * 6 5 NET RST TMR1_EXT_4 P1.5 output P1.5/T1.ICAPB
+ * 6 5 NET RST SPI1-4 P0.4 output P0.4/S1.MISO
*
* UART3, I2C cannot be used with SPI0. The GPIOs selected for the ENC28J60
* interrupt conflict with TMR1.
*/
-#warning "Need to select differnt interrupt pin.. XTI doesn't support this one"
+
/****************************************************************************
* Included Files
@@ -112,24 +114,41 @@
#endif
/* UART3, I2C cannot be used with SPI0. The GPIOs selected for the ENC28J60
- * interrupt conflict with TIM1.
+ * interrupt conflict with BSPI1.
*/
#ifdef CONFIG_STR71X_UART3
# error "CONFIG_STR71X_UART3 cannot be used in this configuration"
#endif
-#ifdef CONFIG_STR71X_TIM1
-# error "CONFIG_STR71X_TIM1 cannot be used in this configuration"
+#ifdef CONFIG_STR71X_I2C1
+# error "CONFIG_STR71X_I2C1 cannot be used in this configuration"
+#endif
+
+#ifdef CONFIG_STR71X_BSP1
+# error "CONFIG_STR71X_BSP1 cannot be used in this configuration"
#endif
/* SPI Assumptions **********************************************************/
-#define ENC28J60_SPI_PORTNO 0 /* On SPI0 */
-#define ENC28J60_DEVNO 0 /* Only one ENC28J60 */
-#define ENC28J60_IRQ STR71X_IRQ_FIRSTXTI /* NEEDED!!!!!!!!!!!!!!!! */
+#define ENC28J60_SPI_PORTNO 0 /* On SPI0 */
+#define ENC28J60_DEVNO 0 /* Only one ENC28J60 */
+#define ENC28J60_IRQ STR71X_IRQ_PORT0p6 /* XTI Line 11: P0.6 */
+
+/* ENC28J60 additional pins *************************************************
+ *
+ * NOTE: The ENC28J60 is a 3.3V part; however, it was designed to be
+ * easily integrated into 5V systems. The SPI CS, SCK and SI inputs,
+ * as well as the RESET pin, are all 5V tolerant. On the other hand,
+ * if the host controller is operated at 5V, it quite likely will
+ * not be within specifications when its SPI and interrupt inputs
+ * are driven by the 3.3V CMOS outputs on the ENC28J60. A
+ * unidirectional level translator would be necessary.
+ */
-#warning "Eventually need to fix XTI IRQ number!"
+# define ENC_GPIO0_CS (1 << 3) /* Chip select (P0.3) */
+# define ENC_GPIO0_NETRST (1 << 4) /* Reset (P0.4) */
+# define ENC_GPIO0_NETINT (1 << 6) /* Interrupt (P0.6) */
/****************************************************************************
* Private Data
@@ -150,6 +169,7 @@
void up_netinitialize(void)
{
FAR struct spi_dev_s *spi;
+ uint16_t reg16;
int ret;
/* Get the SPI port */
@@ -170,6 +190,12 @@ void up_netinitialize(void)
return;
}
+ /* Take ENC28J60 out of reset (active low)*/
+
+ reg16 = getreg16(STR71X_GPIO0_PD);
+ reg16 &= ~ENC_GPIO0_NETRST;
+ putreg16(reg16, STR71X_GPIO0_PD);
+
/* Bind the SPI port to the ENC28J60 driver */
ret = enc_initialize(spi, ENC28J60_DEVNO, ENC28J60_IRQ);
diff --git a/nuttx/configs/olimex-strp711/src/up_spi.c b/nuttx/configs/olimex-strp711/src/up_spi.c
index 3636bc8fa..c01cbbc87 100644
--- a/nuttx/configs/olimex-strp711/src/up_spi.c
+++ b/nuttx/configs/olimex-strp711/src/up_spi.c
@@ -80,6 +80,14 @@
# define CONFIG_STR714X_BSPI1_RXFIFO_DEPTH 8
#endif
+#if defined(CONFIG_STR71X_UART3) && defined (CONFIG_STR71X_BSPI0)
+# warning "BSPI0 GPIO usage conflicts with UART3"
+#endif
+
+#if defined(CONFIG_STR71X_IC21) && defined (CONFIG_STR71X_BSPI0)
+# warning "BSPI0 GPIO usage conflicts with IC21"
+#endif
+
#if defined(CONFIG_STR71X_HDLC) && defined (CONFIG_STR71X_BSPI1)
# warning "BSPI1 GPIO usage conflicts with HDLC"
#endif
@@ -129,7 +137,9 @@
/* ENC28J60 Module
*
* The ENC28J60 module does not come on the Olimex-STR-P711, but this describes
- * how I have connected it:
+ * how I have connected it. NOTE that the ENC28J60 requires an external interrupt
+ * (XTI) pin. The only easily accessible XTI pins are on SPI0/1 so you can't have
+ * both SPI0 and 1 together with this configuration.
*
* STR-P711 PIN PIN CONFIGURATION ENC28J60 CONNECTION
* ----------------------- ----------------- -----------------------
@@ -140,23 +150,19 @@
* GND GND 5 5 GND
* 3.3V 3.3V 10 J9-1 3V3
* NC NC 9 2 WOL
- * P1.4/T1.ICAPA/T1.EXTCLK P1.4 input 8 3 NET INT
+ * P0.6/S1.SCLK P0.6 input 8 3 NET INT
* NC NC 7 4 CLKOUT
- * P1.5/T1.ICAPB P1.5 output 6 5 NET RST
+ * P0.4/S1.MISO P0.4 output 6 5 NET RST
*/
#ifdef CONFIG_NET_ENC28J60
/* UART3, I2C cannot be used with SPI0. The GPIOs selected for the ENC28J60
- * interrupt conflict with TMR1.
+ * interrupt conflict with BSPI1
*/
-# ifdef CONFIG_STR71X_UART3
-# error "CONFIG_STR71X_UART3 cannot be used in this configuration"
-# endif
-
-# ifdef CONFIG_STR71X_TIM3
-# error "CONFIG_STR71X_TIM3 cannot be used in this configuration"
+# ifdef CONFIG_STR71X_BSPI1
+# warning "CONFIG_STR71X_BSPI1 cannot be used in this configuration"
# endif
/* ENC28J60 additional pins
@@ -171,28 +177,19 @@
*/
# define ENC_GPIO0_CS (1 << 3)
-# define ENC_GPIO0_INTTL (0)
-# define ENC_GPIO0_INCMOS (0)
-# define ENC_GPIO0_OUTPP ENC_GPIO0_CS
-# define ENC_GPIO0_ALL ENC_GPIO0_CS
+# define ENC_GPIO0_NETRST (1 << 4)
+# define ENC_GPIO0_NETINT (1 << 6)
-# define ENC_GPIO1_NETINT ( 1 << 4)
-# define ENC_GPIO1_NETRST (1 << 5)
-# define ENC_GPIO1_INTTL (0)
-# define ENC_GPIO1_INCMOS ENC_GPIO1_NETINT
-# define ENC_GPIO1_OUTPP ENC_GPIO1_NETRST
-# define ENC_GPIO1_ALL (ENC_GPIO1_NETINT|ENC_GPIO1_NETRST)
+# define ENC_GPIO0_INTTL (0)
+# define ENC_GPIO0_INCMOS ENC_GPIO0_NETINT
+# define ENC_GPIO0_OUTPP (ENC_GPIO0_CS|ENC_GPIO0_NETRST)
+# define ENC_GPIO0_ALL (ENC_GPIO0_CS|ENC_GPIO0_NETINT|ENC_GPIO0_NETRST)
# define BSPI0_GPIO0_INTTL ENC_GPIO0_INTTL
# define BSPI0_GPIO0_INCMOS ENC_GPIO0_INCMOS
# define BSPI0_GPIO0_OUTPP ENC_GPIO0_OUTPP
# define BSPI0_GPIO0_ALL (BSPI0_GPIO0_ALT|ENC_GPIO0_ALL)
-# define BSPI0_GPIO1_INTTL ENC_GPIO1_INTTL
-# define BSPI0_GPIO1_INCMOS ENC_GPIO1_INCMOS
-# define BSPI0_GPIO1_OUTPP ENC_GPIO1_OUTPP
-# define BSPI0_GPIO1_ALL ENC_GPIO1_ALL
-
#else
# define BSPI0_GPIO0_INTTL (0)
# define BSPI0_GPIO0_INCMOS (0)
@@ -227,7 +224,7 @@
* P1.15/HTXD 13/15 CP P1.15 input
*
* Use of SPI1 doesn't conflict with anything. WP conflicts USB; CP conflicts
- * with NTXD.
+ * with HTXD.
*/
/* MMC/SD additional pins */
@@ -907,11 +904,13 @@ FAR struct spi_dev_s *up_spiinitialize(int port)
reg16 |= (BSPI0_GPIO0_ALT|BSPI0_GPIO0_OUTPP);
putreg16(reg16, STR71X_GPIO0_PC2);
- /* Start with enc28j60 disabled */
+ /* Start with enc28j60 de-selected (active low) and in
+ * reset (also active low)
+ */
#ifdef CONFIG_NET_ENC28J60
reg16 = getreg16(STR71X_GPIO0_PD);
- reg16 |= ENC_GPIO0_CS;
+ reg16 |= (ENC_GPIO0_CS | ENC_GPIO0_NETRST);
putreg16(reg16, STR71X_GPIO0_PD);
#endif
@@ -933,6 +932,7 @@ FAR struct spi_dev_s *up_spiinitialize(int port)
* PC0=1 PC1=0 PC2=1: Output, push pull
*/
+#ifdef BSPI0_GPIO1_ALL
reg16 = getreg16(STR71X_GPIO1_PC0);
reg16 &= ~BSPI0_GPIO1_ALL;
reg16 |= (BSPI0_GPIO1_INTTL|BSPI0_GPIO1_OUTPP);
@@ -947,7 +947,7 @@ FAR struct spi_dev_s *up_spiinitialize(int port)
reg16 &= ~BSPI0_GPIO1_ALL;
reg16 |= BSPI0_GPIO0_OUTPP;
putreg16(reg16, STR71X_GPIO1_PC2);
-
+#endif
g_spidev0.initialized = true;
}