summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2010-12-05 20:29:19 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2010-12-05 20:29:19 +0000
commit7f55e42405eb9471aabab510d6f11b289fdec49f (patch)
tree97a9127b3a7d450041945c3aac90b85aea8780fd
parent01f3ee254fad306d40da1dbaa47efe2909df7b35 (diff)
downloadpx4-nuttx-7f55e42405eb9471aabab510d6f11b289fdec49f.tar.gz
px4-nuttx-7f55e42405eb9471aabab510d6f11b289fdec49f.tar.bz2
px4-nuttx-7f55e42405eb9471aabab510d6f11b289fdec49f.zip
Add putrun method
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3164 42af7a65-404d-4744-a932-0658087f49c3
-rwxr-xr-xnuttx/drivers/lcd/nokia6100.c151
1 files changed, 110 insertions, 41 deletions
diff --git a/nuttx/drivers/lcd/nokia6100.c b/nuttx/drivers/lcd/nokia6100.c
index b570c0839..3fb92b597 100755
--- a/nuttx/drivers/lcd/nokia6100.c
+++ b/nuttx/drivers/lcd/nokia6100.c
@@ -212,35 +212,52 @@
#ifdef CONFIG_NOKIA6100_PCF8833
# define LCD_NOP PCF8833_NOP
# define LCD_RAMWR PCF8833_RAMWR
+# define LCD_PASET PCF8833_PASET
+# define LCD_CASET PCF8833_CASET
#endif
#ifdef CONFIG_NOKIA6100_S1D15G10
# define LCD_NOP S1D15G10_NOP
-# define S1D15G10_RAMWR
+# define LCD_RAMWR S1D15G10_RAMWR
+# define LCD_PASET S1D15G10_PASET
+# define LCD_CASET S1D15G10_CASET
#endif
/* Color Properties *******************************************************************/
/* Display Resolution */
-#define NOKIA_XRES 132
-#define NOKIA_YRES 132
+#define NOKIA_XRES 132
+#define NOKIA_YRES 132
/* Color depth and format */
#if CONFIG_NOKIA6100_BPP == 8
-# define NOKIA_BPP 8
-# define NOKIA_COLORFMT FB_FMT_RGB8_332
-# define NOKIA_STRIDE NOKIA_XRES
+# define NOKIA_BPP 8
+# define NOKIA_COLORFMT FB_FMT_RGB8_332
+# define NOKIA_STRIDE NOKIA_XRES
+# define NOKIA_PIX2BYTES(b) (b)
#elif CONFIG_NOKIA6100_BPP == 12
-# define NOKIA_BPP 12
-# define NOKIA_COLORFMT FB_FMT_RGB12_444
-# define NOKIA_STRIDE ((3*NOKIA_XRES+1)/2)
+# define NOKIA_BPP 12
+# define NOKIA_COLORFMT FB_FMT_RGB12_444
+# define NOKIA_STRIDE ((3*NOKIA_XRES+1)/2)
+# define NOKIA_PIX2BYTES(b) ((3*(b)+1)/2)
#elif CONFIG_NOKIA6100_BPP == 16
-# define NOKIA_BPP 16
-# define NOKIA_COLORFMT FB_FMT_RGB16_565
-# define NOKIA_STRIDE (2*NOKIA_XRES)
+# define NOKIA_BPP 16
+# define NOKIA_COLORFMT FB_FMT_RGB16_565
+# define NOKIA_STRIDE (2*NOKIA_XRES)
+# define NOKIA_PIX2BYTES(b) (2*(b))
#endif
+/* Handle any potential strange behavior at edges */
+
+#define NOKIA_PGBIAS 2 /* May not be necessary */
+#define NOKIA_COLBIAS 0
+#define NOKIA_XBIAS 2 /* May not be necessary */
+#define NOKIA_YBIAS 0
+
+#define NOKIA_ENDPAGE 131
+#define NOKIA_ENDCOL 131
+
/* Debug ******************************************************************************/
#ifdef CONFIG_LCD_REGDEBUG
@@ -264,7 +281,7 @@ struct nokia_dev_s
/* Private LCD-specific information follows */
uint8_t contrast;
- uint16_t linebuf[NOKIA_STRIDE+2];
+ uint16_t linebuf[NOKIA_STRIDE+1];
};
/**************************************************************************************
@@ -282,7 +299,7 @@ static void nokia_select(FAR struct spi_dev_s *spi);
static void nokia_deselect(FAR struct spi_dev_s *spi);
#endif
static void nokia_sndcmd(FAR struct spi_dev_s *spi, const uint8_t cmd);
-static void nokia_sndarray(FAR struct spi_dev_s *spi, int len, const uint8_t *cmddata);
+static void nokia_cmdarray(FAR struct spi_dev_s *spi, int len, const uint8_t *cmddata);
static void nokia_clrram(FAR struct spi_dev_s *spi);
/* LCD Data Transfer Methods */
@@ -498,7 +515,7 @@ static const uint8_t g_rgbset8[] =
static const uint8_t g_paset[]
{
S1D15G10_PASET, /* Page start address set */
- 2, /* Fr some reason starts at 2 */
+ NOKIA_PGBIAS,
131
};
@@ -507,7 +524,7 @@ static const uint8_t g_paset[]
static const uint8_t g_caset[]
{
S1D15G10_CASET, /* Column start address set */
- 0,
+ NOKIA_COLBIAS,
131
};
#endif /* CONFIG_NOKIA6100_S1D15G10 */
@@ -692,14 +709,15 @@ static void nokia_sndcmd(FAR struct spi_dev_s *spi, const uint8_t cmd)
}
/**************************************************************************************
- * Name: nokia_sndarray
+ * Name: nokia_cmddata
*
* Description:
- * Send a 1-byte command followed by len-1 data bytes.
+ * Send a 1-byte command followed by datlen data bytes.
*
**************************************************************************************/
-static void nokia_sndarray(FAR struct spi_dev_s *spi, int len, const uint8_t *cmddata)
+static void nokia_cmddata(FAR struct spi_dev_s *spi, uint8_t cmd, int datlen,
+ const uint8_t *data)
{
uint16_t *linebuf = priv->linebuf;
uint16_t word;
@@ -709,7 +727,7 @@ static void nokia_sndarray(FAR struct spi_dev_s *spi, int len, const uint8_t *cm
/* Copy the command into the line buffer. Bit 8 == 0 denotes a command. */
- *linebuf++ = *cmddata++;
+ *linebuf++ = cmd;
/* Copy any data after the command into the line buffer */
@@ -717,20 +735,16 @@ static void nokia_sndarray(FAR struct spi_dev_s *spi, int len, const uint8_t *cm
{
/* Bit 8 == 1 denotes data */
- *linebuf++ = (uin16_t)*cmddata++ | NOKIA_LCD_DATA;
+ *linebuf++ = (uin16_t)*data++ | NOKIA_LCD_DATA;
}
- /* Terminate with a NOP */
-
- *linebuf = LCD_NOP;
-
/* Select the LCD */
nokia_select(spi);
/* Send the line buffer. */
- (void)SPI_SNDBLOCK(spi, priv->linebuf, len+1);
+ (void)SPI_SNDBLOCK(spi, priv->linebuf, len);
/* De-select the LCD */
@@ -738,6 +752,32 @@ static void nokia_sndarray(FAR struct spi_dev_s *spi, int len, const uint8_t *cm
}
/**************************************************************************************
+ * Name: nokia_ramwr
+ *
+ * Description:
+ * Send a RAMWR command followed by datlen data bytes.
+ *
+ **************************************************************************************/
+
+static void nokia_ramwr(FAR struct spi_dev_s *spi, int datlen, const uint8_t *data)
+{
+ nokia_cmddata(spi, LCD_RAMWR, datlen, data);
+}
+
+/**************************************************************************************
+ * Name: nokia_cmdarray
+ *
+ * Description:
+ * Send a RAMWR command followed by len-1 data bytes.
+ *
+ **************************************************************************************/
+
+static void nokia_cmdarray(FAR struct spi_dev_s *spi, int len, const uint8_t *cmddata)
+{
+ nokia_cmddata(spi, cmddata[0], len-1, &cmddata[1]);
+}
+
+/**************************************************************************************
* Name: nokia_clrram
*
* Description:
@@ -770,7 +810,6 @@ static void nokia_clrram(FAR struct spi_dev_s *spi)
{
(void)SPI_SNDBLOCK(spi, priv->linebuf, NOKIA_STRIDE);
}
- SPI_SEND(spi, LCD_NOP);
/* De-select the LCD */
@@ -794,13 +833,40 @@ static void nokia_clrram(FAR struct spi_dev_s *spi)
static int nokia_putrun(fb_coord_t row, fb_coord_t col, FAR const uint8_t *buffer,
size_t npixels)
{
+ uint16_t cmd[3];
+ int datlen;
+
gvdbg("row: %d col: %d npixels: %d\n", row, col, npixels);
- DEBUGASSERT(buffer && ((uintptr_t)buffer & 1) == 0);
+
+#if NOKIA_XBIAS > 0
+ x += NOKIA_XBIAS;
+#endif
+#if NOKIA_XBIAS > 0
+ y += NOKIA_YBIAS;
+#endif
+ DEBUGASSERT(buffer && col < NOKIA_XRES && row >= 0 && );
/* Set up to write the run. */
- /* Write the run to GRAM. */
-#warning "Missing logic"
+ nokia_select(spi);
+ cmd[0] = PASET;
+ cmd[1] = x | NOKIA_DATA;
+ cmd[2] = NOKIA_ENDPAGE | NOKIA_DATA;
+ (void)SPI_SNDBLOCK(spi, cmd, 3);
+ nokia_deselect(spi);
+
+ /* De-select the LCD */
+
+ nokia_select(spi);
+ cmd[0] = CASET;
+ cmd[1] = y | NOKIA_DATA;
+ cmd[2] = NOKIA_ENDCOL | NOKIA_DATA;
+ (void)SPI_SNDBLOCK(spi, cmd, 3);
+ nokia_deselect(spi);
+
+ /* Then send the run */
+
+ nokia_ramwr(spi, NOKIA_PIX2BYTES(npixels), buffer);
return OK;
}
@@ -823,6 +889,9 @@ static int nokia_getrun(fb_coord_t row, fb_coord_t col, FAR uint8_t *buffer,
{
gvdbg("row: %d col: %d npixels: %d\n", row, col, npixels);
DEBUGASSERT(buffer && ((uintptr_t)buffer & 1) == 0);
+
+ /* At present, this is a write-only LCD driver */
+
#warning "Not implemented"
return -ENOSYS;
}
@@ -977,21 +1046,21 @@ static int nokia_initialize(struct nokia_dev_s *priv)
/* Configure the display */
- nokia_sndarray(spi, sizeof(g_disctl), g_disctl); /* Display control */
- nokia_sndarray(spi, sizeof(g_comscn), g_comscn); /* Common scan direction */
+ nokia_cmdarray(spi, sizeof(g_disctl), g_disctl); /* Display control */
+ nokia_cmdarray(spi, sizeof(g_comscn), g_comscn); /* Common scan direction */
nokia_sndcmd(spi, S1D15G10_OSCON); /* Internal oscilator ON */
nokia_sndcmd(spi, S1D15G10_SLPOUT); /* Sleep out */
- nokia_sndarray(spi, sizeof(g_volctr), g_volctr); /* Volume control (contrast) */
- nokia_sndarray(spi, sizeof(g_pwrctr), g_pwrctr); /* Turn on voltage regulators */
+ nokia_cmdarray(spi, sizeof(g_volctr), g_volctr); /* Volume control (contrast) */
+ nokia_cmdarray(spi, sizeof(g_pwrctr), g_pwrctr); /* Turn on voltage regulators */
up_msdelay(100);
nokia_sndcmd(spi, S1D15G10_DISINV); /* Invert display */
- nokia_sndarray(spi, sizeof(g_datctl), g_datctl); /* Data control */
+ nokia_cmdarray(spi, sizeof(g_datctl), g_datctl); /* Data control */
#if CONFIG_NOKIA6100_BPP == 8
- nokia_sndarray(spi, sizeof(g_rgbset8), g_rgbset8); /* Set up color lookup table */
+ nokia_cmdarray(spi, sizeof(g_rgbset8), g_rgbset8); /* Set up color lookup table */
nokia_sndcmd(spi, S1D15G10_NOP);
#endif
- nokia_sndarray(spi, sizeof(g_paset), g_paset); /* Page address set */
- nokia_sndarray(spi, sizeof(g_paset), g_caset); /* Column address set */
+ nokia_cmdarray(spi, sizeof(g_paset), g_paset); /* Page address set */
+ nokia_cmdarray(spi, sizeof(g_paset), g_caset); /* Column address set */
nokia_clrram(spi);
nokia_sndcmd(spi, S1D15G10_DISON); /* Display on */
}
@@ -1006,9 +1075,9 @@ static int nokia_initialize(struct nokia_dev_s *priv)
nokia_sndcmd(spi, PCF8833_SLEEPOUT); /* Exit sleep mode */
nokia_sndcmd(spi, PCF8833_BSTRON); /* Turn on voltage booster */
nokia_sndcmd(spi, PCF8833_INVON); /* Invert display */
- nokia_sndarray(spi, sizeof(g_madctl), g_madctl); /* Memory data access control */
- nokia_sndarray(spi, sizeof(g_colmod), g_colmod); /* Color interface pixel format */
- nokia_sndarray(spi, sizeof(g_setcon), g_setcon); /* Set contrast */
+ nokia_cmdarray(spi, sizeof(g_madctl), g_madctl); /* Memory data access control */
+ nokia_cmdarray(spi, sizeof(g_colmod), g_colmod); /* Color interface pixel format */
+ nokia_cmdarray(spi, sizeof(g_setcon), g_setcon); /* Set contrast */
nokia_sndcmd(spi, PCF8833_NOP); /* No operation */
nokia_clrram(spi);
nokia_sndcmd(spi, PCF8833_DISPON); /* Display on */