Fix banding on the R61580 LCD
git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@4136 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
parent
ec69455a81
commit
e69720fe6e
|
@ -13,7 +13,7 @@
|
|||
<h1><big><font color="#3c34ec"><i>NuttX Operating System<p>User's Manual</i></font></big></h1>
|
||||
<p><small>by</small></p>
|
||||
<p>Gregory Nutt<p>
|
||||
<p>Last Updated: July 19, 2011</p>
|
||||
<p>Last Updated: December 5, 2011</p>
|
||||
</td>
|
||||
</tr>
|
||||
</table>
|
||||
|
@ -1549,58 +1549,83 @@ interface of the same name.
|
|||
<h3><a name="mqnotify">2.4.7 mq_notify</a></h3>
|
||||
|
||||
<p>
|
||||
<b>Function Prototype:</b>
|
||||
<b>Function Prototype:</b>
|
||||
<pre>
|
||||
#include <mqueue.h>
|
||||
int mq_notify(mqd_t mqdes, const struct sigevent *notification);
|
||||
</pre>
|
||||
|
||||
</p>
|
||||
<p>
|
||||
<b>Description:</b> If the "notification" input parameter
|
||||
is not NULL, this function connects the task with the message queue such
|
||||
that the specified signal will be sent to the task whenever the message
|
||||
changes from empty to non-empty. One notification can be attached
|
||||
to a message queue.
|
||||
<b>Description:</b> If the <code>notification</code> input parameter
|
||||
is not <code>NULL</code>, this function connects the task with the message queue such
|
||||
that the specified signal will be sent to the task whenever the message
|
||||
changes from empty to non-empty. One notification can be attached
|
||||
to a message queue.
|
||||
</p>
|
||||
<p>
|
||||
If "notification" is NULL, the attached notification
|
||||
is detached (if it was held by the calling task) and the queue
|
||||
is available to attach another notification.
|
||||
If <code>notification</code>; is <code>NULL</code>, the attached notification
|
||||
is detached (if it was held by the calling task) and the queue
|
||||
is available to attach another notification.
|
||||
</p>
|
||||
<p>
|
||||
When the notification is sent to the registered task, its registration
|
||||
will be removed. The message queue will then be available for
|
||||
registration.
|
||||
When the notification is sent to the registered task, its registration
|
||||
will be removed. The message queue will then be available for
|
||||
registration.
|
||||
<p>
|
||||
<b>Input Parameters:</b>
|
||||
<ul>
|
||||
<li><i>mqdes</i>. Message queue descriptor
|
||||
<li><i>notification</i>. Real-time signal structure containing:
|
||||
<ul>
|
||||
<li><i>sigev_notify</i>. Should be SIGEV_SIGNAL (but actually
|
||||
ignored)
|
||||
<li><i>sigev_signo</i>. The signo to use for the notification
|
||||
<li><i>sigev_value</i>. Value associated with the signal
|
||||
</ul>
|
||||
|
||||
</ul>
|
||||
|
||||
<b>Input Parameters:</b>
|
||||
<ul>
|
||||
<li>
|
||||
<code>mqdes</code>. Message queue descriptor
|
||||
</li>
|
||||
<li><code>notification</code>. Real-time signal structure containing:
|
||||
<ul>
|
||||
<li><code>sigev_notify</code>. Should be SIGEV_SIGNAL (but actually ignored)
|
||||
<li><code>sigev_signo</code>. The signo to use for the notification
|
||||
<li><code>sigev_value</code>. Value associated with the signal
|
||||
</ul>
|
||||
</ul>
|
||||
</p>
|
||||
<p>
|
||||
<b>Returned Values:</b> None.
|
||||
<b>Returned Values:</b>
|
||||
On success <code>mq_notify()</code> returns 0; on error, -1 is returned, with
|
||||
<code>errno</code> set to indicate the error:
|
||||
<ul>
|
||||
<li>
|
||||
<code>EBADF</code>. The descriptor specified in <code>mqdes</code> is invalid.
|
||||
</li>
|
||||
<li>
|
||||
<code>EBUSY</code>. Another process has already registered to receive notification
|
||||
for this message queue.
|
||||
</li>
|
||||
<li>
|
||||
<code>EINVAL</code>. <code>sevp->sigev_notify</code> is not one of the permitted values; or
|
||||
<code>sevp->sigev_notify</code> is <code>SIGEV_SIGNAL</code> and <code>sevp->sigev_signo</code> is not a
|
||||
valid signal number.
|
||||
</li>
|
||||
<li>
|
||||
<code>ENOMEM</code>. Insufficient memory.
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
<p>
|
||||
<b>Assumptions/Limitations:</b>
|
||||
<b>Assumptions/Limitations:</b>
|
||||
</p>
|
||||
<p>
|
||||
<b> POSIX Compatibility:</b> Comparable to the POSIX interface
|
||||
of the same name.
|
||||
Differences from the full POSIX implementation include:
|
||||
<ul>
|
||||
<li>The notification signal will be sent to the registered task even if
|
||||
another task is waiting for the message queue to become non-empty. This is
|
||||
inconsistent with the POSIX specification which states, "If a process
|
||||
has registered for notification of message arrival at a message queue and
|
||||
some process is blocked in <i>mq_receive</i> waiting to receive a message
|
||||
when a message arrives at the queue, the arriving message shall satisfy the
|
||||
appropriate <i>mq_receive()</i> ... The resulting behavior is as if the
|
||||
message queue remains empty, and no notification shall be sent."
|
||||
</ul>
|
||||
<b>POSIX Compatibility:</b> Comparable to the POSIX interface of the same name.
|
||||
Differences from the full POSIX implementation include:
|
||||
<ul>
|
||||
<li>
|
||||
The notification signal will be sent to the registered task even if
|
||||
another task is waiting for the message queue to become non-empty. This is
|
||||
inconsistent with the POSIX specification which states, "If a process
|
||||
has registered for notification of message arrival at a message queue and
|
||||
some process is blocked in <i>mq_receive</i> waiting to receive a message
|
||||
when a message arrives at the queue, the arriving message shall satisfy the
|
||||
appropriate <i>mq_receive()</i> ... The resulting behavior is as if the
|
||||
message queue remains empty, and no notification shall be sent."
|
||||
</li>
|
||||
</ul>
|
||||
</p>
|
||||
|
||||
<H3><a name="mqsetattr">2.4.8 mq_setattr</a></H3>
|
||||
|
||||
|
|
|
@ -223,6 +223,13 @@ CONFIG_SSI1_DISABLE=y
|
|||
CONFIG_SSI_POLLWAIT=y
|
||||
#CONFIG_SSI_TXLIMIT=4
|
||||
|
||||
#
|
||||
# STM3210E-EVAL specific LCD settings
|
||||
#
|
||||
CONFIG_STM32_AM240320_DISABLE=n
|
||||
CONFIG_STM32_SPFD5408B_DISABLE=n
|
||||
CONFIG_STM32_R61580_DISABLE=y
|
||||
|
||||
#
|
||||
# General build options
|
||||
#
|
||||
|
|
|
@ -236,6 +236,13 @@ CONFIG_SSI1_DISABLE=y
|
|||
CONFIG_SSI_POLLWAIT=y
|
||||
#CONFIG_SSI_TXLIMIT=4
|
||||
|
||||
#
|
||||
# STM3210E-EVAL specific LCD settings
|
||||
#
|
||||
CONFIG_STM32_AM240320_DISABLE=n
|
||||
CONFIG_STM32_SPFD5408B_DISABLE=n
|
||||
CONFIG_STM32_R61580_DISABLE=y
|
||||
|
||||
#
|
||||
# General build options
|
||||
#
|
||||
|
|
|
@ -232,6 +232,13 @@ CONFIG_SSI1_DISABLE=y
|
|||
CONFIG_SSI_POLLWAIT=y
|
||||
#CONFIG_SSI_TXLIMIT=4
|
||||
|
||||
#
|
||||
# STM3210E-EVAL specific LCD settings
|
||||
#
|
||||
CONFIG_STM32_AM240320_DISABLE=n
|
||||
CONFIG_STM32_SPFD5408B_DISABLE=n
|
||||
CONFIG_STM32_R61580_DISABLE=y
|
||||
|
||||
#
|
||||
# General build options
|
||||
#
|
||||
|
|
|
@ -232,6 +232,13 @@ CONFIG_SSI1_DISABLE=y
|
|||
CONFIG_SSI_POLLWAIT=y
|
||||
#CONFIG_SSI_TXLIMIT=4
|
||||
|
||||
#
|
||||
# STM3210E-EVAL specific LCD settings
|
||||
#
|
||||
CONFIG_STM32_AM240320_DISABLE=n
|
||||
CONFIG_STM32_SPFD5408B_DISABLE=n
|
||||
CONFIG_STM32_R61580_DISABLE=y
|
||||
|
||||
#
|
||||
# General build options
|
||||
#
|
||||
|
|
|
@ -232,6 +232,13 @@ CONFIG_SSI1_DISABLE=y
|
|||
CONFIG_SSI_POLLWAIT=y
|
||||
#CONFIG_SSI_TXLIMIT=4
|
||||
|
||||
#
|
||||
# STM3210E-EVAL specific LCD settings
|
||||
#
|
||||
CONFIG_STM32_AM240320_DISABLE=n
|
||||
CONFIG_STM32_SPFD5408B_DISABLE=n
|
||||
CONFIG_STM32_R61580_DISABLE=y
|
||||
|
||||
#
|
||||
# General build options
|
||||
#
|
||||
|
|
|
@ -232,6 +232,13 @@ CONFIG_SSI1_DISABLE=y
|
|||
CONFIG_SSI_POLLWAIT=y
|
||||
#CONFIG_SSI_TXLIMIT=4
|
||||
|
||||
#
|
||||
# STM3210E-EVAL specific LCD settings
|
||||
#
|
||||
CONFIG_STM32_AM240320_DISABLE=n
|
||||
CONFIG_STM32_SPFD5408B_DISABLE=n
|
||||
CONFIG_STM32_R61580_DISABLE=y
|
||||
|
||||
#
|
||||
# General build options
|
||||
#
|
||||
|
|
|
@ -232,6 +232,13 @@ CONFIG_SSI1_DISABLE=y
|
|||
CONFIG_SSI_POLLWAIT=y
|
||||
#CONFIG_SSI_TXLIMIT=4
|
||||
|
||||
#
|
||||
# STM3210E-EVAL specific LCD settings
|
||||
#
|
||||
CONFIG_STM32_AM240320_DISABLE=n
|
||||
CONFIG_STM32_SPFD5408B_DISABLE=n
|
||||
CONFIG_STM32_R61580_DISABLE=y
|
||||
|
||||
#
|
||||
# General build options
|
||||
#
|
||||
|
|
|
@ -234,6 +234,13 @@ CONFIG_SSI1_DISABLE=y
|
|||
CONFIG_SSI_POLLWAIT=y
|
||||
#CONFIG_SSI_TXLIMIT=4
|
||||
|
||||
#
|
||||
# STM3210E-EVAL specific LCD settings
|
||||
#
|
||||
CONFIG_STM32_AM240320_DISABLE=n
|
||||
CONFIG_STM32_SPFD5408B_DISABLE=n
|
||||
CONFIG_STM32_R61580_DISABLE=y
|
||||
|
||||
#
|
||||
# General build options
|
||||
#
|
||||
|
|
|
@ -289,6 +289,7 @@
|
|||
#define LCD_REG_153 0x99
|
||||
#define LCD_REG_154 0x9a
|
||||
#define LCD_REG_157 0x9d
|
||||
#define LCD_REG_164 0xa4
|
||||
#define LCD_REG_192 0xc0
|
||||
#define LCD_REG_193 0xc1
|
||||
#define LCD_REG_229 0xe5
|
||||
|
@ -1074,27 +1075,14 @@ static inline void stm3210e_lcdinitialize(void)
|
|||
id = stm3210e_readreg(LCD_REG_0);
|
||||
lcddbg("LCD ID: %04x\n", id);
|
||||
|
||||
/* Check if the ID is for the SPFD5408B or the almost compatible R61580 */
|
||||
/* Check if the ID is for the SPFD5408B */
|
||||
|
||||
#if !defined(CONFIG_STM32_SPFD5408B_DISABLE) || !defined(CONFIG_STM32_R61580_DISABLE)
|
||||
#if !defined(CONFIG_STM32_SPFD5408B_DISABLE) && !defined(CONFIG_STM32_R61580_DISABLE)
|
||||
if (id == SPFD5408B_ID || id == R61580_ID)
|
||||
#elif !defined(CONFIG_STM32_SPFD5408B_DISABLE)
|
||||
#if !defined(CONFIG_STM32_SPFD5408B_DISABLE)
|
||||
if (id == SPFD5408B_ID)
|
||||
#else
|
||||
if (id == R61580_ID)
|
||||
#endif
|
||||
{
|
||||
/* Set the LCD type for the SPFD5408B or the R61580 */
|
||||
|
||||
#if !defined(CONFIG_STM32_SPFD5408B_DISABLE) && !defined(CONFIG_STM32_R61580_DISABLE)
|
||||
g_lcddev.type = (id == SPFD5408B_ID ? LCD_TYPE_SPFD5408B : LCD_TYPE_R61580);
|
||||
#elif !defined(CONFIG_STM32_SPFD5408B_DISABLE)
|
||||
g_lcddev.type = SPFD5408B_ID;
|
||||
#else
|
||||
g_lcddev.type = LCD_TYPE_R61580;
|
||||
#endif
|
||||
/* Set the LCD type for the SPFD5408B */
|
||||
|
||||
g_lcddev.type = LCD_TYPE_SPFD5408B;
|
||||
lcddbg("LCD type: %d\n", g_lcddev.type);
|
||||
|
||||
/* Start Initial Sequence */
|
||||
|
@ -1191,6 +1179,80 @@ static inline void stm3210e_lcdinitialize(void)
|
|||
}
|
||||
else
|
||||
#endif
|
||||
|
||||
/* Check if the ID is for the almost compatible R61580 */
|
||||
|
||||
#if !defined(CONFIG_STM32_R61580_DISABLE)
|
||||
if (id == R61580_ID)
|
||||
{
|
||||
/* Set the LCD type for the R61580 */
|
||||
|
||||
g_lcddev.type = LCD_TYPE_R61580;
|
||||
lcddbg("LCD type: %d\n", g_lcddev.type);
|
||||
|
||||
/* Start Initial Sequence */
|
||||
|
||||
stm3210e_writereg(LCD_REG_0, 0x0000);
|
||||
stm3210e_writereg(LCD_REG_0, 0x0000);
|
||||
up_mdelay(100);
|
||||
stm3210e_writereg(LCD_REG_0, 0x0000);
|
||||
stm3210e_writereg(LCD_REG_0, 0x0000);
|
||||
stm3210e_writereg(LCD_REG_0, 0x0000);
|
||||
stm3210e_writereg(LCD_REG_0, 0x0000);
|
||||
stm3210e_writereg(LCD_REG_164, 0x0001);
|
||||
up_mdelay(100);
|
||||
stm3210e_writereg(LCD_REG_96, 0xa700);
|
||||
stm3210e_writereg(LCD_REG_8, 0x0808);
|
||||
|
||||
/* Gamma Setting */
|
||||
|
||||
stm3210e_writereg(LCD_REG_48, 0x0203);
|
||||
stm3210e_writereg(LCD_REG_49, 0x080f);
|
||||
stm3210e_writereg(LCD_REG_50, 0x0401);
|
||||
stm3210e_writereg(LCD_REG_51, 0x050b);
|
||||
stm3210e_writereg(LCD_REG_52, 0x3330);
|
||||
stm3210e_writereg(LCD_REG_53, 0x0b05);
|
||||
stm3210e_writereg(LCD_REG_54, 0x0005);
|
||||
stm3210e_writereg(LCD_REG_55, 0x0f08);
|
||||
stm3210e_writereg(LCD_REG_56, 0x0302);
|
||||
stm3210e_writereg(LCD_REG_57, 0x3033);
|
||||
|
||||
/* Power Setting */
|
||||
|
||||
stm3210e_writereg(LCD_REG_144, 0x0018); /* 80Hz */
|
||||
stm3210e_writereg(LCD_REG_16, 0x0530); /* BT, AP */
|
||||
stm3210e_writereg(LCD_REG_17, 0x0237); /* DC1,DC0,VC */
|
||||
stm3210e_writereg(LCD_REG_18, 0x01bf);
|
||||
stm3210e_writereg(LCD_REG_19, 0x1000); /* VCOM */
|
||||
up_mdelay(200);
|
||||
|
||||
stm3210e_writereg(LCD_REG_1, 0x0100); /* Set SS bit */
|
||||
stm3210e_writereg(LCD_REG_2, 0x0200);
|
||||
stm3210e_writereg(LCD_REG_3, 0x1030); /* Set GRAM write direction and BGR=1. */
|
||||
stm3210e_writereg(LCD_REG_9, 0x0001);
|
||||
stm3210e_writereg(LCD_REG_10, 0x0008);
|
||||
stm3210e_writereg(LCD_REG_12, 0x0000); /* RGB 18-bit System interface setting */
|
||||
stm3210e_writereg(LCD_REG_13, 0xd000);
|
||||
stm3210e_writereg(LCD_REG_14, 0x0030);
|
||||
stm3210e_writereg(LCD_REG_15, 0x0000); /* RGB interface polarity, no impact */
|
||||
stm3210e_writereg(LCD_REG_32, 0x0000); /* H Start */
|
||||
stm3210e_writereg(LCD_REG_33, 0x0000); /* V Start */
|
||||
stm3210e_writereg(LCD_REG_41, 0x002e);
|
||||
stm3210e_writereg(LCD_REG_80, 0x0000); /* Horizontal GRAM Start Address */
|
||||
stm3210e_writereg(LCD_REG_81, 0x00ef); /* Horizontal GRAM End Address */
|
||||
stm3210e_writereg(LCD_REG_82, 0x0000); /* Vertical GRAM Start Address */
|
||||
stm3210e_writereg(LCD_REG_83, 0x013f); /* Vertical GRAM End Address */
|
||||
stm3210e_writereg(LCD_REG_97, 0x0001); /* NDL, VLE, REV */
|
||||
stm3210e_writereg(LCD_REG_106, 0x0000); /* set scrolling line */
|
||||
stm3210e_writereg(LCD_REG_128, 0x0000);
|
||||
stm3210e_writereg(LCD_REG_129, 0x0000);
|
||||
stm3210e_writereg(LCD_REG_130, 0x005f);
|
||||
stm3210e_writereg(LCD_REG_147, 0x0701);
|
||||
|
||||
stm3210e_writereg(LCD_REG_7, 0x0000); /* Display OFF */
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
#ifndef CONFIG_STM32_AM240320_DISABLE
|
||||
g_lcddev.type = LCD_TYPE_AM240320;
|
||||
|
|
|
@ -234,6 +234,13 @@ CONFIG_SSI1_DISABLE=y
|
|||
CONFIG_SSI_POLLWAIT=y
|
||||
#CONFIG_SSI_TXLIMIT=4
|
||||
|
||||
#
|
||||
# STM3210E-EVAL specific LCD settings
|
||||
#
|
||||
CONFIG_STM32_AM240320_DISABLE=n
|
||||
CONFIG_STM32_SPFD5408B_DISABLE=n
|
||||
CONFIG_STM32_R61580_DISABLE=y
|
||||
|
||||
#
|
||||
# General build options
|
||||
#
|
||||
|
|
|
@ -232,6 +232,13 @@ CONFIG_SSI1_DISABLE=y
|
|||
CONFIG_SSI_POLLWAIT=y
|
||||
#CONFIG_SSI_TXLIMIT=4
|
||||
|
||||
#
|
||||
# STM3210E-EVAL specific LCD settings
|
||||
#
|
||||
CONFIG_STM32_AM240320_DISABLE=n
|
||||
CONFIG_STM32_SPFD5408B_DISABLE=n
|
||||
CONFIG_STM32_R61580_DISABLE=y
|
||||
|
||||
#
|
||||
# General build options
|
||||
#
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
* sched/mq_notify.c
|
||||
*
|
||||
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <spudmonkey@racsa.co.cr>
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
|
@ -97,17 +97,17 @@
|
|||
* sigev_value - Value associated with the signal
|
||||
*
|
||||
* Return Value:
|
||||
* On success mq_notify() returns 0; on error, -1 is returned, with
|
||||
* errno set to indicate the error.
|
||||
* On success mq_notify() returns 0; on error, -1 is returned, with
|
||||
* errno set to indicate the error.
|
||||
*
|
||||
* EBADF The descriptor specified in mqdes is invalid.
|
||||
* EBUSY Another process has already registered to receive notification
|
||||
* for this message queue.
|
||||
* EINVAL sevp->sigev_notify is not one of the permitted values; or
|
||||
* sevp->sigev_notify is SIGEV_SIGNAL and sevp->sigev_signo is not a
|
||||
* valid signal number.
|
||||
* ENOMEM
|
||||
* Insufficient memory.
|
||||
* EBADF The descriptor specified in mqdes is invalid.
|
||||
* EBUSY Another process has already registered to receive notification
|
||||
* for this message queue.
|
||||
* EINVAL sevp->sigev_notify is not one of the permitted values; or
|
||||
* sevp->sigev_notify is SIGEV_SIGNAL and sevp->sigev_signo is not a
|
||||
* valid signal number.
|
||||
* ENOMEM
|
||||
* Insufficient memory.
|
||||
*
|
||||
* Assumptions:
|
||||
*
|
||||
|
|
Loading…
Reference in New Issue