diff --git a/FSW-qt/Makefile b/FSW-qt/Makefile --- a/FSW-qt/Makefile +++ b/FSW-qt/Makefile @@ -1,6 +1,6 @@ ############################################################################# # Makefile for building: bin/fsw -# Generated by qmake (2.01a) (Qt 4.8.5) on: Fri Nov 15 07:19:44 2013 +# Generated by qmake (2.01a) (Qt 4.8.5) on: Tue Nov 19 13:58:57 2013 # Project: fsw-qt.pro # Template: app # Command: /usr/bin/qmake-qt4 -spec /usr/lib64/qt4/mkspecs/linux-g++ -o Makefile fsw-qt.pro @@ -10,7 +10,7 @@ CC = sparc-rtems-gcc CXX = sparc-rtems-g++ -DEFINES = -DSW_VERSION_N1=0 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=22 -DPRINT_MESSAGES_ON_CONSOLE -DPRINT_TASK_STATISTICS +DEFINES = -DSW_VERSION_N1=0 -DSW_VERSION_N2=0 -DSW_VERSION_N3=0 -DSW_VERSION_N4=22 -DPRINT_MESSAGES_ON_CONSOLE CFLAGS = -pipe -O3 -Wall $(DEFINES) CXXFLAGS = -pipe -O3 -Wall $(DEFINES) INCPATH = -I/usr/lib64/qt4/mkspecs/linux-g++ -I. -I../src -I../header 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 cpu_usage_report +CONFIG += console verbose CONFIG -= qt include(./sparc.pri) 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 diff --git a/header/fsw_params.h b/header/fsw_params.h --- a/header/fsw_params.h +++ b/header/fsw_params.h @@ -194,6 +194,7 @@ #define NB_SAMPLES_PER_SNAPSHOT 2048 #define TIME_OFFSET 2 +#define ALIGNEMENT_OFFSET 100 #define WAVEFORM_EXTENDED_HEADER_OFFSET 22 #define NB_BYTES_SWF_BLK (2 * 6) #define NB_WORDS_SWF_BLK 3 diff --git a/header/wf_handler.h b/header/wf_handler.h --- a/header/wf_handler.h +++ b/header/wf_handler.h @@ -72,6 +72,7 @@ void set_wfp_burst_enable_register( unsi void reset_wfp_run_burst_enable(); void reset_wfp_status(); void reset_new_waveform_picker_regs(); +unsigned int address_alignment( volatile int *address); //***************** // local parameters diff --git a/src/fsw_globals.c b/src/fsw_globals.c --- a/src/fsw_globals.c +++ b/src/fsw_globals.c @@ -41,19 +41,19 @@ gptimer_regs_t *gptimer_regs spectral_matrix_regs_t *spectral_matrix_regs = (spectral_matrix_regs_t*) REGS_ADDR_SPECTRAL_MATRIX; // 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 + ALIGNEMENT_OFFSET ]; // -volatile int wf_snap_f1[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; -volatile int wf_snap_f1_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; -volatile int wf_snap_f1_norm[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; +volatile int wf_snap_f1[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET + ALIGNEMENT_OFFSET ]; +volatile int wf_snap_f1_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET + ALIGNEMENT_OFFSET ]; +volatile int wf_snap_f1_norm[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET + ALIGNEMENT_OFFSET ]; // -volatile int wf_snap_f2[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; -volatile int wf_snap_f2_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; -volatile int wf_snap_f2_norm[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET ]; +volatile int wf_snap_f2[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET + ALIGNEMENT_OFFSET ]; +volatile int wf_snap_f2_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET + ALIGNEMENT_OFFSET ]; +volatile int wf_snap_f2_norm[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET + ALIGNEMENT_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 ]; -char wf_cont_f3_light[ NB_SAMPLES_PER_SNAPSHOT * NB_BYTES_CWF3_LIGHT_BLK ]; +volatile int wf_cont_f3[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET + ALIGNEMENT_OFFSET ]; +volatile int wf_cont_f3_bis[ NB_SAMPLES_PER_SNAPSHOT * NB_WORDS_SWF_BLK + TIME_OFFSET + ALIGNEMENT_OFFSET ]; +char wf_cont_f3_light[ NB_SAMPLES_PER_SNAPSHOT * NB_BYTES_CWF3_LIGHT_BLK + ALIGNEMENT_OFFSET ]; // SPECTRAL MATRICES GLOBAL VARIABLES volatile int spec_mat_f0_0[ SM_HEADER + TOTAL_SIZE_SM ]; diff --git a/src/fsw_misc.c b/src/fsw_misc.c --- a/src/fsw_misc.c +++ b/src/fsw_misc.c @@ -7,13 +7,15 @@ #include "fsw_misc.h" -char *DumbMessages[7] = {"in DUMB *** default", // RTEMS_EVENT_0 +char *DumbMessages[9] = {"in DUMB *** default", // RTEMS_EVENT_0 "in DUMB *** timecode_irq_handler", // RTEMS_EVENT_1 "in DUMB *** waveforms_isr", // RTEMS_EVENT_2 "in DUMB *** in SMIQ *** Error sending event to AVF0", // RTEMS_EVENT_3 "in DUMB *** spectral_matrices_isr *** Error sending event to SMIQ", // RTEMS_EVENT_4 "in DUMB *** waveforms_simulator_isr", // RTEMS_EVENT_5 - "ERR HK" // RTEMS_EVENT_6 + "ERR HK", // RTEMS_EVENT_6 + "full is 0", // RTEMS_EVENT_7 + "full is 1" // RTEMS_EVENT_8 }; int configure_timer(gptimer_regs_t *gptimer_regs, unsigned char timer, unsigned int clock_divider, @@ -251,7 +253,8 @@ rtems_task dumb_task( rtems_task_argumen while(1){ rtems_event_receive(RTEMS_EVENT_0 | RTEMS_EVENT_1 | RTEMS_EVENT_2 | RTEMS_EVENT_3 - | RTEMS_EVENT_4 | RTEMS_EVENT_5 | RTEMS_EVENT_6, + | RTEMS_EVENT_4 | RTEMS_EVENT_5 | RTEMS_EVENT_6 + | RTEMS_EVENT_7 | RTEMS_EVENT_8 | RTEMS_EVENT_9 , RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT intEventOut = (unsigned int) event_out; for ( i=0; i<32; i++) diff --git a/src/tc_handler.c b/src/tc_handler.c --- a/src/tc_handler.c +++ b/src/tc_handler.c @@ -481,12 +481,12 @@ int enter_normal_mode() //**************** // waveform picker reset_new_waveform_picker_regs(); - set_wfp_burst_enable_register(LFR_MODE_NORMAL); + set_wfp_burst_enable_register( LFR_MODE_NORMAL ); LEON_Clear_interrupt( IRQ_WAVEFORM_PICKER ); LEON_Unmask_interrupt( IRQ_WAVEFORM_PICKER ); startDate = time_management_regs->coarse_time + 2; + new_waveform_picker_regs->run_burst_enable = new_waveform_picker_regs->run_burst_enable | 0x80; // [1000 0000] new_waveform_picker_regs->start_date = startDate; - new_waveform_picker_regs->run_burst_enable = new_waveform_picker_regs->run_burst_enable | 0x80; // [1000 0000] //**************** // spectral matrix #endif diff --git a/src/wf_handler.c b/src/wf_handler.c --- a/src/wf_handler.c +++ b/src/wf_handler.c @@ -76,20 +76,28 @@ rtems_isr waveforms_isr( rtems_vector_nu statusReg = new_waveform_picker_regs->status; fullRecord = fullRecord | ( statusReg & 0x7 ); // if ( (new_waveform_picker_regs->status & 0x7) == 0x7 ){ // f2 f1 and f0 are full - if ( (new_waveform_picker_regs->status & 0x1) == 0x1 ){ // f2 is full +// if ( (new_waveform_picker_regs->status & 0x1) == 0x1 ) // f0 is full + if ( (new_waveform_picker_regs->status & 0x4) == 0x4 ) // f2 is full + { if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) { rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); } new_waveform_picker_regs->status = new_waveform_picker_regs->status & 0xfffff888; + new_waveform_picker_regs->status = new_waveform_picker_regs->status & 0xfffff888; + new_waveform_picker_regs->status = new_waveform_picker_regs->status & 0xfffff888; + new_waveform_picker_regs->status = new_waveform_picker_regs->status & 0xfffff888; + new_waveform_picker_regs->status = new_waveform_picker_regs->status & 0xfffff888; + // if ( (new_waveform_picker_regs->status & 0x1) == 0x1 ) + if ( (new_waveform_picker_regs->status & 0x4) == 0x4 ) // f2 is full + { + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_8 ); + } + // if ( (new_waveform_picker_regs->status & 0x1) == 0x0 ) + if ( (new_waveform_picker_regs->status & 0x4) == 0x0 ) + { + rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_7 ); + } } -// if ( fullRecord == 0x7 ){ // f2 f1 and f0 are full -// if (rtems_event_send( Task_id[TASKID_WFRM], RTEMS_EVENT_MODE_NORMAL ) != RTEMS_SUCCESSFUL) { -// rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_2 ); -// } -// fullRecord = 0x00; -// } -// new_waveform_picker_regs->status = ( new_waveform_picker_regs->status & (~statusReg) ) -// | ( new_waveform_picker_regs->status & 0xfffffff8 ); #endif break; @@ -266,8 +274,8 @@ rtems_task wfrm_task(rtems_task_argument if (event_out == RTEMS_EVENT_MODE_NORMAL) { - send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0, headerSWF_F0, queue_id); - send_waveform_SWF(wf_snap_f1, SID_NORM_SWF_F1, headerSWF_F1, queue_id); + //send_waveform_SWF(wf_snap_f0, SID_NORM_SWF_F0, headerSWF_F0, queue_id); + //send_waveform_SWF(wf_snap_f1, SID_NORM_SWF_F1, headerSWF_F1, queue_id); send_waveform_SWF(wf_snap_f2, SID_NORM_SWF_F2, headerSWF_F2, queue_id); #ifdef GSA new_waveform_picker_regs->status = new_waveform_picker_regs->status & 0xf888; // [1111 1000 1000 1000] f2, f1, f0 bits =0 @@ -1033,7 +1041,8 @@ void set_wfp_burst_enable_register( unsi new_waveform_picker_regs->run_burst_enable = 0x00; // [0000 0000] no burst enable // new_waveform_picker_regs->run_burst_enable = 0x0f; // [0000 1111] enable f3 f2 f1 f0 // new_waveform_picker_regs->run_burst_enable = 0x07; // [0000 0111] enable f2 f1 f0 - new_waveform_picker_regs->run_burst_enable = 0x01; // [0000 0111] enable f0 +// new_waveform_picker_regs->run_burst_enable = 0x01; // [0000 0001] enable f0 + new_waveform_picker_regs->run_burst_enable = 0x04; // [0000 0100] enable f0 break; case(LFR_MODE_BURST): new_waveform_picker_regs->run_burst_enable = 0x40; // [0100 0000] f2 burst enabled @@ -1106,24 +1115,87 @@ void reset_new_waveform_picker_regs() * */ + unsigned int wf_snap_f0_aligned; + unsigned int wf_snap_f1_aligned; + unsigned int wf_snap_f2_aligned; + unsigned int wf_cont_f3_aligned; + new_waveform_picker_regs->data_shaping = 0x01; // 0x00 *** R1 R0 SP1 SP0 BW new_waveform_picker_regs->run_burst_enable = 0x00; // 0x04 *** [run *** burst f2, f1, f0 *** enable f3, f2, f1, f0 ] - new_waveform_picker_regs->addr_data_f0 = (int) (wf_snap_f0); // 0x08 - new_waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1); // 0x0c - new_waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2); // 0x10 - new_waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3); // 0x14 + wf_snap_f0_aligned = address_alignment( wf_snap_f0 ); + wf_snap_f1_aligned = address_alignment( wf_snap_f1 ); + wf_snap_f2_aligned = address_alignment( wf_snap_f2 ); + wf_cont_f3_aligned = address_alignment( wf_cont_f3 ); + new_waveform_picker_regs->addr_data_f0 = (int) (wf_snap_f0_aligned); // 0x08 + new_waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_aligned); // 0x0c + new_waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_aligned); // 0x10 + new_waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3_aligned); // 0x14 + new_waveform_picker_regs->status = 0x00; // 0x18 +// new_waveform_picker_regs->delta_snapshot = 0x12800; // 0x1c 296 * 256 = 75776 +// new_waveform_picker_regs->delta_snapshot = 0x1000; // 0x1c 16 * 256 = 4096 + new_waveform_picker_regs->delta_snapshot = 0x2000; // 0x1c 32 * 256 = 8192 + new_waveform_picker_regs->delta_f0 = 0xbf5; // 0x20 *** 1013 + new_waveform_picker_regs->delta_f0_2 = 0x7; // 0x24 *** 7 [7 bits] + new_waveform_picker_regs->delta_f1 = 0xbc0; // 0x28 *** 960 +// new_waveform_picker_regs->delta_f2 = 0x12200; // 0x2c *** 74240 + new_waveform_picker_regs->delta_f2 = 0xc00; // 0x2c *** 12 * 256 = 3072 + new_waveform_picker_regs->nb_data_by_buffer = 0x7ff; // 0x30 *** 2048 -1 => nb samples -1 + new_waveform_picker_regs->snapshot_param = 0x800; // 0x34 *** 2048 => nb samples + new_waveform_picker_regs->start_date = 0x00; // 0x38 + new_waveform_picker_regs->nb_word_in_buffer = 0x1802; // 0x3c *** 2048 * 3 + 2 = 6146 +} + +void reset_new_waveform_picker_regs_alt() +{ + /** 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 + * + */ + + unsigned int wf_snap_f0_aligned; + unsigned int wf_snap_f1_aligned; + unsigned int wf_snap_f2_aligned; + unsigned int wf_cont_f3_aligned; + + new_waveform_picker_regs->data_shaping = 0x01; // 0x00 *** R1 R0 SP1 SP0 BW + new_waveform_picker_regs->run_burst_enable = 0x00; // 0x04 *** [run *** burst f2, f1, f0 *** enable f3, f2, f1, f0 ] + wf_snap_f0_aligned = address_alignment( wf_snap_f0 ); + wf_snap_f1_aligned = address_alignment( wf_snap_f1 ); + wf_snap_f2_aligned = address_alignment( wf_snap_f2 ); + wf_cont_f3_aligned = address_alignment( wf_cont_f3 ); + new_waveform_picker_regs->addr_data_f0 = (int) (wf_snap_f0_aligned); // 0x08 + new_waveform_picker_regs->addr_data_f1 = (int) (wf_snap_f1_aligned); // 0x0c + new_waveform_picker_regs->addr_data_f2 = (int) (wf_snap_f2_aligned); // 0x10 + new_waveform_picker_regs->addr_data_f3 = (int) (wf_cont_f3_aligned); // 0x14 new_waveform_picker_regs->status = 0x00; // 0x18 // new_waveform_picker_regs->delta_snapshot = 0x12800; // 0x1c 296 * 256 = 75776 new_waveform_picker_regs->delta_snapshot = 0x1000; // 0x1c 16 * 256 = 4096 - new_waveform_picker_regs->delta_f0 = 0x3f5; // 0x20 *** 1013 + new_waveform_picker_regs->delta_f0 = 0xbf5; // 0x20 *** 1013 new_waveform_picker_regs->delta_f0_2 = 0x7; // 0x24 *** 7 [7 bits] - new_waveform_picker_regs->delta_f1 = 0x3c0; // 0x28 *** 960 + new_waveform_picker_regs->delta_f1 = 0xbc0; // 0x28 *** 960 // new_waveform_picker_regs->delta_f2 = 0x12200; // 0x2c *** 74240 new_waveform_picker_regs->delta_f2 = 0xc00; // 0x2c *** 12 * 256 = 3072 - new_waveform_picker_regs->nb_data_by_buffer = 0x7ff; // 0x30 *** 2048 -1 - new_waveform_picker_regs->snapshot_param = 0x800; // 0x34 *** 2048 + new_waveform_picker_regs->nb_data_by_buffer = 0x07; // 0x30 *** 7 + new_waveform_picker_regs->snapshot_param = 0x10; // 0x34 *** 16 new_waveform_picker_regs->start_date = 0x00; // 0x38 - new_waveform_picker_regs->nb_word_in_buffer = 0x1802; // 0x3c *** 2048 * 3 + 2 = 6146 + new_waveform_picker_regs->nb_word_in_buffer = 0x34; // 0x3c *** (3 * 8 + 2) * 2 } //***************** @@ -1249,3 +1321,31 @@ void increment_seq_counter_source_id( un *sequence_cnt = 0; } } + +unsigned int address_alignment( volatile int *address) +{ + unsigned char i; + unsigned char lastByte; + unsigned int addressAligned; + + addressAligned = (unsigned int) address; + + PRINTF1("address %x\n", addressAligned ); + + for (i=0; i<256; i++) + { + lastByte = (unsigned char) ( addressAligned & 0x000000ff ) ; + if (lastByte == 0x00) + { + break; + } + else + { + addressAligned = addressAligned + 1; + } + } + + PRINTF2("i = %d, address %x\n", i, (int) addressAligned); + + return addressAligned; +}