
On 26.12.2009 19:40, Mike Frysinger wrote:
On Friday 25 December 2009 13:57:55 Dirk Behme wrote:
I started to convert the enc28j60.c to common SPI framework. Do you like to have a look at attachment (and maybe test it?)?
It is compile tested only. And for the moment it just re-uses the existing driver. When we know that it basically works this way, doing it in a clean way as you describe above would be the next step. CONFIG_NET_MULTI is still missing, too.
spi_lock/spi_unlock should redirect to spi_claim_bus/spi_release_bus. this isnt so much an "interrupts" issue as the process of claiming the bus reprograms the controller with the slave settings.
In your config file you have to set and configure
#define CONFIG_xxx_SPI #define CONFIG_ENC28J60 #define CONFIG_ENC28J60_SPI_BUS 0 #define CONFIG_ENC28J60_SPI_CS 0 #define CONFIG_ENC28J60_SPI_CLK 1000000 #define CONFIG_CMD_NET
for your board.
this is ok with the current design, but broken for NET_MULTI. when converted to NET_MULTI, the new enc28j60_register() function will take the spi settings as function arguments. so the function would look something like: int enc28j60_register(bd_t *bis, unsigned int spi_bus, unsigned int spi_cs, unsigned int max_hz, unsigned int mode);
and it'd be up to the board to call it with the settings it wants
Both changes, enc28j60_initialize() (NET_MULTI enabled) and spi_claim_bus/spi_release_bus done in below.
In the the board file I now have
int board_eth_init(bd_t *bis) { int rc = 0; #ifdef CONFIG_ENC28J60 rc = enc28j60_initialize(bis, CONFIG_ENC28J60_SPI_BUS, CONFIG_ENC28J60_SPI_CS, CONFIG_ENC28J60_SPI_CLK, SPI_MODE_3); #endif return rc; }
Do you like to test? Any further comments?
As mentioned, when we know that it works this way, I will do a clean version.
Best regards
Dirk
Index: u-boot-main/drivers/net/enc28j60.c =================================================================== --- u-boot-main.orig/drivers/net/enc28j60.c +++ u-boot-main/drivers/net/enc28j60.c @@ -18,8 +18,8 @@ #include <config.h> #include <common.h> #include <net.h> -#include <asm/arch/hardware.h> -#include <asm/arch/spi.h> +//#include <asm/arch/hardware.h> +#include <spi.h>
/* * Control Registers in Bank 0 @@ -284,10 +284,14 @@ /* maximum frame length */ #define ENC_MAX_FRM_LEN 1518
-#define enc_enable() PUT32(IO1CLR, ENC_SPI_SLAVE_CS) -#define enc_disable() PUT32(IO1SET, ENC_SPI_SLAVE_CS) -#define enc_cfg_spi() spi_set_cfg(0, 0, 0); spi_set_clock(8); - +#define enc_enable(x) spi_cs_activate(x); +#define enc_disable(x) spi_cs_deactivate(x); +#define spi_write(x) spi_w8r8(slave, x) +#define spi_read() spi_w8r8(slave, 0) +#define spi_lock() spi_claim_bus(slave) +#define spi_unlock() spi_release_bus(slave) +/* Use spi_setup_slave() instead of enc_cfg_spi() */ +#define enc_cfg_spi()
static unsigned char encReadReg (unsigned char regNo); static void encWriteReg (unsigned char regNo, unsigned char data); @@ -322,25 +326,26 @@ static unsigned char next_pointer_msb; static unsigned char buffer[ENC_MAX_FRM_LEN]; static int rxResetCounter = 0;
+static struct spi_slave *slave; + #define RX_RESET_COUNTER 1000;
/*----------------------------------------------------------------------------- * Always returns 0 */ -int eth_init (bd_t * bis) +int enc28j60_initialize(bd_t *bis, unsigned int spi_bus, unsigned int spi_cs, + unsigned int max_hz, unsigned int mode) { unsigned char estatVal; uchar enetaddr[6];
- /* configure GPIO */ - (*((volatile unsigned long *) IO1DIR)) |= ENC_SPI_SLAVE_CS; - (*((volatile unsigned long *) IO1DIR)) |= ENC_RESET; - - /* CS and RESET active low */ - PUT32 (IO1SET, ENC_SPI_SLAVE_CS); - PUT32 (IO1SET, ENC_RESET); - spi_init (); + if (!slave) { + slave = spi_setup_slave(spi_bus, spi_cs, max_hz, mode); + if (!slave) + return -1; + } + spi_claim_bus(slave);
/* taken from the Linux driver - dangerous stuff here! */ /* Wait for CLKRDY to become set (i.e., check that we can communicate with @@ -592,17 +597,17 @@ static void encWriteReg (unsigned char r { spi_lock (); enc_cfg_spi (); - enc_enable (); + enc_enable (slave);
spi_write (0x40 | regNo); /* write in regNo */ spi_write (data);
- enc_disable (); - enc_enable (); + enc_disable (slave); + enc_enable (slave);
spi_write (0x1f); /* write reg 0x1f */
- enc_disable (); + enc_disable (slave); spi_unlock (); }
@@ -615,17 +620,17 @@ static void encWriteRegRetry (unsigned c
for (i = 0; i < c; i++) { enc_cfg_spi (); - enc_enable (); + enc_enable (slave);
spi_write (0x40 | regNo); /* write in regNo */ spi_write (data);
- enc_disable (); - enc_enable (); + enc_disable (slave); + enc_enable (slave);
spi_write (0x1f); /* write reg 0x1f */
- enc_disable (); + enc_disable (slave);
spi_unlock (); /* we must unlock spi first */
@@ -649,14 +654,14 @@ static unsigned char encReadReg (unsigne
spi_lock (); enc_cfg_spi (); - enc_enable (); + enc_enable (slave);
spi_write (0x1f); /* read reg 0x1f */
bank = spi_read () & 0x3;
- enc_disable (); - enc_enable (); + enc_disable (slave); + enc_enable (slave);
spi_write (regNo); rxByte = spi_read (); @@ -668,7 +673,7 @@ static unsigned char encReadReg (unsigne rxByte = spi_read (); }
- enc_disable (); + enc_disable (slave); spi_unlock ();
return rxByte; @@ -678,7 +683,7 @@ static void encReadBuff (unsigned short { spi_lock (); enc_cfg_spi (); - enc_enable (); + enc_enable (slave);
spi_write (0x20 | 0x1a); /* read buffer memory */
@@ -689,7 +694,7 @@ static void encReadBuff (unsigned short spi_write (0); }
- enc_disable (); + enc_disable (slave); spi_unlock (); }
@@ -697,7 +702,7 @@ static void encWriteBuff (unsigned short { spi_lock (); enc_cfg_spi (); - enc_enable (); + enc_enable (slave);
spi_write (0x60 | 0x1a); /* write buffer memory */
@@ -706,7 +711,7 @@ static void encWriteBuff (unsigned short while (length--) spi_write (*pBuff++);
- enc_disable (); + enc_disable (slave); spi_unlock (); }
@@ -714,12 +719,12 @@ static void encBitSet (unsigned char reg { spi_lock (); enc_cfg_spi (); - enc_enable (); + enc_enable (slave);
spi_write (0x80 | regNo); /* bit field set */ spi_write (data);
- enc_disable (); + enc_disable (slave); spi_unlock (); }
@@ -727,12 +732,12 @@ static void encBitClr (unsigned char reg { spi_lock (); enc_cfg_spi (); - enc_enable (); + enc_enable (slave);
spi_write (0xA0 | regNo); /* bit field clear */ spi_write (data);
- enc_disable (); + enc_disable (slave); spi_unlock (); }
@@ -740,11 +745,11 @@ static void encReset (void) { spi_lock (); enc_cfg_spi (); - enc_enable (); + enc_enable (slave);
spi_write (0xff); /* soft reset */
- enc_disable (); + enc_disable (slave); spi_unlock ();
/* sleep 1 ms. See errata pt. 2 */ Index: u-boot-main/include/netdev.h =================================================================== --- u-boot-main.orig/include/netdev.h +++ u-boot-main/include/netdev.h @@ -49,6 +49,8 @@ int davinci_emac_initialize(void); int dnet_eth_initialize(int id, void *regs, unsigned int phy_addr); int e1000_initialize(bd_t *bis); int eepro100_initialize(bd_t *bis); +int enc28j60_initialize(bd_t *bis, unsigned int spi_bus, unsigned int spi_cs, + unsigned int max_hz, unsigned int mode); int eth_3com_initialize (bd_t * bis); int fec_initialize (bd_t *bis); int fecmxc_initialize (bd_t *bis);