Merge with trunk NuttX

git-svn-id: https://nuttx.svn.sourceforge.net/svnroot/nuttx/trunk@5079 7fd9a85b-ad96-42d3-883c-3090e2eb8679
This commit is contained in:
px4dev 2012-09-02 12:17:16 -07:00
commit 6576edb47e
154 changed files with 2179 additions and 706 deletions

View File

@ -289,5 +289,19 @@
threds to no more than 3 of each priority. Bad things happen threds to no more than 3 of each priority. Bad things happen
when the existing logic tried to created several hundred test when the existing logic tried to created several hundred test
treads! treads!
* apps/nshlib/nsh.h: Both CONFIG_LIBC_STRERROR and CONFIG_NSH_STRERROR
must be defined to use strerror() with NSH.
* apps/examples/*/*_main.c, system/i2c/i2c_main.c, and others: Added
configuration variable CONFIG_USER_ENTRYPOINT that may be used to change
the default entry from user_start to some other symbol. Contributed by
Kate.
* apps/netutils/webserver/httpd/c: Fix a typo that as introduced in
version r4402: 'lese' instead of 'else' (Noted by Max Holtzberg).
* tools/mkfsdata.pl: The uIP web server CGI image making perl script was
moved from apps/netutils/webserver/makefsdata to nuttx/tools/mkfsdata.pl
(Part of a larger change submitted by Max Holtzberg).
* apps/netutils/webserver, apps/examples/uip, and apps/include/netutils/httpd.h:
The "canned" version of the uIP web servers content that was at
netutils/webserver/httpd_fsdata.c has been replaced with a dynamically
built configuration located at apps/examples/uip (Contributed by
Max Holtzberg).

View File

@ -118,7 +118,7 @@ the NuttX configuration file:
CONFIG_BUILTIN_APP_START=<application name> CONFIG_BUILTIN_APP_START=<application name>
that application shall be invoked immediately after system starts that application shall be invoked immediately after system starts
*instead* of the normal, default "user_start" entry point. *instead* of the default "user_start" entry point.
Note that <application name> must be provided as: "hello", Note that <application name> must be provided as: "hello",
will call: will call:

View File

@ -1350,6 +1350,10 @@ examples/uip
CONFIGURED_APPS += resolv CONFIGURED_APPS += resolv
CONFIGURED_APPS += webserver CONFIGURED_APPS += webserver
NOTE: This example does depend on the perl script at
nuttx/tools/mkfsdata.pl. You must have perl installed on your
development system at /usr/bin/perl.
examples/usbserial examples/usbserial
^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^

View File

@ -57,14 +57,6 @@
* Pre-processor Definitions * Pre-processor Definitions
****************************************************************************/ ****************************************************************************/
#ifdef CONFIG_NSH_BUILTIN_APPS
# define MAIN_NAME adc_main
# define MAIN_STRING "adc_main: "
#else
# define MAIN_NAME user_start
# define MAIN_STRING "user_start: "
#endif
/**************************************************************************** /****************************************************************************
* Private Types * Private Types
****************************************************************************/ ****************************************************************************/
@ -223,10 +215,10 @@ static void parse_args(FAR struct adc_state_s *adc, int argc, FAR char **argv)
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* Name: user_start/adc_main * Name: adc_main
****************************************************************************/ ****************************************************************************/
int MAIN_NAME(int argc, char *argv[]) int adc_main(int argc, char *argv[])
{ {
struct adc_msg_s sample[CONFIG_EXAMPLES_ADC_GROUPSIZE]; struct adc_msg_s sample[CONFIG_EXAMPLES_ADC_GROUPSIZE];
size_t readsize; size_t readsize;
@ -244,11 +236,11 @@ int MAIN_NAME(int argc, char *argv[])
* this test. * this test.
*/ */
message(MAIN_STRING "Initializing external ADC device\n"); message("adc_main: Initializing external ADC device\n");
ret = adc_devinit(); ret = adc_devinit();
if (ret != OK) if (ret != OK)
{ {
message(MAIN_STRING "adc_devinit failed: %d\n", ret); message("adc_main: adc_devinit failed: %d\n", ret);
errval = 1; errval = 1;
goto errout; goto errout;
} }
@ -276,18 +268,18 @@ int MAIN_NAME(int argc, char *argv[])
*/ */
#if defined(CONFIG_NSH_BUILTIN_APPS) || defined(CONFIG_EXAMPLES_ADC_NSAMPLES) #if defined(CONFIG_NSH_BUILTIN_APPS) || defined(CONFIG_EXAMPLES_ADC_NSAMPLES)
message(MAIN_STRING "g_adcstate.count: %d\n", g_adcstate.count); message("adc_main: g_adcstate.count: %d\n", g_adcstate.count);
#endif #endif
/* Open the ADC device for reading */ /* Open the ADC device for reading */
message(MAIN_STRING "Hardware initialized. Opening the ADC device: %s\n", message("adc_main: Hardware initialized. Opening the ADC device: %s\n",
g_adcstate.devpath); g_adcstate.devpath);
fd = open(g_adcstate.devpath, O_RDONLY); fd = open(g_adcstate.devpath, O_RDONLY);
if (fd < 0) if (fd < 0)
{ {
message(MAIN_STRING "open %s failed: %d\n", g_adcstate.devpath, errno); message("adc_main: open %s failed: %d\n", g_adcstate.devpath, errno);
errval = 2; errval = 2;
goto errout_with_dev; goto errout_with_dev;
} }
@ -322,17 +314,17 @@ int MAIN_NAME(int argc, char *argv[])
errval = errno; errval = errno;
if (errval != EINTR) if (errval != EINTR)
{ {
message(MAIN_STRING "read %s failed: %d\n", message("adc_main: read %s failed: %d\n",
g_adcstate.devpath, errval); g_adcstate.devpath, errval);
errval = 3; errval = 3;
goto errout_with_dev; goto errout_with_dev;
} }
message(MAIN_STRING "Interrupted read...\n"); message("adc_main: Interrupted read...\n");
} }
else if (nbytes == 0) else if (nbytes == 0)
{ {
message(MAIN_STRING "No data read, Ignoring\n"); message("adc_main: No data read, Ignoring\n");
} }
/* Print the sample data on successful return */ /* Print the sample data on successful return */
@ -342,7 +334,7 @@ int MAIN_NAME(int argc, char *argv[])
int nsamples = nbytes / sizeof(struct adc_msg_s); int nsamples = nbytes / sizeof(struct adc_msg_s);
if (nsamples * sizeof(struct adc_msg_s) != nbytes) if (nsamples * sizeof(struct adc_msg_s) != nbytes)
{ {
message(MAIN_STRING "read size=%d is not a multiple of sample size=%d, Ignoring\n", message("adc_main: read size=%d is not a multiple of sample size=%d, Ignoring\n",
nbytes, sizeof(struct adc_msg_s)); nbytes, sizeof(struct adc_msg_s));
} }
else else

View File

@ -130,16 +130,6 @@
#define NUM_BUTTONS (MAX_BUTTON - MIN_BUTTON + 1) #define NUM_BUTTONS (MAX_BUTTON - MIN_BUTTON + 1)
#define BUTTON_INDEX(b) ((b)-MIN_BUTTON) #define BUTTON_INDEX(b) ((b)-MIN_BUTTON)
/* Is this being built as an NSH built-in application? */
#ifdef CONFIG_NSH_BUILTIN_APPS
# define MAIN_NAME buttons_main
# define MAIN_STRING "buttons_main: "
#else
# define MAIN_NAME user_start
# define MAIN_STRING "user_start: "
#endif
/**************************************************************************** /****************************************************************************
* Private Types * Private Types
****************************************************************************/ ****************************************************************************/
@ -399,10 +389,10 @@ static int button7_handler(int irq, FAR void *context)
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* user_start/buttons_main * buttons_main
****************************************************************************/ ****************************************************************************/
int MAIN_NAME(int argc, char *argv[]) int buttons_main(int argc, char *argv[])
{ {
uint8_t newset; uint8_t newset;
irqstate_t flags; irqstate_t flags;

View File

@ -76,14 +76,6 @@
# define MAX_ID (1 << 11) # define MAX_ID (1 << 11)
#endif #endif
#ifdef CONFIG_NSH_BUILTIN_APPS
# define MAIN_NAME can_main
# define MAIN_STRING "can_main: "
#else
# define MAIN_NAME user_start
# define MAIN_STRING "user_start: "
#endif
/**************************************************************************** /****************************************************************************
* Private Types * Private Types
****************************************************************************/ ****************************************************************************/
@ -109,10 +101,10 @@
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* Name: user_start/can_main * Name: can_main
****************************************************************************/ ****************************************************************************/
int MAIN_NAME(int argc, char *argv[]) int can_main(int argc, char *argv[])
{ {
#ifndef CONFIG_EXAMPLES_CAN_READONLY #ifndef CONFIG_EXAMPLES_CAN_READONLY
struct can_msg_s txmsg; struct can_msg_s txmsg;
@ -150,31 +142,31 @@ int MAIN_NAME(int argc, char *argv[])
{ {
nmsgs = strtol(argv[1], NULL, 10); nmsgs = strtol(argv[1], NULL, 10);
} }
message(MAIN_STRING "nmsgs: %d\n", nmsgs); message("can_main: nmsgs: %d\n", nmsgs);
#elif defined(CONFIG_EXAMPLES_CAN_NMSGS) #elif defined(CONFIG_EXAMPLES_CAN_NMSGS)
message(MAIN_STRING "nmsgs: %d\n", CONFIG_EXAMPLES_CAN_NMSGS); message("can_main: nmsgs: %d\n", CONFIG_EXAMPLES_CAN_NMSGS);
#endif #endif
/* Initialization of the CAN hardware is performed by logic external to /* Initialization of the CAN hardware is performed by logic external to
* this test. * this test.
*/ */
message(MAIN_STRING "Initializing external CAN device\n"); message("can_main: Initializing external CAN device\n");
ret = can_devinit(); ret = can_devinit();
if (ret != OK) if (ret != OK)
{ {
message(MAIN_STRING "can_devinit failed: %d\n", ret); message("can_main: can_devinit failed: %d\n", ret);
errval = 1; errval = 1;
goto errout; goto errout;
} }
/* Open the CAN device for reading */ /* Open the CAN device for reading */
message(MAIN_STRING "Hardware initialized. Opening the CAN device\n"); message("can_main: Hardware initialized. Opening the CAN device\n");
fd = open(CONFIG_EXAMPLES_CAN_DEVPATH, CAN_OFLAGS); fd = open(CONFIG_EXAMPLES_CAN_DEVPATH, CAN_OFLAGS);
if (fd < 0) if (fd < 0)
{ {
message(MAIN_STRING "open %s failed: %d\n", message("can_main: open %s failed: %d\n",
CONFIG_EXAMPLES_CAN_DEVPATH, errno); CONFIG_EXAMPLES_CAN_DEVPATH, errno);
errval = 2; errval = 2;
goto errout_with_dev; goto errout_with_dev;

View File

@ -53,16 +53,10 @@
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* user_start/hello_main * hello_main
****************************************************************************/ ****************************************************************************/
#ifdef CONFIG_EXAMPLES_HELLO_BUILTIN int hello_main(int argc, char *argv[])
# define MAIN_NAME hello_main
#else
# define MAIN_NAME user_start
#endif
int MAIN_NAME(int argc, char *argv[])
{ {
printf("Hello, World!!\n"); printf("Hello, World!!\n");
return 0; return 0;

View File

@ -124,24 +124,11 @@ static CHelloWorld g_HelloWorld;
// Public Functions // Public Functions
//*************************************************************************** //***************************************************************************
//***************************************************************************
// user_start
//***************************************************************************
/**************************************************************************** /****************************************************************************
* Name: user_start/nxhello_main * Name: helloxx_main
****************************************************************************/ ****************************************************************************/
#ifdef CONFIG_EXAMPLES_HELLOXX_BUILTIN int helloxx_main(int argc, char *argv[])
extern "C" int helloxx_main(int argc, char *argv[]);
# define MAIN_NAME helloxx_main
# define MAIN_STRING "helloxx_main: "
#else
# define MAIN_NAME user_start
# define MAIN_STRING "user_start: "
#endif
int MAIN_NAME(int argc, char *argv[])
{ {
// If C++ initialization for static constructors is supported, then do // If C++ initialization for static constructors is supported, then do
// that first // that first
@ -153,7 +140,7 @@ int MAIN_NAME(int argc, char *argv[])
// Exercise an explictly instantiated C++ object // Exercise an explictly instantiated C++ object
CHelloWorld *pHelloWorld = new CHelloWorld; CHelloWorld *pHelloWorld = new CHelloWorld;
printf(MAIN_STRING "Saying hello from the dynamically constructed instance\n"); printf("helloxx_main: Saying hello from the dynamically constructed instance\n");
pHelloWorld->HelloWorld(); pHelloWorld->HelloWorld();
// Exercise an C++ object instantiated on the stack // Exercise an C++ object instantiated on the stack
@ -161,14 +148,14 @@ int MAIN_NAME(int argc, char *argv[])
#ifndef CONFIG_EXAMPLES_HELLOXX_NOSTACKCONST #ifndef CONFIG_EXAMPLES_HELLOXX_NOSTACKCONST
CHelloWorld HelloWorld; CHelloWorld HelloWorld;
printf(MAIN_STRING "Saying hello from the instance constructed on the stack\n"); printf("helloxx_main: Saying hello from the instance constructed on the stack\n");
HelloWorld.HelloWorld(); HelloWorld.HelloWorld();
#endif #endif
// Exercise an statically constructed C++ object // Exercise an statically constructed C++ object
#ifdef CONFIG_HAVE_CXXINITIALIZE #ifdef CONFIG_HAVE_CXXINITIALIZE
printf(MAIN_STRING "Saying hello from the statically constructed instance\n"); printf("helloxx_main: Saying hello from the statically constructed instance\n");
g_HelloWorld.HelloWorld(); g_HelloWorld.HelloWorld();
#endif #endif

View File

@ -152,16 +152,10 @@ static inline int lcdrw_initialize(FAR struct lcdrw_instance_s *inst)
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* Name: lcdrw_main/user_start * Name: lcdrw_main
****************************************************************************/ ****************************************************************************/
#ifdef CONFIG_EXAMPLES_LCDRW_BUILTIN int lcdrw_main(int argc, char *argv[])
# define MAIN_NAME lcdrw_main
#else
# define MAIN_NAME user_start
#endif
int MAIN_NAME(int argc, char *argv[])
{ {
struct lcdrw_instance_s inst; struct lcdrw_instance_s inst;
nxgl_coord_t row; nxgl_coord_t row;

View File

@ -267,10 +267,10 @@ static void do_frees(void **mem, const int *size, const int *seq, int n)
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* Name: user_start * Name: mm_main
****************************************************************************/ ****************************************************************************/
int user_start(int argc, char *argv[]) int mm_main(int argc, char *argv[])
{ {
mm_showmallinfo(); mm_showmallinfo();

View File

@ -567,10 +567,10 @@ static void succeed_stat(const char *path)
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* Name: user_start * Name: mount_main
****************************************************************************/ ****************************************************************************/
int user_start(int argc, char *argv[]) int mount_main(int argc, char *argv[])
{ {
int ret; int ret;
@ -580,18 +580,18 @@ int user_start(int argc, char *argv[])
ret = create_ramdisk(); ret = create_ramdisk();
if (ret < 0) if (ret < 0)
{ {
printf("user_start: ERROR failed to create RAM disk\n"); printf("mount_main: ERROR failed to create RAM disk\n");
return 1; return 1;
} }
#endif #endif
/* Mount the test file system (see arch/sim/src/up_deviceimage.c */ /* Mount the test file system (see arch/sim/src/up_deviceimage.c */
printf("user_start: mounting %s filesystem at target=%s with source=%s\n", printf("mount_main: mounting %s filesystem at target=%s with source=%s\n",
g_filesystemtype, g_target, g_source); g_filesystemtype, g_target, g_source);
ret = mount(g_source, g_target, g_filesystemtype, 0, NULL); ret = mount(g_source, g_target, g_filesystemtype, 0, NULL);
printf("user_start: mount() returned %d\n", ret); printf("mount_main: mount() returned %d\n", ret);
if (ret == 0) if (ret == 0)
{ {
@ -737,16 +737,16 @@ int user_start(int argc, char *argv[])
/* Unmount the file system */ /* Unmount the file system */
printf("user_start: Try unmount(%s)\n", g_target); printf("mount_main: Try unmount(%s)\n", g_target);
ret = umount(g_target); ret = umount(g_target);
if (ret != 0) if (ret != 0)
{ {
printf("user_start: ERROR umount() failed, errno %d\n", errno); printf("mount_main: ERROR umount() failed, errno %d\n", errno);
g_nerrors++; g_nerrors++;
} }
printf("user_start: %d errors reported\n", g_nerrors); printf("mount_main: %d errors reported\n", g_nerrors);
} }
fflush(stdout); fflush(stdout);

View File

@ -84,10 +84,10 @@
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* Name: user_start * Name: nsh_main
****************************************************************************/ ****************************************************************************/
int user_start(int argc, char *argv[]) int nsh_main(int argc, char *argv[])
{ {
int exitval = 0; int exitval = 0;
int ret; int ret;

View File

@ -58,10 +58,10 @@
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* Name: user_start * Name: null_main
****************************************************************************/ ****************************************************************************/
int user_start(int argc, char *argv[]) int null_main(int argc, char *argv[])
{ {
return 0; return 0;
} }

View File

@ -409,7 +409,7 @@ static int user_main(int argc, char *argv[])
check_test_memory_usage(); check_test_memory_usage();
#endif /* CONFIG_PRIORITY_INHERITANCE && !CONFIG_DISABLE_SIGNALS && !CONFIG_DISABLE_PTHREAD */ #endif /* CONFIG_PRIORITY_INHERITANCE && !CONFIG_DISABLE_SIGNALS && !CONFIG_DISABLE_PTHREAD */
/* Compare memory usage at time user_start started until /* Compare memory usage at time ostest_main started until
* user_main exits. These should not be identical, but should * user_main exits. These should not be identical, but should
* be similar enough that we can detect any serious OS memory * be similar enough that we can detect any serious OS memory
* leaks. * leaks.
@ -458,18 +458,10 @@ static void stdio_test(void)
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* user_start/ostest_main * ostest_main
****************************************************************************/ ****************************************************************************/
#ifdef CONFIG_EXAMPLES_OSTEST_BUILTIN int ostest_main(int argc, char *argv[])
# define MAIN_NAME ostest_main
# define MAIN_STRING "ostest_main: "
#else
# define MAIN_NAME user_start
# define MAIN_STRING "user_start: "
#endif
int MAIN_NAME(int argc, char *argv[])
{ {
int result; int result;
@ -492,19 +484,19 @@ int MAIN_NAME(int argc, char *argv[])
/* Set up some environment variables */ /* Set up some environment variables */
#ifndef CONFIG_DISABLE_ENVIRON #ifndef CONFIG_DISABLE_ENVIRON
printf(MAIN_STRING "putenv(%s)\n", g_putenv_value); printf("ostest_main: putenv(%s)\n", g_putenv_value);
putenv(g_putenv_value); /* Varaible1=BadValue3 */ putenv(g_putenv_value); /* Varaible1=BadValue3 */
printf(MAIN_STRING "setenv(%s, %s, TRUE)\n", g_var1_name, g_var1_value); printf("ostest_main: setenv(%s, %s, TRUE)\n", g_var1_name, g_var1_value);
setenv(g_var1_name, g_var1_value, TRUE); /* Variable1=GoodValue1 */ setenv(g_var1_name, g_var1_value, TRUE); /* Variable1=GoodValue1 */
printf(MAIN_STRING "setenv(%s, %s, FALSE)\n", g_var2_name, g_bad_value1); printf("ostest_main: setenv(%s, %s, FALSE)\n", g_var2_name, g_bad_value1);
setenv(g_var2_name, g_bad_value1, FALSE); /* Variable2=BadValue1 */ setenv(g_var2_name, g_bad_value1, FALSE); /* Variable2=BadValue1 */
printf(MAIN_STRING "setenv(%s, %s, TRUE)\n", g_var2_name, g_var2_value); printf("ostest_main: setenv(%s, %s, TRUE)\n", g_var2_name, g_var2_value);
setenv(g_var2_name, g_var2_value, TRUE); /* Variable2=GoodValue2 */ setenv(g_var2_name, g_var2_value, TRUE); /* Variable2=GoodValue2 */
printf(MAIN_STRING "setenv(%s, %s, FALSE)\n", g_var3_name, g_var3_name); printf("ostest_main: setenv(%s, %s, FALSE)\n", g_var3_name, g_var3_name);
setenv(g_var3_name, g_var3_value, FALSE); /* Variable3=GoodValue3 */ setenv(g_var3_name, g_var3_value, FALSE); /* Variable3=GoodValue3 */
printf(MAIN_STRING "setenv(%s, %s, FALSE)\n", g_var3_name, g_var3_name); printf("ostest_main: setenv(%s, %s, FALSE)\n", g_var3_name, g_var3_name);
setenv(g_var3_name, g_bad_value2, FALSE); /* Variable3=GoodValue3 */ setenv(g_var3_name, g_bad_value2, FALSE); /* Variable3=GoodValue3 */
show_environment(true, true, true); show_environment(true, true, true);
#endif #endif
@ -518,13 +510,13 @@ int MAIN_NAME(int argc, char *argv[])
#endif #endif
if (result == ERROR) if (result == ERROR)
{ {
printf(MAIN_STRING "ERROR Failed to start user_main\n"); printf("ostest_main: ERROR Failed to start user_main\n");
} }
else else
{ {
printf(MAIN_STRING "Started user_main at PID=%d\n", result); printf("ostest_main: Started user_main at PID=%d\n", result);
} }
printf(MAIN_STRING "Exitting\n"); printf("ostest_main: Exitting\n");
return 0; return 0;
} }

View File

@ -69,21 +69,21 @@
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* Name: user_start * Name: pipe_main
****************************************************************************/ ****************************************************************************/
int user_start(int argc, char *argv[]) int pipe_main(int argc, char *argv[])
{ {
int filedes[2]; int filedes[2];
int ret; int ret;
/* Test FIFO logic */ /* Test FIFO logic */
printf("\nuser_start: Performing FIFO test\n"); printf("\npipe_main: Performing FIFO test\n");
ret = mkfifo(FIFO_PATH1, 0666); ret = mkfifo(FIFO_PATH1, 0666);
if (ret < 0) if (ret < 0)
{ {
fprintf(stderr, "user_start: mkfifo failed with errno=%d\n", errno); fprintf(stderr, "pipe_main: mkfifo failed with errno=%d\n", errno);
return 1; return 1;
} }
@ -96,7 +96,7 @@ int user_start(int argc, char *argv[])
filedes[1] = open(FIFO_PATH1, O_WRONLY); filedes[1] = open(FIFO_PATH1, O_WRONLY);
if (filedes[1] < 0) if (filedes[1] < 0)
{ {
fprintf(stderr, "user_start: Failed to open FIFO %s for writing, errno=%d\n", fprintf(stderr, "pipe_main: Failed to open FIFO %s for writing, errno=%d\n",
FIFO_PATH1, errno); FIFO_PATH1, errno);
return 2; return 2;
} }
@ -104,11 +104,11 @@ int user_start(int argc, char *argv[])
filedes[0] = open(FIFO_PATH1, O_RDONLY); filedes[0] = open(FIFO_PATH1, O_RDONLY);
if (filedes[0] < 0) if (filedes[0] < 0)
{ {
fprintf(stderr, "user_start: Failed to open FIFO %s for reading, errno=%d\n", fprintf(stderr, "pipe_main: Failed to open FIFO %s for reading, errno=%d\n",
FIFO_PATH1, errno); FIFO_PATH1, errno);
if (close(filedes[1]) != 0) if (close(filedes[1]) != 0)
{ {
fprintf(stderr, "user_start: close failed: %d\n", errno); fprintf(stderr, "pipe_main: close failed: %d\n", errno);
} }
return 3; return 3;
} }
@ -118,28 +118,28 @@ int user_start(int argc, char *argv[])
ret = transfer_test(filedes[0], filedes[1]); ret = transfer_test(filedes[0], filedes[1]);
if (close(filedes[0]) != 0) if (close(filedes[0]) != 0)
{ {
fprintf(stderr, "user_start: close failed: %d\n", errno); fprintf(stderr, "pipe_main: close failed: %d\n", errno);
} }
if (close(filedes[1]) != 0) if (close(filedes[1]) != 0)
{ {
fprintf(stderr, "user_start: close failed: %d\n", errno); fprintf(stderr, "pipe_main: close failed: %d\n", errno);
} }
/* unlink(FIFO_PATH1); fails */ /* unlink(FIFO_PATH1); fails */
if (ret != 0) if (ret != 0)
{ {
fprintf(stderr, "user_start: FIFO test FAILED (%d)\n", ret); fprintf(stderr, "pipe_main: FIFO test FAILED (%d)\n", ret);
return 4; return 4;
} }
printf("user_start: FIFO test PASSED\n"); printf("pipe_main: FIFO test PASSED\n");
/* Test PIPE logic */ /* Test PIPE logic */
printf("\nuser_start: Performing pipe test\n"); printf("\npipe_main: Performing pipe test\n");
ret = pipe(filedes); ret = pipe(filedes);
if (ret < 0) if (ret < 0)
{ {
fprintf(stderr, "user_start: pipe failed with errno=%d\n", errno); fprintf(stderr, "pipe_main: pipe failed with errno=%d\n", errno);
return 5; return 5;
} }
@ -148,41 +148,41 @@ int user_start(int argc, char *argv[])
ret = transfer_test(filedes[0], filedes[1]); ret = transfer_test(filedes[0], filedes[1]);
if (close(filedes[0]) != 0) if (close(filedes[0]) != 0)
{ {
fprintf(stderr, "user_start: close failed: %d\n", errno); fprintf(stderr, "pipe_main: close failed: %d\n", errno);
} }
if (close(filedes[1]) != 0) if (close(filedes[1]) != 0)
{ {
fprintf(stderr, "user_start: close failed: %d\n", errno); fprintf(stderr, "pipe_main: close failed: %d\n", errno);
} }
if (ret != 0) if (ret != 0)
{ {
fprintf(stderr, "user_start: PIPE test FAILED (%d)\n", ret); fprintf(stderr, "pipe_main: PIPE test FAILED (%d)\n", ret);
return 6; return 6;
} }
printf("user_start: PIPE test PASSED\n"); printf("pipe_main: PIPE test PASSED\n");
/* Perform the FIFO interlock test */ /* Perform the FIFO interlock test */
printf("\nuser_start: Performing pipe interlock test\n"); printf("\npipe_main: Performing pipe interlock test\n");
ret = interlock_test(); ret = interlock_test();
if (ret != 0) if (ret != 0)
{ {
fprintf(stderr, "user_start: FIFO interlock test FAILED (%d)\n", ret); fprintf(stderr, "pipe_main: FIFO interlock test FAILED (%d)\n", ret);
return 7; return 7;
} }
printf("user_start: PIPE interlock test PASSED\n"); printf("pipe_main: PIPE interlock test PASSED\n");
/* Perform the pipe redirection test */ /* Perform the pipe redirection test */
printf("\nuser_start: Performing redirection test\n"); printf("\npipe_main: Performing redirection test\n");
ret = redirection_test(); ret = redirection_test();
if (ret != 0) if (ret != 0)
{ {
fprintf(stderr, "user_start: FIFO redirection test FAILED (%d)\n", ret); fprintf(stderr, "pipe_main: FIFO redirection test FAILED (%d)\n", ret);
return 7; return 7;
} }
printf("user_start: PIPE redirection test PASSED\n"); printf("pipe_main: PIPE redirection test PASSED\n");
fflush(stdout); fflush(stdout);
return 0; return 0;

View File

@ -301,16 +301,16 @@ int redirection_test(void)
if (close(filedes[0]) != 0) if (close(filedes[0]) != 0)
{ {
fprintf(stderr, "user_start: close failed: %d\n", errno); fprintf(stderr, "pipe_main: close failed: %d\n", errno);
} }
if (close(filedes[1]) != 0) if (close(filedes[1]) != 0)
{ {
fprintf(stderr, "user_start: close failed: %d\n", errno); fprintf(stderr, "pipe_main: close failed: %d\n", errno);
} }
if (ret != 0) if (ret != 0)
{ {
fprintf(stderr, "user_start: PIPE test FAILED (%d)\n", ret); fprintf(stderr, "pipe_main: PIPE test FAILED (%d)\n", ret);
return 6; return 6;
} }

View File

@ -74,10 +74,10 @@
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* Name: user_start * Name: poll_main
****************************************************************************/ ****************************************************************************/
int user_start(int argc, char *argv[]) int poll_main(int argc, char *argv[])
{ {
char buffer[64]; char buffer[64];
ssize_t nbytes; ssize_t nbytes;
@ -94,20 +94,20 @@ int user_start(int argc, char *argv[])
/* Open FIFOs */ /* Open FIFOs */
message("\nuser_start: Creating FIFO %s\n", FIFO_PATH1); message("\npoll_main: Creating FIFO %s\n", FIFO_PATH1);
ret = mkfifo(FIFO_PATH1, 0666); ret = mkfifo(FIFO_PATH1, 0666);
if (ret < 0) if (ret < 0)
{ {
message("user_start: mkfifo failed: %d\n", errno); message("poll_main: mkfifo failed: %d\n", errno);
exitcode = 1; exitcode = 1;
goto errout; goto errout;
} }
message("\nuser_start: Creating FIFO %s\n", FIFO_PATH2); message("\npoll_main: Creating FIFO %s\n", FIFO_PATH2);
ret = mkfifo(FIFO_PATH2, 0666); ret = mkfifo(FIFO_PATH2, 0666);
if (ret < 0) if (ret < 0)
{ {
message("user_start: mkfifo failed: %d\n", errno); message("poll_main: mkfifo failed: %d\n", errno);
exitcode = 2; exitcode = 2;
goto errout; goto errout;
} }
@ -117,7 +117,7 @@ int user_start(int argc, char *argv[])
fd1 = open(FIFO_PATH1, O_WRONLY); fd1 = open(FIFO_PATH1, O_WRONLY);
if (fd1 < 0) if (fd1 < 0)
{ {
message("user_start: Failed to open FIFO %s for writing, errno=%d\n", message("poll_main: Failed to open FIFO %s for writing, errno=%d\n",
FIFO_PATH1, errno); FIFO_PATH1, errno);
exitcode = 3; exitcode = 3;
goto errout; goto errout;
@ -126,7 +126,7 @@ int user_start(int argc, char *argv[])
fd2 = open(FIFO_PATH2, O_WRONLY); fd2 = open(FIFO_PATH2, O_WRONLY);
if (fd2 < 0) if (fd2 < 0)
{ {
message("user_start: Failed to open FIFO %s for writing, errno=%d\n", message("poll_main: Failed to open FIFO %s for writing, errno=%d\n",
FIFO_PATH2, errno); FIFO_PATH2, errno);
exitcode = 4; exitcode = 4;
goto errout; goto errout;
@ -134,39 +134,39 @@ int user_start(int argc, char *argv[])
/* Start the listeners */ /* Start the listeners */
message("user_start: Starting poll_listener thread\n"); message("poll_main: Starting poll_listener thread\n");
ret = pthread_create(&tid1, NULL, poll_listener, NULL); ret = pthread_create(&tid1, NULL, poll_listener, NULL);
if (ret != 0) if (ret != 0)
{ {
message("user_start: Failed to create poll_listener thread: %d\n", ret); message("poll_main: Failed to create poll_listener thread: %d\n", ret);
exitcode = 5; exitcode = 5;
goto errout; goto errout;
} }
message("user_start: Starting select_listener thread\n"); message("poll_main: Starting select_listener thread\n");
ret = pthread_create(&tid2, NULL, select_listener, NULL); ret = pthread_create(&tid2, NULL, select_listener, NULL);
if (ret != 0) if (ret != 0)
{ {
message("user_start: Failed to create select_listener thread: %d\n", ret); message("poll_main: Failed to create select_listener thread: %d\n", ret);
exitcode = 6; exitcode = 6;
goto errout; goto errout;
} }
#ifdef HAVE_NETPOLL #ifdef HAVE_NETPOLL
#ifdef CONFIG_NET_TCPBACKLOG #ifdef CONFIG_NET_TCPBACKLOG
message("user_start: Starting net_listener thread\n"); message("poll_main: Starting net_listener thread\n");
ret = pthread_create(&tid3, NULL, net_listener, NULL); ret = pthread_create(&tid3, NULL, net_listener, NULL);
#else #else
message("user_start: Starting net_reader thread\n"); message("poll_main: Starting net_reader thread\n");
ret = pthread_create(&tid3, NULL, net_reader, NULL); ret = pthread_create(&tid3, NULL, net_reader, NULL);
#endif #endif
if (ret != 0) if (ret != 0)
{ {
message("user_start: Failed to create net_listener thread: %d\n", ret); message("poll_main: Failed to create net_listener thread: %d\n", ret);
} }
#endif #endif
@ -182,7 +182,7 @@ int user_start(int argc, char *argv[])
nbytes = write(fd1, buffer, strlen(buffer)); nbytes = write(fd1, buffer, strlen(buffer));
if (nbytes < 0) if (nbytes < 0)
{ {
message("user_start: Write to fd1 failed: %d\n", errno); message("poll_main: Write to fd1 failed: %d\n", errno);
exitcode = 7; exitcode = 7;
goto errout; goto errout;
} }
@ -190,12 +190,12 @@ int user_start(int argc, char *argv[])
nbytes = write(fd2, buffer, strlen(buffer)); nbytes = write(fd2, buffer, strlen(buffer));
if (nbytes < 0) if (nbytes < 0)
{ {
message("user_start: Write fd2 failed: %d\n", errno); message("poll_main: Write fd2 failed: %d\n", errno);
exitcode = 8; exitcode = 8;
goto errout; goto errout;
} }
message("\nuser_start: Sent '%s' (%d bytes)\n", buffer, nbytes); message("\npoll_main: Sent '%s' (%d bytes)\n", buffer, nbytes);
msgflush(); msgflush();
/* Wait awhile. This delay should be long enough that the /* Wait awhile. This delay should be long enough that the

View File

@ -269,7 +269,7 @@ static void parse_args(FAR struct pwm_state_s *pwm, int argc, FAR char **argv)
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* Name: user_start/pwm_main * Name: pwm_main
****************************************************************************/ ****************************************************************************/
int pwm_main(int argc, char *argv[]) int pwm_main(int argc, char *argv[])

View File

@ -59,14 +59,6 @@
* Pre-processor Definitions * Pre-processor Definitions
****************************************************************************/ ****************************************************************************/
#ifdef CONFIG_NSH_BUILTIN_APPS
# define MAIN_NAME qe_main
# define MAIN_STRING "qe_main: "
#else
# define MAIN_NAME user_start
# define MAIN_STRING "user_start: "
#endif
/**************************************************************************** /****************************************************************************
* Private Types * Private Types
****************************************************************************/ ****************************************************************************/
@ -245,10 +237,10 @@ static void parse_args(int argc, FAR char **argv)
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* Name: user_start/qe_main * Name: qe_main
****************************************************************************/ ****************************************************************************/
int MAIN_NAME(int argc, char *argv[]) int qe_main(int argc, char *argv[])
{ {
int32_t position; int32_t position;
int fd; int fd;
@ -266,11 +258,11 @@ int MAIN_NAME(int argc, char *argv[])
* this test. * this test.
*/ */
message(MAIN_STRING "Initializing external encoder(s)\n"); message("qe_main: Initializing external encoder(s)\n");
ret = qe_devinit(); ret = qe_devinit();
if (ret != OK) if (ret != OK)
{ {
message(MAIN_STRING "qe_devinit failed: %d\n", ret); message("qe_main: qe_devinit failed: %d\n", ret);
exitval = EXIT_FAILURE; exitval = EXIT_FAILURE;
goto errout; goto errout;
} }
@ -289,13 +281,13 @@ int MAIN_NAME(int argc, char *argv[])
/* Open the encoder device for reading */ /* Open the encoder device for reading */
message(MAIN_STRING "Hardware initialized. Opening the encoder device: %s\n", message("qe_main: Hardware initialized. Opening the encoder device: %s\n",
g_qeexample.devpath); g_qeexample.devpath);
fd = open(g_qeexample.devpath, O_RDONLY); fd = open(g_qeexample.devpath, O_RDONLY);
if (fd < 0) if (fd < 0)
{ {
message(MAIN_STRING "open %s failed: %d\n", g_qeexample.devpath, errno); message("qe_main: open %s failed: %d\n", g_qeexample.devpath, errno);
exitval = EXIT_FAILURE; exitval = EXIT_FAILURE;
goto errout_with_dev; goto errout_with_dev;
} }
@ -304,11 +296,11 @@ int MAIN_NAME(int argc, char *argv[])
if (g_qeexample.reset) if (g_qeexample.reset)
{ {
message(MAIN_STRING "Resetting the count...\n"); message("qe_main: Resetting the count...\n");
ret = ioctl(fd, QEIOC_RESET, 0); ret = ioctl(fd, QEIOC_RESET, 0);
if (ret < 0) if (ret < 0)
{ {
message(MAIN_STRING "ioctl(QEIOC_RESET) failed: %d\n", errno); message("qe_main: ioctl(QEIOC_RESET) failed: %d\n", errno);
exitval = EXIT_FAILURE; exitval = EXIT_FAILURE;
goto errout_with_dev; goto errout_with_dev;
} }
@ -319,10 +311,10 @@ int MAIN_NAME(int argc, char *argv[])
*/ */
#if defined(CONFIG_NSH_BUILTIN_APPS) #if defined(CONFIG_NSH_BUILTIN_APPS)
message(MAIN_STRING "Number of samples: %d\n", g_qeexample.nloops); message("qe_main: Number of samples: %d\n", g_qeexample.nloops);
for (nloops = 0; nloops < g_qeexample.nloops; nloops++) for (nloops = 0; nloops < g_qeexample.nloops; nloops++)
#elif defined(CONFIG_EXAMPLES_QENCODER_NSAMPLES) #elif defined(CONFIG_EXAMPLES_QENCODER_NSAMPLES)
message(MAIN_STRING "Number of samples: %d\n", CONFIG_EXAMPLES_QENCODER_NSAMPLES); message("qe_main: Number of samples: %d\n", CONFIG_EXAMPLES_QENCODER_NSAMPLES);
for (nloops = 0; nloops < CONFIG_EXAMPLES_QENCODER_NSAMPLES; nloops++) for (nloops = 0; nloops < CONFIG_EXAMPLES_QENCODER_NSAMPLES; nloops++)
#else #else
for (;;) for (;;)
@ -339,7 +331,7 @@ int MAIN_NAME(int argc, char *argv[])
ret = ioctl(fd, QEIOC_POSITION, (unsigned long)((uintptr_t)&position)); ret = ioctl(fd, QEIOC_POSITION, (unsigned long)((uintptr_t)&position));
if (ret < 0) if (ret < 0)
{ {
message(MAIN_STRING "ioctl(QEIOC_POSITION) failed: %d\n", errno); message("qe_main: ioctl(QEIOC_POSITION) failed: %d\n", errno);
exitval = EXIT_FAILURE; exitval = EXIT_FAILURE;
goto errout_with_dev; goto errout_with_dev;
} }
@ -348,7 +340,7 @@ int MAIN_NAME(int argc, char *argv[])
else else
{ {
message(MAIN_STRING "%3d. %d\n", nloops+1, position); message("qe_main: %3d. %d\n", nloops+1, position);
} }
/* Delay a little bit */ /* Delay a little bit */

View File

@ -452,10 +452,10 @@ static void checkdirectories(struct node_s *entry)
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* Name: user_start * Name: romfs_main
****************************************************************************/ ****************************************************************************/
int user_start(int argc, char *argv[]) int romfs_main(int argc, char *argv[])
{ {
int ret; int ret;

View File

@ -56,10 +56,10 @@
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* user_start * serloop_main
****************************************************************************/ ****************************************************************************/
int user_start(int argc, char *argv[]) int serloop_main(int argc, char *argv[])
{ {
#ifdef CONFIG_EXAMPLES_SERLOOP_BUFIO #ifdef CONFIG_EXAMPLES_SERLOOP_BUFIO
int ch; int ch;

View File

@ -217,7 +217,7 @@ static void parse_args(FAR struct wdog_example_s *wdog, int argc, FAR char **arg
****************************************************************************/ ****************************************************************************/
/**************************************************************************** /****************************************************************************
* Name: user_start/wdog_main * Name: wdog_main
****************************************************************************/ ****************************************************************************/
int wdog_main(int argc, char *argv[]) int wdog_main(int argc, char *argv[])

View File

@ -58,7 +58,7 @@ pcode
Pascal P-Code at runtime. To use this example, place the following in Pascal P-Code at runtime. To use this example, place the following in
your appconfig file" your appconfig file"
# Path to example in apps/examples containing the user_start entry point # Path to example in apps/examples containing the passhello_main entry point
CONFIGURED_APPS += examples/pashello CONFIGURED_APPS += examples/pashello

View File

@ -148,9 +148,12 @@ config NSH_FILEIOSIZE
config NSH_STRERROR config NSH_STRERROR
bool "Use strerror()" bool "Use strerror()"
default n default n
depends on LIBC_STRERROR
---help--- ---help---
strerror(errno) makes more readable output but strerror() is strerror(errno) makes more readable output but strerror() is
very large and will not be used unless this setting is 'y' very large and will not be used unless this setting is 'y'
This setting depends upon the strerror() having been enabled
with LIBC_STRERROR.
config NSH_LINELEN config NSH_LINELEN
int "Max command line length" int "Max command line length"

View File

@ -915,7 +915,9 @@ NSH-Specific Configuration Settings
* CONFIG_NSH_STRERROR * CONFIG_NSH_STRERROR
strerror(errno) makes more readable output but strerror() is strerror(errno) makes more readable output but strerror() is
very large and will not be used unless this setting is 'y' very large and will not be used unless this setting is 'y'.
This setting depends upon the strerror() having been enabled
with CONFIG_LIBC_STRERROR.
* CONFIG_NSH_LINELEN * CONFIG_NSH_LINELEN
The maximum length of one command line and of one output line. The maximum length of one command line and of one output line.

View File

@ -238,9 +238,14 @@
#define NSH_MAX_ARGUMENTS 6 #define NSH_MAX_ARGUMENTS 6
/* strerror() produces much nicer output but is, however, quite large and /* strerror() produces much nicer output but is, however, quite large and
* will only be used if CONFIG_NSH_STRERROR is defined. * will only be used if CONFIG_NSH_STRERROR is defined. Note that the strerror
* interface must also have been enabled with CONFIG_LIBC_STRERROR.
*/ */
#ifndef CONFIG_LIBC_STRERROR
# undef CONFIG_NSH_STRERROR
#endif
#ifdef CONFIG_NSH_STRERROR #ifdef CONFIG_NSH_STRERROR
# define NSH_ERRNO strerror(errno) # define NSH_ERRNO strerror(errno)
# define NSH_ERRNO_OF(err) strerror(err) # define NSH_ERRNO_OF(err) strerror(err)

View File

@ -351,15 +351,7 @@ static void i2c_teardown(FAR struct i2ctool_s *i2ctool)
* Name: i2c_main * Name: i2c_main
****************************************************************************/ ****************************************************************************/
#ifdef CONFIG_I2CTOOL_BUILTIN int i2c_main(int argc, char *argv[])
# define MAIN_NAME i2c_main
# define MAIN_NAME_STRING "i2c_main"
#else
# define MAIN_NAME user_start
# define MAIN_NAME_STRING "user_start"
#endif
int MAIN_NAME(int argc, char *argv[])
{ {
/* Verify settings */ /* Verify settings */

View File

@ -3202,4 +3202,51 @@
for control transfers but does not resolve all of the issues. for control transfers but does not resolve all of the issues.
* configs/stm3220g-eval/*/defconfig: Calibrated delay loop. It had * configs/stm3220g-eval/*/defconfig: Calibrated delay loop. It had
never been calibrated was was way off. never been calibrated was was way off.
* sched/sem_holder.c: Add logic to handler some priority inheritance
cases when sem_post() is called from an interrupt handler. The
logic is clearly wrong, but it is not known if this is the
cause of any known bugs.
* lib/stdio/lib_perror(): Add perror(). Contributed by Kate.
* lib/string/lib_strerror(): Add option CONFIG_LIBC_STRERROR that
is now required to enabled strerror(). Add an option
CONFIG_LIBC_STRERROR_SHORT that can be used to output shortened
strings by strerror().
* arch/arm/src/stm32/stm32_usbotghost.c: Finally... the USB OTG FS
appears to handle NAKing correctly is complete.
* configs/stm32f4discovery/*: Added and verifed support for USB OTG FS
host on the STM32F4Discovery board.
* configs/*/defconfig: Remove configuration documentation from config
files. It is redundant, error-prone, and difficult to maintain.
Configuration documentation is available in configs/README.txt for
common configurations and in configs/*/README.txt for board and MCU_
specific configurations.
* configs/stm3240g-eval: Add USB host support.
* sched/os_bring.c, configs/*/defconfig, tools/mkconfig.c, and others: Added
configuration variable CONFIG_USER_ENTRYPOINT that may be used to change
the default entry from user_start to some other symbol. Contributed by
Kate. NOTE: This change does introduce a minor backward incompatibility.
For example, if your application uses NSH as its start-up program, then your
code will not fail because it will be unable to find "user_start". The fix
for this link failure is to add the following to your configuration file:
CONFIG_USER_ENTRYPOINT="nsh_main".
* libs/stdio/lib_libfread.c and lib_*flush*.c: Correct a couple of
error cases where the lib semaphore was not be released on error
exits (thanks Ronen Vainish). Also, improved some error reporting:
the generic ERROR was being used instead of the specific errno
value; the errno variable was not always set correctly.
* tools/mkfsdata.pl: The uIP web server CGI image making perl script was
moved from apps/netutils/webserver/makefsdata to nuttx/tools/mkfsdata.pl
(Part of a larger change submitted by Max Holtzberg).
* configs/stm3240g-eval/script/ld.script: All of the identical ld.script
files for the STM3240G-EVAL were replaced by one version in this directory.
* configs/stm3240g-eval/webserver: Configuration submitted by Max Holtzberg
for testing the changes to the uIP web server (see apps/ChangeLog.txt).
* lib/stdio/lib_perror.c: Remove CONFIG_LIBC_PERROR_DEVNAME. What was I
thinking? Arbitrary streams cannot be shared by different tasks.
* tools/mksyscall.c, csvparser.c, and csvparser.h: Separate CSV parsing
logic from mksyscall.c into files where it can be shared.
* tools/mksymtab.c: Add a tool that can be used to convert a CSV file
into a NuttX-style symbol table.
* sched/work_cancel.c: Fix a bad assertion (reported by Mike Smith)
* configs/stm3210e-eval/src/up_idle.c: Correct some power management
compilation errors (reported by Diego Sanchez).

View File

@ -43,15 +43,12 @@
#include <stdint.h> #include <stdint.h>
#include <stdbool.h> #include <stdbool.h>
#include <stdlib.h> #include <stdlib.h>
#include <unistd.h>
#include <semaphore.h> #include <semaphore.h>
#include <string.h> #include <string.h>
#include <errno.h> #include <errno.h>
#include <debug.h> #include <debug.h>
#if !defined(CONFIG_DEBUG_VERBOSE) && !defined(CONFIG_DEBUG_USB)
# include <debug.h>
#endif
#include <nuttx/arch.h> #include <nuttx/arch.h>
#include <nuttx/kmalloc.h> #include <nuttx/kmalloc.h>
#include <nuttx/usb/usb.h> #include <nuttx/usb/usb.h>
@ -315,6 +312,10 @@ static int stm32_ctrl_senddata(FAR struct stm32_usbhost_s *priv,
FAR uint8_t *buffer, unsigned int buflen); FAR uint8_t *buffer, unsigned int buflen);
static int stm32_ctrl_recvdata(FAR struct stm32_usbhost_s *priv, static int stm32_ctrl_recvdata(FAR struct stm32_usbhost_s *priv,
FAR uint8_t *buffer, unsigned int buflen); FAR uint8_t *buffer, unsigned int buflen);
static int stm32_in_transfer(FAR struct stm32_usbhost_s *priv, int chidx,
FAR uint8_t *buffer, size_t buflen);
static int stm32_out_transfer(FAR struct stm32_usbhost_s *priv, int chidx,
FAR uint8_t *buffer, size_t buflen);
/* Interrupt handling **********************************************************/ /* Interrupt handling **********************************************************/
/* Lower level interrupt handlers */ /* Lower level interrupt handlers */
@ -808,7 +809,7 @@ static void stm32_chan_halt(FAR struct stm32_usbhost_s *priv, int chidx,
uint32_t eptype; uint32_t eptype;
unsigned int avail; unsigned int avail;
/* Save the recon for the halt. We need this in the channel halt interrrupt /* Save the reason for the halt. We need this in the channel halt interrrupt
* handling logic to know what to do next. * handling logic to know what to do next.
*/ */
@ -1354,6 +1355,254 @@ static int stm32_ctrl_recvdata(FAR struct stm32_usbhost_s *priv,
return stm32_chan_wait(priv, chan); return stm32_chan_wait(priv, chan);
} }
/*******************************************************************************
* Name: stm32_in_transfer
*
* Description:
* Transfer 'buflen' bytes into 'buffer' from an IN channel.
*
*******************************************************************************/
static int stm32_in_transfer(FAR struct stm32_usbhost_s *priv, int chidx,
FAR uint8_t *buffer, size_t buflen)
{
FAR struct stm32_chan_s *chan;
uint16_t start;
uint16_t elapsed;
int ret = OK;
/* Loop until the transfer completes (i.e., buflen is decremented to zero)
* or a fatal error occurs (any error other than a simple NAK)
*/
chan = &priv->chan[chidx];
chan->buffer = buffer;
chan->buflen = buflen;
start = stm32_getframe();
while (chan->buflen > 0)
{
/* Set up for the wait BEFORE starting the transfer */
ret = stm32_chan_waitsetup(priv, chan);
if (ret != OK)
{
udbg("ERROR: Device disconnected\n");
return ret;
}
/* Set up for the transfer based on the direction and the endpoint type */
switch (chan->eptype)
{
default:
case OTGFS_EPTYPE_CTRL: /* Control */
{
/* This kind of transfer on control endpoints other than EP0 are not
* currently supported
*/
return -ENOSYS;
}
case OTGFS_EPTYPE_ISOC: /* Isochronous */
{
/* Set up the IN data PID */
chan->pid = OTGFS_PID_DATA0;
}
break;
case OTGFS_EPTYPE_BULK: /* Bulk */
case OTGFS_EPTYPE_INTR: /* Interrupt */
{
/* Setup the IN data PID */
chan->pid = chan->indata1 ? OTGFS_PID_DATA1 : OTGFS_PID_DATA0;
}
break;
}
/* Start the transfer */
stm32_transfer_start(priv, chidx);
/* Wait for the transfer to complete and get the result */
ret = stm32_chan_wait(priv, chan);
/* EAGAIN indicates that the device NAKed the transfer and we need
* do try again. Anything else (success or other errors) will
* cause use to return
*/
if (ret != OK)
{
udbg("Transfer failed: %d\n", ret);
/* Check for a special case: If (1) the transfer was NAKed and (2)
* no Tx FIFO empty or Rx FIFO not-empty event occurred, then we
* should be able to just flush the Rx and Tx FIFOs and try again.
* We can detect this latter case becasue the then the transfer
* buffer pointer and buffer size will be unaltered.
*/
elapsed = stm32_getframe() - start;
if (ret != -EAGAIN || /* Not a NAK condition OR */
elapsed >= STM32_DATANAK_DELAY || /* Timeout has elapsed OR */
chan->buflen != buflen) /* Data has been partially transferred */
{
/* Break out and return the error */
break;
}
}
}
return ret;
}
/*******************************************************************************
* Name: stm32_out_transfer
*
* Description:
* Transfer the 'buflen' bytes in 'buffer' through an OUT channel.
*
*******************************************************************************/
static int stm32_out_transfer(FAR struct stm32_usbhost_s *priv, int chidx,
FAR uint8_t *buffer, size_t buflen)
{
FAR struct stm32_chan_s *chan;
uint16_t start;
uint16_t elapsed;
size_t xfrlen;
int ret = OK;
/* Loop until the transfer completes (i.e., buflen is decremented to zero)
* or a fatal error occurs (any error other than a simple NAK)
*/
chan = &priv->chan[chidx];
start = stm32_getframe();
while (buflen > 0)
{
/* Transfer one packet at a time. The hardware is capable of queueing
* multiple OUT packets, but I just haven't figured out how to handle
* the case where a single OUT packet in the group is NAKed.
*/
xfrlen = MIN(chan->maxpacket, buflen);
chan->buffer = buffer;
chan->buflen = xfrlen;
/* Set up for the wait BEFORE starting the transfer */
ret = stm32_chan_waitsetup(priv, chan);
if (ret != OK)
{
udbg("ERROR: Device disconnected\n");
return ret;
}
/* Set up for the transfer based on the direction and the endpoint type */
switch (chan->eptype)
{
default:
case OTGFS_EPTYPE_CTRL: /* Control */
{
/* This kind of transfer on control endpoints other than EP0 are not
* currently supported
*/
return -ENOSYS;
}
case OTGFS_EPTYPE_ISOC: /* Isochronous */
{
/* Set up the OUT data PID */
chan->pid = OTGFS_PID_DATA0;
}
break;
case OTGFS_EPTYPE_BULK: /* Bulk */
{
/* Setup the OUT data PID */
chan->pid = chan->outdata1 ? OTGFS_PID_DATA1 : OTGFS_PID_DATA0;
}
break;
case OTGFS_EPTYPE_INTR: /* Interrupt */
{
/* Setup the OUT data PID */
chan->pid = chan->outdata1 ? OTGFS_PID_DATA1 : OTGFS_PID_DATA0;
/* Toggle the OUT data PID for the next transfer */
chan->outdata1 ^= true;
}
}
/* Start the transfer */
stm32_transfer_start(priv, chidx);
/* Wait for the transfer to complete and get the result */
ret = stm32_chan_wait(priv, chan);
/* Handle transfer failures */
if (ret != OK)
{
udbg("Transfer failed: %d\n", ret);
/* Check for a special case: If (1) the transfer was NAKed and (2)
* no Tx FIFO empty or Rx FIFO not-empty event occurred, then we
* should be able to just flush the Rx and Tx FIFOs and try again.
* We can detect this latter case becasue the then the transfer
* buffer pointer and buffer size will be unaltered.
*/
elapsed = stm32_getframe() - start;
if (ret != -EAGAIN || /* Not a NAK condition OR */
elapsed >= STM32_DATANAK_DELAY || /* Timeout has elapsed OR */
chan->buflen != xfrlen) /* Data has been partially transferred */
{
/* Break out and return the error */
break;
}
/* Is this flush really necessary? What does the hardware do with the
* data in the FIFO when the NAK occurs? Does it discard it?
*/
stm32_flush_txfifos(OTGFS_GRSTCTL_TXFNUM_HALL);
/* Get the device a little time to catch up. Then retry the transfer
* using the same buffer pointer and length.
*/
usleep(20*1000);
}
else
{
/* Successfully transferred. Update the buffer pointer and length */
buffer += xfrlen;
buflen -= xfrlen;
}
}
return ret;
}
/******************************************************************************* /*******************************************************************************
* Name: stm32_gint_wrpacket * Name: stm32_gint_wrpacket
* *
@ -2869,9 +3118,9 @@ static int stm32_enumerate(FAR struct usbhost_driver_s *drvr)
priv->chan[chidx].indata1 = false; priv->chan[chidx].indata1 = false;
priv->chan[chidx].outdata1 = false; priv->chan[chidx].outdata1 = false;
/* USB 2.0 spec says at least 50ms delay before port reset */ /* USB 2.0 spec says at least 50ms delay before port reset. We wait 100ms. */
up_mdelay(100); usleep(100*1000);
/* Reset the host port */ /* Reset the host port */
@ -3496,141 +3745,29 @@ static int stm32_ctrlout(FAR struct usbhost_driver_s *drvr,
static int stm32_transfer(FAR struct usbhost_driver_s *drvr, usbhost_ep_t ep, static int stm32_transfer(FAR struct usbhost_driver_s *drvr, usbhost_ep_t ep,
FAR uint8_t *buffer, size_t buflen) FAR uint8_t *buffer, size_t buflen)
{ {
struct stm32_usbhost_s *priv = (struct stm32_usbhost_s *)drvr; FAR struct stm32_usbhost_s *priv = (FAR struct stm32_usbhost_s *)drvr;
FAR struct stm32_chan_s *chan;
unsigned int chidx = (unsigned int)ep; unsigned int chidx = (unsigned int)ep;
int ret = OK; int ret;
uvdbg("chidx: %d buflen: %d\n", (unsigned int)ep, buflen); uvdbg("chidx: %d buflen: %d\n", (unsigned int)ep, buflen);
DEBUGASSERT(priv && buffer && chidx < STM32_MAX_TX_FIFOS && buflen > 0); DEBUGASSERT(priv && buffer && chidx < STM32_MAX_TX_FIFOS && buflen > 0);
chan = &priv->chan[chidx];
/* We must have exclusive access to the USB host hardware and state structures */ /* We must have exclusive access to the USB host hardware and state structures */
stm32_takesem(&priv->exclsem); stm32_takesem(&priv->exclsem);
/* Loop until the transfer completes (i.e., buflen is decremented to zero) /* Handle IN and OUT transfer slightly differently */
* or a fatal error occurs (any error other than a simple NAK)
*/
chan->buffer = buffer; if (priv->chan[chidx].in)
chan->buflen = buflen;
while (chan->buflen > 0)
{ {
/* Set up for the wait BEFORE starting the transfer */ ret = stm32_in_transfer(priv, chidx, buffer, buflen);
ret = stm32_chan_waitsetup(priv, chan);
if (ret != OK)
{
udbg("ERROR: Device disconnected\n");
goto errout;
}
/* Set up for the transfer based on the direction and the endpoint type */
switch (chan->eptype)
{
default:
case OTGFS_EPTYPE_CTRL: /* Control */
{
/* This kind of transfer on control endpoints other than EP0 are not
* currently supported
*/
ret = -ENOSYS;
goto errout;
}
case OTGFS_EPTYPE_ISOC: /* Isochronous */
{
/* Set up the IN/OUT data PID */
chan->pid = OTGFS_PID_DATA0;
}
break;
case OTGFS_EPTYPE_BULK: /* Bulk */
{
/* Handle the bulk transfer based on the direction of the transfer. */
if (chan->in)
{
/* Setup the IN data PID */
chan->pid = chan->indata1 ? OTGFS_PID_DATA1 : OTGFS_PID_DATA0;
} }
else else
{ {
/* Setup the OUT data PID */ ret = stm32_out_transfer(priv, chidx, buffer, buflen);
chan->pid = chan->outdata1 ? OTGFS_PID_DATA1 : OTGFS_PID_DATA0;
}
}
break;
case OTGFS_EPTYPE_INTR: /* Interrupt */
{
/* Handle the interrupt transfer based on the direction of the
* transfer.
*/
if (chan->in)
{
/* Setup the IN data PID */
chan->pid = chan->indata1 ? OTGFS_PID_DATA1 : OTGFS_PID_DATA0;
/* The indata1 data toggle will be updated in the Rx FIFO
* interrupt handling logic as each packet is received.
*/
}
else
{
/* Setup the OUT data PID */
chan->pid = chan->outdata1 ? OTGFS_PID_DATA1 : OTGFS_PID_DATA0;
/* Toggle the OUT data PID for the next transfer */
chan->outdata1 ^= true;
}
}
} }
/* There is a bug in the code at present. With debug OFF, this driver
* overruns the typical FLASH device and there are many problems with
* NAKS sticking a big delay here allows the driver to work but with
* very poor performance when debug is off.
*/
#if !defined(CONFIG_DEBUG_VERBOSE) && !defined(CONFIG_DEBUG_USB)
#warning "REVISIT this delay"
usleep(100*1000);
#endif
/* Start the transfer */
stm32_transfer_start(priv, chidx);
/* Wait for the transfer to complete and get the result */
ret = stm32_chan_wait(priv, chan);
/* EAGAIN indicates that the device NAKed the transfer and we need
* do try again. Anything else (success or other errors) will
* cause use to return
*/
if (ret != OK)
{
udbg("Transfer failed: %d\n", ret);
break;
}
}
errout:
stm32_givesem(&priv->exclsem); stm32_givesem(&priv->exclsem);
return ret; return ret;
} }

View File

@ -7,6 +7,7 @@ Table of Contents
o Summary of Files o Summary of Files
o Supported Architectures o Supported Architectures
o Configuring NuttX o Configuring NuttX
o Building Symbol Tables
Board-Specific Configurations Board-Specific Configurations
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@ -268,6 +269,7 @@ defconfig -- This is a configuration file similar to the Linux
by default) by default)
CONFIG_DEBUG_GRAPHICS - enable NX graphics debug output CONFIG_DEBUG_GRAPHICS - enable NX graphics debug output
(disabled by default) (disabled by default)
CONFIG_ARCH_LOWPUTC - architecture supports low-level, boot CONFIG_ARCH_LOWPUTC - architecture supports low-level, boot
time console output time console output
CONFIG_MM_REGIONS - If the architecture includes multiple CONFIG_MM_REGIONS - If the architecture includes multiple
@ -375,6 +377,10 @@ defconfig -- This is a configuration file similar to the Linux
CONFIG_SCHED_ONEXIT_MAX - By default if CONFIG_SCHED_ONEXIT is selected, CONFIG_SCHED_ONEXIT_MAX - By default if CONFIG_SCHED_ONEXIT is selected,
only a single on_exit() function is supported. That number can be only a single on_exit() function is supported. That number can be
increased by defined this setting to the number that you require. increased by defined this setting to the number that you require.
CONFIG_USER_ENTRYPOINT - The name of the entry point for user
applications. For the example applications this is of the form 'app_main'
where 'app' is the application name. If not defined, CONFIG_USER_ENTRYPOINT
defaults to user_start.
System Logging: System Logging:
CONFIG_SYSLOG enables general system logging support. CONFIG_SYSLOG enables general system logging support.
@ -546,10 +552,28 @@ defconfig -- This is a configuration file similar to the Linux
Misc libc settings Misc libc settings
CONFIG_NOPRINTF_FIELDWIDTH - sprintf-related logic is a CONFIG_NOPRINTF_FIELDWIDTH - sprintf-related logic is a little smaller
little smaller if we do not support fieldwidthes if we do not support fieldwidthes
CONFIG_LIBC_FLOATINGPOINT - By default, floating point CONFIG_LIBC_FLOATINGPOINT - By default, floating point support in printf,
support in printf, sscanf, etc. is disabled. sscanf, etc. is disabled.
CONFIG_LIBC_STRERROR - strerror() is useful because it decodes 'errno'
values into a human readable strings. But it can also require
a lot of memory. If this option is selected, strerror() will still
exist in the build but it will not decode error values. This option
should be used by other logic to decide if it should use strerror() or
not. For example, the NSH application will not use strerror() if this
option is not selected; perror() will not use strerror() is this option
is not selected (see also CONFIG_NSH_STRERROR).
CONFIG_LIBC_STRERROR_SHORT - If this option is selected, then strerror()
will use a shortened string when it decodes the error. Specifically,
strerror() is simply use the string that is the common name for the
error. For example, the 'errno' value of 2 will produce the string
"No such file or directory" if CONFIG_LIBC_STRERROR_SHORT is not
defined but the string "ENOENT" if CONFIG_LIBC_STRERROR_SHORT is
defined.
CONFIG_LIBC_PERROR_STDOUT - POSIX requires that perror() provide its output
on stderr. This option may be defined, however, to provide perror() output
that is serialized with other stdout messages.
Allow for architecture optimized implementations Allow for architecture optimized implementations
@ -1782,3 +1806,26 @@ command line like:
cd tools cd tools
./configure.sh -a <app-dir> <board-name>/<config-dir> ./configure.sh -a <app-dir> <board-name>/<config-dir>
Building Symbol Tables
^^^^^^^^^^^^^^^^^^^^^^
Symbol tables are needed at several of the binfmt interfaces in order to bind
a module to the base code. These symbol tables can be tricky to create and
will probably have to be tailored for any specific application, balancing
the number of symbols and the size of the symbol table against the symbols
required by the applications.
The top-level System.map file is one good source of symbol information
(which, or course, was just generated from the top-level nuttx file
using the GNU 'nm' tool).
There are also common-separated value (CSV) values in the source try that
provide information about symbols. In particular:
nuttx/syscall/syscall.csv - Describes the NuttX RTOS interface, and
nuttx/lib/lib.csv - Describes the NuttX C library interface.
There is a tool at nuttx/tools/mksymtab that will use these CSV files as
input to generate a generic symbol table. See nuttx/tools/README.txt for
more information about using the mksymtab tool.

View File

@ -42,6 +42,7 @@
#include <sys/types.h> #include <sys/types.h>
#include <stdint.h> #include <stdint.h>
#include <string.h> #include <string.h>
#include <unistd.h>
#include <errno.h> #include <errno.h>
#include <assert.h> #include <assert.h>
#include <debug.h> #include <debug.h>
@ -317,7 +318,7 @@ int usbhost_enumerate(FAR struct usbhost_driver_s *drvr, uint8_t funcaddr,
DEBUGASSERT(drvr && class); DEBUGASSERT(drvr && class);
/* Allocate TD buffers for use in this function. We will need two: /* Allocate descriptor buffers for use in this function. We will need two:
* One for the request and one for the data buffer. * One for the request and one for the data buffer.
*/ */
@ -400,7 +401,7 @@ int usbhost_enumerate(FAR struct usbhost_driver_s *drvr, uint8_t funcaddr,
udbg("ERROR: SETADDRESS DRVR_CTRLOUT returned %d\n", ret); udbg("ERROR: SETADDRESS DRVR_CTRLOUT returned %d\n", ret);
goto errout; goto errout;
} }
up_mdelay(2); usleep(2*1000);
/* Modify control pipe with the provided USB device address */ /* Modify control pipe with the provided USB device address */
@ -461,9 +462,9 @@ int usbhost_enumerate(FAR struct usbhost_driver_s *drvr, uint8_t funcaddr,
goto errout; goto errout;
} }
/* Free the TD that we were using for the request buffer. It is not needed /* Free the descriptor buffer that we were using for the request buffer.
* further here but it may be needed by the class driver during its connection * It is not needed further here but it may be needed by the class driver
* operations. * during its connection operations.
*/ */
DRVR_FREE(drvr, (uint8_t*)ctrlreq); DRVR_FREE(drvr, (uint8_t*)ctrlreq);
@ -488,9 +489,9 @@ int usbhost_enumerate(FAR struct usbhost_driver_s *drvr, uint8_t funcaddr,
} }
} }
/* Some devices may require this delay before initialization */ /* Some devices may require some delay before initialization */
up_mdelay(100); usleep(100*1000);
/* Parse the configuration descriptor and bind to the class instance for the /* Parse the configuration descriptor and bind to the class instance for the
* device. This needs to be the last thing done because the class driver * device. This needs to be the last thing done because the class driver

View File

@ -42,6 +42,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h>
#include <semaphore.h> #include <semaphore.h>
#include <assert.h> #include <assert.h>
#include <errno.h> #include <errno.h>
@ -724,6 +725,7 @@ static inline int usbhost_testunitready(FAR struct usbhost_state_s *priv)
usbhost_dumpcsw((FAR struct usbmsc_csw_s *)priv->tbuffer); usbhost_dumpcsw((FAR struct usbmsc_csw_s *)priv->tbuffer);
} }
} }
return result; return result;
} }
@ -1195,13 +1197,15 @@ static inline int usbhost_initvolume(FAR struct usbhost_state_s *priv)
uvdbg("Get max LUN\n"); uvdbg("Get max LUN\n");
ret = usbhost_maxlunreq(priv); ret = usbhost_maxlunreq(priv);
/* Wait for the unit to be ready */ for (retries = 0; retries < USBHOST_MAX_RETRIES /* && ret == OK */; retries++)
for (retries = 0; retries < USBHOST_MAX_RETRIES && ret == OK; retries++)
{ {
uvdbg("Test unit ready, retries=%d\n", retries); uvdbg("Test unit ready, retries=%d\n", retries);
/* Send TESTUNITREADY to see the unit is ready */ /* Wait just a bit */
usleep(50*1000);
/* Send TESTUNITREADY to see if the unit is ready */
ret = usbhost_testunitready(priv); ret = usbhost_testunitready(priv);
if (ret == OK) if (ret == OK)

View File

@ -91,6 +91,10 @@
#endif #endif
#ifndef assert
#define assert ASSERT
#endif
/**************************************************************************** /****************************************************************************
* Included Files * Included Files
****************************************************************************/ ****************************************************************************/

View File

@ -55,8 +55,8 @@ extern "C" {
#define EXTERN extern #define EXTERN extern
#endif #endif
EXTERN char *basename(char *path); EXTERN FAR char *basename(FAR char *path);
EXTERN char *dirname(char *path); EXTERN FAR char *dirname(FAR char *path);
#undef EXTERN #undef EXTERN
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -63,7 +63,7 @@ extern "C" {
#define EXTERN extern #define EXTERN extern
#endif #endif
EXTERN char *ether_ntoa(const struct ether_addr *addr); EXTERN FAR char *ether_ntoa(FAR const struct ether_addr *addr);
EXTERN struct ether_addr *ether_aton(const char *asc); EXTERN struct ether_addr *ether_aton(const char *asc);
EXTERN int ether_ntohost(char *hostname, const struct ether_addr *addr); EXTERN int ether_ntohost(char *hostname, const struct ether_addr *addr);
EXTERN int ether_hostton(const char *hostname, struct ether_addr *addr); EXTERN int ether_hostton(const char *hostname, struct ether_addr *addr);

View File

@ -68,7 +68,7 @@ extern "C" {
/* This entry point must be supplied by the application */ /* This entry point must be supplied by the application */
EXTERN int user_start(int argc, char *argv[]); EXTERN int CONFIG_USER_ENTRYPOINT(int argc, char *argv[]);
/* Functions contained in os_task.c *****************************************/ /* Functions contained in os_task.c *****************************************/

View File

@ -128,6 +128,7 @@ EXTERN int sprintf(FAR char *buf, const char *format, ...);
EXTERN int asprintf (FAR char **ptr, const char *fmt, ...); EXTERN int asprintf (FAR char **ptr, const char *fmt, ...);
EXTERN int snprintf(FAR char *buf, size_t size, const char *format, ...); EXTERN int snprintf(FAR char *buf, size_t size, const char *format, ...);
EXTERN int sscanf(const char *buf, const char *fmt, ...); EXTERN int sscanf(const char *buf, const char *fmt, ...);
EXTERN void perror(FAR const char *s);
EXTERN int ungetc(int c, FAR FILE *stream); EXTERN int ungetc(int c, FAR FILE *stream);
EXTERN int vprintf(FAR const char *format, va_list ap); EXTERN int vprintf(FAR const char *format, va_list ap);

View File

@ -23,7 +23,7 @@ config NUNGET_CHARS
---help--- ---help---
Number of characters that can be buffered by ungetc() (Only if NFILE_STREAMS > 0) Number of characters that can be buffered by ungetc() (Only if NFILE_STREAMS > 0)
config CONFIG_LIB_HOMEDIR config LIB_HOMEDIR
string "Home directory" string "Home directory"
default "/" default "/"
depends on !DISABLE_ENVIRON depends on !DISABLE_ENVIRON
@ -51,6 +51,46 @@ config LIBC_FLOATINGPOINT
By default, floating point By default, floating point
support in printf, sscanf, etc. is disabled. support in printf, sscanf, etc. is disabled.
config LIBC_STRERROR
bool "Enable strerror"
default n
---help---
strerror() is useful because it decodes 'errno' values into a human readable
strings. But it can also require a lot of memory. If this option is selected,
strerror() will still exist in the build but it will not decode error values.
This option should be used by other logic to decide if it should use strerror()
or not. For example, the NSH application will not use strerror() if this
option is not selected; perror() will not use strerror() is this option is not
selected (see also NSH_STRERROR).
config LIBC_STRERROR_SHORT
bool "Use short error descriptions in strerror()"
default n
depends on LIBC_STRERROR
---help---
If this option is selected, then strerror() will use a shortened string when
it decodes the error. Specifically, strerror() is simply use the string that
is the common name for the error. For example, the 'errno' value of 2 will
produce the string "No such file or directory" is LIBC_STRERROR_SHORT
is not defined but the string "ENOENT" is LIBC_STRERROR_SHORT is defined.
config LIBC_PERROR_STDOUT
bool "perror() to stdout"
default n
---help---
POSIX requires that perror() provide its output on stderr. This option may
be defined, however, to provide perror() output that is serialized with
other stdout messages.
config LIBC_PERROR_DEVNAME
string "perror() to device"
default "/dev/console"
depends on !LIBC_PERROR_STDOUT
---help---
Another non-standard option is to provide perror() output to a logging device
or file. LIBC_PERROR_DEVNAME may be defined to be any write-able,
character device (or file).
config ARCH_LOWPUTC config ARCH_LOWPUTC
bool "Low-level console output" bool "Low-level console output"
default "y" default "y"
@ -68,7 +108,7 @@ config ENABLE_ARCH_OPTIMIZED_FUN
The architecture may provide custom versions of certain The architecture may provide custom versions of certain
standard header files: standard header files:
config ARCH_MATH_H, CONFIG_ARCH_STDBOOL_H, CONFIG_ARCH_STDINT_H config ARCH_MATH_H, ARCH_STDBOOL_H, ARCH_STDINT_H
if ENABLE_ARCH_OPTIMIZED_FUN if ENABLE_ARCH_OPTIMIZED_FUN
config ARCH_MEMCPY config ARCH_MEMCPY

View File

@ -45,3 +45,40 @@ directory:
misc - Nonstandard "glue" logic, debug.h, crc32.h, dirent.h misc - Nonstandard "glue" logic, debug.h, crc32.h, dirent.h
Library Database
================
Information about functions available in the NuttX C library information is
maintained in a database. That "database" is implemented as a simple comma-
separated-value file, lib.csv. Most spreadsheets programs will accept this
format and can be used to maintain the library database.
This library database will (eventually) be used to generate symbol library
symbol table information that can be exported to external applications.
The format of the CSV file for each line is:
Field 1: Function name
Field 2: The header file that contains the function prototype
Field 3: Condition for compilation
Field 4: The type of function return value.
Field 5 - N+5: The type of each of the N formal parameters of the function
Each type field has a format as follows:
type name:
For all simpler types
formal type | actual type:
For array types where the form of the formal (eg. int parm[2])
differs from the type of actual passed parameter (eg. int*). This
is necessary because you cannot do simple casts to array types.
formal type | union member actual type | union member fieldname:
A similar situation exists for unions. For example, the formal
parameter type union sigval -- You cannot cast a uintptr_t to
a union sigval, but you can cast to the type of one of the union
member types when passing the actual paramter. Similarly, we
cannot cast a union sigval to a uinptr_t either. Rather, we need
to cast a specific union member fieldname to uintptr_t.
NOTE: The tool mksymtab can be used to generate a symbol table from this CSV
file. See nuttx/tools/README.txt for further details about the use of mksymtab.

170
nuttx/lib/lib.csv Normal file
View File

@ -0,0 +1,170 @@
"_inet_ntoa","arpa/inet.h","!defined(CONFIG_NET_IPv6) && !defined(CONFIG_CAN_PASS_STRUCTS)","FAR char","in_addr_t"
"abort","stdlib.h","","void"
"abs","stdlib.h","","int","int"
"asprintf","stdio.h","","int","FAR char **","const char *","..."
"avsprintf","stdio.h","","int","FAR char **","const char *","va_list"
"b16atan2","fixedmath.h","","b16_t","b16_t","b16_t"
"b16cos","fixedmath.h","","b16_t","b16_t"
"b16divb16","fixedmath.h","","b16_t","b16_t","b16_t"
"b16mulb16","fixedmath.h","","b16_t","b16_t","b16_t"
"b16sin","fixedmath.h","","b16_t","b16_t"
"b16sqr","fixedmath.h","","b16_t","b16_t"
"basename","libgen.h","","FAR char","FAR char *"
"cfgetspeed","termios.h","CONFIG_NFILE_DESCRIPTORS > 0 && defined(CONFIG_SERIAL_TERMIOS)","speed_t","FAR const struct termios *"
"cfsetspeed","termios.h","CONFIG_NFILE_DESCRIPTORS > 0 && defined(CONFIG_SERIAL_TERMIOS)","int","FAR struct termios *","speed_t"
"chdir","unistd.h","CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_ENVIRON)","int","FAR const char *"
"crc32","crc32.h","","uint32_t","FAR const uint8_t *","size_t"
"crc32part","crc32.h","","uint32_t","FAR const uint8_t *","size_t","uint32_t"
"dbg","debug.h","!defined(CONFIG_CPP_HAVE_VARARGS) && defined(CONFIG_DEBUG)","int","const char *","..."
"dbg_enable","debug.h","defined(CONFIG_DEBUG_ENABLE)","void","bool"
"dirname","libgen.h","","FAR char","FAR char *"
"dq_addafter","queue.h","","void","FAR dq_entry_t *","FAR dq_entry_t *","FAR dq_queue_t *"
"dq_addbefore","queue.h","","void","FAR dq_entry_t *","FAR dq_entry_t *","FAR dq_queue_t *"
"dq_addfirst","queue.h","","void","FAR dq_entry_t *","dq_queue_t *"
"dq_addlast","queue.h","","void","FAR dq_entry_t *","dq_queue_t *"
"dq_rem","queue.h","","void","FAR dq_entry_t *","dq_queue_t *"
"dq_remfirst","queue.h","","FAR dq_entry_t","dq_queue_t *"
"dq_remlast","queue.h","","FAR dq_entry_t","dq_queue_t *"
"ether_ntoa","netinet/ether.h","","FAR char","FAR const struct ether_addr *"
"fclose","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","int","FAR FILE *"
"fdopen","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","FAR FILE","int","FAR const char *"
"fflush","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","int","FAR FILE *"
"fgetc","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","int","FAR FILE *"
"fgetpos","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","int","FAR FILE *","FAR fpos_t *"
"fgets","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","FAR char","FAR char *","int","FAR FILE *"
"fileno","stdio.h","","int","FAR FILE *"
"fopen","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","FAR FILE","FAR const char *","FAR const char *"
"fprintf","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","int","FAR FILE *","FAR const char *","..."
"fputc","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","int","int c","FAR FILE *"
"fputs","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","int","FAR const char *","FAR FILE *"
"fread","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","size_t","FAR void *","size_t","size_t","FAR FILE *"
"fseek","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","int","FAR FILE *","long int","int"
"fsetpos","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","int","FAR FILE *","FAR fpos_t *"
"ftell","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","long","FAR FILE *"
"fwrite","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","size_t","FAR const void *","size_t","size_t","FAR FILE *"
"getcwd","unistd.h","CONFIG_NFILE_DESCRIPTORS > 0 && !defined(CONFIG_DISABLE_ENVIRON)","FAR char","FAR char *","size_t"
"getopt","unistd.h","","int","int","FAR char *const[]","FAR const char *"
"getoptargp","unistd.h","","FAR char *"
"getoptindp","unistd.h","","int"
"getoptoptp","unistd.h","","int"
"gets","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","FAR char","FAR char *"
"gmtime","time.h","","struct tm","const time_t *"
"gmtime_r","time.h","","FAR struct tm","FAR const time_t *","FAR struct tm *"
"htonl","arpa/inet.h","","uint32_t","uint32_t"
"htons","arpa/inet.h","","uint16_t","uint16_t"
"imaxabs","stdlib.h","","intmax_t","intmax_t"
"inet_addr","arpa/inet.h","","in_addr_t","FAR const char "
"inet_ntoa","arpa/inet.h","!defined(CONFIG_NET_IPv6) && defined(CONFIG_CAN_PASS_STRUCTS)","FAR char","struct in_addr"
"inet_ntop","arpa/inet.h","","FAR const char","int","FAR const void *","FAR char *","socklen_t"
"inet_pton","arpa/inet.h","","int","int","FAR const char *","FAR void *"
"labs","stdlib.h","","long int","long int"
"lib_dumpbuffer","debug.h","","void","FAR const char *","FAR const uint8_t *","unsigned int"
"lib_lowprintf","debug.h","","int","FAR const char *","..."
"lib_rawprintf","debug.h","","int","FAR const char *","..."
"llabs","stdlib.h","defined(CONFIG_HAVE_LONG_LONG)","long long int","long long int"
"lldbg","debug.h","!defined(CONFIG_CPP_HAVE_VARARGS) && defined(CONFIG_DEBUG) && defined(CONFIG_ARCH_LOWPUTC)","int","const char *","..."
"llvdbg","debug.h","!defined(CONFIG_CPP_HAVE_VARARGS) && defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_VERBOSE) && defined(CONFIG_ARCH_LOWPUTC)","int","const char *","..."
"match","","","int","const char *","const char *"
"memccpy","string.h","","FAR void","FAR void *","FAR const void *","int c","size_t"
"memchr","string.h","","FAR void","FAR const void *","int c","size_t"
"memcmp","string.h","","int","FAR const void *","FAR const void *","size_t"
"memcpy","string.h","","FAR void","FAR void *","FAR const void *","size_t"
"memmove","string.h","","FAR void","FAR void *","FAR const void *","size_t"
"memset","string.h","","FAR void","FAR void *","int c","size_t"
"mktime","time.h","","time_t","const struct tm *"
"mq_getattr","mqueue.h","!defined(CONFIG_DISABLE_MQUEUE)","int","mqd_t","struct mq_attr *"
"mq_setattr","mqueue.h","!defined(CONFIG_DISABLE_MQUEUE)","int","mqd_t","const struct mq_attr *","struct mq_attr *"
"ntohl","arpa/inet.h","","uint32_t","uint32_t"
"ntohs","arpa/inet.h","","uint16_t","uint16_t"
"perror","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","void","FAR const char *"
"printf","stdio.h","","int","const char *","..."
"pthread_attr_destroy","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR pthread_attr_t *"
"pthread_attr_getinheritsched","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR const pthread_attr_t *","FAR int *"
"pthread_attr_getschedparam","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR pthread_attr_t *","FAR struct sched_param *"
"pthread_attr_getschedpolicy","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR pthread_attr_t *","int *"
"pthread_attr_getstacksize","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR pthread_attr_t *","FAR long *"
"pthread_attr_init","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR pthread_attr_t *"
"pthread_attr_setinheritsched","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR pthread_attr_t *","int"
"pthread_attr_setschedparam","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR pthread_attr_t *","FAR const struct sched_param *"
"pthread_attr_setschedpolicy","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR pthread_attr_t *","int"
"pthread_attr_setstacksize","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR pthread_attr_t *","long"
"pthread_barrierattr_destroy","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR pthread_barrierattr_t *"
"pthread_barrierattr_getpshared","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR const pthread_barrierattr_t *","FAR int *"
"pthread_barrierattr_init","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR pthread_barrierattr_t *"
"pthread_barrierattr_setpshared","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR pthread_barrierattr_t *","int"
"pthread_condattr_destroy","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR pthread_condattr_t *"
"pthread_condattr_init","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR pthread_condattr_t *"
"pthread_mutexattr_destroy","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR pthread_mutexattr_t *"
"pthread_mutexattr_getpshared","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR pthread_mutexattr_t *","FAR int *"
"pthread_mutexattr_gettype","pthread.h","!defined(CONFIG_DISABLE_PTHREAD) && defined(CONFIG_MUTEX_TYPES)","int","const pthread_mutexattr_t *","int *"
"pthread_mutexattr_init","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR pthread_mutexattr_t *"
"pthread_mutexattr_setpshared","pthread.h","!defined(CONFIG_DISABLE_PTHREAD)","int","FAR pthread_mutexattr_t *","int "
"pthread_mutexattr_settype","pthread.h","!defined(CONFIG_DISABLE_PTHREAD) && defined(CONFIG_MUTEX_TYPES)","int","pthread_mutexattr_t *","int"
"puts","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","int","FAR const char *"
"qsort","stdlib.h","","void","void *","size_t","size_t","int(*)(const void *","const void *)"
"rand","stdlib.h","","int"
"readdir_r","dirent.h","CONFIG_NFILE_DESCRIPTORS > 0","int","FAR DIR *","FAR struct dirent *","FAR struct dirent **"
"rint","","","double_t","double_t"
"sched_get_priority_max","sched.h","","int","int"
"sched_get_priority_min","sched.h","","int","int"
"sem_getvalue","semaphore.h","","int","FAR sem_t *","FAR int *"
"sem_init","semaphore.h","","int","FAR sem_t *","int","unsigned int"
"sigaddset","signal.h","!defined(CONFIG_DISABLE_SIGNALS)","int","FAR sigset_t *","int"
"sigdelset","signal.h","!defined(CONFIG_DISABLE_SIGNALS)","int","FAR sigset_t *","int"
"sigemptyset","signal.h","!defined(CONFIG_DISABLE_SIGNALS)","int","FAR sigset_t *"
"sigfillset","signal.h","!defined(CONFIG_DISABLE_SIGNALS)","int","FAR sigset_t *"
"sigismember","signal.h","!defined(CONFIG_DISABLE_SIGNALS)","int","FAR const sigset_t *","int"
"snprintf","stdio.h","","int","FAR char *","size_t","const char *","..."
"sprintf","stdio.h","","int","FAR char *","const char *","..."
"sq_addafter","queue.h","","void","FAR sq_entry_t *","FAR sq_entry_t *","FAR sq_queue_t *"
"sq_addfirst","queue.h","","void","FAR sq_entry_t *","sq_queue_t *"
"sq_addlast","queue.h","","void","FAR sq_entry_t *","sq_queue_t *"
"sq_rem","queue.h","","void","FAR sq_entry_t *","sq_queue_t *"
"sq_remafter","queue.h","","FAR sq_entry_t","FAR sq_entry_t *","sq_queue_t *"
"sq_remfirst","queue.h","","FAR sq_entry_t","sq_queue_t *"
"sq_remlast","queue.h","","FAR sq_entry_t","sq_queue_t *"
"srand","stdlib.h","","void","unsigned int"
"sscanf","stdio.h","","int","const char *","const char *","..."
"strcasecmp","string.h","","int","FAR const char *","FAR const char *"
"strcasestr","string.h","","FAR char","FAR const char *","FAR const char *"
"strcat","string.h","","FAR char","FAR char *","FAR const char *"
"strchr","string.h","","FAR char","FAR const char *","int"
"strcmp","string.h","","int","FAR const char *","FAR const char *"
"strcpy","string.h","","FAR char","char *","FAR const char *"
"strcspn","string.h","","size_t","FAR const char *","FAR const char *"
"strdup","string.h","","FAR char","FAR const char *"
"strerror","string.h","","FAR const char","int"
"strftime","time.h","","size_t","char *","size_t","const char *","const struct tm *"
"strlen","string.h","","size_t","FAR const char *"
"strncasecmp","string.h","","int","FAR const char *","FAR const char *","size_t"
"strncat","string.h","","FAR char","FAR char *","FAR const char *","size_t"
"strncmp","string.h","","int","FAR const char *","FAR const char *","size_t"
"strncpy","string.h","","FAR char","char *","FAR const char *","size_t"
"strndup","string.h","","FAR char","FAR const char *","size_t"
"strnlen","string.h","","size_t","FAR const char *","size_t"
"strpbrk","string.h","","FAR char","FAR const char *","FAR const char *"
"strrchr","string.h","","FAR char","FAR const char *","int"
"strspn","string.h","","size_t","FAR const char *","FAR const char *"
"strstr","string.h","","FAR char","FAR const char *","FAR const char *"
"strtod","stdlib.h","","double_t","const char *str","char **endptr"
"strtok","string.h","","FAR char","FAR char *","FAR const char *"
"strtok_r","string.h","","FAR char","FAR char *","FAR const char *","FAR char **"
"strtol","string.h","","long","const char *","char **","int"
"strtoll","stdlib.h","defined(CONFIG_HAVE_LONG_LONG)","long long","const char *nptr","char **endptr","int base"
"strtoul","stdlib.h","","unsigned long","const char *","char **","int"
"strtoull","stdlib.h","defined(CONFIG_HAVE_LONG_LONG)","unsigned long long","const char *","char **","int"
"tcflush","termios.h","CONFIG_NFILE_DESCRIPTORS > 0 && defined(CONFIG_SERIAL_TERMIOS)","int","int","int"
"tcgetattr","termios.h","CONFIG_NFILE_DESCRIPTORS > 0 && defined(CONFIG_SERIAL_TERMIOS)","int","int","FAR struct termios *"
"tcsetattr","termios.h","CONFIG_NFILE_DESCRIPTORS > 0 && defined(CONFIG_SERIAL_TERMIOS)","int","int","int","FAR const struct termios *"
"telldir","dirent.h","CONFIG_NFILE_DESCRIPTORS > 0","off_t","FAR DIR *"
"time","time.h","","time_t","time_t *"
"ub16divub16","fixedmath.h","","ub16_t","ub16_t","ub16_t"
"ub16mulub16","fixedmath.h","","ub16_t","ub16_t","ub16_t"
"ub16sqr","fixedmath.h","","ub16_t","ub16_t"
"ungetc","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","int","int","FAR FILE *"
"vdbg","debug.h","!defined(CONFIG_CPP_HAVE_VARARGS) && defined(CONFIG_DEBUG) && defined(CONFIG_DEBUG_VERBOSE)","int","const char *","..."
"vfprintf","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","int","FAR FILE *","const char *","va_list"
"vprintf","stdio.h","CONFIG_NFILE_DESCRIPTORS > 0 && CONFIG_NFILE_STREAMS > 0","int","FAR const char *","va_list"
"vsnprintf","stdio.h","","int","FAR char *","size_t","const char *","va_list"
"vsprintf","stdio.h","","int","FAR char *","const char *","va_list"
"vsscanf","stdio.h","","int","char *","const char *","va_list"
Can't render this file because it has a wrong number of fields in line 2.

View File

@ -1,8 +1,8 @@
/**************************************************************************** /****************************************************************************
* lib/libgen/lib_basename.c * lib/libgen/lib_basename.c
* *
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2007, 2009, 2011-2012 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
@ -78,7 +78,7 @@ static char g_retchar[2];
* *
****************************************************************************/ ****************************************************************************/
char *basename(char *path) FAR char *basename(FAR char *path)
{ {
char *p; char *p;
int len; int len;

View File

@ -1,8 +1,8 @@
/**************************************************************************** /****************************************************************************
* lib/libgen/lib_dirname.c * lib/libgen/lib_dirname.c
* *
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2007, 2009, 2011-2012 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
@ -78,7 +78,7 @@ static char g_retchar[2];
* *
****************************************************************************/ ****************************************************************************/
char *dirname(char *path) FAR char *dirname(FAR char *path)
{ {
char *p; char *p;
int len; int len;

View File

@ -2,7 +2,7 @@
* lib/math/lib_b16atan2.c * lib/math/lib_b16atan2.c
* *
* Copyright (C) 2011 Gregory Nutt. All rights reserved. * Copyright (C) 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/math/lib_b16cos.c * lib/math/lib_b16cos.c
* *
* Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2007, 2008, 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/math/lib_b16sin.c * lib/math/lib_b16sin.c
* *
* Copyright (C) 2008, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2008, 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/math/lib_fixedmath.c * lib/math/lib_fixedmath.c
* *
* Copyright (C) 2008-2009, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2008-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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
@ -165,7 +165,7 @@ ub16_t ub16mulub16(ub16_t m1, ub16_t m2)
} }
/**************************************************************************** /****************************************************************************
* Name: b16divb16 * Name: b16sqr
**************************************************************************/ **************************************************************************/
b16_t b16sqr(b16_t a) b16_t b16sqr(b16_t a)

View File

@ -2,7 +2,7 @@
* lib/math/lib_rint.c * lib/math/lib_rint.c
* *
* Copyright (C) 2007, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2007, 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/net/lib_etherntoa.c * lib/net/lib_etherntoa.c
* *
* Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2007, 2008, 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
@ -58,7 +58,7 @@
* *
****************************************************************************/ ****************************************************************************/
char *ether_ntoa(const struct ether_addr *addr) FAR char *ether_ntoa(FAR const struct ether_addr *addr)
{ {
static char buffer[20]; static char buffer[20];
sprintf(buffer, "%02x:%02x:%02x:%02x:%02x:%02x", sprintf(buffer, "%02x:%02x:%02x:%02x:%02x:%02x",

View File

@ -2,7 +2,7 @@
* lib/net/lib_ntohl.c * lib/net/lib_ntohl.c
* *
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/net/lib_htons.c * lib/net/lib_htons.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_attrdestroy.c * lib/pthread/pthread_attrdestroy.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_attrgetinheritsched.c * lib/pthread/pthread_attrgetinheritsched.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_attrgetschedparam.c * lib/pthread/pthread_attrgetschedparam.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_attrgetschedpolicy.c * lib/pthread/pthread_attrgetschedpolicy.c
* *
* Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2007, 2008, 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_attrgetstacksize.c * lib/pthread/pthread_attrgetstacksize.c
* *
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_attrinit.c * lib/pthread/pthread_attrinit.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_attrsetinheritsched.c * lib/pthread/pthread_attrsetinheritsched.c
* *
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_attrsetschedparam.c * lib/pthread/pthread_attrsetschedparam.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_attrsetschedpolicy.c * lib/pthread/pthread_attrsetschedpolicy.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_attrsetstacksize.c * lib/pthread/pthread_attrsetstacksize.c
* *
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_barrierattrdestroy.c * lib/pthread/pthread_barrierattrdestroy.c
* *
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_barrierattrgetpshared.c * lib/pthread/pthread_barrierattrgetpshared.c
* *
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_barrierattrinit.c * lib/pthread/pthread_barrierattrinit.c
* *
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_barrierattrsetpshared.c * lib/pthread/pthread_barrierattrsetpshared.c
* *
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_condattrdestroy.c * lib/pthread/pthread_condattrdestroy.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_condattrinit.c * lib/pthread/pthread_condattrinit.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_mutexattrdestroy.c * lib/pthread/pthread_mutexattrdestroy.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_mutexattrgetpshared.c * lib/pthread/pthread_mutexattrgetpshared.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_mutexattrgettype.c * lib/pthread/pthread_mutexattrgettype.c
* *
* Copyright (C) 2008, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2008, 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_mutexattrinit.c * lib/pthread/pthread_mutexattrinit.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_mutexattrsetpshared.c * lib/pthread/pthread_mutexattrsetpshared.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/pthread/pthread_mutexattrsettype.c * lib/pthread/pthread_mutexattrsettype.c
* *
* Copyright (C) 2008, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2008, 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/sched/sched_getprioritymax.c * lib/sched/sched_getprioritymax.c
* *
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/sched/sched_getprioritymin.c * lib/sched/sched_getprioritymin.c
* *
* Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/semaphore/sem_getvalue.c * lib/semaphore/sem_getvalue.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/signal/sig_addset.c * lib/signal/sig_addset.c
* *
* Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2007, 2008, 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/signal/sig_delset.c * lib/signal/sig_delset.c
* *
* Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2007, 2008, 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/signal/sig_emptyset.c * lib/signal/sig_emptyset.c
* *
* Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2007, 2008, 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/signal/sig_fillset.c * lib/signal/sig_fillset.c
* *
* Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2007, 2008, 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/signal/sig_ismember.c * lib/signal/sig_ismember.c
* *
* Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2007, 2008, 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -50,7 +50,8 @@ CSRCS += lib_fopen.c lib_fclose.c lib_fread.c lib_libfread.c lib_fseek.c \
lib_gets.c lib_fwrite.c lib_libfwrite.c lib_fflush.c \ lib_gets.c lib_fwrite.c lib_libfwrite.c lib_fflush.c \
lib_libflushall.c lib_libfflush.c lib_rdflush.c lib_wrflush.c \ lib_libflushall.c lib_libfflush.c lib_rdflush.c lib_wrflush.c \
lib_fputc.c lib_puts.c lib_fputs.c lib_ungetc.c lib_vprintf.c \ lib_fputc.c lib_puts.c lib_fputs.c lib_ungetc.c lib_vprintf.c \
lib_fprintf.c lib_vfprintf.c lib_stdinstream.c lib_stdoutstream.c lib_fprintf.c lib_vfprintf.c lib_stdinstream.c lib_stdoutstream.c \
lib_perror.c
endif endif
endif endif

View File

@ -2,7 +2,7 @@
* lib/stdio/lib_fflush.c * lib/stdio/lib_fflush.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
@ -97,22 +97,36 @@
int fflush(FAR FILE *stream) int fflush(FAR FILE *stream)
{ {
int ret;
/* Is the stream argument NULL? */ /* Is the stream argument NULL? */
if (!stream) if (!stream)
{ {
/* Yes... then this is a request to flush all streams */ /* Yes... then this is a request to flush all streams */
return lib_flushall(sched_getstreams()); ret = lib_flushall(sched_getstreams());
} }
else if (lib_fflush(stream, true) != 0) else
{ {
/* An error occurred during the flush AND/OR we were unable to flush all ret = lib_fflush(stream, true);
* of the buffered write data. Return EOF on failure. }
/* Check the return value */
if (ret < 0)
{
/* An error occurred during the flush AND/OR we were unable to flush
* all of the buffered write data. Set the errno value.
*/ */
set_errno(-ret);
/* And return EOF on failure. */
return EOF; return EOF;
} }
return OK; return OK;
} }

View File

@ -2,7 +2,7 @@
* lib/stdio/lib_fgetc.c * lib/stdio/lib_fgetc.c
* *
* Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2007, 2008, 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/stdio/lib_fgetpos.c * lib/stdio/lib_fgetpos.c
* *
* Copyright (C) 2008-2009, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2008-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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/stdio/lib_fileno.c * lib/stdio/lib_fileno.c
* *
* Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
@ -63,6 +63,7 @@ int fileno(FAR FILE *stream)
set_errno(EBADF); set_errno(EBADF);
return ERROR; return ERROR;
} }
return ret; return ret;
} }
#endif /* CONFIG_NFILE_STREAMS */ #endif /* CONFIG_NFILE_STREAMS */

View File

@ -2,7 +2,7 @@
* lib/stdio/lib_fread.c * lib/stdio/lib_fread.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/stdio/lib_fseek.c * lib/stdio/lib_fseek.c
* *
* Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2007, 2008, 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/stdio/lib_fsetpos.c * lib/stdio/lib_fsetpos.c
* *
* Copyright (C) 2008, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2008, 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/stdio/lib_ftell.c * lib/stdio/lib_ftell.c
* *
* Copyright (C) 2008, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2008, 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/stdio/lib_fwrite.c * lib/stdio/lib_fwrite.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -98,8 +98,8 @@
* bforce - flush must be complete. * bforce - flush must be complete.
* *
* Return: * Return:
* ERROR on failure, otherwise the number of bytes remaining in the buffer. * A negated errno value on failure, otherwise the number of bytes remaining
* If bforce is set, then only the values ERROR and 0 will be returned. * in the buffer.
* *
****************************************************************************/ ****************************************************************************/
@ -114,8 +114,7 @@ ssize_t lib_fflush(FAR FILE *stream, bool bforce)
if (stream->fs_filedes < 0 || (stream->fs_oflags & O_WROK) == 0) if (stream->fs_filedes < 0 || (stream->fs_oflags & O_WROK) == 0)
{ {
set_errno(EBADF); return -EBADF;
return ERROR;
} }
/* Make sure that we have exclusive access to the stream */ /* Make sure that we have exclusive access to the stream */
@ -132,8 +131,11 @@ ssize_t lib_fflush(FAR FILE *stream, bool bforce)
if (stream->fs_bufread != stream->fs_bufstart) if (stream->fs_bufread != stream->fs_bufstart)
{ {
/* The buffer holds read data... just return zero */ /* The buffer holds read data... just return zero meaning "no bytes
* remaining in the buffer."
*/
lib_give_semaphore(stream);
return 0; return 0;
} }
@ -151,8 +153,12 @@ ssize_t lib_fflush(FAR FILE *stream, bool bforce)
bytes_written = write(stream->fs_filedes, src, nbuffer); bytes_written = write(stream->fs_filedes, src, nbuffer);
if (bytes_written < 0) if (bytes_written < 0)
{ {
/* Write failed. The cause of the failure is in 'errno'.
* returned the negated errno value.
*/
lib_give_semaphore(stream); lib_give_semaphore(stream);
return ERROR; return -get_errno();
} }
/* Handle partial writes. fflush() must either return with /* Handle partial writes. fflush() must either return with

View File

@ -1,8 +1,8 @@
/**************************************************************************** /****************************************************************************
* lib/stdio/lib_libflushall.c * lib/stdio/lib_libflushall.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2007-2009, 2011-2012 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
@ -91,7 +91,7 @@
int lib_flushall(FAR struct streamlist *list) int lib_flushall(FAR struct streamlist *list)
{ {
int lasterrno = OK; int lasterrno = OK;
int ret = OK; int ret;
/* Make sure that there are streams associated with this thread */ /* Make sure that there are streams associated with this thread */
@ -115,25 +115,23 @@ int lib_flushall(FAR struct streamlist *list)
{ {
/* Flush the writable FILE */ /* Flush the writable FILE */
if (lib_fflush(stream, true) != 0) ret = lib_fflush(stream, true);
if (ret < 0)
{ {
/* An error occurred during the flush AND/OR we were unable /* An error occurred during the flush AND/OR we were unable
* to flush all of the buffered write data. Return EOF on failure. * to flush all of the buffered write data. Remember the
* last errcode.
*/ */
lasterrno = get_errno(); lasterrno = ret;
ret = ERROR;
} }
} }
} }
stream_semgive(list); stream_semgive(list);
} }
/* If any flush failed, return that last failed flush */ /* If any flush failed, return the errorcode of the last failed flush */
if (ret != OK) return lasterrno;
{
set_errno(lasterrno);
}
return ret;
} }

View File

@ -1,8 +1,8 @@
/**************************************************************************** /****************************************************************************
* lib/stdio/lib_libfread.c * lib/stdio/lib_libfread.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2007-2009, 2011-2012 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions
@ -88,6 +88,7 @@ ssize_t lib_fread(FAR void *ptr, size_t count, FAR FILE *stream)
{ {
unsigned char *dest = (unsigned char*)ptr; unsigned char *dest = (unsigned char*)ptr;
ssize_t bytes_read; ssize_t bytes_read;
int ret;
/* Make sure that reading from this stream is allowed */ /* Make sure that reading from this stream is allowed */
@ -127,9 +128,11 @@ ssize_t lib_fread(FAR void *ptr, size_t count, FAR FILE *stream)
* buffered read/write access. * buffered read/write access.
*/ */
if (lib_wrflush(stream) != 0) ret = lib_wrflush(stream);
if (ret < 0)
{ {
return ERROR; lib_give_semaphore(stream);
return ret;
} }
/* Now get any other needed chars from the buffer or the file. */ /* Now get any other needed chars from the buffer or the file. */
@ -176,15 +179,17 @@ ssize_t lib_fread(FAR void *ptr, size_t count, FAR FILE *stream)
bytes_read = read(stream->fs_filedes, dest, count); bytes_read = read(stream->fs_filedes, dest, count);
if (bytes_read < 0) if (bytes_read < 0)
{ {
/* An error occurred on the read */ /* An error occurred on the read. The error code is
* in the 'errno' variable.
*/
goto err_out; goto errout_with_errno;
} }
else if (bytes_read == 0) else if (bytes_read == 0)
{ {
/* We are at the end of the file */ /* We are at the end of the file */
goto short_read; goto shortread;
} }
else else
{ {
@ -198,7 +203,7 @@ ssize_t lib_fread(FAR void *ptr, size_t count, FAR FILE *stream)
{ {
/* No. We must be at the end of file. */ /* No. We must be at the end of file. */
goto short_read; goto shortread;
} }
else else
{ {
@ -219,15 +224,17 @@ ssize_t lib_fread(FAR void *ptr, size_t count, FAR FILE *stream)
bytes_read = read(stream->fs_filedes, stream->fs_bufread, buffer_available); bytes_read = read(stream->fs_filedes, stream->fs_bufread, buffer_available);
if (bytes_read < 0) if (bytes_read < 0)
{ {
/* An error occurred on the read */ /* An error occurred on the read. The error code is
* in the 'errno' variable.
*/
goto err_out; goto errout_with_errno;
} }
else if (bytes_read == 0) else if (bytes_read == 0)
{ {
/* We are at the end of the file */ /* We are at the end of the file */
goto short_read; goto shortread;
} }
else else
{ {
@ -246,7 +253,11 @@ ssize_t lib_fread(FAR void *ptr, size_t count, FAR FILE *stream)
bytes_read = read(stream->fs_filedes, dest, count); bytes_read = read(stream->fs_filedes, dest, count);
if (bytes_read < 0) if (bytes_read < 0)
{ {
goto err_out; /* An error occurred on the read. The error code is
* in the 'errno' variable.
*/
goto errout_with_errno;
} }
else if (bytes_read == 0) else if (bytes_read == 0)
{ {
@ -259,13 +270,21 @@ ssize_t lib_fread(FAR void *ptr, size_t count, FAR FILE *stream)
} }
} }
#endif #endif
/* Here after a successful (but perhaps short) read */
#if CONFIG_STDIO_BUFFER_SIZE > 0 #if CONFIG_STDIO_BUFFER_SIZE > 0
short_read: shortread:
#endif #endif
bytes_read = dest - (unsigned char*)ptr; bytes_read = dest - (unsigned char*)ptr;
err_out:
lib_give_semaphore(stream);
} }
lib_give_semaphore(stream);
return bytes_read; return bytes_read;
/* Error exits */
errout_with_errno:
lib_give_semaphore(stream);
return -get_errno();
} }

View File

@ -2,7 +2,7 @@
* lib/stdio/lib_libsprintf.c * lib/stdio/lib_libsprintf.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -0,0 +1,99 @@
/****************************************************************************
* lib/stdio/lib_perror.c
*
* Copyright (C) 2012 Gregory Nutt. All rights reserved.
* 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
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
* 3. Neither the name NuttX nor the names of its contributors may be
* used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
****************************************************************************/
/****************************************************************************
* Included Files
****************************************************************************/
#include <nuttx/config.h>
#include <stdio.h>
#include <errno.h>
/****************************************************************************
* Pre-processor Definitions
****************************************************************************/
/* POSIX requires that perror provide its output on stderr. This option may
* be defined, however, to provide perror output that is serialized with
* other stdout messages.
*/
#ifdef CONFIG_LIBC_PERROR_STDOUT
# define PERROR_STREAM stdout
#else
# define PERROR_STREAM stderr
#endif
/****************************************************************************
* Private Type Declarations
****************************************************************************/
/****************************************************************************
* Private Function Prototypes
****************************************************************************/
/****************************************************************************
* Public Data
****************************************************************************/
/****************************************************************************
* Private Data
****************************************************************************/
/****************************************************************************
* Private Functions
****************************************************************************/
/****************************************************************************
* Public Functions
****************************************************************************/
/****************************************************************************
* Name: perror
****************************************************************************/
void perror(FAR const char *s)
{
/* If strerror() is not enabled, then just print the error number */
#ifdef CONFIG_LIBC_STRERROR
(void)fprintf(PERROR_STREAM, "%s: %s\n", s, strerror(errno));
#else
(void)fprintf(PERROR_STREAM, "%s: Error %d\n", s, errno);
#endif
}

View File

@ -2,7 +2,7 @@
* lib/stdio/lib_rdflush.c * lib/stdio/lib_rdflush.c
* *
* Copyright (C) 2008, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2008, 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/stdio/lib_snprintf.c * lib/stdio/lib_snprintf.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/stdio/lib_sprintf.c * lib/stdio/lib_sprintf.c
* *
* Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. * 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/stdio/lib_sscanf.c * lib/stdio/lib_sscanf.c
* *
* Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. * Copyright (C) 2007, 2008, 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

View File

@ -2,7 +2,7 @@
* lib/stdio/lib_syslogstream.c * lib/stdio/lib_syslogstream.c
* *
* Copyright (C) 2012 Gregory Nutt. All rights reserved. * Copyright (C) 2012 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 * Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions * modification, are permitted provided that the following conditions

Some files were not shown because too many files have changed in this diff Show More