From: Dirk Behme <dirk.behme@googlemail.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] Remove board specific code from ENC28J60 network driver?
Date: Sun, 27 Dec 2009 08:59:21 +0100 [thread overview]
Message-ID: <4B3713D9.7060100@googlemail.com> (raw)
In-Reply-To: <200912261340.46179.vapier@gentoo.org>
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);
next prev parent reply other threads:[~2009-12-27 7:59 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-12-20 19:30 [U-Boot] Remove board specific code from ENC28J60 network driver? Dirk Behme
2009-12-20 19:54 ` Ben Warren
2009-12-20 20:05 ` Mike Frysinger
2009-12-21 8:26 ` Dirk Behme
2009-12-21 13:17 ` Mike Frysinger
2009-12-25 18:57 ` Dirk Behme
2009-12-26 18:40 ` Mike Frysinger
2009-12-27 7:59 ` Dirk Behme [this message]
2009-12-27 15:32 ` Ben Warren
2009-12-27 18:55 ` Dirk Behme
2009-12-28 18:33 ` Mike Frysinger
2009-12-28 21:29 ` Ben Warren
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=4B3713D9.7060100@googlemail.com \
--to=dirk.behme@googlemail.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox