diff --git a/apps/ChangeLog.txt b/apps/ChangeLog.txt index 361fb97dc8..5b75f40ed6 100755 --- a/apps/ChangeLog.txt +++ b/apps/ChangeLog.txt @@ -289,5 +289,19 @@ threds to no more than 3 of each priority. Bad things happen when the existing logic tried to created several hundred test 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). diff --git a/apps/README.txt b/apps/README.txt index 4266585726..f9c9ececd7 100644 --- a/apps/README.txt +++ b/apps/README.txt @@ -118,7 +118,7 @@ the NuttX configuration file: CONFIG_BUILTIN_APP_START= 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 must be provided as: "hello", will call: diff --git a/apps/examples/README.txt b/apps/examples/README.txt index 7d068f9794..52d7279dac 100644 --- a/apps/examples/README.txt +++ b/apps/examples/README.txt @@ -1345,10 +1345,14 @@ examples/uip file in the configuration driver with instruction to build applications like: - CONFIGURED_APPS += uiplib - CONFIGURED_APPS += dhcpc - CONFIGURED_APPS += resolv - CONFIGURED_APPS += webserver + CONFIGURED_APPS += uiplib + CONFIGURED_APPS += dhcpc + CONFIGURED_APPS += resolv + 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 ^^^^^^^^^^^^^^^^^^ diff --git a/apps/examples/adc/adc_main.c b/apps/examples/adc/adc_main.c index b880326549..4797265db0 100644 --- a/apps/examples/adc/adc_main.c +++ b/apps/examples/adc/adc_main.c @@ -57,14 +57,6 @@ * 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 ****************************************************************************/ @@ -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]; size_t readsize; @@ -244,11 +236,11 @@ int MAIN_NAME(int argc, char *argv[]) * this test. */ - message(MAIN_STRING "Initializing external ADC device\n"); + message("adc_main: Initializing external ADC device\n"); ret = adc_devinit(); if (ret != OK) { - message(MAIN_STRING "adc_devinit failed: %d\n", ret); + message("adc_main: adc_devinit failed: %d\n", ret); errval = 1; goto errout; } @@ -276,18 +268,18 @@ int MAIN_NAME(int argc, char *argv[]) */ #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 /* 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); fd = open(g_adcstate.devpath, O_RDONLY); 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; goto errout_with_dev; } @@ -322,17 +314,17 @@ int MAIN_NAME(int argc, char *argv[]) errval = errno; if (errval != EINTR) { - message(MAIN_STRING "read %s failed: %d\n", + message("adc_main: read %s failed: %d\n", g_adcstate.devpath, errval); errval = 3; goto errout_with_dev; } - message(MAIN_STRING "Interrupted read...\n"); + message("adc_main: Interrupted read...\n"); } 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 */ @@ -342,7 +334,7 @@ int MAIN_NAME(int argc, char *argv[]) int nsamples = nbytes / sizeof(struct adc_msg_s); 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)); } else diff --git a/apps/examples/buttons/main.c b/apps/examples/buttons/main.c index fe447ca6b6..50124512cd 100644 --- a/apps/examples/buttons/main.c +++ b/apps/examples/buttons/main.c @@ -130,16 +130,6 @@ #define NUM_BUTTONS (MAX_BUTTON - MIN_BUTTON + 1) #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 ****************************************************************************/ @@ -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; irqstate_t flags; diff --git a/apps/examples/can/can_main.c b/apps/examples/can/can_main.c index 0ea729e5e8..d3ca241192 100644 --- a/apps/examples/can/can_main.c +++ b/apps/examples/can/can_main.c @@ -76,14 +76,6 @@ # define MAX_ID (1 << 11) #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 ****************************************************************************/ @@ -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 struct can_msg_s txmsg; @@ -150,31 +142,31 @@ int MAIN_NAME(int argc, char *argv[]) { 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) - message(MAIN_STRING "nmsgs: %d\n", CONFIG_EXAMPLES_CAN_NMSGS); + message("can_main: nmsgs: %d\n", CONFIG_EXAMPLES_CAN_NMSGS); #endif /* Initialization of the CAN hardware is performed by logic external to * this test. */ - message(MAIN_STRING "Initializing external CAN device\n"); + message("can_main: Initializing external CAN device\n"); ret = can_devinit(); if (ret != OK) { - message(MAIN_STRING "can_devinit failed: %d\n", ret); + message("can_main: can_devinit failed: %d\n", ret); errval = 1; goto errout; } /* 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); if (fd < 0) { - message(MAIN_STRING "open %s failed: %d\n", + message("can_main: open %s failed: %d\n", CONFIG_EXAMPLES_CAN_DEVPATH, errno); errval = 2; goto errout_with_dev; diff --git a/apps/examples/hello/main.c b/apps/examples/hello/main.c index 7934dc34ba..7e07cffd13 100644 --- a/apps/examples/hello/main.c +++ b/apps/examples/hello/main.c @@ -53,16 +53,10 @@ ****************************************************************************/ /**************************************************************************** - * user_start/hello_main + * hello_main ****************************************************************************/ -#ifdef CONFIG_EXAMPLES_HELLO_BUILTIN -# define MAIN_NAME hello_main -#else -# define MAIN_NAME user_start -#endif - -int MAIN_NAME(int argc, char *argv[]) +int hello_main(int argc, char *argv[]) { printf("Hello, World!!\n"); return 0; diff --git a/apps/examples/helloxx/main.cxx b/apps/examples/helloxx/main.cxx index 8514fead22..fcec7c761a 100644 --- a/apps/examples/helloxx/main.cxx +++ b/apps/examples/helloxx/main.cxx @@ -124,24 +124,11 @@ static CHelloWorld g_HelloWorld; // Public Functions //*************************************************************************** -//*************************************************************************** -// user_start -//*************************************************************************** - /**************************************************************************** - * Name: user_start/nxhello_main + * Name: helloxx_main ****************************************************************************/ -#ifdef CONFIG_EXAMPLES_HELLOXX_BUILTIN -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[]) +int helloxx_main(int argc, char *argv[]) { // If C++ initialization for static constructors is supported, then do // that first @@ -153,7 +140,7 @@ int MAIN_NAME(int argc, char *argv[]) // Exercise an explictly instantiated C++ object 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(); // Exercise an C++ object instantiated on the stack @@ -161,14 +148,14 @@ int MAIN_NAME(int argc, char *argv[]) #ifndef CONFIG_EXAMPLES_HELLOXX_NOSTACKCONST 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(); #endif // Exercise an statically constructed C++ object #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(); #endif diff --git a/apps/examples/lcdrw/lcdrw_main.c b/apps/examples/lcdrw/lcdrw_main.c index c366743f47..f39e1849da 100644 --- a/apps/examples/lcdrw/lcdrw_main.c +++ b/apps/examples/lcdrw/lcdrw_main.c @@ -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 -# define MAIN_NAME lcdrw_main -#else -# define MAIN_NAME user_start -#endif - -int MAIN_NAME(int argc, char *argv[]) +int lcdrw_main(int argc, char *argv[]) { struct lcdrw_instance_s inst; nxgl_coord_t row; diff --git a/apps/examples/mm/mm_main.c b/apps/examples/mm/mm_main.c index 036c390474..5d45efdc59 100644 --- a/apps/examples/mm/mm_main.c +++ b/apps/examples/mm/mm_main.c @@ -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(); diff --git a/apps/examples/mount/mount_main.c b/apps/examples/mount/mount_main.c index 00070b94c0..5f881e40ca 100644 --- a/apps/examples/mount/mount_main.c +++ b/apps/examples/mount/mount_main.c @@ -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; @@ -580,18 +580,18 @@ int user_start(int argc, char *argv[]) ret = create_ramdisk(); 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; } #endif /* 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); 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) { @@ -737,16 +737,16 @@ int user_start(int argc, char *argv[]) /* 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); 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++; } - printf("user_start: %d errors reported\n", g_nerrors); + printf("mount_main: %d errors reported\n", g_nerrors); } fflush(stdout); diff --git a/apps/examples/nsh/nsh_main.c b/apps/examples/nsh/nsh_main.c index c5b671ab14..97792cb2a3 100644 --- a/apps/examples/nsh/nsh_main.c +++ b/apps/examples/nsh/nsh_main.c @@ -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 ret; diff --git a/apps/examples/null/null_main.c b/apps/examples/null/null_main.c index 10fc1bf1e4..63a14fcaca 100644 --- a/apps/examples/null/null_main.c +++ b/apps/examples/null/null_main.c @@ -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; } diff --git a/apps/examples/ostest/main.c b/apps/examples/ostest/main.c index 7d63c0ff48..61a2af19a6 100644 --- a/apps/examples/ostest/main.c +++ b/apps/examples/ostest/main.c @@ -409,7 +409,7 @@ static int user_main(int argc, char *argv[]) check_test_memory_usage(); #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 * be similar enough that we can detect any serious OS memory * leaks. @@ -458,18 +458,10 @@ static void stdio_test(void) ****************************************************************************/ /**************************************************************************** - * user_start/ostest_main + * ostest_main ****************************************************************************/ -#ifdef CONFIG_EXAMPLES_OSTEST_BUILTIN -# 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 ostest_main(int argc, char *argv[]) { int result; @@ -492,19 +484,19 @@ int MAIN_NAME(int argc, char *argv[]) /* Set up some environment variables */ #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 */ - 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 */ - 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 */ - 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 */ - 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 */ - 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 */ show_environment(true, true, true); #endif @@ -518,13 +510,13 @@ int MAIN_NAME(int argc, char *argv[]) #endif if (result == ERROR) { - printf(MAIN_STRING "ERROR Failed to start user_main\n"); + printf("ostest_main: ERROR Failed to start user_main\n"); } 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; } diff --git a/apps/examples/pipe/pipe_main.c b/apps/examples/pipe/pipe_main.c index 1f0f73032a..406832a98a 100644 --- a/apps/examples/pipe/pipe_main.c +++ b/apps/examples/pipe/pipe_main.c @@ -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 ret; /* Test FIFO logic */ - printf("\nuser_start: Performing FIFO test\n"); + printf("\npipe_main: Performing FIFO test\n"); ret = mkfifo(FIFO_PATH1, 0666); 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; } @@ -96,7 +96,7 @@ int user_start(int argc, char *argv[]) filedes[1] = open(FIFO_PATH1, O_WRONLY); 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); return 2; } @@ -104,11 +104,11 @@ int user_start(int argc, char *argv[]) filedes[0] = open(FIFO_PATH1, O_RDONLY); 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); 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; } @@ -118,28 +118,28 @@ int user_start(int argc, char *argv[]) ret = transfer_test(filedes[0], filedes[1]); 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) { - fprintf(stderr, "user_start: close failed: %d\n", errno); + fprintf(stderr, "pipe_main: close failed: %d\n", errno); } /* unlink(FIFO_PATH1); fails */ 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; } - printf("user_start: FIFO test PASSED\n"); + printf("pipe_main: FIFO test PASSED\n"); /* Test PIPE logic */ - printf("\nuser_start: Performing pipe test\n"); + printf("\npipe_main: Performing pipe test\n"); ret = pipe(filedes); 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; } @@ -148,41 +148,41 @@ int user_start(int argc, char *argv[]) ret = transfer_test(filedes[0], filedes[1]); 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) { - fprintf(stderr, "user_start: close failed: %d\n", errno); + fprintf(stderr, "pipe_main: close failed: %d\n", errno); } 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; } - printf("user_start: PIPE test PASSED\n"); + printf("pipe_main: PIPE test PASSED\n"); /* Perform the FIFO interlock test */ - printf("\nuser_start: Performing pipe interlock test\n"); + printf("\npipe_main: Performing pipe interlock test\n"); ret = interlock_test(); 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; } - printf("user_start: PIPE interlock test PASSED\n"); + printf("pipe_main: PIPE interlock test PASSED\n"); /* Perform the pipe redirection test */ - printf("\nuser_start: Performing redirection test\n"); + printf("\npipe_main: Performing redirection test\n"); ret = redirection_test(); 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; } - printf("user_start: PIPE redirection test PASSED\n"); + printf("pipe_main: PIPE redirection test PASSED\n"); fflush(stdout); return 0; diff --git a/apps/examples/pipe/redirect_test.c b/apps/examples/pipe/redirect_test.c index 45e86c3560..db7c0b99a3 100644 --- a/apps/examples/pipe/redirect_test.c +++ b/apps/examples/pipe/redirect_test.c @@ -301,16 +301,16 @@ int redirection_test(void) 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) { - fprintf(stderr, "user_start: close failed: %d\n", errno); + fprintf(stderr, "pipe_main: close failed: %d\n", errno); } 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; } diff --git a/apps/examples/poll/poll_main.c b/apps/examples/poll/poll_main.c index 3db0150e77..9c3a096cba 100644 --- a/apps/examples/poll/poll_main.c +++ b/apps/examples/poll/poll_main.c @@ -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]; ssize_t nbytes; @@ -94,20 +94,20 @@ int user_start(int argc, char *argv[]) /* 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); if (ret < 0) { - message("user_start: mkfifo failed: %d\n", errno); + message("poll_main: mkfifo failed: %d\n", errno); exitcode = 1; 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); if (ret < 0) { - message("user_start: mkfifo failed: %d\n", errno); + message("poll_main: mkfifo failed: %d\n", errno); exitcode = 2; goto errout; } @@ -117,7 +117,7 @@ int user_start(int argc, char *argv[]) fd1 = open(FIFO_PATH1, O_WRONLY); 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); exitcode = 3; goto errout; @@ -126,7 +126,7 @@ int user_start(int argc, char *argv[]) fd2 = open(FIFO_PATH2, O_WRONLY); 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); exitcode = 4; goto errout; @@ -134,39 +134,39 @@ int user_start(int argc, char *argv[]) /* 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); 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; 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); 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; goto errout; } #ifdef HAVE_NETPOLL #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); #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); #endif 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 @@ -182,7 +182,7 @@ int user_start(int argc, char *argv[]) nbytes = write(fd1, buffer, strlen(buffer)); 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; goto errout; } @@ -190,12 +190,12 @@ int user_start(int argc, char *argv[]) nbytes = write(fd2, buffer, strlen(buffer)); if (nbytes < 0) { - message("user_start: Write fd2 failed: %d\n", errno); + message("poll_main: Write fd2 failed: %d\n", errno); exitcode = 8; goto errout; } - message("\nuser_start: Sent '%s' (%d bytes)\n", buffer, nbytes); + message("\npoll_main: Sent '%s' (%d bytes)\n", buffer, nbytes); msgflush(); /* Wait awhile. This delay should be long enough that the diff --git a/apps/examples/pwm/pwm_main.c b/apps/examples/pwm/pwm_main.c index 64c5dfb2c0..775bdba6b1 100644 --- a/apps/examples/pwm/pwm_main.c +++ b/apps/examples/pwm/pwm_main.c @@ -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[]) diff --git a/apps/examples/qencoder/qe_main.c b/apps/examples/qencoder/qe_main.c index c58a2b0ada..8c185ea1b7 100644 --- a/apps/examples/qencoder/qe_main.c +++ b/apps/examples/qencoder/qe_main.c @@ -59,14 +59,6 @@ * 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 ****************************************************************************/ @@ -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; int fd; @@ -266,11 +258,11 @@ int MAIN_NAME(int argc, char *argv[]) * this test. */ - message(MAIN_STRING "Initializing external encoder(s)\n"); + message("qe_main: Initializing external encoder(s)\n"); ret = qe_devinit(); if (ret != OK) { - message(MAIN_STRING "qe_devinit failed: %d\n", ret); + message("qe_main: qe_devinit failed: %d\n", ret); exitval = EXIT_FAILURE; goto errout; } @@ -289,13 +281,13 @@ int MAIN_NAME(int argc, char *argv[]) /* 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); fd = open(g_qeexample.devpath, O_RDONLY); 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; goto errout_with_dev; } @@ -304,11 +296,11 @@ int MAIN_NAME(int argc, char *argv[]) if (g_qeexample.reset) { - message(MAIN_STRING "Resetting the count...\n"); + message("qe_main: Resetting the count...\n"); ret = ioctl(fd, QEIOC_RESET, 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; goto errout_with_dev; } @@ -319,10 +311,10 @@ int MAIN_NAME(int argc, char *argv[]) */ #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++) #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++) #else for (;;) @@ -339,7 +331,7 @@ int MAIN_NAME(int argc, char *argv[]) ret = ioctl(fd, QEIOC_POSITION, (unsigned long)((uintptr_t)&position)); 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; goto errout_with_dev; } @@ -348,7 +340,7 @@ int MAIN_NAME(int argc, char *argv[]) else { - message(MAIN_STRING "%3d. %d\n", nloops+1, position); + message("qe_main: %3d. %d\n", nloops+1, position); } /* Delay a little bit */ diff --git a/apps/examples/romfs/romfs_main.c b/apps/examples/romfs/romfs_main.c index 32b3d2654b..4870ff4f81 100644 --- a/apps/examples/romfs/romfs_main.c +++ b/apps/examples/romfs/romfs_main.c @@ -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; diff --git a/apps/examples/serloop/main.c b/apps/examples/serloop/main.c index 3c635fe886..f0e3ac2387 100644 --- a/apps/examples/serloop/main.c +++ b/apps/examples/serloop/main.c @@ -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 int ch; diff --git a/apps/examples/watchdog/watchdog_main.c b/apps/examples/watchdog/watchdog_main.c index c1341e0fb9..53099d21a5 100644 --- a/apps/examples/watchdog/watchdog_main.c +++ b/apps/examples/watchdog/watchdog_main.c @@ -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[]) diff --git a/apps/interpreters/README.txt b/apps/interpreters/README.txt index 8cf7ce321b..f33c75df1c 100644 --- a/apps/interpreters/README.txt +++ b/apps/interpreters/README.txt @@ -58,7 +58,7 @@ pcode Pascal P-Code at runtime. To use this example, place the following in 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 diff --git a/apps/nshlib/Kconfig b/apps/nshlib/Kconfig index 7e419bdde4..ff692f43ba 100644 --- a/apps/nshlib/Kconfig +++ b/apps/nshlib/Kconfig @@ -148,9 +148,12 @@ config NSH_FILEIOSIZE config NSH_STRERROR bool "Use strerror()" default n + depends on LIBC_STRERROR ---help--- strerror(errno) makes more readable output but strerror() is 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 int "Max command line length" diff --git a/apps/nshlib/README.txt b/apps/nshlib/README.txt index d8edd89695..0f6aee759b 100644 --- a/apps/nshlib/README.txt +++ b/apps/nshlib/README.txt @@ -915,7 +915,9 @@ NSH-Specific Configuration Settings * CONFIG_NSH_STRERROR 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 The maximum length of one command line and of one output line. diff --git a/apps/nshlib/nsh.h b/apps/nshlib/nsh.h index 439c2ffd10..dac91ba05d 100644 --- a/apps/nshlib/nsh.h +++ b/apps/nshlib/nsh.h @@ -238,9 +238,14 @@ #define NSH_MAX_ARGUMENTS 6 /* 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 # define NSH_ERRNO strerror(errno) # define NSH_ERRNO_OF(err) strerror(err) diff --git a/apps/system/i2c/i2c_main.c b/apps/system/i2c/i2c_main.c index 2a0e5d626d..fbaf677aa6 100644 --- a/apps/system/i2c/i2c_main.c +++ b/apps/system/i2c/i2c_main.c @@ -351,15 +351,7 @@ static void i2c_teardown(FAR struct i2ctool_s *i2ctool) * Name: i2c_main ****************************************************************************/ -#ifdef CONFIG_I2CTOOL_BUILTIN -# 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[]) +int i2c_main(int argc, char *argv[]) { /* Verify settings */ diff --git a/nuttx/ChangeLog b/nuttx/ChangeLog index eff224f79a..b67c066bcb 100644 --- a/nuttx/ChangeLog +++ b/nuttx/ChangeLog @@ -3202,4 +3202,51 @@ for control transfers but does not resolve all of the issues. * configs/stm3220g-eval/*/defconfig: Calibrated delay loop. It had 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). diff --git a/nuttx/arch/arm/src/stm32/stm32_otgfshost.c b/nuttx/arch/arm/src/stm32/stm32_otgfshost.c index ce0e9036e5..02b12ec873 100644 --- a/nuttx/arch/arm/src/stm32/stm32_otgfshost.c +++ b/nuttx/arch/arm/src/stm32/stm32_otgfshost.c @@ -43,15 +43,12 @@ #include #include #include +#include #include #include #include #include -#if !defined(CONFIG_DEBUG_VERBOSE) && !defined(CONFIG_DEBUG_USB) -# include -#endif - #include #include #include @@ -315,6 +312,10 @@ static int stm32_ctrl_senddata(FAR struct stm32_usbhost_s *priv, FAR uint8_t *buffer, unsigned int buflen); static int stm32_ctrl_recvdata(FAR struct stm32_usbhost_s *priv, 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 **********************************************************/ /* Lower level interrupt handlers */ @@ -751,7 +752,7 @@ static void stm32_chan_configure(FAR struct stm32_usbhost_s *priv, int chidx) stm32_putreg(STM32_OTGFS_HCINTMSK(chidx), regval); /* Enable the top level host channel interrupt. */ - + stm32_modifyreg(STM32_OTGFS_HAINTMSK, 0, OTGFS_HAINT(chidx)); /* Make sure host channel interrupts are enabled. */ @@ -808,7 +809,7 @@ static void stm32_chan_halt(FAR struct stm32_usbhost_s *priv, int chidx, uint32_t eptype; 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. */ @@ -1157,7 +1158,7 @@ static void stm32_transfer_start(FAR struct stm32_usbhost_s *priv, int chidx) unsigned int wrpackets = avail / chan->maxpacket; wrsize = wrpackets * chan->maxpacket; } - + /* Write packet into the Tx FIFO. */ stm32_gint_wrpacket(priv, chan->buffer, chidx, wrsize); @@ -1354,6 +1355,254 @@ static int stm32_ctrl_recvdata(FAR struct stm32_usbhost_s *priv, 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 * @@ -1923,7 +2172,7 @@ static void stm32_gint_disconnected(FAR struct stm32_usbhost_s *priv) if (!priv->connected) { /* Yes.. then we no longer connected */ - + ullvdbg("Disconnected\n"); /* Are we bound to a class driver? */ @@ -2148,7 +2397,7 @@ static inline void stm32_gint_nptxfeisr(FAR struct stm32_usbhost_s *priv) unsigned int wrpackets = avail / chan->maxpacket; wrsize = wrpackets * chan->maxpacket; } - + /* Otherwise, this will be the last packet to be sent in this transaction. * We now need to disable further NPTXFE interrupts. */ @@ -2238,7 +2487,7 @@ static inline void stm32_gint_ptxfeisr(FAR struct stm32_usbhost_s *priv) unsigned int wrpackets = avail / chan->maxpacket; wrsize = wrpackets * chan->maxpacket; } - + /* Otherwise, this will be the last packet to be sent in this transaction. * We now need to disable further PTXFE interrupts. */ @@ -2382,7 +2631,7 @@ static inline void stm32_gint_hprtisr(FAR struct stm32_usbhost_s *priv) /* Set the Host Frame Interval Register for the 6KHz speed */ stm32_putreg(STM32_OTGFS_HFIR, 6000); - + /* Are we switching from FS to LS? */ if ((hcfg & OTGFS_HCFG_FSLSPCS_MASK) != OTGFS_HCFG_FSLSPCS_LS6MHz) @@ -2459,7 +2708,7 @@ static inline void stm32_gint_iisooxfrisr(FAR struct stm32_usbhost_s *priv) /* CHENA : Set to enable the channel * CHDIS : Set to stop transmitting/receiving data on a channel */ - + regval = stm32_getreg(STM32_OTGFS_HCCHAR(0)); regval |= (OTGFS_HCCHAR_CHDIS | OTGFS_HCCHAR_CHENA); stm32_putreg(STM32_OTGFS_HCCHAR(0), regval); @@ -2718,7 +2967,7 @@ static void stm32_txfe_enable(FAR struct stm32_usbhost_s *priv, int chidx) /* Disable all interrupts so that we have exclusive access to the GINTMSK * (it would be sufficent just to disable the GINT interrupt). */ - + flags = irqsave(); /* Should we enable the periodic or non-peridic Tx FIFO empty interrupts */ @@ -2842,7 +3091,7 @@ static int stm32_enumerate(FAR struct usbhost_driver_s *drvr) } DEBUGASSERT(priv->smstate == SMSTATE_ATTACHED); - + /* Allocate and initialize the control OUT channel */ chidx = stm32_chan_alloc(priv); @@ -2869,9 +3118,9 @@ static int stm32_enumerate(FAR struct usbhost_driver_s *drvr) priv->chan[chidx].indata1 = 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 */ @@ -2956,12 +3205,12 @@ static int stm32_ep0configure(FAR struct usbhost_driver_s *drvr, uint8_t funcadd priv->chan[priv->ep0out].maxpacket = maxpacketsize; stm32_chan_configure(priv, priv->ep0out); - + /* Configure the EP0 IN channel */ priv->chan[priv->ep0in].maxpacket = maxpacketsize; stm32_chan_configure(priv, priv->ep0in); - + stm32_givesem(&priv->exclsem); return OK; } @@ -3427,7 +3676,7 @@ static int stm32_ctrlout(FAR struct usbhost_driver_s *drvr, } /* Handle the status IN phase */ - + if (ret == OK) { ret = stm32_ctrl_recvdata(priv, NULL, 0); @@ -3492,145 +3741,33 @@ static int stm32_ctrlout(FAR struct usbhost_driver_s *drvr, * - Never called from an interrupt handler. * *******************************************************************************/ - + static int stm32_transfer(FAR struct usbhost_driver_s *drvr, usbhost_ep_t ep, FAR uint8_t *buffer, size_t buflen) { - struct stm32_usbhost_s *priv = (struct stm32_usbhost_s *)drvr; - FAR struct stm32_chan_s *chan; + FAR struct stm32_usbhost_s *priv = (FAR struct stm32_usbhost_s *)drvr; unsigned int chidx = (unsigned int)ep; - int ret = OK; + int ret; uvdbg("chidx: %d buflen: %d\n", (unsigned int)ep, buflen); 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 */ stm32_takesem(&priv->exclsem); - /* Loop until the transfer completes (i.e., buflen is decremented to zero) - * or a fatal error occurs (any error other than a simple NAK) - */ + /* Handle IN and OUT transfer slightly differently */ - chan->buffer = buffer; - chan->buflen = buflen; - - while (chan->buflen > 0) + if (priv->chan[chidx].in) { - /* Set up for the wait BEFORE starting the transfer */ - - 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 - { - /* Setup the OUT data PID */ - - 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; - } + ret = stm32_in_transfer(priv, chidx, buffer, buflen); + } + else + { + ret = stm32_out_transfer(priv, chidx, buffer, buflen); } -errout: stm32_givesem(&priv->exclsem); return ret; } @@ -3663,7 +3800,7 @@ static void stm32_disconnect(FAR struct usbhost_driver_s *drvr) struct stm32_usbhost_s *priv = (struct stm32_usbhost_s *)drvr; priv->class = NULL; } - + /******************************************************************************* * Initialization *******************************************************************************/ @@ -3979,7 +4116,7 @@ static inline int stm32_hw_initialize(FAR struct stm32_usbhost_s *priv) /* Set the PHYSEL bit in the GUSBCFG register to select the OTG FS serial * transceiver: "This bit is always 1 with write-only access" */ - + regval = stm32_getreg(STM32_OTGFS_GUSBCFG);; regval |= OTGFS_GUSBCFG_PHYSEL; stm32_putreg(STM32_OTGFS_GUSBCFG, regval); @@ -4128,7 +4265,7 @@ FAR struct usbhost_driver_s *usbhost_initialize(int controller) stm32_configgpio(GPIO_OTGFS_SOF); #endif - /* Initialize the USB OTG FS core */ + /* Initialize the USB OTG FS core */ stm32_hw_initialize(priv); diff --git a/nuttx/configs/README.txt b/nuttx/configs/README.txt index 7da0aa062a..1b405b3e45 100644 --- a/nuttx/configs/README.txt +++ b/nuttx/configs/README.txt @@ -7,6 +7,7 @@ Table of Contents o Summary of Files o Supported Architectures o Configuring NuttX + o Building Symbol Tables Board-Specific Configurations ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -268,6 +269,7 @@ defconfig -- This is a configuration file similar to the Linux by default) CONFIG_DEBUG_GRAPHICS - enable NX graphics debug output (disabled by default) + CONFIG_ARCH_LOWPUTC - architecture supports low-level, boot time console output CONFIG_MM_REGIONS - If the architecture includes multiple @@ -331,7 +333,7 @@ defconfig -- This is a configuration file similar to the Linux threads (minus 1) than can be waiting for another thread to release a count on a semaphore. This value may be set to zero if no more than one thread is expected to wait for - a semaphore. If defined, then this should be a relatively + a semaphore. If defined, then this should be a relatively small number because this the number of maximumum of waiters on one semaphore (like 4 or 8). CONFIG_FDCLONE_DISABLE. Disable cloning of all file descriptors @@ -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, only a single on_exit() function is supported. That number can be 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: CONFIG_SYSLOG enables general system logging support. @@ -546,10 +552,28 @@ defconfig -- This is a configuration file similar to the Linux Misc libc settings - CONFIG_NOPRINTF_FIELDWIDTH - sprintf-related logic is a - little smaller if we do not support fieldwidthes - CONFIG_LIBC_FLOATINGPOINT - By default, floating point - support in printf, sscanf, etc. is disabled. + CONFIG_NOPRINTF_FIELDWIDTH - sprintf-related logic is a little smaller + if we do not support fieldwidthes + CONFIG_LIBC_FLOATINGPOINT - By default, floating point support in printf, + 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 @@ -1782,3 +1806,26 @@ command line like: cd tools ./configure.sh -a / + +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. diff --git a/nuttx/drivers/usbhost/usbhost_enumerate.c b/nuttx/drivers/usbhost/usbhost_enumerate.c index 36bfa20d19..26b93bf360 100644 --- a/nuttx/drivers/usbhost/usbhost_enumerate.c +++ b/nuttx/drivers/usbhost/usbhost_enumerate.c @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -317,7 +318,7 @@ int usbhost_enumerate(FAR struct usbhost_driver_s *drvr, uint8_t funcaddr, 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. */ @@ -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); goto errout; } - up_mdelay(2); + usleep(2*1000); /* 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; } - /* Free the TD that we were using for the request buffer. It is not needed - * further here but it may be needed by the class driver during its connection - * operations. + /* Free the descriptor buffer that we were using for the request buffer. + * It is not needed further here but it may be needed by the class driver + * during its connection operations. */ 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 * device. This needs to be the last thing done because the class driver diff --git a/nuttx/drivers/usbhost/usbhost_storage.c b/nuttx/drivers/usbhost/usbhost_storage.c index 853287371d..2e3136b339 100644 --- a/nuttx/drivers/usbhost/usbhost_storage.c +++ b/nuttx/drivers/usbhost/usbhost_storage.c @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -724,6 +725,7 @@ static inline int usbhost_testunitready(FAR struct usbhost_state_s *priv) usbhost_dumpcsw((FAR struct usbmsc_csw_s *)priv->tbuffer); } } + return result; } @@ -1195,13 +1197,15 @@ static inline int usbhost_initvolume(FAR struct usbhost_state_s *priv) uvdbg("Get max LUN\n"); 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); - /* 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); if (ret == OK) diff --git a/nuttx/include/assert.h b/nuttx/include/assert.h index 89606b6f6a..31c9edf48d 100644 --- a/nuttx/include/assert.h +++ b/nuttx/include/assert.h @@ -91,6 +91,10 @@ #endif +#ifndef assert +#define assert ASSERT +#endif + /**************************************************************************** * Included Files ****************************************************************************/ diff --git a/nuttx/include/libgen.h b/nuttx/include/libgen.h index e659483768..0d42dc7782 100644 --- a/nuttx/include/libgen.h +++ b/nuttx/include/libgen.h @@ -55,8 +55,8 @@ extern "C" { #define EXTERN extern #endif -EXTERN char *basename(char *path); -EXTERN char *dirname(char *path); +EXTERN FAR char *basename(FAR char *path); +EXTERN FAR char *dirname(FAR char *path); #undef EXTERN #ifdef __cplusplus diff --git a/nuttx/include/netinet/ether.h b/nuttx/include/netinet/ether.h index f11fef6dbf..69b8fbba67 100644 --- a/nuttx/include/netinet/ether.h +++ b/nuttx/include/netinet/ether.h @@ -63,7 +63,7 @@ extern "C" { #define EXTERN extern #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 int ether_ntohost(char *hostname, const struct ether_addr *addr); EXTERN int ether_hostton(const char *hostname, struct ether_addr *addr); diff --git a/nuttx/include/nuttx/init.h b/nuttx/include/nuttx/init.h index ecdad702f5..2d1b3c693c 100644 --- a/nuttx/include/nuttx/init.h +++ b/nuttx/include/nuttx/init.h @@ -68,7 +68,7 @@ extern "C" { /* 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 *****************************************/ diff --git a/nuttx/include/stdio.h b/nuttx/include/stdio.h index 82bf0eaf6d..e9218046c5 100644 --- a/nuttx/include/stdio.h +++ b/nuttx/include/stdio.h @@ -128,6 +128,7 @@ EXTERN int sprintf(FAR char *buf, const char *format, ...); EXTERN int asprintf (FAR char **ptr, const char *fmt, ...); EXTERN int snprintf(FAR char *buf, size_t size, const char *format, ...); 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 vprintf(FAR const char *format, va_list ap); diff --git a/nuttx/lib/Kconfig b/nuttx/lib/Kconfig index 9e60201c2f..d94a274f9b 100644 --- a/nuttx/lib/Kconfig +++ b/nuttx/lib/Kconfig @@ -23,7 +23,7 @@ config NUNGET_CHARS ---help--- Number of characters that can be buffered by ungetc() (Only if NFILE_STREAMS > 0) -config CONFIG_LIB_HOMEDIR +config LIB_HOMEDIR string "Home directory" default "/" depends on !DISABLE_ENVIRON @@ -51,6 +51,46 @@ config LIBC_FLOATINGPOINT By default, floating point 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 bool "Low-level console output" default "y" @@ -68,7 +108,7 @@ config ENABLE_ARCH_OPTIMIZED_FUN The architecture may provide custom versions of certain 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 config ARCH_MEMCPY diff --git a/nuttx/lib/README.txt b/nuttx/lib/README.txt index 62e2fcce2e..63d1c343c0 100644 --- a/nuttx/lib/README.txt +++ b/nuttx/lib/README.txt @@ -45,3 +45,40 @@ directory: 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. diff --git a/nuttx/lib/lib.csv b/nuttx/lib/lib.csv new file mode 100644 index 0000000000..aa63653f5c --- /dev/null +++ b/nuttx/lib/lib.csv @@ -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" diff --git a/nuttx/lib/libgen/lib_basename.c b/nuttx/lib/libgen/lib_basename.c index 5741d976a9..986c6b8520 100644 --- a/nuttx/lib/libgen/lib_basename.c +++ b/nuttx/lib/libgen/lib_basename.c @@ -1,8 +1,8 @@ /**************************************************************************** * lib/libgen/lib_basename.c * - * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Copyright (C) 2007, 2009, 2011-2012 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * 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; int len; diff --git a/nuttx/lib/libgen/lib_dirname.c b/nuttx/lib/libgen/lib_dirname.c index c416d8aca3..248293a605 100644 --- a/nuttx/lib/libgen/lib_dirname.c +++ b/nuttx/lib/libgen/lib_dirname.c @@ -1,8 +1,8 @@ /**************************************************************************** * lib/libgen/lib_dirname.c * - * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Copyright (C) 2007, 2009, 2011-2012 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * 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; int len; diff --git a/nuttx/lib/math/lib_b16atan2.c b/nuttx/lib/math/lib_b16atan2.c index a396524517..8792fa0879 100644 --- a/nuttx/lib/math/lib_b16atan2.c +++ b/nuttx/lib/math/lib_b16atan2.c @@ -2,7 +2,7 @@ * lib/math/lib_b16atan2.c * * Copyright (C) 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/math/lib_b16cos.c b/nuttx/lib/math/lib_b16cos.c index 69cc610425..7547871f63 100644 --- a/nuttx/lib/math/lib_b16cos.c +++ b/nuttx/lib/math/lib_b16cos.c @@ -2,7 +2,7 @@ * lib/math/lib_b16cos.c * * Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/math/lib_b16sin.c b/nuttx/lib/math/lib_b16sin.c index fc4b5e5663..1eee179934 100644 --- a/nuttx/lib/math/lib_b16sin.c +++ b/nuttx/lib/math/lib_b16sin.c @@ -2,7 +2,7 @@ * lib/math/lib_b16sin.c * * Copyright (C) 2008, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/math/lib_fixedmath.c b/nuttx/lib/math/lib_fixedmath.c index b20158dc85..c1a710e739 100644 --- a/nuttx/lib/math/lib_fixedmath.c +++ b/nuttx/lib/math/lib_fixedmath.c @@ -2,7 +2,7 @@ * lib/math/lib_fixedmath.c * * Copyright (C) 2008-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * 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) diff --git a/nuttx/lib/math/lib_rint.c b/nuttx/lib/math/lib_rint.c index b122870b81..bd861ecedc 100644 --- a/nuttx/lib/math/lib_rint.c +++ b/nuttx/lib/math/lib_rint.c @@ -2,7 +2,7 @@ * lib/math/lib_rint.c * * Copyright (C) 2007, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/net/lib_etherntoa.c b/nuttx/lib/net/lib_etherntoa.c index 2535491833..f89f205a2e 100644 --- a/nuttx/lib/net/lib_etherntoa.c +++ b/nuttx/lib/net/lib_etherntoa.c @@ -2,7 +2,7 @@ * lib/net/lib_etherntoa.c * * Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * 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]; sprintf(buffer, "%02x:%02x:%02x:%02x:%02x:%02x", diff --git a/nuttx/lib/net/lib_htonl.c b/nuttx/lib/net/lib_htonl.c index f43b525050..e4c3e53838 100644 --- a/nuttx/lib/net/lib_htonl.c +++ b/nuttx/lib/net/lib_htonl.c @@ -2,7 +2,7 @@ * lib/net/lib_ntohl.c * * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/net/lib_htons.c b/nuttx/lib/net/lib_htons.c index 66d736a33f..b4117e1dc2 100644 --- a/nuttx/lib/net/lib_htons.c +++ b/nuttx/lib/net/lib_htons.c @@ -2,7 +2,7 @@ * lib/net/lib_htons.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_attrdestroy.c b/nuttx/lib/pthread/pthread_attrdestroy.c index fdadab7432..103528c7e1 100644 --- a/nuttx/lib/pthread/pthread_attrdestroy.c +++ b/nuttx/lib/pthread/pthread_attrdestroy.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_attrdestroy.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_attrgetinheritsched.c b/nuttx/lib/pthread/pthread_attrgetinheritsched.c index c1b764faa3..02d6e0b7c0 100644 --- a/nuttx/lib/pthread/pthread_attrgetinheritsched.c +++ b/nuttx/lib/pthread/pthread_attrgetinheritsched.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_attrgetinheritsched.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_attrgetschedparam.c b/nuttx/lib/pthread/pthread_attrgetschedparam.c index fa456f61a4..c6bf55dea8 100644 --- a/nuttx/lib/pthread/pthread_attrgetschedparam.c +++ b/nuttx/lib/pthread/pthread_attrgetschedparam.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_attrgetschedparam.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_attrgetschedpolicy.c b/nuttx/lib/pthread/pthread_attrgetschedpolicy.c index b4f762b519..c42b828c96 100644 --- a/nuttx/lib/pthread/pthread_attrgetschedpolicy.c +++ b/nuttx/lib/pthread/pthread_attrgetschedpolicy.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_attrgetschedpolicy.c * * Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_attrgetstacksize.c b/nuttx/lib/pthread/pthread_attrgetstacksize.c index 06e40b5fbe..2faa586ba8 100644 --- a/nuttx/lib/pthread/pthread_attrgetstacksize.c +++ b/nuttx/lib/pthread/pthread_attrgetstacksize.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_attrgetstacksize.c * * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_attrinit.c b/nuttx/lib/pthread/pthread_attrinit.c index 7df73e54b4..d06a535d78 100644 --- a/nuttx/lib/pthread/pthread_attrinit.c +++ b/nuttx/lib/pthread/pthread_attrinit.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_attrinit.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_attrsetinheritsched.c b/nuttx/lib/pthread/pthread_attrsetinheritsched.c index ebdc9b3e45..df2c2fba33 100644 --- a/nuttx/lib/pthread/pthread_attrsetinheritsched.c +++ b/nuttx/lib/pthread/pthread_attrsetinheritsched.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_attrsetinheritsched.c * * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_attrsetschedparam.c b/nuttx/lib/pthread/pthread_attrsetschedparam.c index 4f65bcd8cb..c2ab4d1c41 100644 --- a/nuttx/lib/pthread/pthread_attrsetschedparam.c +++ b/nuttx/lib/pthread/pthread_attrsetschedparam.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_attrsetschedparam.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_attrsetschedpolicy.c b/nuttx/lib/pthread/pthread_attrsetschedpolicy.c index b4b1fd0543..4e43e635de 100644 --- a/nuttx/lib/pthread/pthread_attrsetschedpolicy.c +++ b/nuttx/lib/pthread/pthread_attrsetschedpolicy.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_attrsetschedpolicy.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_attrsetstacksize.c b/nuttx/lib/pthread/pthread_attrsetstacksize.c index a2de8ac78d..8a826dd3ac 100644 --- a/nuttx/lib/pthread/pthread_attrsetstacksize.c +++ b/nuttx/lib/pthread/pthread_attrsetstacksize.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_attrsetstacksize.c * * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_barrierattrdestroy.c b/nuttx/lib/pthread/pthread_barrierattrdestroy.c index 7498bc4f23..6d16b9cff8 100644 --- a/nuttx/lib/pthread/pthread_barrierattrdestroy.c +++ b/nuttx/lib/pthread/pthread_barrierattrdestroy.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_barrierattrdestroy.c * * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_barrierattrgetpshared.c b/nuttx/lib/pthread/pthread_barrierattrgetpshared.c index f4b4f64c13..d29bc6dfc8 100644 --- a/nuttx/lib/pthread/pthread_barrierattrgetpshared.c +++ b/nuttx/lib/pthread/pthread_barrierattrgetpshared.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_barrierattrgetpshared.c * * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_barrierattrinit.c b/nuttx/lib/pthread/pthread_barrierattrinit.c index 47bbb8eb42..b5f35ca917 100644 --- a/nuttx/lib/pthread/pthread_barrierattrinit.c +++ b/nuttx/lib/pthread/pthread_barrierattrinit.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_barrierattrinit.c * * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_barrierattrsetpshared.c b/nuttx/lib/pthread/pthread_barrierattrsetpshared.c index a982eea393..d0eecbf5a4 100644 --- a/nuttx/lib/pthread/pthread_barrierattrsetpshared.c +++ b/nuttx/lib/pthread/pthread_barrierattrsetpshared.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_barrierattrsetpshared.c * * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_condattrdestroy.c b/nuttx/lib/pthread/pthread_condattrdestroy.c index c55dcd4e3f..d6c3df5d1a 100644 --- a/nuttx/lib/pthread/pthread_condattrdestroy.c +++ b/nuttx/lib/pthread/pthread_condattrdestroy.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_condattrdestroy.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_condattrinit.c b/nuttx/lib/pthread/pthread_condattrinit.c index 75f01a11b6..5721c61593 100644 --- a/nuttx/lib/pthread/pthread_condattrinit.c +++ b/nuttx/lib/pthread/pthread_condattrinit.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_condattrinit.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_mutexattrdestroy.c b/nuttx/lib/pthread/pthread_mutexattrdestroy.c index 59e81528be..e9868df68b 100644 --- a/nuttx/lib/pthread/pthread_mutexattrdestroy.c +++ b/nuttx/lib/pthread/pthread_mutexattrdestroy.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_mutexattrdestroy.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_mutexattrgetpshared.c b/nuttx/lib/pthread/pthread_mutexattrgetpshared.c index e5e09bbbe1..bc6379db5f 100644 --- a/nuttx/lib/pthread/pthread_mutexattrgetpshared.c +++ b/nuttx/lib/pthread/pthread_mutexattrgetpshared.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_mutexattrgetpshared.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_mutexattrgettype.c b/nuttx/lib/pthread/pthread_mutexattrgettype.c index 93cbe36019..5fb10f3015 100644 --- a/nuttx/lib/pthread/pthread_mutexattrgettype.c +++ b/nuttx/lib/pthread/pthread_mutexattrgettype.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_mutexattrgettype.c * * Copyright (C) 2008, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_mutexattrinit.c b/nuttx/lib/pthread/pthread_mutexattrinit.c index 729b0b8e14..f815bf16c1 100644 --- a/nuttx/lib/pthread/pthread_mutexattrinit.c +++ b/nuttx/lib/pthread/pthread_mutexattrinit.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_mutexattrinit.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_mutexattrsetpshared.c b/nuttx/lib/pthread/pthread_mutexattrsetpshared.c index 752e9faa03..900476fdd2 100644 --- a/nuttx/lib/pthread/pthread_mutexattrsetpshared.c +++ b/nuttx/lib/pthread/pthread_mutexattrsetpshared.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_mutexattrsetpshared.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/pthread/pthread_mutexattrsettype.c b/nuttx/lib/pthread/pthread_mutexattrsettype.c index e095dd70c3..81427c757e 100644 --- a/nuttx/lib/pthread/pthread_mutexattrsettype.c +++ b/nuttx/lib/pthread/pthread_mutexattrsettype.c @@ -2,7 +2,7 @@ * lib/pthread/pthread_mutexattrsettype.c * * Copyright (C) 2008, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/sched/sched_getprioritymax.c b/nuttx/lib/sched/sched_getprioritymax.c index 8be45d7100..14b368dfc0 100644 --- a/nuttx/lib/sched/sched_getprioritymax.c +++ b/nuttx/lib/sched/sched_getprioritymax.c @@ -2,7 +2,7 @@ * lib/sched/sched_getprioritymax.c * * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/sched/sched_getprioritymin.c b/nuttx/lib/sched/sched_getprioritymin.c index a590f1fc2e..86410cb0f6 100644 --- a/nuttx/lib/sched/sched_getprioritymin.c +++ b/nuttx/lib/sched/sched_getprioritymin.c @@ -2,7 +2,7 @@ * lib/sched/sched_getprioritymin.c * * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/semaphore/sem_getvalue.c b/nuttx/lib/semaphore/sem_getvalue.c index 137eb90010..31c6bb7e06 100644 --- a/nuttx/lib/semaphore/sem_getvalue.c +++ b/nuttx/lib/semaphore/sem_getvalue.c @@ -2,7 +2,7 @@ * lib/semaphore/sem_getvalue.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/signal/sig_addset.c b/nuttx/lib/signal/sig_addset.c index af9463aac8..19ba0cb6b6 100644 --- a/nuttx/lib/signal/sig_addset.c +++ b/nuttx/lib/signal/sig_addset.c @@ -2,7 +2,7 @@ * lib/signal/sig_addset.c * * Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/signal/sig_delset.c b/nuttx/lib/signal/sig_delset.c index 489c59afac..1c661d37f6 100644 --- a/nuttx/lib/signal/sig_delset.c +++ b/nuttx/lib/signal/sig_delset.c @@ -2,7 +2,7 @@ * lib/signal/sig_delset.c * * Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/signal/sig_emptyset.c b/nuttx/lib/signal/sig_emptyset.c index bfee588323..ac0c6b3e89 100644 --- a/nuttx/lib/signal/sig_emptyset.c +++ b/nuttx/lib/signal/sig_emptyset.c @@ -2,7 +2,7 @@ * lib/signal/sig_emptyset.c * * Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/signal/sig_fillset.c b/nuttx/lib/signal/sig_fillset.c index c660da0ad8..8697d7577f 100644 --- a/nuttx/lib/signal/sig_fillset.c +++ b/nuttx/lib/signal/sig_fillset.c @@ -2,7 +2,7 @@ * lib/signal/sig_fillset.c * * Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/signal/sig_ismember.c b/nuttx/lib/signal/sig_ismember.c index 88dc8d819b..c5bb091b7b 100644 --- a/nuttx/lib/signal/sig_ismember.c +++ b/nuttx/lib/signal/sig_ismember.c @@ -2,7 +2,7 @@ * lib/signal/sig_ismember.c * * Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdio/Make.defs b/nuttx/lib/stdio/Make.defs index 1165d53547..f88a5edd9e 100644 --- a/nuttx/lib/stdio/Make.defs +++ b/nuttx/lib/stdio/Make.defs @@ -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_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_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 diff --git a/nuttx/lib/stdio/lib_fflush.c b/nuttx/lib/stdio/lib_fflush.c index e0278d0d25..d0b5e0185d 100644 --- a/nuttx/lib/stdio/lib_fflush.c +++ b/nuttx/lib/stdio/lib_fflush.c @@ -2,7 +2,7 @@ * lib/stdio/lib_fflush.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -97,22 +97,36 @@ int fflush(FAR FILE *stream) { + int ret; + /* Is the stream argument NULL? */ if (!stream) { /* 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 - * of the buffered write data. Return EOF on failure. + ret = lib_fflush(stream, true); + } + + /* 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 OK; } diff --git a/nuttx/lib/stdio/lib_fgetc.c b/nuttx/lib/stdio/lib_fgetc.c index 4e521e8403..4b3d0ec44f 100644 --- a/nuttx/lib/stdio/lib_fgetc.c +++ b/nuttx/lib/stdio/lib_fgetc.c @@ -2,7 +2,7 @@ * lib/stdio/lib_fgetc.c * * Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdio/lib_fgetpos.c b/nuttx/lib/stdio/lib_fgetpos.c index af07f7387e..e9e9f4d102 100644 --- a/nuttx/lib/stdio/lib_fgetpos.c +++ b/nuttx/lib/stdio/lib_fgetpos.c @@ -2,7 +2,7 @@ * lib/stdio/lib_fgetpos.c * * Copyright (C) 2008-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdio/lib_fileno.c b/nuttx/lib/stdio/lib_fileno.c index ec25ce6d09..fca08fc0d4 100644 --- a/nuttx/lib/stdio/lib_fileno.c +++ b/nuttx/lib/stdio/lib_fileno.c @@ -2,7 +2,7 @@ * lib/stdio/lib_fileno.c * * Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -63,6 +63,7 @@ int fileno(FAR FILE *stream) set_errno(EBADF); return ERROR; } + return ret; } #endif /* CONFIG_NFILE_STREAMS */ diff --git a/nuttx/lib/stdio/lib_fread.c b/nuttx/lib/stdio/lib_fread.c index cc652fab72..4a4b29256d 100644 --- a/nuttx/lib/stdio/lib_fread.c +++ b/nuttx/lib/stdio/lib_fread.c @@ -2,7 +2,7 @@ * lib/stdio/lib_fread.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdio/lib_fseek.c b/nuttx/lib/stdio/lib_fseek.c index a68de79fe2..7380f83b3b 100644 --- a/nuttx/lib/stdio/lib_fseek.c +++ b/nuttx/lib/stdio/lib_fseek.c @@ -2,7 +2,7 @@ * lib/stdio/lib_fseek.c * * Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdio/lib_fsetpos.c b/nuttx/lib/stdio/lib_fsetpos.c index ad3e672300..13d556521b 100644 --- a/nuttx/lib/stdio/lib_fsetpos.c +++ b/nuttx/lib/stdio/lib_fsetpos.c @@ -2,7 +2,7 @@ * lib/stdio/lib_fsetpos.c * * Copyright (C) 2008, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdio/lib_ftell.c b/nuttx/lib/stdio/lib_ftell.c index cd0e483687..9476481529 100644 --- a/nuttx/lib/stdio/lib_ftell.c +++ b/nuttx/lib/stdio/lib_ftell.c @@ -2,7 +2,7 @@ * lib/stdio/lib_ftell.c * * Copyright (C) 2008, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdio/lib_fwrite.c b/nuttx/lib/stdio/lib_fwrite.c index 1b7be2ce5c..60e0017463 100644 --- a/nuttx/lib/stdio/lib_fwrite.c +++ b/nuttx/lib/stdio/lib_fwrite.c @@ -2,7 +2,7 @@ * lib/stdio/lib_fwrite.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdio/lib_libfflush.c b/nuttx/lib/stdio/lib_libfflush.c index fb5a8768e9..2a4fe29326 100644 --- a/nuttx/lib/stdio/lib_libfflush.c +++ b/nuttx/lib/stdio/lib_libfflush.c @@ -98,8 +98,8 @@ * bforce - flush must be complete. * * Return: - * ERROR on failure, otherwise the number of bytes remaining in the buffer. - * If bforce is set, then only the values ERROR and 0 will be returned. + * A negated errno value on failure, otherwise the number of bytes remaining + * 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) { - set_errno(EBADF); - return ERROR; + return -EBADF; } /* 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) { - /* 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; } @@ -151,8 +153,12 @@ ssize_t lib_fflush(FAR FILE *stream, bool bforce) bytes_written = write(stream->fs_filedes, src, nbuffer); if (bytes_written < 0) { + /* Write failed. The cause of the failure is in 'errno'. + * returned the negated errno value. + */ + lib_give_semaphore(stream); - return ERROR; + return -get_errno(); } /* Handle partial writes. fflush() must either return with diff --git a/nuttx/lib/stdio/lib_libflushall.c b/nuttx/lib/stdio/lib_libflushall.c index 8de0c33096..9d0a89e9c1 100644 --- a/nuttx/lib/stdio/lib_libflushall.c +++ b/nuttx/lib/stdio/lib_libflushall.c @@ -1,8 +1,8 @@ /**************************************************************************** * lib/stdio/lib_libflushall.c * - * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Copyright (C) 2007-2009, 2011-2012 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -91,7 +91,7 @@ int lib_flushall(FAR struct streamlist *list) { int lasterrno = OK; - int ret = OK; + int ret; /* 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 */ - 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 - * 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(); - ret = ERROR; + lasterrno = ret; } } } + 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) - { - set_errno(lasterrno); - } - return ret; + return lasterrno; } diff --git a/nuttx/lib/stdio/lib_libfread.c b/nuttx/lib/stdio/lib_libfread.c index 4d402a42b4..03b47eda66 100644 --- a/nuttx/lib/stdio/lib_libfread.c +++ b/nuttx/lib/stdio/lib_libfread.c @@ -1,8 +1,8 @@ /**************************************************************************** * lib/stdio/lib_libfread.c * - * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Copyright (C) 2007-2009, 2011-2012 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * 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; ssize_t bytes_read; + int ret; /* 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. */ - 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. */ @@ -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); 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) { /* We are at the end of the file */ - goto short_read; + goto shortread; } 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. */ - goto short_read; + goto shortread; } 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); 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) { /* We are at the end of the file */ - goto short_read; + goto shortread; } 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); 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) { @@ -259,13 +270,21 @@ ssize_t lib_fread(FAR void *ptr, size_t count, FAR FILE *stream) } } #endif + /* Here after a successful (but perhaps short) read */ + #if CONFIG_STDIO_BUFFER_SIZE > 0 - short_read: + shortread: #endif bytes_read = dest - (unsigned char*)ptr; - err_out: - lib_give_semaphore(stream); } - return bytes_read; + + lib_give_semaphore(stream); + return bytes_read; + +/* Error exits */ + +errout_with_errno: + lib_give_semaphore(stream); + return -get_errno(); } diff --git a/nuttx/lib/stdio/lib_libsprintf.c b/nuttx/lib/stdio/lib_libsprintf.c index 04d5477541..2474a6f01d 100644 --- a/nuttx/lib/stdio/lib_libsprintf.c +++ b/nuttx/lib/stdio/lib_libsprintf.c @@ -2,7 +2,7 @@ * lib/stdio/lib_libsprintf.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdio/lib_perror.c b/nuttx/lib/stdio/lib_perror.c new file mode 100644 index 0000000000..867e113f98 --- /dev/null +++ b/nuttx/lib/stdio/lib_perror.c @@ -0,0 +1,99 @@ +/**************************************************************************** + * lib/stdio/lib_perror.c + * + * Copyright (C) 2012 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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 + +#include +#include + +/**************************************************************************** + * 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 +} + diff --git a/nuttx/lib/stdio/lib_rdflush.c b/nuttx/lib/stdio/lib_rdflush.c index 948dcce5da..35c5495c17 100644 --- a/nuttx/lib/stdio/lib_rdflush.c +++ b/nuttx/lib/stdio/lib_rdflush.c @@ -2,7 +2,7 @@ * lib/stdio/lib_rdflush.c * * Copyright (C) 2008, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdio/lib_snprintf.c b/nuttx/lib/stdio/lib_snprintf.c index a4dcd399bd..e5ce7b0f02 100644 --- a/nuttx/lib/stdio/lib_snprintf.c +++ b/nuttx/lib/stdio/lib_snprintf.c @@ -2,7 +2,7 @@ * lib/stdio/lib_snprintf.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdio/lib_sprintf.c b/nuttx/lib/stdio/lib_sprintf.c index 6de019cc5f..89fd610330 100644 --- a/nuttx/lib/stdio/lib_sprintf.c +++ b/nuttx/lib/stdio/lib_sprintf.c @@ -2,7 +2,7 @@ * lib/stdio/lib_sprintf.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdio/lib_sscanf.c b/nuttx/lib/stdio/lib_sscanf.c index 3430aa0a02..c779077112 100644 --- a/nuttx/lib/stdio/lib_sscanf.c +++ b/nuttx/lib/stdio/lib_sscanf.c @@ -2,7 +2,7 @@ * lib/stdio/lib_sscanf.c * * Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdio/lib_syslogstream.c b/nuttx/lib/stdio/lib_syslogstream.c index 7e47d794a5..21151b43a1 100644 --- a/nuttx/lib/stdio/lib_syslogstream.c +++ b/nuttx/lib/stdio/lib_syslogstream.c @@ -2,7 +2,7 @@ * lib/stdio/lib_syslogstream.c * * Copyright (C) 2012 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdio/lib_ungetc.c b/nuttx/lib/stdio/lib_ungetc.c index 73e5917295..c10d4fba1a 100644 --- a/nuttx/lib/stdio/lib_ungetc.c +++ b/nuttx/lib/stdio/lib_ungetc.c @@ -2,7 +2,7 @@ * lib/stdio/lib_ungetc.c * * Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdio/lib_vfprintf.c b/nuttx/lib/stdio/lib_vfprintf.c index 25c3954c08..1c3a2d7fc9 100644 --- a/nuttx/lib/stdio/lib_vfprintf.c +++ b/nuttx/lib/stdio/lib_vfprintf.c @@ -2,7 +2,7 @@ * lib/stdio/lib_vfprintf.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdio/lib_vprintf.c b/nuttx/lib/stdio/lib_vprintf.c index a2e31fa052..d085d58869 100644 --- a/nuttx/lib/stdio/lib_vprintf.c +++ b/nuttx/lib/stdio/lib_vprintf.c @@ -2,7 +2,7 @@ * lib/stdio/lib_vprintf.c * * Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdio/lib_vsnprintf.c b/nuttx/lib/stdio/lib_vsnprintf.c index da885977c7..c6f52092d1 100644 --- a/nuttx/lib/stdio/lib_vsnprintf.c +++ b/nuttx/lib/stdio/lib_vsnprintf.c @@ -2,7 +2,7 @@ * lib/stdio/lib_vsnprintf.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdio/lib_vsprintf.c b/nuttx/lib/stdio/lib_vsprintf.c index 72a829a794..5db46664e3 100644 --- a/nuttx/lib/stdio/lib_vsprintf.c +++ b/nuttx/lib/stdio/lib_vsprintf.c @@ -2,7 +2,7 @@ * lib/stdio/lib_vsprintf.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdio/lib_wrflush.c b/nuttx/lib/stdio/lib_wrflush.c index c16109515b..39680da6ae 100644 --- a/nuttx/lib/stdio/lib_wrflush.c +++ b/nuttx/lib/stdio/lib_wrflush.c @@ -1,8 +1,8 @@ /**************************************************************************** * lib/stdio/lib_wrflush.c * - * Copyright (C) 2008-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Copyright (C) 2008-2009, 2011-2012 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -88,29 +88,47 @@ int lib_wrflush(FAR FILE *stream) { +#if CONFIG_STDIO_BUFFER_SIZE > 0 /* Verify that we were passed a valid (i.e., non-NULL) stream */ -#if CONFIG_STDIO_BUFFER_SIZE > 0 - if (stream) +#ifdef CONFIG_DEBUG + if (!stream) { - /* Verify that the stream is opened for writing... lib_fflush will - * return an error if it is called for a stream that is not opened for - * writing. + return -EINVAL; + } +#endif + + /* Verify that the stream is opened for writing... lib_fflush will + * return an error if it is called for a stream that is not opened for + * writing. Check that first so that this function will not fail in + * that case. + */ + + if ((stream->fs_oflags & O_WROK) == 0) + { + /* Report that the success was successful if we attempt to flush a + * read-only stream. */ - if ((stream->fs_oflags & O_WROK) == 0 || - lib_fflush(stream, true) == 0) - { - /* Return success if there is no buffered write data -- i.e., that - * the stream is not opened for writing or, if it is, that all of - * the buffered write data was successfully flushed. - */ - - return OK; - } + return OK; } - return ERROR; + + /* Flush the stream. Return success if there is no buffered write data + * -- i.e., that the stream is opened for writing and that all of the + * buffered write data was successfully flushed by lib_fflush(). + */ + + return lib_fflush(stream, true); #else - return stream ? OK : ERROR; + /* Verify that we were passed a valid (i.e., non-NULL) stream */ + +#ifdef CONFIG_DEBUG + if (!stream) + { + return -EINVAL; + } +#endif + + return OK; #endif } diff --git a/nuttx/lib/stdio/lib_zeroinstream.c b/nuttx/lib/stdio/lib_zeroinstream.c index 27655b5475..39a6c22ef3 100644 --- a/nuttx/lib/stdio/lib_zeroinstream.c +++ b/nuttx/lib/stdio/lib_zeroinstream.c @@ -2,7 +2,7 @@ * lib/stdio/lib_zeroinstream.c * * Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdlib/lib_abs.c b/nuttx/lib/stdlib/lib_abs.c index 5c805d8579..1a0c1671cc 100644 --- a/nuttx/lib/stdlib/lib_abs.c +++ b/nuttx/lib/stdlib/lib_abs.c @@ -2,7 +2,7 @@ * lib/stdlib/lib_abs.c * * Copyright (C) 2010-2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdlib/lib_imaxabs.c b/nuttx/lib/stdlib/lib_imaxabs.c index d16791b268..c6e227c7de 100644 --- a/nuttx/lib/stdlib/lib_imaxabs.c +++ b/nuttx/lib/stdlib/lib_imaxabs.c @@ -2,7 +2,7 @@ * lib/stdlib//lib_abs.c * * Copyright (C) 2010-2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdlib/lib_labs.c b/nuttx/lib/stdlib/lib_labs.c index c9d9c19351..f7218ee833 100644 --- a/nuttx/lib/stdlib/lib_labs.c +++ b/nuttx/lib/stdlib/lib_labs.c @@ -2,7 +2,7 @@ * lib/stdlib/lib_labs.c * * Copyright (C) 2010-2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdlib/lib_llabs.c b/nuttx/lib/stdlib/lib_llabs.c index 24e26e9e11..db7d3dbe07 100644 --- a/nuttx/lib/stdlib/lib_llabs.c +++ b/nuttx/lib/stdlib/lib_llabs.c @@ -2,7 +2,7 @@ * lib/stdlib/lib_llabs.c * * Copyright (C) 2010-2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/stdlib/lib_qsort.c b/nuttx/lib/stdlib/lib_qsort.c index 13bca7499a..9dd5c00409 100644 --- a/nuttx/lib/stdlib/lib_qsort.c +++ b/nuttx/lib/stdlib/lib_qsort.c @@ -2,7 +2,7 @@ * lib/stdlib/lib_qsort.c * * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Leveraged from: * diff --git a/nuttx/lib/stdlib/lib_rand.c b/nuttx/lib/stdlib/lib_rand.c index 537bc1aaee..7227c52d0d 100644 --- a/nuttx/lib/stdlib/lib_rand.c +++ b/nuttx/lib/stdlib/lib_rand.c @@ -2,7 +2,7 @@ * lib/stdlib/lib_rand.c * * Copyright (C) 2007, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/string/lib_strerror.c b/nuttx/lib/string/lib_strerror.c index 580974fa6c..249f695c1b 100644 --- a/nuttx/lib/string/lib_strerror.c +++ b/nuttx/lib/string/lib_strerror.c @@ -1,8 +1,8 @@ /************************************************************************ * lib/string/lib_strerror.c * - * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Copyright (C) 2007, 2009, 2011-2012 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -61,6 +61,8 @@ struct errno_strmap_s * Private Data ************************************************************************/ +#ifdef CONFIG_LIBC_STRERROR + /* This table maps all error numbers to descriptive strings. * The only assumption that the code makes with regard to this * this table is that it is ordered by error number. @@ -70,6 +72,8 @@ struct errno_strmap_s * strings. */ +#ifndef CONFIG_LIBC_STRERROR_SHORT + static const struct errno_strmap_s g_errnomap[] = { { EPERM, EPERM_STR }, @@ -196,8 +200,140 @@ static const struct errno_strmap_s g_errnomap[] = { EMEDIUMTYPE, EMEDIUMTYPE_STR } }; +#else /* CONFIG_LIBC_STRERROR_SHORT */ + +static const struct errno_strmap_s g_errnomap[] = +{ + { EPERM, "EPERM" }, + { ENOENT, "ENOENT" }, + { ESRCH, "ESRCH" }, + { EINTR, "EINTR" }, + { EIO, "EIO" }, + { ENXIO, "ENXIO" }, + { E2BIG, "E2BIG" }, + { ENOEXEC, "ENOEXEC" }, + { EBADF, "EBADF" }, + { ECHILD, "ECHILD" }, + { EAGAIN, "EAGAIN" }, + { ENOMEM, "ENOMEM" }, + { EACCES, "EACCES" }, + { EFAULT, "EFAULT" }, + { ENOTBLK, "ENOTBLK" }, + { EBUSY, "EBUSY" }, + { EEXIST, "EEXIST" }, + { EXDEV, "EXDEV" }, + { ENODEV, "ENODEV" }, + { ENOTDIR, "ENOTDIR" }, + { EISDIR, "EISDIR" }, + { EINVAL, "EINVAL" }, + { ENFILE, "ENFILE" }, + { EMFILE, "EMFILE" }, + { ENOTTY, "ENOTTY" }, + { ETXTBSY, "ETXTBSY" }, + { EFBIG, "EFBIG" }, + { ENOSPC, "ENOSPC" }, + { ESPIPE, "ESPIPE" }, + { EROFS, "EROFS" }, + { EMLINK, "EMLINK" }, + { EPIPE, "EPIPE" }, + { EDOM, "EDOM" }, + { ERANGE, "ERANGE" }, + { EDEADLK, "EDEADLK" }, + { ENAMETOOLONG, "ENAMETOOLONG" }, + { ENOLCK, "ENOLCK" }, + { ENOSYS, "ENOSYS" }, + { ENOTEMPTY, "ENOTEMPTY" }, + { ELOOP, "ELOOP" }, + { ENOMSG, "ENOMSG" }, + { EIDRM, "EIDRM" }, + { ECHRNG, "ECHRNG" }, + { EL2NSYNC, "EL2NSYNC" }, + { EL3HLT, "EL3HLT" }, + { EL3RST, "EL3RST" }, + { EL3RST, "EL3RST" }, + { EUNATCH, "EUNATCH" }, + { ENOCSI, "ENOCSI" }, + { EL2HLT, "EL2HLT" }, + { EBADE, "EBADE" }, + { EBADR, "EBADR" }, + { EXFULL, "EXFULL" }, + { ENOANO, "ENOANO" }, + { EBADRQC, "EBADRQC" }, + { EBADSLT, "EBADSLT" }, + { EBFONT, "EBFONT" }, + { ENOSTR, "ENOSTR" }, + { ENODATA, "ENODATA" }, + { ETIME, "ETIME" }, + { ENOSR, "ENOSR" }, + { ENONET, "ENONET" }, + { ENOPKG, "ENOPKG" }, + { EREMOTE, "EREMOTE" }, + { ENOLINK, "ENOLINK" }, + { EADV, "EADV" }, + { ESRMNT, "ESRMNT" }, + { ECOMM, "ECOMM" }, + { EPROTO, "EPROTO" }, + { EMULTIHOP, "EMULTIHOP" }, + { EDOTDOT, "EDOTDOT" }, + { EBADMSG, "EBADMSG" }, + { EOVERFLOW, "EOVERFLOW" }, + { ENOTUNIQ, "ENOTUNIQ" }, + { EBADFD, "EBADFD" }, + { EREMCHG, "EREMCHG" }, + { ELIBACC, "ELIBACC" }, + { ELIBBAD, "ELIBBAD" }, + { ELIBSCN, "ELIBSCN" }, + { ELIBMAX, "ELIBMAX" }, + { ELIBEXEC, "ELIBEXEC" }, + { EILSEQ, "EILSEQ" }, + { ERESTART, "ERESTART" }, + { ESTRPIPE, "ESTRPIPE" }, + { EUSERS, "EUSERS" }, + { ENOTSOCK, "ENOTSOCK" }, + { EDESTADDRREQ, "EDESTADDRREQ" }, + { EMSGSIZE, "EMSGSIZE" }, + { EPROTOTYPE, "EPROTOTYPE" }, + { ENOPROTOOPT, "ENOPROTOOPT" }, + { EPROTONOSUPPORT, "EPROTONOSUPPORT" }, + { ESOCKTNOSUPPORT, "ESOCKTNOSUPPORT" }, + { EOPNOTSUPP, "EOPNOTSUPP" }, + { EPFNOSUPPORT, "EPFNOSUPPORT" }, + { EAFNOSUPPORT, "EAFNOSUPPORT" }, + { EADDRINUSE, "EADDRINUSE" }, + { EADDRNOTAVAIL, "EADDRNOTAVAIL" }, + { ENETDOWN, "ENETDOWN" }, + { ENETUNREACH, "ENETUNREACH" }, + { ENETRESET, "ENETRESET" }, + { ECONNABORTED, "ECONNABORTED" }, + { ECONNRESET, "ECONNRESET" }, + { ENOBUFS, "ENOBUFS" }, + { EISCONN, "EISCONN" }, + { ENOTCONN, "ENOTCONN" }, + { ESHUTDOWN, "ESHUTDOWN" }, + { ETOOMANYREFS, "ETOOMANYREFS" }, + { ETIMEDOUT, "ETIMEDOUT" }, + { ECONNREFUSED, "ECONNREFUSED" }, + { EHOSTDOWN, "EHOSTDOWN" }, + { EHOSTUNREACH, "EHOSTUNREACH" }, + { EALREADY, "EALREADY" }, + { EINPROGRESS, "EINPROGRESS" }, + { ESTALE, "ESTALE" }, + { EUCLEAN, "EUCLEAN" }, + { ENOTNAM, "ENOTNAM" }, + { ENAVAIL, "ENAVAIL" }, + { EISNAM, "EISNAM" }, + { EREMOTEIO, "EREMOTEIO" }, + { EDQUOT, "EDQUOT" }, + { ENOMEDIUM, "ENOMEDIUM" }, + { EMEDIUMTYPE, "EMEDIUMTYPE" } +}; + +#endif /* CONFIG_LIBC_STRERROR_SHORT */ + #define NERRNO_STRS (sizeof(g_errnomap) / sizeof(struct errno_strmap_s)) +#endif /* CONFIG_LIBC_STRERROR */ + /************************************************************************ * Private Functions ************************************************************************/ @@ -210,8 +346,9 @@ static const struct errno_strmap_s g_errnomap[] = * Name: strerror ************************************************************************/ -const char *strerror(int errnum) +FAR const char *strerror(int errnum) { +#ifdef CONFIG_LIBC_STRERROR int ndxlow = 0; int ndxhi = NERRNO_STRS - 1; int ndxmid; @@ -233,5 +370,6 @@ const char *strerror(int errnum) } } while (ndxlow <= ndxhi); +#endif return "Unknown error"; } diff --git a/nuttx/lib/string/lib_strtokr.c b/nuttx/lib/string/lib_strtokr.c index 366a318198..0d12a23815 100644 --- a/nuttx/lib/string/lib_strtokr.c +++ b/nuttx/lib/string/lib_strtokr.c @@ -90,7 +90,7 @@ * ****************************************************************************/ -char *strtok_r(char *str, const char *delim, char **saveptr) +FAR char *strtok_r(FAR char *str, FAR const char *delim, FAR char **saveptr) { char *pbegin; char *pend = NULL; diff --git a/nuttx/lib/time/lib_calendar2utc.c b/nuttx/lib/time/lib_calendar2utc.c index 642e23568a..e80c292fc6 100644 --- a/nuttx/lib/time/lib_calendar2utc.c +++ b/nuttx/lib/time/lib_calendar2utc.c @@ -2,7 +2,7 @@ * lib/time/lib_calendar2utc.c * * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/time/lib_daysbeforemonth.c b/nuttx/lib/time/lib_daysbeforemonth.c index 4312adaba2..8000b0e7a9 100644 --- a/nuttx/lib/time/lib_daysbeforemonth.c +++ b/nuttx/lib/time/lib_daysbeforemonth.c @@ -2,7 +2,7 @@ * lib/time/lib_daysbeforemonth.c * * Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/time/lib_gmtime.c b/nuttx/lib/time/lib_gmtime.c index 7bce8391ed..99afeded9e 100644 --- a/nuttx/lib/time/lib_gmtime.c +++ b/nuttx/lib/time/lib_gmtime.c @@ -2,7 +2,7 @@ * lib/time/lib_gmtime.c * * Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/time/lib_gmtimer.c b/nuttx/lib/time/lib_gmtimer.c index 146939e7a4..ba1c9724f1 100644 --- a/nuttx/lib/time/lib_gmtimer.c +++ b/nuttx/lib/time/lib_gmtimer.c @@ -2,7 +2,7 @@ * lib/time/lib_gmtimer.c * * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/time/lib_isleapyear.c b/nuttx/lib/time/lib_isleapyear.c index 24d7d6153d..966c248e01 100644 --- a/nuttx/lib/time/lib_isleapyear.c +++ b/nuttx/lib/time/lib_isleapyear.c @@ -2,7 +2,7 @@ * lib/time/lib_isleapyear.c * * Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/time/lib_mktime.c b/nuttx/lib/time/lib_mktime.c index 2e8cfc119e..8c17e7c0ab 100644 --- a/nuttx/lib/time/lib_mktime.c +++ b/nuttx/lib/time/lib_mktime.c @@ -2,7 +2,7 @@ * lib/time/lib_mktime.c * * Copyright (C) 2007, 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/time/lib_strftime.c b/nuttx/lib/time/lib_strftime.c index c1ac345ee0..cd0804f55d 100644 --- a/nuttx/lib/time/lib_strftime.c +++ b/nuttx/lib/time/lib_strftime.c @@ -2,7 +2,7 @@ * lib/time/lib_strftime.c * * Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/time/lib_time.c b/nuttx/lib/time/lib_time.c index 02853132b0..106a04c366 100644 --- a/nuttx/lib/time/lib_time.c +++ b/nuttx/lib/time/lib_time.c @@ -2,7 +2,7 @@ * lib/time/lib_time.c * * Copyright (C) 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/unistd/lib_chdir.c b/nuttx/lib/unistd/lib_chdir.c index f79b424ff0..3dd1333cec 100644 --- a/nuttx/lib/unistd/lib_chdir.c +++ b/nuttx/lib/unistd/lib_chdir.c @@ -2,7 +2,7 @@ * lib/unistd/lib_chdir.c * * Copyright (C) 2008-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/unistd/lib_getcwd.c b/nuttx/lib/unistd/lib_getcwd.c index 9bfa102fb6..b94823300b 100644 --- a/nuttx/lib/unistd/lib_getcwd.c +++ b/nuttx/lib/unistd/lib_getcwd.c @@ -2,7 +2,7 @@ * lib/unistd/lib_getcwd.c * * Copyright (C) 2008, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/unistd/lib_getopt.c b/nuttx/lib/unistd/lib_getopt.c index 26a2c7fae4..832d287213 100644 --- a/nuttx/lib/unistd/lib_getopt.c +++ b/nuttx/lib/unistd/lib_getopt.c @@ -2,7 +2,7 @@ * lib/unistd/lib_getopt.c * * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/unistd/lib_getoptargp.c b/nuttx/lib/unistd/lib_getoptargp.c index 4a483c051b..98a4850169 100644 --- a/nuttx/lib/unistd/lib_getoptargp.c +++ b/nuttx/lib/unistd/lib_getoptargp.c @@ -2,7 +2,7 @@ * lib/unistd/lib_getoptargp.c * * Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/unistd/lib_getoptindp.c b/nuttx/lib/unistd/lib_getoptindp.c index 002201aa94..7714f8e708 100644 --- a/nuttx/lib/unistd/lib_getoptindp.c +++ b/nuttx/lib/unistd/lib_getoptindp.c @@ -2,7 +2,7 @@ * lib/unistd/lib_getoptindp.c * * Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/lib/unistd/lib_getoptoptp.c b/nuttx/lib/unistd/lib_getoptoptp.c index 2214f2d141..4805b7ac3b 100644 --- a/nuttx/lib/unistd/lib_getoptoptp.c +++ b/nuttx/lib/unistd/lib_getoptoptp.c @@ -2,7 +2,7 @@ * lib/unistd/lib_getoptoptp.c * * Copyright (C) 2009, 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/sched/Kconfig b/nuttx/sched/Kconfig index 9d7a38549d..37ce0ebd61 100644 --- a/nuttx/sched/Kconfig +++ b/nuttx/sched/Kconfig @@ -202,6 +202,14 @@ config SCHED_ONEXIT_MAX is supported. That number can be increased by defined this setting to the number that you require. +config USER_ENTRYPOINT + string "Appliation entry point" + default "user_start" + ---help--- + 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, USER_ENTRYPOINT defaults to "user_start." + config DISABLE_OS_API bool "Disable NuttX interfaces" default y diff --git a/nuttx/sched/os_bringup.c b/nuttx/sched/os_bringup.c index 646f491583..d6d9431377 100644 --- a/nuttx/sched/os_bringup.c +++ b/nuttx/sched/os_bringup.c @@ -71,12 +71,6 @@ * then the default entry point is user_start. */ -#if defined(CONFIG_NUTTX_KERNEL) && defined(CONFIG_USER_ENTRYPOINT) -# define USER_ENTRYPOINT (main_t)CONFIG_USER_ENTRYPOINT -#else -# define USER_ENTRYPOINT user_start -#endif - /**************************************************************************** * Private Types ****************************************************************************/ @@ -175,11 +169,11 @@ int os_bringup(void) init_taskid = exec_namedapp(CONFIG_BUILTIN_APP_START, argv); #else - /* Start the default application at USER_ENTRYPOINT() */ + /* Start the default application at CONFIG_USER_ENTRYPOINT() */ init_taskid = TASK_CREATE("init", SCHED_PRIORITY_DEFAULT, CONFIG_USERMAIN_STACKSIZE, - (main_t)USER_ENTRYPOINT, (const char **)NULL); + (main_t)CONFIG_USER_ENTRYPOINT, (const char **)NULL); #endif ASSERT(init_taskid != ERROR); return OK; diff --git a/nuttx/sched/sem_holder.c b/nuttx/sched/sem_holder.c index 704ebd1946..1bae37746f 100644 --- a/nuttx/sched/sem_holder.c +++ b/nuttx/sched/sem_holder.c @@ -948,10 +948,11 @@ void sem_restorebaseprio(FAR _TCB *stcb, FAR sem_t *sem) (sem->semcount <= 0 && stcb != NULL)); /* Handler semaphore counts posed from an interrupt handler differently - * from interrupts posted from threads. The priority difference is that + * from interrupts posted from threads. The primary difference is that * if the semaphore is posted from a thread, then the poster thread is * a player in the priority inheritance scheme. The interrupt handler - * externally injects the new count without participated itself. + * externally injects the new count without otherwise participating + * itself. */ if (up_interrupt_context()) diff --git a/nuttx/sched/work_cancel.c b/nuttx/sched/work_cancel.c index 75a6cbc7d8..30b650826b 100644 --- a/nuttx/sched/work_cancel.c +++ b/nuttx/sched/work_cancel.c @@ -104,10 +104,16 @@ int work_cancel(struct work_s *work) flags = irqsave(); if (work->worker != NULL) { - DEBUGASSERT(work->dq.blink || (FAR dq_entry_t *)work == g_work.head); - DEBUGASSERT(work->dq.flink || (FAR dq_entry_t *)work == g_work.tail); - dq_rem((FAR dq_entry_t *)work, &g_work); + /* A little test of the integrity of the work queue */ + DEBUGASSERT(work->dq.flink ||(FAR dq_entry_t *)work == g_work.tail); + DEBUGASSERT(work->dq.blink ||(FAR dq_entry_t *)work == g_work.head); + + /* Remove the entry from the work queue and make sure that it is + * mark as availalbe (i.e., the worker field is nullified). + */ + + dq_rem((FAR dq_entry_t *)work, &g_work); work->worker = NULL; } diff --git a/nuttx/syscall/README.txt b/nuttx/syscall/README.txt index 0b77f50bfc..ed5e6081d7 100644 --- a/nuttx/syscall/README.txt +++ b/nuttx/syscall/README.txt @@ -108,6 +108,10 @@ Each type field has a format as follows: cannot cast a union sigval to a uinptr_t either. Rather, we need to cast a specific union member fieldname to uintptr_t. +NOTE: This CSV file is used both to support the generate of trap information, +but also for the generation of symbol tables. See nuttx/tools/README.txt +and nuttx/lib/README.txt for further information. + Auto-Generated Files ==================== diff --git a/nuttx/tools/Config.mk b/nuttx/tools/Config.mk index 004a7e5bdd..07d88392ec 100644 --- a/nuttx/tools/Config.mk +++ b/nuttx/tools/Config.mk @@ -33,6 +33,9 @@ # ############################################################################ -CONFIG_ARCH := $(shell echo $(CONFIG_ARCH)) -CONFIG_ARCH_CHIP := $(shell echo $(CONFIG_ARCH_CHIP)) -CONFIG_ARCH_BOARD := $(shell echo $(CONFIG_ARCH_BOARD)) +# These are configuration variables that are quoted by configuration tool +# but which must be unquoated when used in the build system. + +CONFIG_ARCH := $(patsubst "%",%,$(strip $(CONFIG_ARCH))) +CONFIG_ARCH_CHIP := $(patsubst "%",%,$(strip $(CONFIG_ARCH_CHIP))) +CONFIG_ARCH_BOARD := $(patsubst "%",%,$(strip $(CONFIG_ARCH_BOARD))) diff --git a/nuttx/tools/Makefile.export b/nuttx/tools/Makefile.export index fa2909972a..ce4842187a 100644 --- a/nuttx/tools/Makefile.export +++ b/nuttx/tools/Makefile.export @@ -2,7 +2,7 @@ # Makefile.export # # Copyright (C) 2011 Gregory Nutt. All rights reserved. -# Author: Gregory Nutt +# Author: Gregory Nutt # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/nuttx/tools/Makefile.host b/nuttx/tools/Makefile.host index cf421aa3bf..33b7aaab2b 100644 --- a/nuttx/tools/Makefile.host +++ b/nuttx/tools/Makefile.host @@ -58,8 +58,13 @@ mkversion: mkconfig.c cfgparser.c # mksyscall - Convert a CSV file into syscall stubs and proxies -mksyscall: mksyscall.c - @gcc $(CFLAGS) -o mksyscall mksyscall.c +mksyscall: mksyscall.c csvparser.c + @gcc $(CFLAGS) -o mksyscall mksyscall.c csvparser.c + +# mksymtab - Convert a CSV file into a symbol table + +mksymtab: mksymtab.c csvparser.c + @gcc $(CFLAGS) -o mksymtab mksymtab.c csvparser.c # bdf-converter - Converts a BDF font to the NuttX font format diff --git a/nuttx/tools/README.txt b/nuttx/tools/README.txt index 39128fa1b0..ae19be2738 100755 --- a/nuttx/tools/README.txt +++ b/nuttx/tools/README.txt @@ -44,6 +44,16 @@ mkexport.sh and Makefile.export Makefile.export is used only by the mkexport.sh script to parse out options from the top-level Make.defs file. +mkfsdata.pl + + This perl script is used to build the "fake" file system and CGI support + as needed for the apps/netutils/webserver. It is currently used only + by the Makefile at apps/examples/uip. That example serves as an example + of how to configure the uIP webserver "fake" file system. + + NOTE: This perl script comes from uIP and was (probably) written + by Adam Dunkels. uIP has a license that is compatible with NuttX. + mkversion.c, cfgparser.c, and cfgparser.h This is C file that is used to build mkversion program. The mkversion @@ -57,7 +67,7 @@ mkversion.c, cfgparser.c, and cfgparser.h .version file in the top level directory into include/nuttx/version.h. version.h provides version information that can be included by C files. -mksyscall.c +mksyscall.c, cvsparser.c, and cvsparser.h This is a C file that is used to build mksyscall program. The mksyscall program is used during the initial NuttX build by the logic in the top- @@ -79,6 +89,26 @@ mksyscall.c accept this CVS file as input and generate all of the required proxy or stub files as output. See syscall/README.txt for additonal information. +mksymtab.c, cvsparser.c, and cvsparser.h + + This is a C file that is used to build symbol tables from common-separated + value (CSV) files. This tool is not used during the NuttX build, but + can be used as needed to generate files. + + USAGE: ./mksymtab + + Where: + + : The path to the input CSV file + : The path to the output symbol table file + -d : Enable debug output + + Example: + + cd nuttx/tools + cat ../syscall/syscall.csv ../lib/lib.csv | sort >tmp.csv + ./mksymtab.exe tmp.csv tmp.c + pic32mx This directory contains build tools used only for PIC32MX platforms diff --git a/nuttx/tools/cfgparser.c b/nuttx/tools/cfgparser.c index 655fac5739..e49b29d5e4 100644 --- a/nuttx/tools/cfgparser.c +++ b/nuttx/tools/cfgparser.c @@ -52,21 +52,41 @@ char line[LINESIZE+1]; /**************************************************************************** + * Private Data + ****************************************************************************/ + +/* These are configuration variable name that are quoted by configuration tool + * but which must be unquoated when used in C code. + */ + +static const char *dequote_list[] = +{ + "CONFIG_USER_ENTRYPOINT", + NULL +}; + + /**************************************************************************** * Private Functions ****************************************************************************/ + /* Skip over any spaces */ + static char *skip_space(char *ptr) { while (*ptr && isspace((int)*ptr)) ptr++; return ptr; } +/* Find the end of a variable string */ + static char *find_name_end(char *ptr) { while (*ptr && (isalnum((int)*ptr) || *ptr == '_')) ptr++; return ptr; } +/* Find the end of a value string */ + static char *find_value_end(char *ptr) { while (*ptr && !isspace((int)*ptr)) @@ -84,6 +104,8 @@ static char *find_value_end(char *ptr) return ptr; } +/* Read the next line from the configuration file */ + static char *read_line(FILE *stream) { char *ptr; @@ -106,31 +128,127 @@ static char *read_line(FILE *stream) } } +/* Parse the line from the configuration file into a variable name + * string and a value string. + */ + static void parse_line(char *ptr, char **varname, char **varval) { - *varname = ptr; + /* Skip over any leading spaces */ + + ptr = skip_space(ptr); + + /* The first no-space is the beginning of the variable name */ + + *varname = skip_space(ptr); *varval = NULL; - ptr = find_name_end(ptr); - if (*ptr && *ptr != '=') + /* Parse to the end of the variable name */ + + ptr = find_name_end(ptr); + + /* An equal sign is expected next, perhaps after some white space */ + + if (*ptr && *ptr != '=') { + /* Some else follows the variable name. Terminate the variable + * name and skip over any spaces. + */ + *ptr = '\0'; ptr = skip_space(ptr + 1); } + /* Verify that the equal sign is present */ + if (*ptr == '=') { + /* Make sure that the variable name is terminated (this was already + * done if the name was followed by white space. + */ + *ptr = '\0'; + + /* The variable value should follow =, perhaps separated by some + * white space. + */ + ptr = skip_space(ptr + 1); if (*ptr) { + /* Yes.. a variable follows. Save the pointer to the start + * of the variable string. + */ + *varval = ptr; + + /* Find the end of the variable string and make sure that it + * is terminated. + */ + ptr = find_value_end(ptr); *ptr = '\0'; } } } +static char *dequote_value(const char *varname, char *varval) +{ + const char **dqnam; + char *dqval = varval; + int len; + + if (dqval) + { + /* Check if the variable name is in the list of strings to be dequoated */ + + for (dqnam = dequote_list; *dqnam; dqnam++) + { + if (strcmp(*dqnam, varname) == 0) + { + break; + } + } + + /* Did we find the variable name in the list of configuration variables + * to be dequoated? + */ + + if (*dqnam) + { + /* Yes... Check if there is a traiing quote */ + + len = strlen(dqval); + if (dqval[len-1] == '"') + { + /* Yes... replace it with a terminator */ + + dqval[len-1] = '\0'; + len--; + } + + /* Is there a leading quote? */ + + if (dqval[0] == '"') + { + /* Yes.. skip over the leading quote */ + + dqval++; + len--; + } + + /* Handle the case where nothing is left after dequoting */ + + if (len < 0) + { + dqval = NULL; + } + } + } + + return dqval; +} + /**************************************************************************** * Public Functions ****************************************************************************/ @@ -141,22 +259,47 @@ void parse_file(FILE *stream) char *varval; char *ptr; + /* Loop until the entire file has been parsed. */ + do { + /* Read the next line from the file */ + ptr = read_line(stream); if (ptr) { + /* Parse the line into a variable and a value field */ + parse_line(ptr, &varname, &varval); + + /* Was a variable name found? */ + if (varname) { + /* Yes.. dequote the value if necessary */ + + varval = dequote_value(varname, varval); + + /* If no value was provided or if the special value 'n' was provided, + * then undefine the configuration variable. + */ + if (!varval || strcmp(varval, "n") == 0) { printf("#undef %s\n", varname); } + + /* Simply define the configuration variable if it has the special + * value "y" + */ + else if (strcmp(varval, "y") == 0) { printf("#define %s 1\n", varname); } + + /* Otherwise, use the value as provided */ + else { printf("#define %s %s\n", varname, varval); diff --git a/nuttx/tools/cfgparser.h b/nuttx/tools/cfgparser.h index 02de42928b..b1c4bae762 100644 --- a/nuttx/tools/cfgparser.h +++ b/nuttx/tools/cfgparser.h @@ -2,7 +2,7 @@ * tools/cfgpaser.h * * Copyright (C) 2007-2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions diff --git a/nuttx/tools/configure.sh b/nuttx/tools/configure.sh index 3aaed06817..8b4a3e4860 100755 --- a/nuttx/tools/configure.sh +++ b/nuttx/tools/configure.sh @@ -2,7 +2,7 @@ # configure.sh # # Copyright (C) 2007, 2008, 2011 Gregory Nutt. All rights reserved. -# Author: Gregory Nutt +# Author: Gregory Nutt # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/nuttx/tools/csvparser.c b/nuttx/tools/csvparser.c new file mode 100644 index 0000000000..739e5e1f8b --- /dev/null +++ b/nuttx/tools/csvparser.c @@ -0,0 +1,205 @@ +/**************************************************************************** + * tools/csvparser.c + * + * Copyright (C) 2011-2012 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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 +#include +#include +#include +#include +#include + +#include "csvparser.h" + +/**************************************************************************** + * Definitions + ****************************************************************************/ + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +bool g_debug; +char g_line[LINESIZE+1]; +char g_parm[MAX_FIELDS][MAX_PARMSIZE]; +int g_lineno; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +static char *skip_space(char *ptr) +{ + while (*ptr && isspace((int)*ptr)) ptr++; + return ptr; +} + +static char *copy_parm(char *src, char *dest) +{ + char *start = src; + int i; + + for (i = 0; i < MAX_PARMSIZE; i++) + { + if (*src == '"') + { + *dest = '\0'; + return src; + } + else if (*src == '\n' || *src == '\0') + { + fprintf(stderr, "%d: Unexpected end of line: \"%s\"\n", g_lineno, start); + exit(4); + } + else + { + *dest++ = *src++; + } + } + + fprintf(stderr, "%d: Parameter too long: \"%s\"\n", g_lineno, start); + exit(3); +} + +static char *find_parm(char *ptr) +{ + char *start = ptr; + + if (*ptr != '"') + { + fprintf(stderr, "%d: I'm confused: \"%s\"\n", g_lineno, start); + exit(5); + } + ptr++; + + ptr = skip_space(ptr); + if (*ptr == '\n' || *ptr == '\0') + { + return NULL; + } + else if (*ptr != ',') + { + fprintf(stderr, "%d: Expected ',': \"%s\"\n", g_lineno, start); + exit(6); + } + ptr++; + + ptr = skip_space(ptr); + if (*ptr != '"') + { + fprintf(stderr, "%d: Expected \": \"%s\"\n", g_lineno, start); + exit(7); + } + ptr++; + + return ptr; +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +char *read_line(FILE *stream) +{ + char *ptr; + + for (;;) + { + g_line[LINESIZE] = '\0'; + if (!fgets(g_line, LINESIZE, stream)) + { + return NULL; + } + else + { + g_lineno++; + if (g_debug) + { + printf("Line: %s\n", g_line); + } + + ptr = skip_space(g_line); + if (*ptr && *ptr != '#' && *ptr != '\n') + { + return ptr; + } + } + } +} + +int parse_csvline(char *ptr) +{ + int nparms; + int i; + + /* Format "arg1","arg2","arg3",... Spaces will be tolerated outside of the + * quotes. Any initial spaces have already been skipped so the first thing + * should be '"'. + */ + + if (*ptr != '"') + { + fprintf(stderr, "%d: Bad line: \"%s\"\n", g_lineno, g_line); + exit(2); + } + + ptr++; + nparms = 0; + + do + { + ptr = copy_parm(ptr, &g_parm[nparms][0]); + nparms++; + ptr = find_parm(ptr); + } + while (ptr); + + if (g_debug) + { + printf("Parameters: %d\n", nparms); + for (i = 0; i < nparms; i++) + { + printf(" Parm%d: \"%s\"\n", i+1, g_parm[i]); + } + } + return nparms; +} diff --git a/nuttx/tools/csvparser.h b/nuttx/tools/csvparser.h new file mode 100644 index 0000000000..872dc3c020 --- /dev/null +++ b/nuttx/tools/csvparser.h @@ -0,0 +1,76 @@ +/**************************************************************************** + * tools/csvparser.h + * + * Copyright (C) 2011-2012 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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. + * + ****************************************************************************/ + +#ifndef __TOOLS_CSVPARSER_H +#define __TOOLS_CSVPARSER_H + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include +#include + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +#define LINESIZE (PATH_MAX > 256 ? PATH_MAX : 256) + +#define MAX_FIELDS 16 +#define MAX_PARMSIZE 128 +#define NAME_INDEX 0 +#define HEADER_INDEX 1 +#define COND_INDEX 2 +#define RETTYPE_INDEX 3 +#define PARM1_INDEX 4 + +/**************************************************************************** + * Public Data + ****************************************************************************/ + +extern bool g_debug; +extern char g_line[LINESIZE+1]; +extern char g_parm[MAX_FIELDS][MAX_PARMSIZE]; +extern int g_lineno; + +/**************************************************************************** + * Public Function Prototypes + ****************************************************************************/ + +char *read_line(FILE *stream); +int parse_csvline(char *ptr); + +#endif /* __TOOLS_CSVPARSER_H */ diff --git a/nuttx/tools/define.sh b/nuttx/tools/define.sh index 8b2b0e364c..c53cb92a83 100755 --- a/nuttx/tools/define.sh +++ b/nuttx/tools/define.sh @@ -2,7 +2,7 @@ # tools/define.sh # # Copyright (C) 2011 Gregory Nutt. All rights reserved. -# Author: Gregory Nutt +# Author: Gregory Nutt # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/nuttx/tools/indent.sh b/nuttx/tools/indent.sh index 938502e0f9..739b791bdc 100755 --- a/nuttx/tools/indent.sh +++ b/nuttx/tools/indent.sh @@ -3,7 +3,7 @@ # tools/indent.sh # # Copyright (C) 2008, 2010 Gregory Nutt. All rights reserved. -# Author: Gregory Nutt +# Author: Gregory Nutt # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/nuttx/tools/link.sh b/nuttx/tools/link.sh index 7927d65c83..da1e6e7ae5 100755 --- a/nuttx/tools/link.sh +++ b/nuttx/tools/link.sh @@ -3,7 +3,7 @@ # tools/link.sh # # Copyright (C) 2008 Gregory Nutt. All rights reserved. -# Author: Gregory Nutt +# Author: Gregory Nutt # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/nuttx/tools/mkconfig.c b/nuttx/tools/mkconfig.c index b3749266c1..2d2fff5c56 100644 --- a/nuttx/tools/mkconfig.c +++ b/nuttx/tools/mkconfig.c @@ -44,7 +44,7 @@ #include "cfgparser.h" /**************************************************************************** - * Definitions + * Pre-processor Definitions ****************************************************************************/ #define DEFCONFIG ".config" @@ -265,6 +265,12 @@ int main(int argc, char **argv, char **envp) printf("# undef CONFIG_DEBUG_SPI\n"); printf("# undef CONFIG_DEBUG_STACK\n"); printf("#endif\n\n"); + printf("/* User entry point. This is provided as a fall-back to keep compatibility\n"); + printf(" * with existing code, for builds which do not define CONFIG_USER_ENTRYPOINT.\n"); + printf(" */\n\n"); + printf("#ifndef CONFIG_USER_ENTRYPOINT\n"); + printf("# define CONFIG_USER_ENTRYPOINT user_start\n"); + printf("#endif\n\n"); printf("#endif /* __INCLUDE_NUTTX_CONFIG_H */\n"); fclose(stream); return 0; diff --git a/nuttx/tools/mkdeps.sh b/nuttx/tools/mkdeps.sh index 6d83f2ca01..acb6001509 100755 --- a/nuttx/tools/mkdeps.sh +++ b/nuttx/tools/mkdeps.sh @@ -3,7 +3,7 @@ # tools/mkdeps.sh # # Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved. -# Author: Gregory Nutt +# Author: Gregory Nutt # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/nuttx/tools/mkfsdata.pl b/nuttx/tools/mkfsdata.pl new file mode 100755 index 0000000000..589ad5f085 --- /dev/null +++ b/nuttx/tools/mkfsdata.pl @@ -0,0 +1,115 @@ +#!/usr/bin/perl +# tools/mkfsdata.pl +# +# Extracted from uIP which has a license that is compatible with NuttX. +# There is no authorship, copyright, or licensing information in the +# original file. Possibly written by Adam Dunkels. +# +# 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. +# + +open(OUTPUT, "> httpd_fsdata.c"); + +chdir("httpd-fs"); + +opendir(DIR, "."); +@files = grep { !/^\./ && !/(CVS|~)/ } readdir(DIR); +closedir(DIR); + +print(OUTPUT "#include \n\n"); +print(OUTPUT "#ifndef NULL\n#define NULL 0\n#endif\n\n"); + +foreach $file (@files) { + + if(-d $file && $file !~ /^\./) { + print "Processing directory $file\n"; + opendir(DIR, $file); + @newfiles = grep { !/^\./ && !/(CVS|~)/ } readdir(DIR); + closedir(DIR); + printf "Adding files @newfiles\n"; + @files = (@files, map { $_ = "$file/$_" } @newfiles); + next; + } +} + +foreach $file (@files) { + if(-f $file) { + + print "Adding file $file\n"; + + open(FILE, $file) || die "Could not open file $file\n"; + + $file =~ s-^-/-; + $fvar = $file; + $fvar =~ s-/-_-g; + $fvar =~ s-\.-_-g; + # for AVR, add PROGMEM here + print(OUTPUT "static const unsigned char data".$fvar."[] =\n"); + print(OUTPUT "{\n /* $file */\n\n "); + for($j = 0; $j < length($file); $j++) { + printf(OUTPUT "%#02x, ", unpack("C", substr($file, $j, 1))); + } + printf(OUTPUT "0x00,\n "); + + $i = 0; + while(read(FILE, $data, 1)) { + printf(OUTPUT "%#02x, ", unpack("C", $data)); + $i++; + if($i == 10) { + print(OUTPUT "\n"); + $i = 0; + print(OUTPUT " "); + } + } + print(OUTPUT "0x00\n};\n\n"); + close(FILE); + push(@fvars, $fvar); + push(@pfiles, $file); + } +} + +for($i = 0; $i < @fvars; $i++) { + $file = $pfiles[$i]; + $fvar = $fvars[$i]; + + if($i == 0) { + $prevfile = "NULL"; + } else { + $prevfile = "file" . $fvars[$i - 1]; + } + if($i == @fvars-1) { + print(OUTPUT "const struct httpd_fsdata_file g_httpdfs_root[] =\n {{$prevfile, data$fvar, "); + } else { + print(OUTPUT "const struct httpd_fsdata_file file".$fvar."[] =\n {{$prevfile, data$fvar, "); + } + print(OUTPUT "data$fvar + ". (length($file) + 1) .", "); + print(OUTPUT "sizeof(data$fvar) - ". (length($file) + 1) ."}};\n\n"); +} + +# print(OUTPUT "#define HTTPD_FS_ROOT file$fvars[$i - 1]\n\n"); +print(OUTPUT "const int g_httpd_numfiles = $i;\n"); diff --git a/nuttx/tools/mknulldeps.sh b/nuttx/tools/mknulldeps.sh index 6dc3e9635b..033205e6fb 100755 --- a/nuttx/tools/mknulldeps.sh +++ b/nuttx/tools/mknulldeps.sh @@ -2,7 +2,7 @@ # tools/mknulldeps.sh # # Copyright (C) 2008 Gregory Nutt. All rights reserved. -# Author: Gregory Nutt +# Author: Gregory Nutt # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/nuttx/tools/mkromfsimg.sh b/nuttx/tools/mkromfsimg.sh index b628d24196..b774119800 100755 --- a/nuttx/tools/mkromfsimg.sh +++ b/nuttx/tools/mkromfsimg.sh @@ -3,7 +3,7 @@ # tools/mkromfsimg.sh # # Copyright (C) 2008, 2011 Gregory Nutt. All rights reserved. -# Author: Gregory Nutt +# Author: Gregory Nutt # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions diff --git a/nuttx/tools/mksymtab.c b/nuttx/tools/mksymtab.c new file mode 100644 index 0000000000..c5a46a92be --- /dev/null +++ b/nuttx/tools/mksymtab.c @@ -0,0 +1,289 @@ +/**************************************************************************** + * tools/mksymtab.c + * + * Copyright (C) 2012 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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 +#include +#include +#include +#include +#include + +#include "csvparser.h" + +/**************************************************************************** + * Definitions + ****************************************************************************/ + +#define MAX_HEADER_FILES 500 +#define SYMTAB_NAME "g_symtab" + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static const char *g_hdrfiles[MAX_HEADER_FILES]; +static int nhdrfiles; + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +static void show_usage(const char *progname) +{ + fprintf(stderr, "USAGE: %s \n\n", progname); + fprintf(stderr, "Where:\n\n"); + fprintf(stderr, " : The path to the input CSV file\n"); + fprintf(stderr, " : The path to the output symbol table file\n"); + fprintf(stderr, " -d : Enable debug output\n"); + exit(EXIT_FAILURE); +} + +static bool check_hdrfile(const char *hdrfile) +{ + int i; + + for (i = 0; i < nhdrfiles; i++) + { + if (strcmp(g_hdrfiles[i], hdrfile) == 0) + { + return true; + } + } + + return false; +} + +static void add_hdrfile(const char *hdrfile) +{ + if (hdrfile && strlen(hdrfile) > 0) + { + if (!check_hdrfile(hdrfile)) + { + if (nhdrfiles > MAX_HEADER_FILES) + { + fprintf(stderr, "ERROR: Too man header files. Increase MAX_HEADER_FILES\n"); + exit(EXIT_FAILURE); + } + + g_hdrfiles[nhdrfiles] = strdup(hdrfile); + nhdrfiles++; + } + } +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +int main(int argc, char **argv, char **envp) +{ + char *csvpath; + char *symtab; + char *nextterm; + char *finalterm; + char *ptr; + bool cond; + FILE *instream; + FILE *outstream; + int ch; + int i; + + /* Parse command line options */ + + g_debug = false; + + while ((ch = getopt(argc, argv, ":d")) > 0) + { + switch (ch) + { + case 'd' : + g_debug = true; + break; + + case '?' : + fprintf(stderr, "Unrecognized option: %c\n", optopt); + show_usage(argv[0]); + + case ':' : + fprintf(stderr, "Missing option argument, option: %c\n", optopt); + show_usage(argv[0]); + + break; + fprintf(stderr, "Unexpected option: %c\n", ch); + show_usage(argv[0]); + } + } + + if (optind >= argc) + { + fprintf(stderr, "Missing and \n"); + show_usage(argv[0]); + } + + csvpath = argv[optind]; + optind++; + + if (optind >= argc) + { + fprintf(stderr, "Missing \n"); + show_usage(argv[0]); + } + + symtab = argv[optind]; + optind++; + + if (optind < argc) + { + fprintf(stderr, "Unexpected garbage at the end of the line\n"); + show_usage(argv[0]); + } + + /* Open the CSV file for reading */ + + instream = fopen(csvpath, "r"); + if (!instream) + { + fprintf(stderr, "open %s failed: %s\n", csvpath, strerror(errno)); + exit(EXIT_FAILURE); + } + + /* Open the Symbol table file for writing */ + + outstream = fopen(symtab, "w"); + if (!outstream) + { + fprintf(stderr, "open %s failed: %s\n", csvpath, strerror(errno)); + exit(EXIT_FAILURE); + } + + /* Get all of the header files that we need to include */ + + while ((ptr = read_line(instream)) != NULL) + { + /* Parse the line from the CVS file */ + + int nargs = parse_csvline(ptr); + if (nargs < PARM1_INDEX) + { + fprintf(stderr, "Only %d arguments found: %s\n", nargs, g_line); + exit(EXIT_FAILURE); + } + + /* Add the header file to the list of header files we need to include */ + + add_hdrfile(g_parm[HEADER_INDEX]); + } + + /* Back to the beginning */ + + rewind(instream); + + /* Output up-front file boilerplate */ + + fprintf(outstream, "/* %s: Auto-generated symbol table. Do not edit */\n\n", symtab); + fprintf(outstream, "#include \n"); + fprintf(outstream, "#include \n\n"); + + /* Output all of the require header files */ + + for (i = 0; i < nhdrfiles; i++) + { + fprintf(outstream, "#include <%s>\n", g_hdrfiles[i]); + } + + /* Now the symbol table itself */ + + fprintf(outstream, "\nstruct symtab_s %s[] =\n", SYMTAB_NAME); + fprintf(outstream, "{\n"); + + /* Parse each line in the CVS file */ + + nextterm = ""; + finalterm = ""; + + while ((ptr = read_line(instream)) != NULL) + { + /* Parse the line from the CVS file */ + + int nargs = parse_csvline(ptr); + if (nargs < PARM1_INDEX) + { + fprintf(stderr, "Only %d arguments found: %s\n", nargs, g_line); + exit(EXIT_FAILURE); + } + + /* Output any conditional compilation */ + + cond = (g_parm[COND_INDEX] && strlen(g_parm[COND_INDEX]) > 0); + if (cond) + { + fprintf(outstream, "%s#if %s\n", nextterm, g_parm[COND_INDEX]); + nextterm = ""; + } + + /* Output the symbol table entry */ + + fprintf(outstream, "%s { \"%s\", (FAR const void *)%s }", + nextterm, g_parm[NAME_INDEX], g_parm[NAME_INDEX]); + + if (cond) + { + nextterm = ",\n#endif\n"; + finalterm = "\n#endif\n"; + } + else + { + nextterm = ",\n"; + finalterm = "\n"; + } + } + + fprintf(outstream, "%s};\n\n", finalterm); + fprintf(outstream, "#define NSYMBOLS (sizeof(%s) / sizeof (struct symtab_s))\n", SYMTAB_NAME); + + /* Close the CSV and symbol table files and exit */ + + fclose(instream); + fclose(outstream); + return EXIT_SUCCESS; +} diff --git a/nuttx/tools/mksyscall.c b/nuttx/tools/mksyscall.c index a8f2cf99b7..a75e82d280 100644 --- a/nuttx/tools/mksyscall.c +++ b/nuttx/tools/mksyscall.c @@ -1,8 +1,8 @@ /**************************************************************************** * tools/mksyscall.c * - * Copyright (C) 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Copyright (C) 2011-2012 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -41,174 +41,26 @@ #include #include #include -#include -#include #include -#include #include +#include "csvparser.h" + /**************************************************************************** * Definitions ****************************************************************************/ -#define LINESIZE (PATH_MAX > 256 ? PATH_MAX : 256) - -#define MAX_FIELDS 16 -#define MAX_PARMSIZE 128 -#define NAME_INDEX 0 -#define HEADER_INDEX 1 -#define COND_INDEX 2 -#define RETTYPE_INDEX 3 -#define PARM1_INDEX 4 - /**************************************************************************** * Private Data ****************************************************************************/ -static bool g_debug; static bool g_inline; -static char g_line[LINESIZE+1]; -static char g_parm[MAX_FIELDS][MAX_PARMSIZE]; static FILE *g_stubstream; -static int g_lineno; /**************************************************************************** * Private Functions ****************************************************************************/ -static char *skip_space(char *ptr) -{ - while (*ptr && isspace(*ptr)) ptr++; - return ptr; -} - -static char *read_line(FILE *stream) -{ - char *ptr; - - for (;;) - { - g_line[LINESIZE] = '\0'; - if (!fgets(g_line, LINESIZE, stream)) - { - return NULL; - } - else - { - g_lineno++; - if (g_debug) - { - printf("Line: %s\n", g_line); - } - - ptr = skip_space(g_line); - if (*ptr && *ptr != '#' && *ptr != '\n') - { - return ptr; - } - } - } -} - -static char *copy_parm(char *src, char *dest) -{ - char *start = src; - int i; - - for (i = 0; i < MAX_PARMSIZE; i++) - { - if (*src == '"') - { - *dest = '\0'; - return src; - } - else if (*src == '\n' || *src == '\0') - { - fprintf(stderr, "%d: Unexpected end of line: \"%s\"\n", g_lineno, start); - exit(4); - } - else - { - *dest++ = *src++; - } - } - - fprintf(stderr, "%d: Parameter too long: \"%s\"\n", g_lineno, start); - exit(3); -} - -static char *find_parm(char *ptr) -{ - char *start = ptr; - - if (*ptr != '"') - { - fprintf(stderr, "%d: I'm confused: \"%s\"\n", g_lineno, start); - exit(5); - } - ptr++; - - ptr = skip_space(ptr); - if (*ptr == '\n' || *ptr == '\0') - { - return NULL; - } - else if (*ptr != ',') - { - fprintf(stderr, "%d: Expected ',': \"%s\"\n", g_lineno, start); - exit(6); - } - ptr++; - - ptr = skip_space(ptr); - if (*ptr != '"') - { - fprintf(stderr, "%d: Expected \": \"%s\"\n", g_lineno, start); - exit(7); - } - ptr++; - - return ptr; -} - -static int parse_csvline(char *ptr) -{ - int nparms; - int i; - - /* Format "arg1","arg2","arg3",... Spaces will be tolerated outside of the - * quotes. Any initial spaces have already been skipped so the first thing - * should be '"'. - */ - - if (*ptr != '"') - { - fprintf(stderr, "%d: Bad line: \"%s\"\n", g_lineno, g_line); - exit(2); - } - - ptr++; - nparms = 0; - - do - { - ptr = copy_parm(ptr, &g_parm[nparms][0]); - nparms++; - ptr = find_parm(ptr); - } - while (ptr); - - if (g_debug) - { - printf("Parameters: %d\n", nparms); - for (i = 0; i < nparms; i++) - { - printf(" Parm%d: \"%s\"\n", i+1, g_parm[i]); - } - } - return nparms; -} - static bool is_vararg(const char *type, int index, int nparms) { if (strcmp(type,"...") == 0) @@ -719,6 +571,7 @@ static void show_usage(const char *progname) fprintf(stderr, "\t-p : Generate proxies\n"); fprintf(stderr, "\t-s : Generate stubs\n"); fprintf(stderr, "\t-i : Generate proxies as static inline functions\n"); + fprintf(stderr, "\t-d : Enable debug output\n"); exit(1); } diff --git a/nuttx/tools/mkversion.c b/nuttx/tools/mkversion.c index f2086d13a5..32068df38b 100644 --- a/nuttx/tools/mkversion.c +++ b/nuttx/tools/mkversion.c @@ -2,7 +2,7 @@ * tools/mkversion.c * * Copyright (C) 2011 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt + * Author: Gregory Nutt * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions