9
0
Fork 0

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:
patacongo 2011-12-05 19:59:10 +00:00
parent ec69455a81
commit e69720fe6e
13 changed files with 227 additions and 70 deletions

View File

@ -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 &lt;mqueue.h&gt;
int mq_notify(mqd_t mqdes, const struct sigevent *notification);
</pre>
</p>
<p>
<b>Description:</b> If the &quot;notification&quot; 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 &quot;notification&quot; 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, &quot;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.&quot;
</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, &quot;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.&quot;
</li>
</ul>
</p>
<H3><a name="mqsetattr">2.4.8 mq_setattr</a></H3>

View File

@ -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
#

View File

@ -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
#

View File

@ -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
#

View File

@ -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
#

View File

@ -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
#

View File

@ -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
#

View File

@ -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
#

View File

@ -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
#

View File

@ -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;

View File

@ -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
#

View File

@ -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
#

View File

@ -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:
*