From fa54579c9d299591d9cb19b66ba0b34927a9a0a4 Mon Sep 17 00:00:00 2001 From: patacongo Date: Sun, 25 Apr 2010 23:26:16 +0000 Subject: Add SPI buffer read/write logic git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@2629 42af7a65-404d-4744-a932-0658087f49c3 --- nuttx/drivers/net/enc28j60.c | 88 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 82 insertions(+), 6 deletions(-) (limited to 'nuttx/drivers/net/enc28j60.c') diff --git a/nuttx/drivers/net/enc28j60.c b/nuttx/drivers/net/enc28j60.c index 87ae285f6..ad828c43b 100755 --- a/nuttx/drivers/net/enc28j60.c +++ b/nuttx/drivers/net/enc28j60.c @@ -163,6 +163,9 @@ static inline uint8_t enc28j60_deselect(FAR struct spi_dev_s *spi); static uint8_t enc28j60_select(FAR struct spi_dev_s *spi); static uint8_t enc28j60_deselect(FAR struct spi_dev_s *spi); #endif + +/* SPI control register access */ + static uint8_t enc28j60_rdglobal2(FAR struct enc28j60_driver_s *priv, uint8_t cmd); static void enc28j60_wrglobal2(FAR struct enc28j60_driver_s *priv, @@ -173,6 +176,13 @@ static uint8_t enc28j60_rdbank(FAR struct enc28j60_driver_s *priv, static uint8_t enc28j60_rdphymac(FAR struct enc28j60_driver_s *priv, uint8_t ctrlreg); +/* SPI buffer transfers */ + +static void enc28j60_rdbuffer(FAR struct enc28j60_driver_s *priv, + FAR uint8_t *buffer, size_t buflen); +static void enc28j60_wrbuffer(FAR struct enc28j60_driver_s *priv, + FAR const uint8_t *buffer, size_t buflen); + /* Common TX logic */ static int enc28j60_transmit(FAR struct enc28j60_driver_s *priv); @@ -240,7 +250,7 @@ static inline uint8_t enc28j60_select(FAR struct spi_dev_s *spi) #else static uint8_t enc28j60_select(FAR struct spi_dev_s *spi) { - /* Select ENC2J60 chip (locking the SPI bus in case there are multiple + /* Select ENC28J60 chip (locking the SPI bus in case there are multiple * devices competing for the SPI bus */ @@ -302,7 +312,7 @@ static uint8_t enc28j60_rdglobal2(FAR struct enc28j60_driver_s *priv, DEBUGASSERT(priv && priv->spi); spi = priv->spi; - /* Select ENC2J60 chip */ + /* Select ENC28J60 chip */ enc28j60_select(spi); @@ -333,7 +343,7 @@ static void enc28j60_wrglobal2(FAR struct enc28j60_driver_s *priv, DEBUGASSERT(priv && priv->spi); spi = priv->spi; - /* Select ENC2J60 chip */ + /* Select ENC28J60 chip */ enc28j60_select(spi); @@ -350,6 +360,72 @@ static void enc28j60_wrglobal2(FAR struct enc28j60_driver_s *priv, enc28j60_deselect(spi); } +/**************************************************************************** + * Function: enc28j60_rdbuffer + * + * Description: + * Read a buffer of data. + * + ****************************************************************************/ + +static void enc28j60_rdbuffer(FAR struct enc28j60_driver_s *priv, + FAR uint8_t *buffer, size_t buflen) +{ + FAR struct spi_dev_s *spi; + + DEBUGASSERT(priv && priv->spi); + spi = priv->spi; + + /* Select ENC28J60 chip */ + + enc28j60_select(spi); + + /* Send the read buffer memory command (ignoring the response) */ + + (void)SPI_SEND(spi, ENC28J60_RBM); + + /* Then read the buffer data */ + + SPI_RECVBLOCK(spi, buffer, buflen); + + /* De-select ENC28J60 chip. */ + + enc28j60_deselect(spi); +} + +/**************************************************************************** + * Function: enc28j60_wrbuffer + * + * Description: + * Write a buffer of data. + * + ****************************************************************************/ + +static void enc28j60_wrbuffer(FAR struct enc28j60_driver_s *priv, + FAR const uint8_t *buffer, size_t buflen) +{ + FAR struct spi_dev_s *spi; + + DEBUGASSERT(priv && priv->spi); + spi = priv->spi; + + /* Select ENC28J60 chip */ + + enc28j60_select(spi); + + /* Send the write buffer memory command (ignoring the response) */ + + (void)SPI_SEND(spi, ENC28J60_WBM); + + /* Then send the buffer */ + + SPI_SNDBLOCK(spi, buffer, buflen); + + /* De-select ENC28J60 chip. */ + + enc28j60_deselect(spi); +} + /**************************************************************************** * Function: enc28j60_setbank * @@ -401,7 +477,7 @@ static uint8_t enc28j60_rdbank(FAR struct enc28j60_driver_s *priv, DEBUGASSERT(priv && priv->spi); spi = priv->spi; - /* Select ENC2J60 chip */ + /* Select ENC28J60 chip */ enc28j60_select(spi); @@ -438,7 +514,7 @@ static uint8_t enc28j60_rdphymac(FAR struct enc28j60_driver_s *priv, DEBUGASSERT(priv && priv->spi); spi = priv->spi; - /* Select ENC2J60 chip */ + /* Select ENC28J60 chip */ enc28j60_select(spi); @@ -476,7 +552,7 @@ static void enc28j60_wrbank(FAR struct enc28j60_driver_s *priv, DEBUGASSERT(priv && priv->spi); spi = priv->spi; - /* Select ENC2J60 chip */ + /* Select ENC28J60 chip */ enc28j60_select(spi); -- cgit v1.2.3