diff --git a/Documentation/NuttxUserGuide.html b/Documentation/NuttxUserGuide.html index a5997f9728cf6f1f3c168cdee9cded742039f803..09407bfb081dcb284be11c0c3432bc8a3965180e 100644 --- a/Documentation/NuttxUserGuide.html +++ b/Documentation/NuttxUserGuide.html @@ -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> diff --git a/configs/stm3210e-eval/RIDE/defconfig b/configs/stm3210e-eval/RIDE/defconfig index 21adf16aba47640160788552cc7d6decd2e17f55..f47f40bf375cdb70a05507e8b404b0983588f84f 100755 --- a/configs/stm3210e-eval/RIDE/defconfig +++ b/configs/stm3210e-eval/RIDE/defconfig @@ -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 # diff --git a/configs/stm3210e-eval/buttons/defconfig b/configs/stm3210e-eval/buttons/defconfig index 16c19e07fe3b7cbe121b3d01c5bec71b4e0c9075..7a1e4d78dbae545699b5e850b39805725374755f 100644 --- a/configs/stm3210e-eval/buttons/defconfig +++ b/configs/stm3210e-eval/buttons/defconfig @@ -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 # diff --git a/configs/stm3210e-eval/nsh/defconfig b/configs/stm3210e-eval/nsh/defconfig index 06df09d2e986863a7eb5804b7bdfec899696f02e..8e1e1f84843c5a6ed894d88ec144ad7d3fa7141b 100755 --- a/configs/stm3210e-eval/nsh/defconfig +++ b/configs/stm3210e-eval/nsh/defconfig @@ -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 # diff --git a/configs/stm3210e-eval/nsh2/defconfig b/configs/stm3210e-eval/nsh2/defconfig index 281fec5b713aae03c4059a65bad1a67858e20263..ae6a06606a4376e6dfa5b07efc3ad9b15842136d 100644 --- a/configs/stm3210e-eval/nsh2/defconfig +++ b/configs/stm3210e-eval/nsh2/defconfig @@ -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 # diff --git a/configs/stm3210e-eval/nx/defconfig b/configs/stm3210e-eval/nx/defconfig index 8381ae8f6d121c12618187c1f9c6088d4e5f956a..94d843fb9544d602cb92778f098f7c508582b7a7 100644 --- a/configs/stm3210e-eval/nx/defconfig +++ b/configs/stm3210e-eval/nx/defconfig @@ -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 # diff --git a/configs/stm3210e-eval/nxlines/defconfig b/configs/stm3210e-eval/nxlines/defconfig index 048476296ea3bf95531c2975a35942d98bb9e54c..0ed46b6ad14301914e068dd747d6e3691dfbd09d 100644 --- a/configs/stm3210e-eval/nxlines/defconfig +++ b/configs/stm3210e-eval/nxlines/defconfig @@ -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 # diff --git a/configs/stm3210e-eval/nxtext/defconfig b/configs/stm3210e-eval/nxtext/defconfig index 07ab05c7431b29487103330d5208394356e8e694..e48a147c94d7989e9dc9c0c26e9d7ee72625558a 100644 --- a/configs/stm3210e-eval/nxtext/defconfig +++ b/configs/stm3210e-eval/nxtext/defconfig @@ -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 # diff --git a/configs/stm3210e-eval/ostest/defconfig b/configs/stm3210e-eval/ostest/defconfig index b3516fa5d4f38c0938344dbbdf29104d0d8db5ed..c4f81ecd8c7137fe07fceac6c7843390c035e6ad 100755 --- a/configs/stm3210e-eval/ostest/defconfig +++ b/configs/stm3210e-eval/ostest/defconfig @@ -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 # diff --git a/configs/stm3210e-eval/src/up_lcd.c b/configs/stm3210e-eval/src/up_lcd.c index 481da54dd6ad667b8a343bf21f1ff13213a61c3f..a3fe6c8107d60d3f71f0d8ecbbf45ea06070d08e 100644 --- a/configs/stm3210e-eval/src/up_lcd.c +++ b/configs/stm3210e-eval/src/up_lcd.c @@ -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; diff --git a/configs/stm3210e-eval/usbserial/defconfig b/configs/stm3210e-eval/usbserial/defconfig index ef85b33bb5ac479ddc8d8ed4129bb318b2b1f70c..be28df9666a30bf34b814220bc8b98d95e5a05cd 100755 --- a/configs/stm3210e-eval/usbserial/defconfig +++ b/configs/stm3210e-eval/usbserial/defconfig @@ -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 # diff --git a/configs/stm3210e-eval/usbstorage/defconfig b/configs/stm3210e-eval/usbstorage/defconfig index 7e7a447ce59d63c55567751cd88fc5f8adf468e5..9d4557ab9fe67cb5e468c575b473ff1e672aea51 100755 --- a/configs/stm3210e-eval/usbstorage/defconfig +++ b/configs/stm3210e-eval/usbstorage/defconfig @@ -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 # diff --git a/sched/mq_notify.c b/sched/mq_notify.c index 4ec3d82c981a2a1039900838acbb38892b88cd6f..ce64d5a54ea84b48d98c719d152727f65b1c16a3 100644 --- a/sched/mq_notify.c +++ b/sched/mq_notify.c @@ -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: *