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>
18 #include "appl_config.h"
24 #include <rtems/error.h>
25 #include <rtems/monitor.h>
26 #include <rtems/shell.h>
27 #include <rtems/rtl/dlfcn-shell.h>
29 #define USE_RTEMS_TARFS_LOAD
31 #ifdef USE_RTEMS_TARFS_LOAD
32 #include <rtems/imfs.h>
33 #else /*USE_RTEMS_TARFS_LOAD*/
34 #include <rtems/untar.h>
35 #endif /*USE_RTEMS_TARFS_LOAD*/
37 #ifdef CONFIG_OC_APP_APPDL_NET
38 #include <rtems/rtems_bsdnet.h>
40 #include "networkconfig.h"
41 #endif /*CONFIG_OC_APP_APPDL_NET*/
43 #include <sys/types.h>
45 #ifdef CONFIG_OC_APP_APPDL_NET
46 #include <sys/socket.h>
47 #include <netinet/in.h>
48 #include <arpa/inet.h>
49 #endif /*CONFIG_OC_APP_APPDL_NET*/
54 #define CONFIGURE_SHELL_COMMANDS_INIT
55 #define CONFIGURE_SHELL_COMMANDS_ALL
56 #define CONFIGURE_SHELL_COMMANDS_ALL_NETWORKING
57 #define CONFIGURE_SHELL_MOUNT_MSDOS
58 #ifdef CONFIG_OC_APP_APPDL_NET
59 #define CONFIGURE_SHELL_MOUNT_NFS
62 #include <rtems/shellconfig.h>
64 #define BUILD_VERSION_STRING(major,minor,patch) \
65 __XSTRING(major) "." __XSTRING(minor) "." __XSTRING(patch)
67 #define RTEMS_VER_CODE VER_CODE(__RTEMS_MAJOR__ ,__RTEMS_MINOR__ ,__RTEMS_REVISION__)
69 #if RTEMS_VER_CODE < VER_CODE(4,7,99)
70 #define rtems_shell_add_cmd shell_add_cmd
71 #define rtems_shell_init(m_task_name,m_task_stacksize,m_task_priority,m_devname,m_forever,m_wait,m_login_check) \
72 shell_init(m_task_name,m_task_stacksize,m_task_priority,m_devname,B19200 | CS8,m_forever)
73 #elif RTEMS_VER_CODE < VER_CODE(4,9,99)
74 #define rtems_shell_init(m_task_name,m_task_stacksize,m_task_priority,m_devname,m_forever,m_wait,m_login_check) \
75 rtems_shell_init(m_task_name,m_task_stacksize,m_task_priority,m_devname,m_forever,m_wait)
78 extern int _binary_rootfs_tarfile_start;
79 extern int _binary_rootfs_tarfile_size;
80 #define TARFILE_START _binary_rootfs_tarfile_start
81 #define TARFILE_SIZE _binary_rootfs_tarfile_size
83 #ifdef CONFIG_OC_APP_APPDL_TELNETD
84 #include <rtems/telnetd.h>
86 rtems_telnetd_config_table rtems_telnetd_config;
88 void run_telnetd_command(char *device_name, void *arg)
90 rtems_shell_env_t shell_env;
92 rtems_shell_dup_current_env(&shell_env);
93 shell_env.taskname = NULL;
94 shell_env.devname = device_name;
95 rtems_shell_main_loop(&shell_env);
97 #endif /*CONFIG_OC_APP_APPDL_TELNETD*/
100 bad_rtems_status(rtems_status_code status, int fail_level, const char *text)
102 printf("ERROR: %s status %s", text, rtems_status_text(status));
103 status = rtems_task_delete( RTEMS_SELF );
106 int testcmd_forshell(int argc, char **argv)
109 printf("Command %s called\n",argv[0]);
112 printf("%s",argv[i]);
117 typedef int (*call_t)(int argc, char* argv[]);
119 volatile int continue_execution;
121 int dlrun_forshell(int argc, char **argv)
125 char * message = "loaded";
126 char *call_file_name;
127 char *call_symbol = NULL;
132 printf ("file to load not specified\n");
135 call_file_name = argv[1];
138 call_symbol = argv[2];
143 handle = dlopen (call_file_name, RTLD_NOW | RTLD_GLOBAL);
146 printf("dlopen failed: %s\n", dlerror());
150 if (dlinfo (handle, RTLD_DI_UNRESOLVED, &unresolved) < 0)
151 message = "dlinfo error checking unresolved status";
153 message = "has unresolved externals";
155 if (call_symbol == NULL) {
156 printf ("handle: %p %s\n", handle, message);
160 call = dlsym (handle, call_symbol);
163 printf("dlsym failed: symbol %s not found\n", call_symbol);
167 call_ret = call(argc, argv);
173 rtems_task_argument ignored
176 rtems_status_code status;
177 #ifdef USE_RTEMS_TARFS_LOAD
179 #endif /*USE_RTEMS_TARFS_LOAD*/
181 printf( "\n\nRTEMS v "
182 BUILD_VERSION_STRING(__RTEMS_MAJOR__ ,__RTEMS_MINOR__ ,__RTEMS_REVISION__)
185 rtems_monitor_init(RTEMS_MONITOR_SUSPEND|RTEMS_MONITOR_GLOBAL);
186 /*rtems_capture_cli_init (0);*/
188 #ifdef CONFIG_OC_APP_APPDL_NET
189 if (rtems_bsdnet_initialize_network() < 0)
190 printf( "Network initialization failed\n");
192 printf( "Network initialization OK\n");
193 #endif /*CONFIG_OC_APP_APPDL_NET*/
196 printf( "Starting application " SW_VER_ID " v "
197 BUILD_VERSION_STRING(SW_VER_MAJOR,SW_VER_MINOR,SW_VER_PATCH)
200 #ifdef USE_RTEMS_TARFS_LOAD
201 res = rtems_tarfs_load("/", (void*)(&TARFILE_START), (long)&TARFILE_SIZE);
202 printf("rtems_tarfs_load returned %d\n", res);
203 #else /*USE_RTEMS_TARFS_LOAD*/
204 status = Untar_FromMemory((unsigned char *)(&TARFILE_START), (long)&TARFILE_SIZE);
205 printf("Untar_FromMemory returned %s\n",rtems_status_text(status));
206 #endif /*USE_RTEMS_TARFS_LOAD*/
208 Task_1_name = rtems_build_name( 'T', 'S', 'K', '1' );
210 status = rtems_task_create(
213 RTEMS_MINIMUM_STACK_SIZE+0x10000,
214 RTEMS_DEFAULT_MODES /*& ~(RTEMS_TIMESLICE_MASK) | RTEMS_TIMESLICE*/,
215 RTEMS_DEFAULT_ATTRIBUTES,
218 check_rtems_status(status, 0, "rtems_task_create of Task_1");
220 status = rtems_task_start( Task_1_id, Task_1, 0 );
221 check_rtems_status(status, 0, "rtems_task_start of Task_1\n");
223 rtems_shell_init("SHLL",RTEMS_MINIMUM_STACK_SIZE+0x1000,
224 SHELL_TASK_PRIORITY,"/dev/console",1,0, NULL);
226 rtems_shell_add_cmd("testcmd", "app",
227 "test command for shell",
230 rtems_shell_add_cmd("dlrun", "rtl",
231 "runtime load object and run specified function",
234 rtems_shell_add_cmd("dlopen", "rtl",
235 "runtime load object",
238 rtems_shell_add_cmd("dlclose", "rtl",
239 "close reference to loaded object",
242 rtems_shell_add_cmd("dlsym", "rtl",
243 "obtain reference to symbol in loaded object",
246 rtems_shell_add_cmd("dlcall", "rtl",
247 "call function in loaded object",
250 //rtems_monitor_wakeup();
252 #ifdef CONFIG_OC_APP_APPDL_TELNETD
253 rtems_telnetd_config.command = run_telnetd_command;
254 rtems_telnetd_config.arg = NULL;
255 rtems_telnetd_config.priority = SHELL_TASK_PRIORITY;
256 rtems_telnetd_config.stack_size = RTEMS_MINIMUM_STACK_SIZE+0x1000;
257 rtems_telnetd_config.login_check = NULL;
258 rtems_telnetd_config.keep_stdio = 0;
260 status = rtems_telnetd_initialize();
261 check_rtems_status(status, 0, "rtems_telnetd_initialize\n");
262 #endif /*CONFIG_OC_APP_APPDL_TELNETD*/
264 status = rtems_task_delete( RTEMS_SELF );
266 printf( "*** END OF APPDL ***\n" );