diff --git a/configs/lm3s6965-ek/nx/defconfig b/configs/lm3s6965-ek/nx/defconfig index 601c8c186741e3e3599ceebc4e680abac9c79700..de6ae2a1587e3c79881e164865e43a7e8b80ec6e 100755 --- a/configs/lm3s6965-ek/nx/defconfig +++ b/configs/lm3s6965-ek/nx/defconfig @@ -594,7 +594,7 @@ CONFIG_NX_MXCLIENTMSGS=16 # The latter limitation effectively reduces the 128x96 disply to 64x96. CONFIG_LCD_P14201=y CONFIG_P14201_SPIMODE=2 -CONFIG_P14201_FREQUENCY=20000000 +CONFIG_P14201_FREQUENCY=3500000 CONFIG_P14201_NINTERFACES=1 CONFIG_P14201_FRAMEBUFFER=y diff --git a/configs/lm3s6965-ek/src/up_ssi.c b/configs/lm3s6965-ek/src/up_ssi.c index 90d24ef7831f300272cdae2ae040bcaadc855173..4dcd231c060732ed09467cb0591a1f0292b01d5e 100755 --- a/configs/lm3s6965-ek/src/up_ssi.c +++ b/configs/lm3s6965-ek/src/up_ssi.c @@ -137,6 +137,7 @@ void lm3s_spiselect(FAR struct spi_dev_s *dev, enum spi_dev_e devid, bool select { ssidbg("devid: %d CS: %s\n", (int)devid, selected ? "assert" : "de-assert"); ssi_dumpgpio("lm3s_spiselect() Entry"); + if (devid == SPIDEV_MMCSD) { /* Assert the CS pin to the card */ diff --git a/drivers/lcd/p14201.c b/drivers/lcd/p14201.c index a8bb347a91a2b5b470fef458688121b9e0bb22bb..d591360292cbdcdcc1e320cef2553b178e1984ac 100755 --- a/drivers/lcd/p14201.c +++ b/drivers/lcd/p14201.c @@ -552,6 +552,7 @@ static void rit_deselect(FAR struct spi_dev_s *spi) * None * * Assumptions: + * The caller as selected the OLED device. * **************************************************************************************/ @@ -565,15 +566,11 @@ static void rit_sndbytes(FAR struct rit_dev_s *priv, FAR const uint8_t *buffer, buflen, data ? "YES" : "NO", buffer[0], buffer[1], buffer[2] ); DEBUGASSERT(spi); - /* Select the SD1329 controller */ - - rit_select(spi); - - /* Clear the D/Cn bit to enable command mode */ + /* Clear the D/Cn bit to enable command or data mode */ rit_seldata(0, data); - /* Loop until the entire command is transferred */ + /* Loop until the entire command/data block is transferred */ while (buflen-- > 0) { @@ -581,15 +578,7 @@ static void rit_sndbytes(FAR struct rit_dev_s *priv, FAR const uint8_t *buffer, tmp = *buffer++; (void)SPI_SEND(spi, tmp); - - /* Send a dummy byte */ - - (void)SPI_SEND(spi, 0xff); } - - /* De-select the SD1329 controller */ - - rit_deselect(spi); } /************************************************************************************** @@ -635,6 +624,9 @@ static void rit_sndcmds(FAR struct rit_dev_s *priv, FAR const uint8_t *table) * npixels - The number of pixels to write to the LCD * (range: 0 < npixels <= xres-col) * + * Assumptions: + * Caller has selected the OLED section. + * **************************************************************************************/ #ifdef CONFIG_P14201_FRAMEBUFFER @@ -829,6 +821,10 @@ static int rit_putrun(fb_coord_t row, fb_coord_t col, FAR const uint8_t *buffer, } } + /* Select the SD1329 controller */ + + rit_select(priv->spi); + /* Setup a window that describes a run starting at the specified column * and row, and ending at the column + npixels on the same row. */ @@ -848,6 +844,9 @@ static int rit_putrun(fb_coord_t row, fb_coord_t col, FAR const uint8_t *buffer, rit_sndcmd(priv, g_horzinc, sizeof(g_horzinc)); rit_snddata(priv, &run[start], aend - start); + /* De-select the SD1329 controller */ + + rit_deselect(priv->spi); return OK; } #else @@ -872,6 +871,10 @@ static int rit_putrun(fb_coord_t row, fb_coord_t col, FAR const uint8_t *buffer, DEBUGASSERT((col & 1) == 0 && (npixels & 1) == 0); + /* Select the SD1329 controller */ + + rit_select(priv->spi); + /* Setup a window that describes a run starting at the specified column * and row, and ending at the column + npixels on the same row. */ @@ -890,6 +893,10 @@ static int rit_putrun(fb_coord_t row, fb_coord_t col, FAR const uint8_t *buffer, rit_sndcmd(priv, g_horzinc, sizeof(g_horzinc)); rit_snddata(priv, buffer, npixels >> 1); + + /* De-select the SD1329 controller */ + + rit_deselect(priv->spi); } return OK; } @@ -1079,6 +1086,13 @@ static int rit_setpower(struct lcd_dev_s *dev, int power) DEBUGASSERT(priv && (unsigned)power <= CONFIG_LCD_MAXPOWER && priv->spi); gvdbg("power: %d\n", power); + + /* Select the SD1329 controller */ + + rit_select(priv->spi); + + /* Only two power settings -- 0: sleep on, 1: sleep off */ + if (power > 0) { /* Re-initialize the SSD1329 controller */ @@ -1087,7 +1101,7 @@ static int rit_setpower(struct lcd_dev_s *dev, int power) /* Take the display out of sleep mode */ - rit_sndcmd(priv, g_sleepoff, sizeof(g_sleepon)); + rit_sndcmd(priv, g_sleepoff, sizeof(g_sleepoff)); } else { @@ -1095,7 +1109,11 @@ static int rit_setpower(struct lcd_dev_s *dev, int power) rit_sndcmd(priv, g_sleepon, sizeof(g_sleepon)); } - return -ENOSYS; /* Not implemented */ + + /* De-select the SD1329 controller */ + + rit_deselect(priv->spi); + return OK; } /************************************************************************************** @@ -1130,6 +1148,10 @@ static int rit_setcontrast(struct lcd_dev_s *dev, unsigned int contrast) gvdbg("contrast: %d\n", contrast); DEBUGASSERT(contrast <= CONFIG_LCD_MAXCONTRAST); + /* Select the SD1329 controller */ + + rit_select(priv->spi); + /* Set new contrast */ cmd[0] = SSD1329_SET_CONTRAST; @@ -1137,6 +1159,9 @@ static int rit_setcontrast(struct lcd_dev_s *dev, unsigned int contrast) cmd[2] = SSD1329_NOOP; rit_sndcmd(priv, cmd, 3); + /* De-select the SD1329 controller */ + + rit_deselect(priv->spi); priv->contrast = contrast; return OK; } @@ -1179,14 +1204,22 @@ FAR struct lcd_dev_s *rit_initialize(FAR struct spi_dev_s *spi, unsigned int dev priv->contrast = RIT_CONTRAST; priv->on = false; - /* Configure and enable LCD */ + /* Select the SD1329 controller */ rit_configspi(spi); - rit_sndcmds(priv, g_initcmds); + rit_select(spi); /* Clear the display */ rit_clear(priv); + + /* Configure (but don't enable) the OLED */ + + rit_sndcmds(priv, g_initcmds); + + /* De-select the SD1329 controller */ + + rit_deselect(spi); return &priv->dev; } #endif /* CONFIG_LCD_P14201 */