You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by xi...@apache.org on 2022/07/09 08:13:28 UTC
[incubator-nuttx] branch master updated: SSD1680 Landscape mode bugfix
This is an automated email from the ASF dual-hosted git repository.
xiaoxiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
The following commit(s) were added to refs/heads/master by this push:
new da69b013bc SSD1680 Landscape mode bugfix
da69b013bc is described below
commit da69b013bcf2a121e91a5567884ef5b4e5add1f7
Author: Adam Kaliszan <ak...@altimetrik.com>
AuthorDate: Fri Jul 8 13:27:22 2022 +0200
SSD1680 Landscape mode bugfix
Displays with resolution that is not multiplication of 8 had some issues in landscape mode (columns ware shifted).
Fixed function for copying bits.
Optimized memory reload for landscape mode.
---
drivers/lcd/ssd1680.c | 108 ++++++++++++++++++++++++++++++++------------------
1 file changed, 69 insertions(+), 39 deletions(-)
diff --git a/drivers/lcd/ssd1680.c b/drivers/lcd/ssd1680.c
index b6e3b7e361..1079ecef05 100644
--- a/drivers/lcd/ssd1680.c
+++ b/drivers/lcd/ssd1680.c
@@ -328,8 +328,6 @@ static const uint8_t ssd1680_lut[] =
* col - Starting column to write to (range: 0 <= col <= xres-npixels)
* buffer - The buffer containing the run to be written to the LCD
* npixels - The number of pixels to write to the LCD.
- * If npixels = 0 then do redraw e-ink screen. If range:
- * 0 < npixels <= xres-col then update displays memory
*
****************************************************************************/
@@ -735,7 +733,17 @@ static int ssd1680_configuredisplay(struct ssd1680_dev_s *priv)
static int ssd1680_update_all_and_redraw(struct ssd1680_dev_s *priv)
{
int row;
- for (row = 0; row < SSD1680_DEV_FB_YRES; row++)
+#if defined(CONFIG_LCD_PORTRAIT) || defined(CONFIG_LCD_RPORTRAIT)
+ const int row_incr = 1;
+#else
+# if SSD1680_DEV_BPP == 1
+ const int row_incr = 8;
+# else
+ const int row_incr = 4;
+# endif
+#endif
+
+ for (row = 0; row < SSD1680_DEV_FB_YRES; row += row_incr)
{
ssd1680_update_row(priv, row);
}
@@ -989,19 +997,21 @@ static void ssd1680_snd_cmd_with_data(FAR struct ssd1680_dev_s *priv,
#if !defined(CONFIG_LCD_PORTRAIT) && !defined(CONFIG_LCD_RPORTRAIT)
-#if SSD1680_DEV_BPP == 1
static void ssd1680_snd_cmd_with_data_bitstrip(
FAR struct ssd1680_dev_s *priv, uint8_t cmd, const uint8_t *dta,
int nopix, int strip_len)
+# if SSD1680_DEV_BPP == 1
{
int i;
int j;
uint8_t bytes[8];
uint8_t val;
+# if defined(CONFIG_LCD_LANDSCAPE)
+ const int offset = (SSD1680_DEV_ROWSIZE * SSD1680_PDV -
+ SSD1680_DEV_NATIVE_YRES) % SSD1680_PDV;
-#if defined(CONFIG_LCD_LANDSCAPE)
dta += (strip_len - 1);
-#endif
+# endif
ssd1680_select(priv, true);
ssd1680_cmddata(priv, true);
@@ -1011,7 +1021,21 @@ static void ssd1680_snd_cmd_with_data_bitstrip(
{
for (j = 0; j < 8; j++)
{
+# if defined(CONFIG_LCD_LANDSCAPE)
+ if (offset == 0)
+ {
+ bytes[j] = *(dta + j * strip_len);
+ }
+ else
+ {
+ bytes[j] = (*(dta + j * strip_len)) >> offset;
+
+ bytes[j] |= ((*(dta + j * strip_len - 1)) << (8 - offset)
+ & (0xff << (8 - offset)));
+ }
+# else
bytes[j] = *(dta + j * strip_len);
+# endif
}
for (i = 0; i < 8; i++)
@@ -1019,13 +1043,13 @@ static void ssd1680_snd_cmd_with_data_bitstrip(
val = 0;
for (j = 0; j < 8; j++)
{
-#if defined(CONFIG_LCD_LANDSCAPE)
+# if defined(CONFIG_LCD_LANDSCAPE)
val |= ((bytes[j] << (7 - j)) & (1 << (7 - j)));
bytes[j] = bytes[j] >> 1;
-#elif
+# else
val |= ((bytes[j] >> j) & (1 << (7 - j)));
bytes[j] = bytes[j] << 1;
-#endif
+# endif
}
SPI_SEND(priv->spi, val);
@@ -1036,19 +1060,16 @@ static void ssd1680_snd_cmd_with_data_bitstrip(
}
}
-#if defined(CONFIG_LCD_LANDSCAPE)
+# if defined(CONFIG_LCD_LANDSCAPE)
dta--;
-#elif
+# else
dta++;
-#endif
+# endif
}
ssd1680_select(priv, false);
}
-#else
-static void ssd1680_snd_cmd_with_data_even_bits_bitstrip(
- FAR struct ssd1680_dev_s *priv, uint8_t cmd, const uint8_t *dta,
- int nopix, int strip_len)
+# else
{
int i;
int j;
@@ -1056,9 +1077,9 @@ static void ssd1680_snd_cmd_with_data_even_bits_bitstrip(
uint16_t tmp[8];
uint8_t val;
-#if defined(CONFIG_LCD_LANDSCAPE)
+# if defined(CONFIG_LCD_LANDSCAPE)
dta += (strip_len - 1);
-#endif
+# endif
ssd1680_select(priv, true);
ssd1680_cmddata(priv, true);
@@ -1068,13 +1089,13 @@ static void ssd1680_snd_cmd_with_data_even_bits_bitstrip(
{
for (j = 0; j < 8; j++)
{
-#if defined(CONFIG_LCD_LANDSCAPE)
+# if defined(CONFIG_LCD_LANDSCAPE)
tmp = *(dta + j * strip_len)
+ ((*(dta + j * strip_len + 1)) << 8);
-#else
+# else
tmp = *(dta + j * strip_len + 1)
+ ((*(dta + j * strip_len)) << 8);
-#endif
+# endif
rows[j] =
(tmp & 0x01) | ((tmp >> 1) & 0x02)
| ((tmp >> 2) & 0x04) | ((tmp >> 3) & 0x08)
@@ -1087,13 +1108,13 @@ static void ssd1680_snd_cmd_with_data_even_bits_bitstrip(
val = 0;
for (j = 0; j < 8; j++)
{
-#if defined(CONFIG_LCD_LANDSCAPE)
+# if defined(CONFIG_LCD_LANDSCAPE)
val |= ((rows[j] << (7 - j)) & (1 << (7 - j)));
rows[j] = rows[j] >> 1;
-#elif
+# else
val |= ((rows[j] >> (j)) & (1 << (7 - j)));
rows[j] = rows[j] << 1;
-#endif
+# endif
}
SPI_SEND(priv->spi, val);
@@ -1104,11 +1125,11 @@ static void ssd1680_snd_cmd_with_data_even_bits_bitstrip(
}
}
-#if defined(CONFIG_LCD_LANDSCAPE)
+# if defined(CONFIG_LCD_LANDSCAPE)
dta--;
-#elif
+# else
dta++;
-#endif
+# endif
}
ssd1680_select(priv, false);
@@ -1152,7 +1173,7 @@ static void ssd1680_snd_cmd_with_data_odd_bits_bitstrip(
#if defined(CONFIG_LCD_LANDSCAPE)
val |= ((rows[j] << (7 - j)) & (1 << (7 - j)));
rows[j] = rows[j] >> 2;
-#elif
+#else
val |= ((rows[j] >> (j)) & (1 << (7 - j)));
rows[j] = rows[j] << 2;
#endif
@@ -1168,14 +1189,14 @@ static void ssd1680_snd_cmd_with_data_odd_bits_bitstrip(
#if defined(CONFIG_LCD_LANDSCAPE)
dta--;
-#elif
+#else
dta++;
#endif
}
ssd1680_select(priv, false);
}
-#endif
+# endif
#endif
#if SSD1680_DEV_BPP == 2
@@ -1314,6 +1335,7 @@ static FAR void *bitscpy_ds(FAR void *dest, int dest_offset,
FAR unsigned char *pout = (FAR unsigned char *)dest;
FAR unsigned char *pin = (FAR unsigned char *)src;
uint8_t val;
+ uint8_t mask;
/* Copy block of bytes */
@@ -1331,11 +1353,15 @@ static FAR void *bitscpy_ds(FAR void *dest, int dest_offset,
}
else
{
- *pout &= (~(0xff >> dest_offset));
+ mask = 0xff >> dest_offset;
+ *pout &= ~mask;
*pout |= (val >> dest_offset);
+
pout++;
- *pout &= ~(0xff << (8 - dest_offset));
- *pout |= (val << (8 - dest_offset));
+
+ mask = (0xff << (8 - dest_offset)) & 0xff;
+ *pout &= ~mask;
+ *pout |= (val << (8 - dest_offset)); /* no need to & mask */
}
nbits -= 8;
@@ -1349,18 +1375,22 @@ static FAR void *bitscpy_ds(FAR void *dest, int dest_offset,
if (nbits + dest_offset <= 8)
{
- *pout &= (~((0xff << (8 - nbits)) >> dest_offset));
- *pout |= (val & (0xff << (8 - nbits)) >> dest_offset);
+ mask = ((0xff << (8 - nbits)) & 0xff) >> dest_offset;
+ *pout &= ~mask;
+ *pout |= ((val >> dest_offset) & mask);
}
else
{
- *pout &= (~(0xff >> dest_offset));
+ mask = 0xff >> dest_offset;
+ *pout &= ~mask;
*pout |= (val >> dest_offset);
- pout++;
+ pout++;
nbits -= (8 - dest_offset);
- *pout &= ~(0xff << (8 - nbits));
- *pout |= ((val << (8 - dest_offset)) & (0xff << (8 - nbits)));
+
+ mask = 0xff << (8 - nbits);
+ *pout &= ~mask;
+ *pout |= ((val << (8 - dest_offset)) & mask);
}
}