3 * This routine is the initialization task for this test program.
4 * It is called from init_exec and has the responsibility for creating
5 * and starting the tasks that make up the test. If the time of day
6 * clock is required for the test, it should also be set to a known
7 * value by this function.
9 * (C) 2015 Pavel Pisa <pisa@cmp.felk.cvut.cz>
11 * Based on RTEMS example test by
12 * On-Line Applications Research Corporation (OAR).
16 #define CONFIGURE_INIT
17 #include <system_def.h>
20 #include "appl_config.h"
24 #include <rtems/error.h>
25 #include <rtems/monitor.h>
26 #include <rtems/shell.h>
28 #define USE_RTEMS_TARFS_LOAD
30 #ifdef USE_RTEMS_TARFS_LOAD
31 #include <rtems/imfs.h>
32 #else /*USE_RTEMS_TARFS_LOAD*/
33 #include <rtems/untar.h>
34 #endif /*USE_RTEMS_TARFS_LOAD*/
36 #ifdef CONFIG_OC_APP_APPDL_NET
37 #include <rtems/rtems_bsdnet.h>
39 #include "networkconfig.h"
40 #endif /*CONFIG_OC_APP_APPDL_NET*/
42 #include <sys/types.h>
44 #ifdef CONFIG_OC_APP_APPDL_NET
45 #include <sys/socket.h>
46 #include <netinet/in.h>
47 #include <arpa/inet.h>
48 #endif /*CONFIG_OC_APP_APPDL_NET*/
53 #define CONFIGURE_SHELL_COMMANDS_INIT
54 #define CONFIGURE_SHELL_COMMANDS_ALL
55 #define CONFIGURE_SHELL_COMMANDS_ALL_NETWORKING
56 #define CONFIGURE_SHELL_MOUNT_MSDOS
57 #define CONFIGURE_SHELL_MOUNT_NFS
59 #include <rtems/shellconfig.h>
61 #define BUILD_VERSION_STRING(major,minor,patch) \
62 __XSTRING(major) "." __XSTRING(minor) "." __XSTRING(patch)
64 #define RTEMS_VER_CODE VER_CODE(__RTEMS_MAJOR__ ,__RTEMS_MINOR__ ,__RTEMS_REVISION__)
66 #if RTEMS_VER_CODE < VER_CODE(4,7,99)
67 #define rtems_shell_add_cmd shell_add_cmd
68 #define rtems_shell_init(m_task_name,m_task_stacksize,m_task_priority,m_devname,m_forever,m_wait,m_login_check) \
69 shell_init(m_task_name,m_task_stacksize,m_task_priority,m_devname,B19200 | CS8,m_forever)
70 #elif RTEMS_VER_CODE < VER_CODE(4,9,99)
71 #define rtems_shell_init(m_task_name,m_task_stacksize,m_task_priority,m_devname,m_forever,m_wait,m_login_check) \
72 rtems_shell_init(m_task_name,m_task_stacksize,m_task_priority,m_devname,m_forever,m_wait)
75 extern int _binary_rootfs_tarfile_start;
76 extern int _binary_rootfs_tarfile_size;
77 #define TARFILE_START _binary_rootfs_tarfile_start
78 #define TARFILE_SIZE _binary_rootfs_tarfile_size
80 #ifdef CONFIG_OC_APP_APPDL_TELNETD
81 #include <rtems/telnetd.h>
83 rtems_telnetd_config_table rtems_telnetd_config;
85 void run_telnetd_command(char *device_name, void *arg)
87 rtems_shell_env_t shell_env;
89 rtems_shell_dup_current_env(&shell_env);
90 shell_env.taskname = NULL;
91 shell_env.devname = device_name;
92 rtems_shell_main_loop(&shell_env);
94 #endif /*CONFIG_OC_APP_APPDL_TELNETD*/
97 bad_rtems_status(rtems_status_code status, int fail_level, const char *text)
99 printf("ERROR: %s status %s", text, rtems_status_text(status));
100 status = rtems_task_delete( RTEMS_SELF );
103 int testcmd_forshell(int argc, char **argv)
106 printf("Command %s called\n",argv[0]);
109 printf("%s",argv[i]);
114 typedef int (*call_t)(int argc, char* argv[]);
116 int dlopen_forshell(int argc, char **argv)
120 char * message = "loaded";
121 char *call_file_name;
122 char *call_symbol = NULL;
127 printf ("file to load not specified\n");
130 call_file_name = argv[1];
133 call_symbol = argv[2];
138 handle = dlopen (call_file_name, RTLD_NOW | RTLD_GLOBAL);
141 printf("dlopen failed: %s\n", dlerror());
145 if (dlinfo (handle, RTLD_DI_UNRESOLVED, &unresolved) < 0)
146 message = "dlinfo error checking unresolved status";
148 message = "has unresolved externals";
150 if (call_symbol == NULL) {
151 printf ("handle: %p %s\n", handle, message);
155 call = dlsym (handle, call_symbol);
158 printf("dlsym failed: symbol %s not found\n", call_symbol);
162 call_ret = call(argc, argv);
168 rtems_task_argument ignored
171 rtems_status_code status;
172 #ifdef USE_RTEMS_TARFS_LOAD
174 #endif /*USE_RTEMS_TARFS_LOAD*/
176 printf( "\n\nRTEMS v "
177 BUILD_VERSION_STRING(__RTEMS_MAJOR__ ,__RTEMS_MINOR__ ,__RTEMS_REVISION__)
180 rtems_monitor_init(RTEMS_MONITOR_SUSPEND|RTEMS_MONITOR_GLOBAL);
181 /*rtems_capture_cli_init (0);*/
183 #ifdef CONFIG_OC_APP_APPDL_NET
184 if (rtems_bsdnet_initialize_network() < 0)
185 printf( "Network initialization failed\n");
187 printf( "Network initialization OK\n");
188 #endif /*CONFIG_OC_APP_APPDL_NET*/
191 printf( "Starting application " SW_VER_ID " v "
192 BUILD_VERSION_STRING(SW_VER_MAJOR,SW_VER_MINOR,SW_VER_PATCH)
195 #ifdef USE_RTEMS_TARFS_LOAD
196 res = rtems_tarfs_load("/", (void*)(&TARFILE_START), (long)&TARFILE_SIZE);
197 printf("rtems_tarfs_load returned %d\n", res);
198 #else /*USE_RTEMS_TARFS_LOAD*/
199 status = Untar_FromMemory((unsigned char *)(&TARFILE_START), (long)&TARFILE_SIZE);
200 printf("Untar_FromMemory returned %s\n",rtems_status_text(status));
201 #endif /*USE_RTEMS_TARFS_LOAD*/
203 Task_1_name = rtems_build_name( 'T', 'S', 'K', '1' );
205 status = rtems_task_create(
208 RTEMS_MINIMUM_STACK_SIZE+0x10000,
209 RTEMS_DEFAULT_MODES /*& ~(RTEMS_TIMESLICE_MASK) | RTEMS_TIMESLICE*/,
210 RTEMS_DEFAULT_ATTRIBUTES,
213 check_rtems_status(status, 0, "rtems_task_create of Task_1");
215 status = rtems_task_start( Task_1_id, Task_1, 0 );
216 check_rtems_status(status, 0, "rtems_task_start of Task_1\n");
218 rtems_shell_init("SHLL",RTEMS_MINIMUM_STACK_SIZE+0x1000,
219 SHELL_TASK_PRIORITY,"/dev/console",1,0, NULL);
221 rtems_shell_add_cmd("testcmd", "app",
222 "test command for shell",
225 rtems_shell_add_cmd("dlopen", "app",
226 "runtime load object and call contained function",
229 //rtems_monitor_wakeup();
231 #ifdef CONFIG_OC_APP_APPDL_TELNETD
232 rtems_telnetd_config.command = run_telnetd_command;
233 rtems_telnetd_config.arg = NULL;
234 rtems_telnetd_config.priority = SHELL_TASK_PRIORITY;
235 rtems_telnetd_config.stack_size = RTEMS_MINIMUM_STACK_SIZE+0x1000;
236 rtems_telnetd_config.login_check = NULL;
237 rtems_telnetd_config.keep_stdio = 0;
239 status = rtems_telnetd_initialize();
240 check_rtems_status(status, 0, "rtems_telnetd_initialize\n");
241 #endif /*CONFIG_OC_APP_APPDL_TELNETD*/
243 status = rtems_task_delete( RTEMS_SELF );
245 printf( "*** END OF APPDL ***\n" );