##// END OF EJS Templates
fsw-0-17...
paul -
r48:069ab1ca807f default
parent child
Show More
@@ -1,248 +1,248
1 1 #############################################################################
2 2 # Makefile for building: bin/fsw
3 # Generated by qmake (2.01a) (Qt 4.8.5) on: Fri Oct 25 11:58:08 2013
3 # Generated by qmake (2.01a) (Qt 4.8.5) on: Fri Oct 25 13:24:46 2013
4 4 # Project: fsw-qt.pro
5 5 # Template: app
6 6 # Command: /usr/bin/qmake-qt4 -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
7 7 #############################################################################
8 8
9 9 ####### Compiler, tools and options
10 10
11 11 CC = sparc-rtems-gcc
12 12 CXX = sparc-rtems-g++
13 DEFINES = -DSW_VERSION_N1=0 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=16 -DPRINT_MESSAGES_ON_CONSOLE
13 DEFINES = -DSW_VERSION_N1=0 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=17 -DPRINT_MESSAGES_ON_CONSOLE
14 14 CFLAGS = -pipe -O3 -Wall $(DEFINES)
15 15 CXXFLAGS = -pipe -O3 -Wall $(DEFINES)
16 16 INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header
17 17 LINK = sparc-rtems-g++
18 18 LFLAGS =
19 19 LIBS = $(SUBLIBS)
20 20 AR = sparc-rtems-ar rcs
21 21 RANLIB =
22 22 QMAKE = /usr/bin/qmake-qt4
23 23 TAR = tar -cf
24 24 COMPRESS = gzip -9f
25 25 COPY = cp -f
26 26 SED = sed
27 27 COPY_FILE = $(COPY)
28 28 COPY_DIR = $(COPY) -r
29 29 STRIP = sparc-rtems-strip
30 30 INSTALL_FILE = install -m 644 -p
31 31 INSTALL_DIR = $(COPY_DIR)
32 32 INSTALL_PROGRAM = install -m 755 -p
33 33 DEL_FILE = rm -f
34 34 SYMLINK = ln -f -s
35 35 DEL_DIR = rmdir
36 36 MOVE = mv -f
37 37 CHK_DIR_EXISTS= test -d
38 38 MKDIR = mkdir -p
39 39
40 40 ####### Output directory
41 41
42 42 OBJECTS_DIR = obj/
43 43
44 44 ####### Files
45 45
46 46 SOURCES = ../src/wf_handler.c \
47 47 ../src/tc_handler.c \
48 48 ../src/fsw_processing.c \
49 49 ../src/fsw_misc.c \
50 50 ../src/fsw_init.c \
51 51 ../src/fsw_globals.c \
52 52 ../src/fsw_spacewire.c \
53 53 ../src/tc_load_dump_parameters.c \
54 54 ../src/tm_lfr_tc_exe.c \
55 55 ../src/tc_acceptance.c
56 56 OBJECTS = obj/wf_handler.o \
57 57 obj/tc_handler.o \
58 58 obj/fsw_processing.o \
59 59 obj/fsw_misc.o \
60 60 obj/fsw_init.o \
61 61 obj/fsw_globals.o \
62 62 obj/fsw_spacewire.o \
63 63 obj/tc_load_dump_parameters.o \
64 64 obj/tm_lfr_tc_exe.o \
65 65 obj/tc_acceptance.o
66 66 DIST = /usr/lib64/qt4/mkspecs/common/unix.conf \
67 67 /usr/lib64/qt4/mkspecs/common/linux.conf \
68 68 /usr/lib64/qt4/mkspecs/common/gcc-base.conf \
69 69 /usr/lib64/qt4/mkspecs/common/gcc-base-unix.conf \
70 70 /usr/lib64/qt4/mkspecs/common/g++-base.conf \
71 71 /usr/lib64/qt4/mkspecs/common/g++-unix.conf \
72 72 /usr/lib64/qt4/mkspecs/qconfig.pri \
73 73 /usr/lib64/qt4/mkspecs/modules/qt_webkit.pri \
74 74 /usr/lib64/qt4/mkspecs/features/qt_functions.prf \
75 75 /usr/lib64/qt4/mkspecs/features/qt_config.prf \
76 76 /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf \
77 77 /usr/lib64/qt4/mkspecs/features/default_pre.prf \
78 78 sparc.pri \
79 79 /usr/lib64/qt4/mkspecs/features/release.prf \
80 80 /usr/lib64/qt4/mkspecs/features/default_post.prf \
81 81 /usr/lib64/qt4/mkspecs/features/shared.prf \
82 82 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
83 83 /usr/lib64/qt4/mkspecs/features/warn_on.prf \
84 84 /usr/lib64/qt4/mkspecs/features/resources.prf \
85 85 /usr/lib64/qt4/mkspecs/features/uic.prf \
86 86 /usr/lib64/qt4/mkspecs/features/yacc.prf \
87 87 /usr/lib64/qt4/mkspecs/features/lex.prf \
88 88 /usr/lib64/qt4/mkspecs/features/include_source_dir.prf \
89 89 fsw-qt.pro
90 90 QMAKE_TARGET = fsw
91 91 DESTDIR = bin/
92 92 TARGET = bin/fsw
93 93
94 94 first: all
95 95 ####### Implicit rules
96 96
97 97 .SUFFIXES: .o .c .cpp .cc .cxx .C
98 98
99 99 .cpp.o:
100 100 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
101 101
102 102 .cc.o:
103 103 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
104 104
105 105 .cxx.o:
106 106 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
107 107
108 108 .C.o:
109 109 $(CXX) -c $(CXXFLAGS) $(INCPATH) -o "$@" "$<"
110 110
111 111 .c.o:
112 112 $(CC) -c $(CFLAGS) $(INCPATH) -o "$@" "$<"
113 113
114 114 ####### Build rules
115 115
116 116 all: Makefile $(TARGET)
117 117
118 118 $(TARGET): $(OBJECTS)
119 119 @$(CHK_DIR_EXISTS) bin/ || $(MKDIR) bin/
120 120 $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS)
121 121
122 122 Makefile: fsw-qt.pro /usr/lib64/qt4/mkspecs/linux-g++/qmake.conf /usr/lib64/qt4/mkspecs/common/unix.conf \
123 123 /usr/lib64/qt4/mkspecs/common/linux.conf \
124 124 /usr/lib64/qt4/mkspecs/common/gcc-base.conf \
125 125 /usr/lib64/qt4/mkspecs/common/gcc-base-unix.conf \
126 126 /usr/lib64/qt4/mkspecs/common/g++-base.conf \
127 127 /usr/lib64/qt4/mkspecs/common/g++-unix.conf \
128 128 /usr/lib64/qt4/mkspecs/qconfig.pri \
129 129 /usr/lib64/qt4/mkspecs/modules/qt_webkit.pri \
130 130 /usr/lib64/qt4/mkspecs/features/qt_functions.prf \
131 131 /usr/lib64/qt4/mkspecs/features/qt_config.prf \
132 132 /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf \
133 133 /usr/lib64/qt4/mkspecs/features/default_pre.prf \
134 134 sparc.pri \
135 135 /usr/lib64/qt4/mkspecs/features/release.prf \
136 136 /usr/lib64/qt4/mkspecs/features/default_post.prf \
137 137 /usr/lib64/qt4/mkspecs/features/shared.prf \
138 138 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \
139 139 /usr/lib64/qt4/mkspecs/features/warn_on.prf \
140 140 /usr/lib64/qt4/mkspecs/features/resources.prf \
141 141 /usr/lib64/qt4/mkspecs/features/uic.prf \
142 142 /usr/lib64/qt4/mkspecs/features/yacc.prf \
143 143 /usr/lib64/qt4/mkspecs/features/lex.prf \
144 144 /usr/lib64/qt4/mkspecs/features/include_source_dir.prf
145 145 $(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
146 146 /usr/lib64/qt4/mkspecs/common/unix.conf:
147 147 /usr/lib64/qt4/mkspecs/common/linux.conf:
148 148 /usr/lib64/qt4/mkspecs/common/gcc-base.conf:
149 149 /usr/lib64/qt4/mkspecs/common/gcc-base-unix.conf:
150 150 /usr/lib64/qt4/mkspecs/common/g++-base.conf:
151 151 /usr/lib64/qt4/mkspecs/common/g++-unix.conf:
152 152 /usr/lib64/qt4/mkspecs/qconfig.pri:
153 153 /usr/lib64/qt4/mkspecs/modules/qt_webkit.pri:
154 154 /usr/lib64/qt4/mkspecs/features/qt_functions.prf:
155 155 /usr/lib64/qt4/mkspecs/features/qt_config.prf:
156 156 /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf:
157 157 /usr/lib64/qt4/mkspecs/features/default_pre.prf:
158 158 sparc.pri:
159 159 /usr/lib64/qt4/mkspecs/features/release.prf:
160 160 /usr/lib64/qt4/mkspecs/features/default_post.prf:
161 161 /usr/lib64/qt4/mkspecs/features/shared.prf:
162 162 /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf:
163 163 /usr/lib64/qt4/mkspecs/features/warn_on.prf:
164 164 /usr/lib64/qt4/mkspecs/features/resources.prf:
165 165 /usr/lib64/qt4/mkspecs/features/uic.prf:
166 166 /usr/lib64/qt4/mkspecs/features/yacc.prf:
167 167 /usr/lib64/qt4/mkspecs/features/lex.prf:
168 168 /usr/lib64/qt4/mkspecs/features/include_source_dir.prf:
169 169 qmake: FORCE
170 170 @$(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro
171 171
172 172 dist:
173 173 @$(CHK_DIR_EXISTS) obj/fsw1.0.0 || $(MKDIR) obj/fsw1.0.0
174 174 $(COPY_FILE) --parents $(SOURCES) $(DIST) obj/fsw1.0.0/ && (cd `dirname obj/fsw1.0.0` && $(TAR) fsw1.0.0.tar fsw1.0.0 && $(COMPRESS) fsw1.0.0.tar) && $(MOVE) `dirname obj/fsw1.0.0`/fsw1.0.0.tar.gz . && $(DEL_FILE) -r obj/fsw1.0.0
175 175
176 176
177 177 clean:compiler_clean
178 178 -$(DEL_FILE) $(OBJECTS)
179 179 -$(DEL_FILE) *~ core *.core
180 180
181 181
182 182 ####### Sub-libraries
183 183
184 184 distclean: clean
185 185 -$(DEL_FILE) $(TARGET)
186 186 -$(DEL_FILE) Makefile
187 187
188 188
189 189 grmon:
190 190 cd bin && C:/opt/grmon-eval-2.0.29b/win32/bin/grmon.exe -uart COM4 -u
191 191
192 192 check: first
193 193
194 194 compiler_rcc_make_all:
195 195 compiler_rcc_clean:
196 196 compiler_uic_make_all:
197 197 compiler_uic_clean:
198 198 compiler_image_collection_make_all: qmake_image_collection.cpp
199 199 compiler_image_collection_clean:
200 200 -$(DEL_FILE) qmake_image_collection.cpp
201 201 compiler_yacc_decl_make_all:
202 202 compiler_yacc_decl_clean:
203 203 compiler_yacc_impl_make_all:
204 204 compiler_yacc_impl_clean:
205 205 compiler_lex_make_all:
206 206 compiler_lex_clean:
207 207 compiler_clean:
208 208
209 209 ####### Compile
210 210
211 211 obj/wf_handler.o: ../src/wf_handler.c
212 212 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/wf_handler.o ../src/wf_handler.c
213 213
214 214 obj/tc_handler.o: ../src/tc_handler.c
215 215 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/tc_handler.o ../src/tc_handler.c
216 216
217 217 obj/fsw_processing.o: ../src/fsw_processing.c ../src/fsw_processing_globals.c
218 218 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_processing.o ../src/fsw_processing.c
219 219
220 220 obj/fsw_misc.o: ../src/fsw_misc.c
221 221 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_misc.o ../src/fsw_misc.c
222 222
223 223 obj/fsw_init.o: ../src/fsw_init.c ../src/fsw_config.c
224 224 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_init.o ../src/fsw_init.c
225 225
226 226 obj/fsw_globals.o: ../src/fsw_globals.c
227 227 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_globals.o ../src/fsw_globals.c
228 228
229 229 obj/fsw_spacewire.o: ../src/fsw_spacewire.c
230 230 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/fsw_spacewire.o ../src/fsw_spacewire.c
231 231
232 232 obj/tc_load_dump_parameters.o: ../src/tc_load_dump_parameters.c
233 233 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/tc_load_dump_parameters.o ../src/tc_load_dump_parameters.c
234 234
235 235 obj/tm_lfr_tc_exe.o: ../src/tm_lfr_tc_exe.c
236 236 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/tm_lfr_tc_exe.o ../src/tm_lfr_tc_exe.c
237 237
238 238 obj/tc_acceptance.o: ../src/tc_acceptance.c
239 239 $(CC) -c $(CFLAGS) $(INCPATH) -o obj/tc_acceptance.o ../src/tc_acceptance.c
240 240
241 241 ####### Install
242 242
243 243 install: FORCE
244 244
245 245 uninstall: FORCE
246 246
247 247 FORCE:
248 248
1 NO CONTENT: modified file, binary diff hidden
@@ -1,74 +1,74
1 1 TEMPLATE = app
2 2 # CONFIG += console v8 sim
3 3 # CONFIG options = verbose *** boot_messages *** debug_messages *** cpu_usage_report *** stack_report *** gsa
4 4 CONFIG += console verbose
5 5 CONFIG -= qt
6 6
7 7 include(./sparc.pri)
8 8
9 9 # flight software version
10 SWVERSION=-0-16
10 SWVERSION=-0-17
11 11 DEFINES += SW_VERSION_N1=0
12 12 DEFINES += SW_VERSION_N2=0
13 13 DEFINES += SW_VERSION_N3=0
14 DEFINES += SW_VERSION_N4=16
14 DEFINES += SW_VERSION_N4=17
15 15
16 16 contains( CONFIG, verbose ) {
17 17 DEFINES += PRINT_MESSAGES_ON_CONSOLE
18 18 }
19 19
20 20 contains( CONFIG, cpu_usage_report ) {
21 21 DEFINES += PRINT_TASK_STATISTICS
22 22 }
23 23
24 24 contains( CONFIG, stack_report ) {
25 25 DEFINES += PRINT_STACK_REPORT
26 26 }
27 27
28 28 contains( CONFIG, boot_messages ) {
29 29 DEFINES += BOOT_MESSAGES
30 30 }
31 31
32 32 #doxygen.target = doxygen
33 33 #doxygen.commands = doxygen ../doc/Doxyfile
34 34 #QMAKE_EXTRA_TARGETS += doxygen
35 35
36 36 TARGET = fsw
37 37 contains( CONFIG, gsa ) {
38 38 DEFINES += GSA
39 39 TARGET = fsw-gsa
40 40 }
41 41
42 42 INCLUDEPATH += \
43 43 ../src \
44 44 ../header
45 45
46 46 SOURCES += \
47 47 ../src/wf_handler.c \
48 48 ../src/tc_handler.c \
49 49 ../src/fsw_processing.c \
50 50 ../src/fsw_misc.c \
51 51 ../src/fsw_init.c \
52 52 ../src/fsw_globals.c \
53 53 ../src/fsw_spacewire.c \
54 54 ../src/tc_load_dump_parameters.c \
55 55 ../src/tm_lfr_tc_exe.c \
56 56 ../src/tc_acceptance.c
57 57
58 58
59 59 HEADERS += \
60 60 ../header/wf_handler.h \
61 61 ../header/tc_handler.h \
62 62 ../header/grlib_regs.h \
63 63 ../header/fsw_processing.h \
64 64 ../header/fsw_params.h \
65 65 ../header/fsw_misc.h \
66 66 ../header/fsw_init.h \
67 67 ../header/ccsds_types.h \
68 68 ../header/fsw_params_processing.h \
69 69 ../header/fsw_spacewire.h \
70 70 ../header/tm_byte_positions.h \
71 71 ../header/tc_load_dump_parameters.h \
72 72 ../header/tm_lfr_tc_exe.h \
73 73 ../header/tc_acceptance.h
74 74
@@ -1,586 +1,590
1 1 /** Functions related to the SpaceWire interface.
2 2 *
3 3 * @file
4 4 * @author P. LEROY
5 5 *
6 6 * A group of functions to handle SpaceWire transmissions:
7 7 * - configuration of the SpaceWire link
8 8 * - SpaceWire related interruption requests processing
9 9 * - transmission of TeleMetry packets by a dedicated RTEMS task
10 10 * - reception of TeleCommands by a dedicated RTEMS task
11 11 *
12 12 */
13 13
14 14 #include "fsw_spacewire.h"
15 15
16 16 char *lstates[6] = {"Error-reset",
17 17 "Error-wait",
18 18 "Ready",
19 19 "Started",
20 20 "Connecting",
21 21 "Run"
22 22 };
23 23
24 24 //***********
25 25 // RTEMS TASK
26 26 rtems_task spiq_task(rtems_task_argument unused)
27 27 {
28 28 /** This RTEMS task is awaken by an rtems_event sent by the interruption subroutine of the SpaceWire driver.
29 29 *
30 30 * @param unused is the starting argument of the RTEMS task
31 31 *
32 32 */
33 33
34 34 rtems_event_set event_out;
35 35 rtems_status_code status;
36 36 int linkStatus;
37 37
38 38 BOOT_PRINTF("in SPIQ *** \n")
39 39
40 40 while(true){
41 41 rtems_event_receive(SPW_LINKERR_EVENT, RTEMS_WAIT, RTEMS_NO_TIMEOUT, &event_out); // wait for an SPW_LINKERR_EVENT
42 PRINTF("in SPIQ *** got SPW_LINKERR_EVENT\n")
42 43
43 44 // [0] SUSPEND RECV ADN SEND TASKS
44 45 rtems_task_suspend( Task_id[ TASKID_RECV ] );
45 46 rtems_task_suspend( Task_id[ TASKID_SEND ] );
46 47
47 48 // [1] CHECK THE LINK
48 49 ioctl(fdSPW, SPACEWIRE_IOCTRL_GET_LINK_STATUS, &linkStatus); // get the link status (1)
49 50 if ( linkStatus != 5) {
50 51 PRINTF1("in SPIQ *** linkStatus %d, wait...\n", linkStatus)
51 52 rtems_task_wake_after( SY_LFR_DPU_CONNECT_TIMEOUT ); // wait SY_LFR_DPU_CONNECT_TIMEOUT 1000 ms
52 53 }
53 54
54 55 // [2] RECHECK THE LINK AFTER SY_LFR_DPU_CONNECT_TIMEOUT
55 56 ioctl(fdSPW, SPACEWIRE_IOCTRL_GET_LINK_STATUS, &linkStatus); // get the link status (2)
56 57 if ( linkStatus != 5 ) // [2.a] not in run state, reset the link
57 58 {
58 59 spacewire_compute_stats_offsets();
59 60 status = spacewire_reset_link( );
60 61 }
61 62 else // [2.b] in run state, start the link
62 63 {
63 64 status = spacewire_stop_start_link( fdSPW ); // start the link
64 65 if ( status != RTEMS_SUCCESSFUL)
65 66 {
66 67 PRINTF1("in SPIQ *** ERR spacewire_start_link %d\n", status)
67 68 }
68 69 }
69 70
70 71 // [3] COMPLETE RECOVERY ACTION AFTER SY_LFR_DPU_CONNECT_ATTEMPTS
71 72 if ( status == RTEMS_SUCCESSFUL ) // [3.a] the link is in run state and has been started successfully
72 73 {
73 status = rtems_task_resume( Task_id[ TASKID_SEND ] );
74 status = rtems_task_restart( Task_id[ TASKID_SEND ], 1 );
74 75 if ( status != RTEMS_SUCCESSFUL ) {
75 76 PRINTF("in SPIQ *** ERR resuming SEND Task\n")
76 77 }
77 status = rtems_task_resume( Task_id[ TASKID_RECV ] );
78 status = rtems_task_restart( Task_id[ TASKID_RECV ], 1 );
78 79 if ( status != RTEMS_SUCCESSFUL ) {
79 80 PRINTF("in SPIQ *** ERR resuming RECV Task\n")
80 81 }
81 82 }
82 83 else // [3.b] the link is not in run state, go in STANDBY mode
83 84 {
84 85 status = enter_mode( LFR_MODE_STANDBY, NULL ); // enter the STANDBY mode
85 86 if ( status != RTEMS_SUCCESSFUL ) {
86 87 PRINTF1("in SPIQ *** ERR enter_mode *** code %d\n", status)
87 88 }
88 // wake the WTDG task
89 // wake the WTDG task up to wait for the link recovery
89 90 status = rtems_event_send ( Task_id[TASKID_WTDG], RTEMS_EVENT_0 );
90 91 rtems_task_suspend( RTEMS_SELF );
91 92 }
92 93 }
93 94 }
94 95
95 96 rtems_task recv_task( rtems_task_argument unused )
96 97 {
97 98 /** This RTEMS task is dedicated to the reception of incoming TeleCommands.
98 99 *
99 100 * @param unused is the starting argument of the RTEMS task
100 101 *
101 102 * The RECV task blocks on a call to the read system call, waiting for incoming SpaceWire data. When unblocked:
102 103 * 1. It reads the incoming data.
103 104 * 2. Launches the acceptance procedure.
104 105 * 3. If the Telecommand is valid, sends it to a dedicated RTEMS message queue.
105 106 *
106 107 */
107 108
108 109 int len;
109 110 ccsdsTelecommandPacket_t currentTC;
110 111 unsigned char computed_CRC[ 2 ];
111 112 unsigned char currentTC_LEN_RCV[ 2 ];
112 113 unsigned int currentTC_LEN_RCV_AsUnsignedInt;
113 114 unsigned int parserCode;
114 115 rtems_status_code status;
115 116 rtems_id queue_recv_id;
116 117 rtems_id queue_send_id;
117 118
118 119 initLookUpTableForCRC(); // the table is used to compute Cyclic Redundancy Codes
119 120
120 121 status = rtems_message_queue_ident( misc_name[QUEUE_RECV], 0, &queue_recv_id );
121 122 if (status != RTEMS_SUCCESSFUL)
122 123 {
123 124 PRINTF1("in RECV *** ERR getting QUEUE_RECV id, %d\n", status)
124 125 }
125 126
126 127 status = rtems_message_queue_ident( misc_name[QUEUE_SEND], 0, &queue_send_id );
127 128 if (status != RTEMS_SUCCESSFUL)
128 129 {
129 130 PRINTF1("in RECV *** ERR getting QUEUE_SEND id, %d\n", status)
130 131 }
131 132
132 133 BOOT_PRINTF("in RECV *** \n")
133 134
134 135 while(1)
135 136 {
136 137 len = read( fdSPW, (char*) &currentTC, CCSDS_TC_PKT_MAX_SIZE ); // the call to read is blocking
137 138 if (len == -1){ // error during the read call
138 139 PRINTF1("in RECV *** last read call returned -1, ERRNO %d\n", errno)
139 140 }
140 141 else {
141 142 if ( (len+1) < CCSDS_TC_PKT_MIN_SIZE ) {
142 143 PRINTF("in RECV *** packet lenght too short\n")
143 144 }
144 145 else {
145 146 currentTC_LEN_RCV_AsUnsignedInt = (unsigned int) (len - CCSDS_TC_TM_PACKET_OFFSET - 3); // => -3 is for Prot ID, Reserved and User App bytes
146 147 currentTC_LEN_RCV[ 0 ] = (unsigned char) (currentTC_LEN_RCV_AsUnsignedInt >> 8);
147 148 currentTC_LEN_RCV[ 1 ] = (unsigned char) (currentTC_LEN_RCV_AsUnsignedInt );
148 149 // CHECK THE TC
149 150 parserCode = tc_parser( &currentTC, currentTC_LEN_RCV_AsUnsignedInt, computed_CRC ) ;
150 151 if ( (parserCode == ILLEGAL_APID) || (parserCode == WRONG_LEN_PACKET) || (parserCode == INCOR_CHECKSUM)
151 152 | (parserCode == ILL_TYPE) || (parserCode == ILL_SUBTYPE) || (parserCode == WRONG_APP_DATA) )
152 153 { // send TM_LFR_TC_EXE_CORRUPTED
153 154 send_tm_lfr_tc_exe_corrupted( &currentTC, queue_send_id, computed_CRC, currentTC_LEN_RCV );
154 155 }
155 156 else
156 157 { // send valid TC to the action launcher
157 158 status = rtems_message_queue_send( queue_recv_id, &currentTC,
158 159 currentTC_LEN_RCV_AsUnsignedInt + CCSDS_TC_TM_PACKET_OFFSET + 3);
159 160 }
160 161 }
161 162 }
162 163 }
163 164 }
164 165
165 166 rtems_task send_task( rtems_task_argument argument)
166 167 {
167 168 /** This RTEMS task is dedicated to the transmission of TeleMetry packets.
168 169 *
169 170 * @param unused is the starting argument of the RTEMS task
170 171 *
171 172 * The SEND task waits for a message to become available in the dedicated RTEMS queue. When a message arrives:
172 173 * - if the first byte is equal to CCSDS_DESTINATION_ID, the message is sent as is using the write system call.
173 174 * - if the first byte is not equal to CCSDS_DESTINATION_ID, the message is handled as a spw_ioctl_pkt_send. After
174 175 * analyzis, the packet is sent either using the write system call or using the ioctl call SPACEWIRE_IOCTRL_SEND, depending on the
175 176 * data it contains.
176 177 *
177 178 */
178 179
179 180 rtems_status_code status; // RTEMS status code
180 181 char incomingData[ACTION_MSG_PKTS_MAX_SIZE]; // incoming data buffer
181 182 spw_ioctl_pkt_send *spw_ioctl_send;
182 183 size_t size; // size of the incoming TC packet
183 184 u_int32_t count;
184 185 rtems_id queue_id;
185 186
186 187 status = rtems_message_queue_ident( misc_name[QUEUE_SEND], 0, &queue_id );
187 188 if (status != RTEMS_SUCCESSFUL)
188 189 {
189 190 PRINTF1("in SEND *** ERR getting queue id, %d\n", status)
190 191 }
191 192
192 193 BOOT_PRINTF("in SEND *** \n")
193 194
194 195 while(1)
195 196 {
196 197 status = rtems_message_queue_receive( queue_id, incomingData, &size,
197 198 RTEMS_WAIT, RTEMS_NO_TIMEOUT );
198 199
199 200 if (status!=RTEMS_SUCCESSFUL)
200 201 {
201 202 PRINTF1("in SEND *** (1) ERR = %d\n", status)
202 203 }
203 204 else
204 205 {
205 206 if ( incomingData[0] == CCSDS_DESTINATION_ID) // the incoming message is a ccsds packet
206 207 {
207 208 status = write( fdSPW, incomingData, size );
208 209 if (status == -1){
209 PRINTF2("in SEND *** (2.a) ERR = %d, size = %d\n", status, size)
210 PRINTF2("in SEND *** (2.a) ERRNO = %d, size = %d\n", errno, size)
210 211 }
211 212 }
212 213 else // the incoming message is a spw_ioctl_pkt_send structure
213 214 {
214 215 spw_ioctl_send = (spw_ioctl_pkt_send*) incomingData;
215 216 if (spw_ioctl_send->hlen == 0)
216 217 {
217 218 status = write( fdSPW, spw_ioctl_send->data, spw_ioctl_send->dlen );
218 219 if (status == -1){
219 PRINTF2("in SEND *** (2.b) ERR = %d, dlen = %d\n", status, spw_ioctl_send->dlen)
220 PRINTF2("in SEND *** (2.b) ERRNO = %d, dlen = %d\n", errno, spw_ioctl_send->dlen)
220 221 }
221 222 }
222 223 else
223 224 {
224 225 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, spw_ioctl_send );
225 226 if (status == -1){
226 PRINTF2("in SEND *** (2.c) ERR = %d, dlen = %d\n", status, spw_ioctl_send->dlen)
227 PRINTF2("in SEND *** (2.c) ERRNO = %d, dlen = %d\n", errno, spw_ioctl_send->dlen)
227 228 PRINTF1(" hlen = %d\n", spw_ioctl_send->hlen)
228 229 }
229 230 }
230 231 }
231 232 }
232 233
233 234 status = rtems_message_queue_get_number_pending( queue_id, &count );
234 235 if (status != RTEMS_SUCCESSFUL)
235 236 {
236 237 PRINTF1("in SEND *** (3) ERR = %d\n", status)
237 238 }
238 239 else
239 240 {
240 241 if (count > maxCount)
241 242 {
242 243 maxCount = count;
243 244 }
244 245 }
245 246 }
246 247 }
247 248
248 249 rtems_task wtdg_task( rtems_task_argument argument )
249 250 {
250 251 rtems_event_set event_out;
251 252 rtems_status_code status;
252 253 int linkStatus;
253 254
254 255 BOOT_PRINTF("in WTDG ***\n")
255 256
256 257 while(1)
257 258 {
258 259 // wait for an RTEMS_EVENT
259 260 rtems_event_receive( RTEMS_EVENT_0,
260 261 RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out);
261 262 PRINTF("in WTDG *** wait for the link\n")
262 263 ioctl(fdSPW, SPACEWIRE_IOCTRL_GET_LINK_STATUS, &linkStatus); // get the link status
263 264 while( linkStatus != 5) // wait for the link
264 265 {
265 266 rtems_task_wake_after( 10 );
266 267 ioctl(fdSPW, SPACEWIRE_IOCTRL_GET_LINK_STATUS, &linkStatus); // get the link status
267 268 }
268 269
269 270 status = spacewire_stop_start_link( fdSPW );
270 271
271 272 if (status != RTEMS_SUCCESSFUL)
272 273 {
273 274 PRINTF1("in WTDG *** ERR link not started %d\n", status)
274 275 }
275 276 else
276 277 {
277 278 PRINTF("in WTDG *** OK link started\n")
278 279 }
279 280
280 281 // restart the SPIQ task
281 rtems_task_restart( Task_id[TASKID_SPIQ], 1 );
282 status = rtems_task_restart( Task_id[TASKID_SPIQ], 1 );
283 if ( status != RTEMS_SUCCESSFUL ) {
284 PRINTF("in SPIQ *** ERR restarting SPIQ Task\n")
285 }
282 286
283 // resume RECV and SEND
287 // restart RECV and SEND
284 288 status = rtems_task_restart( Task_id[ TASKID_SEND ], 1 );
285 289 if ( status != RTEMS_SUCCESSFUL ) {
286 PRINTF("in SPIQ *** ERR resuming SEND Task\n")
290 PRINTF("in SPIQ *** ERR restarting SEND Task\n")
287 291 }
288 292 status = rtems_task_restart( Task_id[ TASKID_RECV ], 1 );
289 293 if ( status != RTEMS_SUCCESSFUL ) {
290 PRINTF("in SPIQ *** ERR resuming RECV Task\n")
294 PRINTF("in SPIQ *** ERR restarting RECV Task\n")
291 295 }
292 296 }
293 297 }
294 298
295 299 //****************
296 300 // OTHER FUNCTIONS
297 301 int spacewire_open_link( void )
298 302 {
299 303 /** This function opens the SpaceWire link.
300 304 *
301 305 * @return a valid file descriptor in case of success, -1 in case of a failure
302 306 *
303 307 */
304 308 rtems_status_code status;
305 309
306 310 fdSPW = open(GRSPW_DEVICE_NAME, O_RDWR); // open the device. the open call resets the hardware
307 311 if ( fdSPW < 0 ) {
308 312 PRINTF1("ERR *** in configure_spw_link *** error opening "GRSPW_DEVICE_NAME" with ERR %d\n", errno)
309 313 }
310 314 else
311 315 {
312 316 status = RTEMS_SUCCESSFUL;
313 317 }
314 318
315 319 return status;
316 320 }
317 321
318 322 int spacewire_start_link( int fd )
319 323 {
320 324 rtems_status_code status;
321 325
322 326 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_START, -1); // returns successfuly if the link is started
323 327 // -1 default hardcoded driver timeout
324 328
325 329 return status;
326 330 }
327 331
328 332 int spacewire_stop_start_link( int fd )
329 333 {
330 334 rtems_status_code status;
331 335
332 336 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_STOP); // start fails if link pDev->running != 0
333 337 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_START, -1); // returns successfuly if the link is started
334 338 // -1 default hardcoded driver timeout
335 339
336 340 return status;
337 341 }
338 342
339 343 int spacewire_configure_link( int fd )
340 344 {
341 345 /** This function configures the SpaceWire link.
342 346 *
343 347 * @return GR-RTEMS-DRIVER directive status codes:
344 348 * - 22 EINVAL - Null pointer or an out of range value was given as the argument.
345 349 * - 16 EBUSY - Only used for SEND. Returned when no descriptors are avialble in non-blocking mode.
346 350 * - 88 ENOSYS - Returned for SET_DESTKEY if RMAP command handler is not available or if a non-implemented call is used.
347 351 * - 116 ETIMEDOUT - REturned for SET_PACKET_SIZE and START if the link could not be brought up.
348 352 * - 12 ENOMEM - Returned for SET_PACKETSIZE if it was unable to allocate the new buffers.
349 353 * - 5 EIO - Error when writing to grswp hardware registers.
350 354 * - 2 ENOENT - No such file or directory
351 355 */
352 356
353 357 rtems_status_code status;
354 358
355 359 spacewire_set_NP(1, REGS_ADDR_GRSPW); // [N]o [P]ort force
356 360 spacewire_set_RE(1, REGS_ADDR_GRSPW); // [R]MAP [E]nable, the dedicated call seems to break the no port force configuration
357 361
358 362 status = ioctl(fd, SPACEWIRE_IOCTRL_SET_RXBLOCK, 1); // sets the blocking mode for reception
359 363 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_RXBLOCK\n")
360 364 //
361 365 status = ioctl(fd, SPACEWIRE_IOCTRL_SET_EVENT_ID, Task_id[TASKID_SPIQ]); // sets the task ID to which an event is sent when a
362 366 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_EVENT_ID\n") // link-error interrupt occurs
363 367 //
364 368 status = ioctl(fd, SPACEWIRE_IOCTRL_SET_DISABLE_ERR, 0); // automatic link-disabling due to link-error interrupts
365 369 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_DISABLE_ERR\n")
366 370 //
367 371 status = ioctl(fd, SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ, 1); // sets the link-error interrupt bit
368 372 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_LINK_ERR_IRQ\n")
369 373 //
370 374 status = ioctl(fd, SPACEWIRE_IOCTRL_SET_TXBLOCK, 0); // transmission blocks
371 375 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TXBLOCK\n")
372 376 //
373 status = ioctl(fd, SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL, 0); // transmission blocks on full
377 status = ioctl(fd, SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL, 1); // transmission blocks when no transmission descriptor is available
374 378 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TXBLOCK_ON_FULL\n")
375 379 //
376 380 status = ioctl(fd, SPACEWIRE_IOCTRL_SET_TCODE_CTRL, 0x0909); // [Time Rx : Time Tx : Link error : Tick-out IRQ]
377 381 if (status!=RTEMS_SUCCESSFUL) PRINTF("in SPIQ *** Error SPACEWIRE_IOCTRL_SET_TCODE_CTRL,\n")
378 382
379 383 return status;
380 384 }
381 385
382 386 int spacewire_reset_link( void )
383 387 {
384 388 /** This function is executed by the SPIQ rtems_task wehn it has been awaken by an interruption raised by the SpaceWire driver.
385 389 *
386 390 * @return RTEMS directive status code:
387 391 * - RTEMS_UNSATISFIED is returned is the link is not in the running state after 10 s.
388 392 * - RTEMS_SUCCESSFUL is returned if the link is up before the timeout.
389 393 *
390 394 */
391 395
392 396 rtems_status_code status_spw;
393 397 int i;
394 398
395 399 for ( i=0; i<SY_LFR_DPU_CONNECT_ATTEMPT; i++ )
396 400 {
397 401 PRINTF1("in spacewire_reset_link *** link recovery, try %d\n", i);
398 402
399 403 // CLOSING THE DRIVER AT THIS POINT WILL MAKE THE SEND TASK BLOCK THE SYSTEM
400 404
401 405 status_spw = spacewire_stop_start_link( fdSPW );
402 406 if ( status_spw != RTEMS_SUCCESSFUL )
403 407 {
404 408 PRINTF1("in spacewire_reset_link *** ERR spacewire_start_link code %d\n", status_spw)
405 409 }
406 410
407 411 if ( status_spw == RTEMS_SUCCESSFUL)
408 412 {
409 413 break;
410 414 }
411 415 }
412 416
413 417 return status_spw;
414 418 }
415 419
416 420 void spacewire_set_NP( unsigned char val, unsigned int regAddr ) // [N]o [P]ort force
417 421 {
418 422 /** This function sets the [N]o [P]ort force bit of the GRSPW control register.
419 423 *
420 424 * @param val is the value, 0 or 1, used to set the value of the NP bit.
421 425 * @param regAddr is the address of the GRSPW control register.
422 426 *
423 427 * NP is the bit 20 of the GRSPW control register.
424 428 *
425 429 */
426 430
427 431 unsigned int *spwptr = (unsigned int*) regAddr;
428 432
429 433 if (val == 1) {
430 434 *spwptr = *spwptr | 0x00100000; // [NP] set the No port force bit
431 435 }
432 436 if (val== 0) {
433 437 *spwptr = *spwptr & 0xffdfffff;
434 438 }
435 439 }
436 440
437 441 void spacewire_set_RE( unsigned char val, unsigned int regAddr ) // [R]MAP [E]nable
438 442 {
439 443 /** This function sets the [R]MAP [E]nable bit of the GRSPW control register.
440 444 *
441 445 * @param val is the value, 0 or 1, used to set the value of the RE bit.
442 446 * @param regAddr is the address of the GRSPW control register.
443 447 *
444 448 * RE is the bit 16 of the GRSPW control register.
445 449 *
446 450 */
447 451
448 452 unsigned int *spwptr = (unsigned int*) regAddr;
449 453
450 454 if (val == 1)
451 455 {
452 456 *spwptr = *spwptr | 0x00010000; // [RE] set the RMAP Enable bit
453 457 }
454 458 if (val== 0)
455 459 {
456 460 *spwptr = *spwptr & 0xfffdffff;
457 461 }
458 462 }
459 463
460 464 void spacewire_compute_stats_offsets( void )
461 465 {
462 466 /** This function computes the SpaceWire statistics offsets in case of a SpaceWire related interruption raising.
463 467 *
464 468 * The offsets keep a record of the statistics in case of a reset of the statistics. They are added to the current statistics
465 469 * to keep the counters consistent even after a reset of the SpaceWire driver (the counter are set to zero by the driver when it
466 470 * during the open systel call).
467 471 *
468 472 */
469 473
470 474 spw_stats spacewire_stats_grspw;
471 475 rtems_status_code status;
472 476
473 477 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_GET_STATISTICS, &spacewire_stats_grspw );
474 478
475 479 spacewire_stats_backup.packets_received = spacewire_stats_grspw.packets_received
476 480 + spacewire_stats.packets_received;
477 481 spacewire_stats_backup.packets_sent = spacewire_stats_grspw.packets_sent
478 482 + spacewire_stats.packets_sent;
479 483 spacewire_stats_backup.parity_err = spacewire_stats_grspw.parity_err
480 484 + spacewire_stats.parity_err;
481 485 spacewire_stats_backup.disconnect_err = spacewire_stats_grspw.disconnect_err
482 486 + spacewire_stats.disconnect_err;
483 487 spacewire_stats_backup.escape_err = spacewire_stats_grspw.escape_err
484 488 + spacewire_stats.escape_err;
485 489 spacewire_stats_backup.credit_err = spacewire_stats_grspw.credit_err
486 490 + spacewire_stats.credit_err;
487 491 spacewire_stats_backup.write_sync_err = spacewire_stats_grspw.write_sync_err
488 492 + spacewire_stats.write_sync_err;
489 493 spacewire_stats_backup.rx_rmap_header_crc_err = spacewire_stats_grspw.rx_rmap_header_crc_err
490 494 + spacewire_stats.rx_rmap_header_crc_err;
491 495 spacewire_stats_backup.rx_rmap_data_crc_err = spacewire_stats_grspw.rx_rmap_data_crc_err
492 496 + spacewire_stats.rx_rmap_data_crc_err;
493 497 spacewire_stats_backup.early_ep = spacewire_stats_grspw.early_ep
494 498 + spacewire_stats.early_ep;
495 499 spacewire_stats_backup.invalid_address = spacewire_stats_grspw.invalid_address
496 500 + spacewire_stats.invalid_address;
497 501 spacewire_stats_backup.rx_eep_err = spacewire_stats_grspw.rx_eep_err
498 502 + spacewire_stats.rx_eep_err;
499 503 spacewire_stats_backup.rx_truncated = spacewire_stats_grspw.rx_truncated
500 504 + spacewire_stats.rx_truncated;
501 505 }
502 506
503 507 void spacewire_update_statistics( void )
504 508 {
505 509 rtems_status_code status;
506 510 spw_stats spacewire_stats_grspw;
507 511
508 512 status = ioctl( fdSPW, SPACEWIRE_IOCTRL_GET_STATISTICS, &spacewire_stats_grspw );
509 513
510 514 spacewire_stats.packets_received = spacewire_stats_backup.packets_received
511 515 + spacewire_stats_grspw.packets_received;
512 516 spacewire_stats.packets_sent = spacewire_stats_backup.packets_sent
513 517 + spacewire_stats_grspw.packets_sent;
514 518 spacewire_stats.parity_err = spacewire_stats_backup.parity_err
515 519 + spacewire_stats_grspw.parity_err;
516 520 spacewire_stats.disconnect_err = spacewire_stats_backup.disconnect_err
517 521 + spacewire_stats_grspw.disconnect_err;
518 522 spacewire_stats.escape_err = spacewire_stats_backup.escape_err
519 523 + spacewire_stats_grspw.escape_err;
520 524 spacewire_stats.credit_err = spacewire_stats_backup.credit_err
521 525 + spacewire_stats_grspw.credit_err;
522 526 spacewire_stats.write_sync_err = spacewire_stats_backup.write_sync_err
523 527 + spacewire_stats_grspw.write_sync_err;
524 528 spacewire_stats.rx_rmap_header_crc_err = spacewire_stats_backup.rx_rmap_header_crc_err
525 529 + spacewire_stats_grspw.rx_rmap_header_crc_err;
526 530 spacewire_stats.rx_rmap_data_crc_err = spacewire_stats_backup.rx_rmap_data_crc_err
527 531 + spacewire_stats_grspw.rx_rmap_data_crc_err;
528 532 spacewire_stats.early_ep = spacewire_stats_backup.early_ep
529 533 + spacewire_stats_grspw.early_ep;
530 534 spacewire_stats.invalid_address = spacewire_stats_backup.invalid_address
531 535 + spacewire_stats_grspw.invalid_address;
532 536 spacewire_stats.rx_eep_err = spacewire_stats_backup.rx_eep_err
533 537 + spacewire_stats_grspw.rx_eep_err;
534 538 spacewire_stats.rx_truncated = spacewire_stats_backup.rx_truncated
535 539 + spacewire_stats_grspw.rx_truncated;
536 540 //spacewire_stats.tx_link_err;
537 541
538 542 //****************************
539 543 // DPU_SPACEWIRE_IF_STATISTICS
540 544 housekeeping_packet.hk_lfr_dpu_spw_pkt_rcv_cnt[0] = (unsigned char) (spacewire_stats.packets_received >> 8);
541 545 housekeeping_packet.hk_lfr_dpu_spw_pkt_rcv_cnt[1] = (unsigned char) (spacewire_stats.packets_received);
542 546 housekeeping_packet.hk_lfr_dpu_spw_pkt_sent_cnt[0] = (unsigned char) (spacewire_stats.packets_sent >> 8);
543 547 housekeeping_packet.hk_lfr_dpu_spw_pkt_sent_cnt[1] = (unsigned char) (spacewire_stats.packets_sent);
544 548 //housekeeping_packet.hk_lfr_dpu_spw_tick_out_cnt;
545 549 //housekeeping_packet.hk_lfr_dpu_spw_last_timc;
546 550
547 551 //******************************************
548 552 // ERROR COUNTERS / SPACEWIRE / LOW SEVERITY
549 553 housekeeping_packet.hk_lfr_dpu_spw_parity = (unsigned char) spacewire_stats.parity_err;
550 554 housekeeping_packet.hk_lfr_dpu_spw_disconnect = (unsigned char) spacewire_stats.disconnect_err;
551 555 housekeeping_packet.hk_lfr_dpu_spw_escape = (unsigned char) spacewire_stats.escape_err;
552 556 housekeeping_packet.hk_lfr_dpu_spw_credit = (unsigned char) spacewire_stats.credit_err;
553 557 housekeeping_packet.hk_lfr_dpu_spw_write_sync = (unsigned char) spacewire_stats.write_sync_err;
554 558 // housekeeping_packet.hk_lfr_dpu_spw_rx_ahb;
555 559 // housekeeping_packet.hk_lfr_dpu_spw_tx_ahb;
556 560 housekeeping_packet.hk_lfr_dpu_spw_header_crc = (unsigned char) spacewire_stats.rx_rmap_header_crc_err;
557 561 housekeeping_packet.hk_lfr_dpu_spw_data_crc = (unsigned char) spacewire_stats.rx_rmap_data_crc_err;
558 562
559 563 //*********************************************
560 564 // ERROR COUNTERS / SPACEWIRE / MEDIUM SEVERITY
561 565 housekeeping_packet.hk_lfr_dpu_spw_early_eop = (unsigned char) spacewire_stats.early_ep;
562 566 housekeeping_packet.hk_lfr_dpu_spw_invalid_addr = (unsigned char) spacewire_stats.invalid_address;
563 567 housekeeping_packet.hk_lfr_dpu_spw_eep = (unsigned char) spacewire_stats.rx_eep_err;
564 568 housekeeping_packet.hk_lfr_dpu_spw_rx_too_big = (unsigned char) spacewire_stats.rx_truncated;
565 569
566 570 }
567 571
568 572 void timecode_irq_handler( void *pDev, void *regs, int minor, unsigned int tc )
569 573 {
570 574 //if (rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_1 ) != RTEMS_SUCCESSFUL) {
571 575 // printf("In timecode_irq_handler *** Error sending event to DUMB\n");
572 576 //}
573 577 }
574 578
575 579 rtems_timer_service_routine user_routine( rtems_id timer_id, void *user_data )
576 580 {
577 581 int linkStatus;
578 582 rtems_status_code status;
579 583
580 584 ioctl(fdSPW, SPACEWIRE_IOCTRL_GET_LINK_STATUS, &linkStatus); // get the link status
581 585
582 586 if ( linkStatus == 5) {
583 587 PRINTF("in spacewire_reset_link *** link is running\n")
584 588 status = RTEMS_SUCCESSFUL;
585 589 }
586 590 }
General Comments 0
You need to be logged in to leave comments. Login now