Revise recent changes to serial driver error handling: Errors other than EINTR may be returned when the driver is used very early in initialization. STM32 SPI driver will now survive repeated initializations
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5026 42af7a65-404d-4744-a932-0658087f49c3
This commit is contained in:
parent
70b1c3f2f6
commit
100bc34307
@ -1368,15 +1368,20 @@ FAR struct spi_dev_s *up_spiinitialize(int port)
|
|||||||
|
|
||||||
priv = &g_spi1dev;
|
priv = &g_spi1dev;
|
||||||
|
|
||||||
/* Configure SPI1 pins: SCK, MISO, and MOSI */
|
/* Only configure if the port is not already configured */
|
||||||
|
|
||||||
stm32_configgpio(GPIO_SPI1_SCK);
|
if ((spi_getreg(priv, STM32_SPI_CR1_OFFSET) & SPI_CR1_SPE) == 0)
|
||||||
stm32_configgpio(GPIO_SPI1_MISO);
|
{
|
||||||
stm32_configgpio(GPIO_SPI1_MOSI);
|
/* Configure SPI1 pins: SCK, MISO, and MOSI */
|
||||||
|
|
||||||
/* Set up default configuration: Master, 8-bit, etc. */
|
stm32_configgpio(GPIO_SPI1_SCK);
|
||||||
|
stm32_configgpio(GPIO_SPI1_MISO);
|
||||||
|
stm32_configgpio(GPIO_SPI1_MOSI);
|
||||||
|
|
||||||
spi_portinitialize(priv);
|
/* Set up default configuration: Master, 8-bit, etc. */
|
||||||
|
|
||||||
|
spi_portinitialize(priv);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
@ -1387,15 +1392,20 @@ FAR struct spi_dev_s *up_spiinitialize(int port)
|
|||||||
|
|
||||||
priv = &g_spi2dev;
|
priv = &g_spi2dev;
|
||||||
|
|
||||||
/* Configure SPI2 pins: SCK, MISO, and MOSI */
|
/* Only configure if the port is not already configured */
|
||||||
|
|
||||||
stm32_configgpio(GPIO_SPI2_SCK);
|
if ((spi_getreg(priv, STM32_SPI_CR1_OFFSET) & SPI_CR1_SPE) == 0)
|
||||||
stm32_configgpio(GPIO_SPI2_MISO);
|
{
|
||||||
stm32_configgpio(GPIO_SPI2_MOSI);
|
/* Configure SPI2 pins: SCK, MISO, and MOSI */
|
||||||
|
|
||||||
/* Set up default configuration: Master, 8-bit, etc. */
|
stm32_configgpio(GPIO_SPI2_SCK);
|
||||||
|
stm32_configgpio(GPIO_SPI2_MISO);
|
||||||
|
stm32_configgpio(GPIO_SPI2_MOSI);
|
||||||
|
|
||||||
spi_portinitialize(priv);
|
/* Set up default configuration: Master, 8-bit, etc. */
|
||||||
|
|
||||||
|
spi_portinitialize(priv);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
@ -1406,15 +1416,20 @@ FAR struct spi_dev_s *up_spiinitialize(int port)
|
|||||||
|
|
||||||
priv = &g_spi3dev;
|
priv = &g_spi3dev;
|
||||||
|
|
||||||
/* Configure SPI3 pins: SCK, MISO, and MOSI */
|
/* Only configure if the port is not already configured */
|
||||||
|
|
||||||
stm32_configgpio(GPIO_SPI3_SCK);
|
if ((spi_getreg(priv, STM32_SPI_CR1_OFFSET) & SPI_CR1_SPE) == 0)
|
||||||
stm32_configgpio(GPIO_SPI3_MISO);
|
{
|
||||||
stm32_configgpio(GPIO_SPI3_MOSI);
|
/* Configure SPI3 pins: SCK, MISO, and MOSI */
|
||||||
|
|
||||||
/* Set up default configuration: Master, 8-bit, etc. */
|
stm32_configgpio(GPIO_SPI3_SCK);
|
||||||
|
stm32_configgpio(GPIO_SPI3_MISO);
|
||||||
|
stm32_configgpio(GPIO_SPI3_MOSI);
|
||||||
|
|
||||||
spi_portinitialize(priv);
|
/* Set up default configuration: Master, 8-bit, etc. */
|
||||||
|
|
||||||
|
spi_portinitialize(priv);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -69,12 +69,11 @@ static int rawinstream_getc(FAR struct lib_instream_s *this)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Return EOF on any failure to read from the incoming byte stream. The
|
/* Return EOF on any failure to read from the incoming byte stream. The
|
||||||
* only expected error is EINTER meaning that the read was interrupted
|
* only expected error is EINTR meaning that the read was interrupted
|
||||||
* by a signal. A Zero return value would indicated an end-of-file
|
* by a signal. A Zero return value would indicated an end-of-file
|
||||||
* confition.
|
* confition.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
DEBUGASSERT(nwritten == 0 || get_errno() == EINTR);
|
|
||||||
return EOF;
|
return EOF;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -59,9 +59,11 @@ static void rawoutstream_putc(FAR struct lib_outstream_s *this, int ch)
|
|||||||
|
|
||||||
DEBUGASSERT(this && rthis->fd >= 0);
|
DEBUGASSERT(this && rthis->fd >= 0);
|
||||||
|
|
||||||
/* Loop until the character is successfully transferred */
|
/* Loop until the character is successfully transferred or until an
|
||||||
|
* irrecoverable error occurs.
|
||||||
|
*/
|
||||||
|
|
||||||
for (;;)
|
do
|
||||||
{
|
{
|
||||||
nwritten = write(rthis->fd, &buffer, 1);
|
nwritten = write(rthis->fd, &buffer, 1);
|
||||||
if (nwritten == 1)
|
if (nwritten == 1)
|
||||||
@ -75,8 +77,9 @@ static void rawoutstream_putc(FAR struct lib_outstream_s *this, int ch)
|
|||||||
* from write().
|
* from write().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
DEBUGASSERT(nwritten < 0 && get_errno() == EINTR);
|
DEBUGASSERT(nwritten < 0);
|
||||||
}
|
}
|
||||||
|
while (get_errno() == EINTR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -58,9 +58,11 @@ static void stdoutstream_putc(FAR struct lib_outstream_s *this, int ch)
|
|||||||
|
|
||||||
DEBUGASSERT(this && sthis->stream);
|
DEBUGASSERT(this && sthis->stream);
|
||||||
|
|
||||||
/* Loop until the character is successfully transferred */
|
/* Loop until the character is successfully transferred or an irrecoverable
|
||||||
|
* error occurs.
|
||||||
|
*/
|
||||||
|
|
||||||
for (;;)
|
do
|
||||||
{
|
{
|
||||||
result = fputc(ch, sthis->stream);
|
result = fputc(ch, sthis->stream);
|
||||||
if (result != EOF)
|
if (result != EOF)
|
||||||
@ -70,11 +72,10 @@ static void stdoutstream_putc(FAR struct lib_outstream_s *this, int ch)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* EINTR (meaning that fputc was interrupted by a signal) is the only
|
/* EINTR (meaning that fputc was interrupted by a signal) is the only
|
||||||
* expected error.
|
* recoverable error.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
DEBUGASSERT(get_errno() == EINTR);
|
|
||||||
}
|
}
|
||||||
|
while (get_errno() == EINTR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -69,7 +69,7 @@ static void syslogstream_putc(FAR struct lib_outstream_s *this, int ch)
|
|||||||
* error occurs.
|
* error occurs.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (;;)
|
do
|
||||||
{
|
{
|
||||||
/* Write the character to the supported logging device */
|
/* Write the character to the supported logging device */
|
||||||
|
|
||||||
@ -85,9 +85,8 @@ static void syslogstream_putc(FAR struct lib_outstream_s *this, int ch)
|
|||||||
* syslog_putc() was awakened by a signal. This is not a real error and
|
* syslog_putc() was awakened by a signal. This is not a real error and
|
||||||
* must be ignored in this context.
|
* must be ignored in this context.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
DEBUGASSERT(ret == -EINTR);
|
|
||||||
}
|
}
|
||||||
|
while (ret == -EINTR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
Loading…
Reference in New Issue
Block a user