diff --git a/FSW-qt/Makefile b/FSW-qt/Makefile --- a/FSW-qt/Makefile +++ b/FSW-qt/Makefile @@ -1,21 +1,21 @@ ############################################################################# # Makefile for building: bin/fsw -# Generated by qmake (2.01a) (Qt 4.8.5) on: Tue Jan 21 11:57:00 2014 +# Generated by qmake (2.01a) (Qt 4.8.5) on: Tue Jan 21 15:38:15 2014 # Project: fsw-qt.pro # Template: app -# Command: /usr/bin/qmake-qt4 -spec /usr/lib64/qt4/mkspecs/linux-g++ CONFIG+=debug -o Makefile fsw-qt.pro +# Command: /usr/bin/qmake-qt4 -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro ############################################################################# ####### Compiler, tools and options CC = sparc-rtems-gcc CXX = sparc-rtems-g++ -DEFINES = -DSW_VERSION_N1=1 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=1 -DPRINT_MESSAGES_ON_CONSOLE -DDEBUG_MESSAGES -CFLAGS = -pipe -g -O3 -Wall $(DEFINES) +DEFINES = -DSW_VERSION_N1=1 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=1 -DPRINT_MESSAGES_ON_CONSOLE -DDEBUG_MESSAGES -DVHDL_DEV +CFLAGS = -pipe -O3 -Wall $(DEFINES) CXXFLAGS = -pipe -O3 -Wall $(DEFINES) INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header LINK = sparc-rtems-g++ -LFLAGS = -g +LFLAGS = LIBS = $(SUBLIBS) AR = sparc-rtems-ar rcs RANLIB = @@ -76,7 +76,7 @@ DIST = /usr/lib64/qt4/mkspecs/c /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf \ /usr/lib64/qt4/mkspecs/features/default_pre.prf \ sparc.pri \ - /usr/lib64/qt4/mkspecs/features/debug.prf \ + /usr/lib64/qt4/mkspecs/features/release.prf \ /usr/lib64/qt4/mkspecs/features/default_post.prf \ /usr/lib64/qt4/mkspecs/features/shared.prf \ /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \ @@ -118,7 +118,6 @@ all: Makefile $(TARGET) $(TARGET): $(OBJECTS) @$(CHK_DIR_EXISTS) bin/ || $(MKDIR) bin/ $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJCOMP) $(LIBS) - { test -n "$(DESTDIR)" && DESTDIR="$(DESTDIR)" || DESTDIR=.; } && test $$(gdb --version | sed -e 's,[^0-9]\+\([0-9]\)\.\([0-9]\).*,\1\2,;q') -gt 72 && gdb --nx --batch --quiet -ex 'set confirm off' -ex "save gdb-index $$DESTDIR" -ex quit '$(TARGET)' && test -f $(TARGET).gdb-index && sparc-rtems-objcopy --add-section '.gdb_index=$(TARGET).gdb-index' --set-section-flags '.gdb_index=readonly' '$(TARGET)' '$(TARGET)' && rm -f $(TARGET).gdb-index || true Makefile: fsw-qt.pro /usr/lib64/qt4/mkspecs/linux-g++/qmake.conf /usr/lib64/qt4/mkspecs/common/unix.conf \ /usr/lib64/qt4/mkspecs/common/linux.conf \ @@ -133,7 +132,7 @@ Makefile: fsw-qt.pro /usr/lib64/qt4/mks /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf \ /usr/lib64/qt4/mkspecs/features/default_pre.prf \ sparc.pri \ - /usr/lib64/qt4/mkspecs/features/debug.prf \ + /usr/lib64/qt4/mkspecs/features/release.prf \ /usr/lib64/qt4/mkspecs/features/default_post.prf \ /usr/lib64/qt4/mkspecs/features/shared.prf \ /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf \ @@ -143,7 +142,7 @@ Makefile: fsw-qt.pro /usr/lib64/qt4/mks /usr/lib64/qt4/mkspecs/features/yacc.prf \ /usr/lib64/qt4/mkspecs/features/lex.prf \ /usr/lib64/qt4/mkspecs/features/include_source_dir.prf - $(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ CONFIG+=debug -o Makefile fsw-qt.pro + $(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro /usr/lib64/qt4/mkspecs/common/unix.conf: /usr/lib64/qt4/mkspecs/common/linux.conf: /usr/lib64/qt4/mkspecs/common/gcc-base.conf: @@ -157,7 +156,7 @@ Makefile: fsw-qt.pro /usr/lib64/qt4/mks /usr/lib64/qt4/mkspecs/features/exclusive_builds.prf: /usr/lib64/qt4/mkspecs/features/default_pre.prf: sparc.pri: -/usr/lib64/qt4/mkspecs/features/debug.prf: +/usr/lib64/qt4/mkspecs/features/release.prf: /usr/lib64/qt4/mkspecs/features/default_post.prf: /usr/lib64/qt4/mkspecs/features/shared.prf: /usr/lib64/qt4/mkspecs/features/unix/gdb_dwarf_index.prf: @@ -168,7 +167,7 @@ sparc.pri: /usr/lib64/qt4/mkspecs/features/lex.prf: /usr/lib64/qt4/mkspecs/features/include_source_dir.prf: qmake: FORCE - @$(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ CONFIG+=debug -o Makefile fsw-qt.pro + @$(QMAKE) -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro dist: @$(CHK_DIR_EXISTS) obj/fsw1.0.0 || $(MKDIR) obj/fsw1.0.0 diff --git a/FSW-qt/fsw-qt.pro b/FSW-qt/fsw-qt.pro --- a/FSW-qt/fsw-qt.pro +++ b/FSW-qt/fsw-qt.pro @@ -1,7 +1,7 @@ TEMPLATE = app # CONFIG += console v8 sim -# CONFIG options = verbose *** boot_messages *** debug_messages *** cpu_usage_report *** stack_report *** gsa -CONFIG += console verbose debug_messages +# CONFIG options = verbose *** boot_messages *** debug_messages *** cpu_usage_report *** stack_report *** gsa *** vhdl_dev +CONFIG += console verbose debug_messages vhdl_dev CONFIG -= qt include(./sparc.pri) @@ -43,6 +43,12 @@ contains( CONFIG, gsa ) { TARGET = fsw-gsa } +TARGET = fsw +contains( CONFIG, vhdl_dev ) { + DEFINES += VHDL_DEV + TARGET = fsw +} + INCLUDEPATH += \ ../src \ ../header diff --git a/FSW-qt/fsw-qt.pro.user b/FSW-qt/fsw-qt.pro.user --- a/FSW-qt/fsw-qt.pro.user +++ b/FSW-qt/fsw-qt.pro.user @@ -1,6 +1,6 @@ - + ProjectExplorer.Project.ActiveTarget @@ -25,7 +25,7 @@ 2 - UTF-8 + System false 4 false @@ -56,7 +56,7 @@ {5289e843-9ef2-45ce-88c6-ad27d8e08def} 0 0 - 0 + 1 /opt/DEV_PLE/FSW-qt @@ -66,7 +66,7 @@ QtProjectManager.QMakeBuildStep false - false + true false @@ -80,7 +80,7 @@ -r false - + -r -w -j 4 2 @@ -99,7 +99,7 @@ -r true - clean + -r -w clean 1 @@ -110,10 +110,10 @@ 2 false - Release + Qt 4.8.2 in PATH (System) Release Qt4ProjectManager.Qt4BuildConfiguration - 2 + 0 false @@ -125,7 +125,7 @@ QtProjectManager.QMakeBuildStep false - false + true false @@ -139,7 +139,7 @@ -r false - + -r -w 2 @@ -158,7 +158,7 @@ -r true - clean + -r -w clean 1 @@ -169,10 +169,10 @@ 2 false - Release2 + Qt 4.8.2 in PATH (System) Debug Qt4ProjectManager.Qt4BuildConfiguration - 0 + 2 false 2 @@ -184,7 +184,7 @@ ProjectExplorer.BuildSteps.Deploy 1 - Deploy locally + No deployment ProjectExplorer.DefaultDeployConfiguration @@ -240,7 +240,7 @@ false false false - true + false @@ -277,18 +277,18 @@ 13 14 - -1 + 2 - grmon - false - %{buildDir} - Run grmon + doxygen + true + /opt/DEV_PLE/doc + Run doxygen ProjectExplorer.CustomExecutableRunConfiguration 3768 - false - true + true + false false false true diff --git a/header/grlib_regs.h b/header/grlib_regs.h --- a/header/grlib_regs.h +++ b/header/grlib_regs.h @@ -55,6 +55,25 @@ typedef struct { volatile int nb_snapshot_param; // 0x2c 0011 *** } waveform_picker_regs_t; +typedef struct{ + int data_shaping; // 0x00 00 *** R1 R0 SP1 SP0 BW + int run_burst_enable; // 0x04 01 *** [run *** burst f2, f1, f0 *** enable f3, f2, f1, f0 ] + int addr_data_f0; // 0x08 + int addr_data_f1; // 0x0c + int addr_data_f2; // 0x10 + int addr_data_f3; // 0x14 + volatile int status; // 0x18 + int delta_snapshot; // 0x1c + int delta_f0; // 0x20 + int delta_f0_2; // 0x24 + int delta_f1; // 0x28 + int delta_f2; // 0x2c + int nb_data_by_buffer; // 0x30 + int snapshot_param; // 0x34 + int start_date; // 0x38 + int nb_word_in_buffer; // 0x3c +} waveform_picker_regs_new_t; + typedef struct { volatile int config; volatile int status; diff --git a/header/tc_handler.h b/header/tc_handler.h --- a/header/tc_handler.h +++ b/header/tc_handler.h @@ -41,6 +41,7 @@ int enter_sbm1_mode(); int enter_sbm2_mode(); int restart_science_tasks(); int suspend_science_tasks(); +void launch_waveform_picker( unsigned char mode ); // other functions void updateLFRCurrentMode(); diff --git a/header/wf_handler.h b/header/wf_handler.h --- a/header/wf_handler.h +++ b/header/wf_handler.h @@ -31,11 +31,15 @@ extern volatile int wf_snap_f1[ ][ NB_SA // F2 extern volatile int wf_snap_f2[ ][ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; // F3 -extern volatile int wf_cont_f3[ ]; -extern volatile int wf_cont_f3_bis[ ]; +extern volatile int wf_cont_f3_a[ ]; +extern volatile int wf_cont_f3_b[ ]; extern char wf_cont_f3_light[ ]; +#ifdef VHDL_DEV +extern waveform_picker_regs_new_t *waveform_picker_regs; +#else extern waveform_picker_regs_t *waveform_picker_regs; +#endif extern time_management_regs_t *time_management_regs; extern Packet_TM_LFR_HK_t housekeeping_packet; extern Packet_TM_LFR_PARAMETER_DUMP_t parameter_dump_packet; @@ -75,18 +79,15 @@ rtems_id get_pkts_queue_id( void ); // wfp registers void set_wfp_data_shaping(); char set_wfp_delta_snapshot(); -void set_wfp_burst_enable_register( unsigned char mode); +void set_wfp_burst_enable_register( unsigned char mode ); void reset_wfp_burst_enable(); void reset_wfp_status(); void reset_waveform_picker_regs(); +void reset_new_waveform_picker_regs(); //***************** // local parameters -void set_local_sbm1_nb_cwf_max( void ); -void set_local_sbm2_nb_cwf_max( void ); void set_local_nb_interrupt_f0_MAX( void ); -void reset_local_sbm1_nb_cwf_sent( void ); -void reset_local_sbm2_nb_cwf_sent( void ); void increment_seq_counter_source_id( unsigned char *packet_sequence_control, unsigned int sid ); diff --git a/src/fsw_globals.c b/src/fsw_globals.c --- a/src/fsw_globals.c +++ b/src/fsw_globals.c @@ -32,14 +32,14 @@ int fdUART = 0; unsigned char lfrCurrentMode; // WAVEFORMS GLOBAL VARIABLES // 2048 * 3 * 4 + 2 * 4 = 24576 + 8 bytes -volatile int wf_snap_f0[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; +volatile int wf_snap_f0[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; // -volatile int wf_snap_f1[NB_RING_NODES_F1][ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; +volatile int wf_snap_f1[ NB_RING_NODES_F1 ][ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; // -volatile int wf_snap_f2[NB_RING_NODES_F2][ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; +volatile int wf_snap_f2[ NB_RING_NODES_F2 ][ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; // -volatile int wf_cont_f3[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; -volatile int wf_cont_f3_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; +volatile int wf_cont_f3_a[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; +volatile int wf_cont_f3_b[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; char wf_cont_f3_light[ NB_SAMPLES_PER_SNAPSHOT * NB_BYTES_CWF3_LIGHT_BLK ]; // SPECTRAL MATRICES GLOBAL VARIABLES @@ -63,13 +63,15 @@ volatile int spec_mat_f2[ SM_HEADER + TO volatile int spec_mat_f2_bis[ SM_HEADER + TOTAL_SIZE_SM ]; // APB CONFIGURATION REGISTERS -time_management_regs_t *time_management_regs = (time_management_regs_t*) REGS_ADDR_TIME_MANAGEMENT; -gptimer_regs_t *gptimer_regs = (gptimer_regs_t *) REGS_ADDR_GPTIMER; -#ifdef GSA +time_management_regs_t *time_management_regs = (time_management_regs_t*) REGS_ADDR_TIME_MANAGEMENT; +gptimer_regs_t *gptimer_regs = (gptimer_regs_t *) REGS_ADDR_GPTIMER; + +#ifdef VHDL_DEV +waveform_picker_regs_new_t *waveform_picker_regs = (waveform_picker_regs_new_t*) REGS_ADDR_WAVEFORM_PICKER; #else - waveform_picker_regs_t *waveform_picker_regs = (waveform_picker_regs_t*) REGS_ADDR_WAVEFORM_PICKER; +waveform_picker_regs_t *waveform_picker_regs = (waveform_picker_regs_t*) REGS_ADDR_WAVEFORM_PICKER; #endif -spectral_matrix_regs_t *spectral_matrix_regs = (spectral_matrix_regs_t*) REGS_ADDR_SPECTRAL_MATRIX; +spectral_matrix_regs_t *spectral_matrix_regs = (spectral_matrix_regs_t*) REGS_ADDR_SPECTRAL_MATRIX; // MODE PARAMETERS Packet_TM_LFR_PARAMETER_DUMP_t parameter_dump_packet; diff --git a/src/fsw_init.c b/src/fsw_init.c --- a/src/fsw_init.c +++ b/src/fsw_init.c @@ -200,17 +200,12 @@ void init_local_mode_parameters( void ) unsigned int i; // LOCAL PARAMETERS - set_local_sbm1_nb_cwf_max(); - set_local_sbm2_nb_cwf_max(); set_local_nb_interrupt_f0_MAX(); BOOT_PRINTF1("local_sbm1_nb_cwf_max %d \n", param_local.local_sbm1_nb_cwf_max) BOOT_PRINTF1("local_sbm2_nb_cwf_max %d \n", param_local.local_sbm2_nb_cwf_max) BOOT_PRINTF1("nb_interrupt_f0_MAX = %d\n", param_local.local_nb_interrupt_f0_MAX) - reset_local_sbm1_nb_cwf_sent(); - reset_local_sbm2_nb_cwf_sent(); - // init sequence counters for(i = 0; istatus & 0x08) == 0x08){ // [1000] f3 is full // (1) change the receiving buffer for the waveform picker - if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3) { - waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3_bis); + if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3_a) { + waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3_b); } else { - waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3); + waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3_a); } // (2) send an event for the waveforms transmission if (rtems_event_send( Task_id[TASKID_CWF3], RTEMS_EVENT_0 ) != RTEMS_SUCCESSFUL) { @@ -65,7 +63,6 @@ rtems_isr waveforms_isr( rtems_vector_nu waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff777; // reset f3 bits to 0, [1111 0111 0111 0111] } } -#endif switch(lfrCurrentMode) { @@ -77,61 +74,42 @@ rtems_isr waveforms_isr( rtems_vector_nu //****** // NORMAL case(LFR_MODE_NORMAL): -#ifdef GSA - PRINTF("in waveform_isr *** unexpected waveform picker interruption\n") -#else - if ( (waveform_picker_regs->burst_enable & 0x7) == 0x0 ){ // if no channel is enable - rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); + if ( (waveform_picker_regs->status & 0x7) == 0x7 ){ // f2 f1 and f0 are full + // change F1 ring node + ring_node_to_send_swf_f1 = current_ring_node_f1; + current_ring_node_f1 = current_ring_node_f1->next; + waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address; + // change F2 ring node + ring_node_to_send_swf_f2 = current_ring_node_f2; + current_ring_node_f2 = current_ring_node_f2->next; + waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; + // send an event to the WFRM task + if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) { + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); + } + waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff888; // [1000 1000 1000] } - else { - if ( (waveform_picker_regs->status & 0x7) == 0x7 ){ // f2 f1 and f0 are full - waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable & 0x08; - - ring_node_to_send_swf_f1 = current_ring_node_f1; - current_ring_node_f1 = current_ring_node_f1->next; - waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address; - - ring_node_to_send_swf_f2 = current_ring_node_f2; - current_ring_node_f2 = current_ring_node_f2->next; - waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; - - if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) { - rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); - } - - waveform_picker_regs->status = waveform_picker_regs->status & 0xfffff888; // [1000 1000 1000] - waveform_picker_regs->burst_enable = waveform_picker_regs->burst_enable | 0x07; // [0111] enable f2 f1 f0 - } - } -#endif break; //****** // BURST case(LFR_MODE_BURST): -#ifdef GSA - PRINTF("in waveform_isr *** unexpected waveform picker interruption\n") -#else if ( (waveform_picker_regs->status & 0x04) == 0x04 ){ // [0100] check the f2 full bit // (1) change the receiving buffer for the waveform picker ring_node_to_send_cwf_f2 = current_ring_node_f2; current_ring_node_f2 = current_ring_node_f2->next; waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; // (2) send an event for the waveforms transmission - if (rtems_event_send( Task_id[TASKID_CWF1], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) { + if (rtems_event_send( Task_id[TASKID_CWF2], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) { rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); } waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bit = 0 } -#endif break; //***** // SBM1 case(LFR_MODE_SBM1): -#ifdef GSA - PRINTF("in waveform_isr *** unexpected waveform picker interruption\n") -#else if ( (waveform_picker_regs->status & 0x02) == 0x02 ) { // [0010] check the f1 full bit // (1) change the receiving buffer for the waveform picker ring_node_to_send_cwf_f1 = current_ring_node_f1; @@ -152,16 +130,11 @@ rtems_isr waveforms_isr( rtems_vector_nu } waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffaaa; // [1111 1010 1010 1010] f2 and f0 bits = 0 } - -#endif break; //***** // SBM2 case(LFR_MODE_SBM2): -#ifdef GSA - PRINTF("in waveform_isr *** unexpected waveform picker interruption\n") -#else if ( (waveform_picker_regs->status & 0x04) == 0x04 ){ // [0100] check the f2 full bit // (1) change the receiving buffer for the waveform picker ring_node_to_send_cwf_f2 = current_ring_node_f2; @@ -173,13 +146,15 @@ rtems_isr waveforms_isr( rtems_vector_nu } waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffbbb; // [1111 1011 1011 1011] f2 bit = 0 } -// if ( (waveform_picker_regs->status & 0x03) == 0x03 ) { // [0011] f3 f2 f1 f0, f1 and f0 are full -// if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_SBM2 ) != RTEMS_SUCCESSFUL) { -// rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); -// } -// waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0 -// } -#endif + if ( (waveform_picker_regs->status & 0x01) == 0x01 ) { // [0001] check the f0 full bit + ring_node_to_send_swf_f2 = current_ring_node_f2->previous; + } + if ( (waveform_picker_regs->status & 0x02) == 0x02 ) { // [0010] check the f1 full bit + if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) { + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); + } + waveform_picker_regs->status = waveform_picker_regs->status & 0xfffffccc; // [1111 1100 1100 1100] f1, f0 bits = 0 + } break; //******** @@ -225,7 +200,6 @@ rtems_task wfrm_task(rtems_task_argument rtems_event_receive(RTEMS_EVENT_MODE_NORMAL | RTEMS_EVENT_MODE_SBM1 | RTEMS_EVENT_MODE_SBM2 | RTEMS_EVENT_MODE_SBM2_WFRM, RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); - DEBUG_PRINTF("in WFRM *** 2\n") if (event_out == RTEMS_EVENT_MODE_NORMAL) { send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0, headerSWF_F0, queue_id); @@ -272,11 +246,11 @@ rtems_task cwf3_task(rtems_task_argument PRINTF("send CWF F3 \n") #ifdef GSA #else - if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3) { - send_waveform_CWF3_light( wf_cont_f3_bis, headerCWF_F3_light, queue_id ); + if (waveform_picker_regs->addr_data_f3 == (int) wf_cont_f3_a) { + send_waveform_CWF3_light( wf_cont_f3_b, headerCWF_F3_light, queue_id ); } else { - send_waveform_CWF3_light( wf_cont_f3, headerCWF_F3_light, queue_id ); + send_waveform_CWF3_light( wf_cont_f3_a, headerCWF_F3_light, queue_id ); } #endif } @@ -313,14 +287,13 @@ rtems_task cwf2_task(rtems_task_argument // wait for an RTEMS_EVENT rtems_event_receive( RTEMS_EVENT_MODE_BURST | RTEMS_EVENT_MODE_SBM2, RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); - if (event_out == RTEMS_EVENT_MODE_BURST) { send_waveform_CWF( (volatile int *) ring_node_to_send_cwf_f2, SID_BURST_CWF_F2, headerCWF_F2_BURST, queue_id ); } if (event_out == RTEMS_EVENT_MODE_SBM2) { - send_waveform_CWF( (volatile int *) ring_node_to_send_cwf_f2, SID_BURST_CWF_F2, headerCWF_F2_BURST, queue_id ); + send_waveform_CWF( (volatile int *) ring_node_to_send_cwf_f2, SID_SBM2_CWF_F2, headerCWF_F2_SBM2, queue_id ); } } } @@ -649,7 +622,11 @@ int send_waveform_SWF( volatile int *wav for (i=0; i<7; i++) // send waveform { +#ifdef VHDL_DEV + spw_ioctl_send_SWF.data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) + TIME_OFFSET]; +#else spw_ioctl_send_SWF.data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ]; +#endif spw_ioctl_send_SWF.hdr = (char*) &headerSWF[ i ]; // BUILD THE DATA if (i==6) { @@ -714,7 +691,11 @@ int send_waveform_CWF(volatile int *wave { int coarseTime = 0x00; int fineTime = 0x00; +#ifdef VHDL_DEV + spw_ioctl_send_CWF.data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) + TIME_OFFSET]; +#else spw_ioctl_send_CWF.data = (char*) &waveform[ (i * 340 * NB_WORDS_SWF_BLK) ]; +#endif spw_ioctl_send_CWF.hdr = (char*) &headerCWF[ i ]; // BUILD THE DATA if (i==6) { @@ -808,7 +789,11 @@ int send_waveform_CWF3_light(volatile in { int coarseTime = 0x00; int fineTime = 0x00; +#ifdef VHDL_DEV + spw_ioctl_send_CWF.data = (char*) &wf_cont_f3_light[ (i * 340 * NB_BYTES_CWF3_LIGHT_BLK) + TIME_OFFSET]; +#else spw_ioctl_send_CWF.data = (char*) &wf_cont_f3_light[ (i * 340 * NB_BYTES_CWF3_LIGHT_BLK) ]; +#endif spw_ioctl_send_CWF.hdr = (char*) &headerCWF[ i ]; // BUILD THE DATA if ( i == WFRM_INDEX_OF_LAST_PACKET ) { @@ -914,7 +899,8 @@ char set_wfp_delta_snapshot() return ret; } -void set_wfp_burst_enable_register( unsigned char mode) +#ifdef VHDL_DEV +void set_wfp_burst_enable_register( unsigned char mode ) { /** This function sets the waveform picker burst_enable register depending on the mode. * @@ -924,8 +910,41 @@ void set_wfp_burst_enable_register( unsi * */ -#ifdef GSA + // [0000 0000] burst f2, f1, f0 enable f3 f2 f1 f0 + // the burst bits shall be set first, before the enable bits + switch(mode) { + case(LFR_MODE_NORMAL): + waveform_picker_regs->run_burst_enable = 0x00; // [0000 0000] no burst enable + waveform_picker_regs->run_burst_enable = 0x0f; // [0000 1111] enable f3 f2 f1 f0 + break; + case(LFR_MODE_BURST): + waveform_picker_regs->run_burst_enable = 0x40; // [0100 0000] f2 burst enabled + waveform_picker_regs->run_burst_enable = waveform_picker_regs->run_burst_enable | 0x04; // [0100] enable f2 + break; + case(LFR_MODE_SBM1): + waveform_picker_regs->run_burst_enable = 0x20; // [0010 0000] f1 burst enabled + waveform_picker_regs->run_burst_enable = waveform_picker_regs->run_burst_enable | 0x0f; // [1111] enable f3 f2 f1 f0 + break; + case(LFR_MODE_SBM2): + waveform_picker_regs->run_burst_enable = 0x40; // [0100 0000] f2 burst enabled + waveform_picker_regs->run_burst_enable = waveform_picker_regs->run_burst_enable | 0x0f; // [1111] enable f3 f2 f1 f0 + break; + default: + waveform_picker_regs->run_burst_enable = 0x00; // [0000 0000] no burst enabled, no waveform enabled + break; + } +} #else +void set_wfp_burst_enable_register( unsigned char mode ) +{ + /** This function sets the waveform picker burst_enable register depending on the mode. + * + * @param mode is the LFR mode to launch. + * + * The burst bits shall be before the enable bits. + * + */ + // [0000 0000] burst f2, f1, f0 enable f3 f2 f1 f0 // the burst bits shall be set first, before the enable bits switch(mode) { @@ -949,8 +968,8 @@ void set_wfp_burst_enable_register( unsi waveform_picker_regs->burst_enable = 0x00; // [0000 0000] no burst enabled, no waveform enabled break; } +} #endif -} void reset_wfp_burst_enable() { @@ -960,7 +979,8 @@ void reset_wfp_burst_enable() * */ -#ifdef GSA +#ifdef VHDL_DEV + waveform_picker_regs->run_burst_enable = 0x00; // burst f2, f1, f0 enable f3, f2, f1, f0 #else waveform_picker_regs->burst_enable = 0x00; // burst f2, f1, f0 enable f3, f2, f1, f0 #endif @@ -980,6 +1000,51 @@ void reset_wfp_status() #endif } +#ifdef VHDL_DEV +void reset_waveform_picker_regs() +{ + /** This function resets the waveform picker module registers. + * + * The registers affected by this function are located at the following offset addresses: + * - 0x00 data_shaping + * - 0x04 run_burst_enable + * - 0x08 addr_data_f0 + * - 0x0C addr_data_f1 + * - 0x10 addr_data_f2 + * - 0x14 addr_data_f3 + * - 0x18 status + * - 0x1C delta_snapshot + * - 0x20 delta_f0 + * - 0x24 delta_f0_2 + * - 0x28 delta_f1 + * - 0x2c delta_f2 + * - 0x30 nb_data_by_buffer + * - 0x34 nb_snapshot_param + * - 0x38 start_date + * - 0x3c nb_word_in_buffer + * + */ + waveform_picker_regs->data_shaping = 0x01; // 0x00 *** R1 R0 SP1 SP0 BW + waveform_picker_regs->run_burst_enable = 0x00; // 0x04 *** [run *** burst f2, f1, f0 *** enable f3, f2, f1, f0 ] + waveform_picker_regs->addr_data_f0 = (int) (wf_snap_f0); // 0x08 + waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address; // 0x0c + waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; // 0x10 + waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3_a); // 0x14 + waveform_picker_regs->status = 0x00; // 0x18 + // waveform_picker_regs->delta_snapshot = 0x12800; // 0x1c 296 * 256 = 75776 + // waveform_picker_regs->delta_snapshot = 0x1000; // 0x1c 16 * 256 = 4096 + waveform_picker_regs->delta_snapshot = 0x2000; // 0x1c 32 * 256 = 8192 + waveform_picker_regs->delta_f0 = 0xbf5; // 0x20 *** 1013 + waveform_picker_regs->delta_f0_2 = 0x7; // 0x24 *** 7 [7 bits] + waveform_picker_regs->delta_f1 = 0xbc0; // 0x28 *** 960 + // waveform_picker_regs->delta_f2 = 0x12200; // 0x2c *** 290 * 256 = 74240 + waveform_picker_regs->delta_f2 = 0xc00; // 0x2c *** 12 * 256 = 3072 + waveform_picker_regs->nb_data_by_buffer = 0x7ff; // 0x30 *** 2048 -1 => nb samples -1 + waveform_picker_regs->snapshot_param = 0x800; // 0x34 *** 2048 => nb samples + waveform_picker_regs->start_date = 0x00; // 0x38 + waveform_picker_regs->nb_word_in_buffer = 0x1802; // 0x3c *** 2048 * 3 + 2 = 6146 +} +#else void reset_waveform_picker_regs() { /** This function resets the waveform picker module registers. @@ -1000,15 +1065,13 @@ void reset_waveform_picker_regs() * */ -#ifdef GSA -#else reset_wfp_burst_enable(); reset_wfp_status(); // set buffer addresses waveform_picker_regs->addr_data_f0 = (int) (wf_snap_f0); waveform_picker_regs->addr_data_f1 = current_ring_node_f1->buffer_address; waveform_picker_regs->addr_data_f2 = current_ring_node_f2->buffer_address; - waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3); + waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3_a); // set other parameters set_wfp_data_shaping(); set_wfp_delta_snapshot(); // time in seconds between two snapshots @@ -1020,39 +1083,11 @@ void reset_waveform_picker_regs() waveform_picker_regs->nb_burst_available = 0x1b9; // max 3 bytes, size of the buffer in burst (1 burst = 16 x 4 octets) // 3 * 2352 / 16 = 441 waveform_picker_regs->nb_snapshot_param = 0x944; // max 3 octets, 2372 - 1 +} #endif -} //***************** // local parameters -void set_local_sbm1_nb_cwf_max( void ) -{ - /** This function sets the value of the sbm1_nb_cwf_max local parameter. - * - * The sbm1_nb_cwf_max parameter counts the number of CWF_F1 records that have been sent.\n - * This parameter is used to send CWF_F1 data as normal data when the SBM1 is active.\n\n - * (2 snapshots of 2048 points per seconds) * (period of the NORM snashots) - 8 s (duration of the f2 snapshot) - * - */ - param_local.local_sbm1_nb_cwf_max = 2 * - (parameter_dump_packet.sy_lfr_n_swf_p[0] * 256 - + parameter_dump_packet.sy_lfr_n_swf_p[1]) - 8; // 16 CWF1 parts during 1 SWF2 -} - -void set_local_sbm2_nb_cwf_max(void) -{ - /** This function sets the value of the sbm1_nb_cwf_max local parameter. - * - * The sbm1_nb_cwf_max parameter counts the number of CWF_F1 records that have been sent.\n - * This parameter is used to send CWF_F2 data as normal data when the SBM2 is active.\n\n - * (period of the NORM snashots) / (8 seconds per snapshot at f2 = 256 Hz) - * - */ - - param_local.local_sbm2_nb_cwf_max = (parameter_dump_packet.sy_lfr_n_swf_p[0] * 256 - + parameter_dump_packet.sy_lfr_n_swf_p[1]) / 8; -} - void set_local_nb_interrupt_f0_MAX( void ) { /** This function sets the value of the nb_interrupt_f0_MAX local parameter. @@ -1067,30 +1102,6 @@ void set_local_nb_interrupt_f0_MAX( void + parameter_dump_packet.sy_lfr_n_asm_p[1] ) * 100; } -void reset_local_sbm1_nb_cwf_sent( void ) -{ - /** This function resets the value of the sbm1_nb_cwf_sent local parameter. - * - * The sbm1_nb_cwf_sent parameter counts the number of CWF_F1 records that have been sent.\n - * This parameter is used to send CWF_F1 data as normal data when the SBM1 is active. - * - */ - - param_local.local_sbm1_nb_cwf_sent = 0; -} - -void reset_local_sbm2_nb_cwf_sent( void ) -{ - /** This function resets the value of the sbm2_nb_cwf_sent local parameter. - * - * The sbm2_nb_cwf_sent parameter counts the number of CWF_F2 records that have been sent.\n - * This parameter is used to send CWF_F2 data as normal data when the SBM2 mode is active. - * - */ - - param_local.local_sbm2_nb_cwf_sent = 0; -} - void increment_seq_counter_source_id( unsigned char *packet_sequence_control, unsigned int sid ) { unsigned short *sequence_cnt;