# HG changeset patch # User paul # Date 2015-04-21 10:54:55 # Node ID 48fc5efcfe9bd50c866b2087374ea8d858d2ae78 # Parent 868116ca6c4a3eb52000c953a64fead566c0dc8f TM_LFR_SCIENCE_NORMA_ASM_ packets modified, 32 bits values instead of 16 bits resetCacheControlRegister function added txHdrSize changed (34 instead of 32) diff --git a/.hgsubstate b/.hgsubstate --- a/.hgsubstate +++ b/.hgsubstate @@ -1,2 +1,2 @@ a586fe639ac179e95bdc150ebdbab0312f31dc30 LFR_basic-parameters -a806a190dcd72f71d336545073400d3cdaaa3119 header/lfr_common_headers +72c4d5eb0bb95a1546beb2b22c8b88c31322ae31 header/lfr_common_headers 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 @@ -2,7 +2,7 @@ TEMPLATE = app # CONFIG += console v8 sim # CONFIG options = verbose *** boot_messages *** debug_messages *** cpu_usage_report *** stack_report *** vhdl_dev *** debug_tch # lpp_dpu_destid -CONFIG += console verbose lpp_dpu_destid +CONFIG += console verbose lpp_dpu_destid cpu_usage_report CONFIG -= qt include(./sparc.pri) diff --git a/header/GscMemoryLPP.hpp b/header/GscMemoryLPP.hpp --- a/header/GscMemoryLPP.hpp +++ b/header/GscMemoryLPP.hpp @@ -30,6 +30,13 @@ static inline void flushCache() { asm("flush"); } +static void resetCacheControlRegister() { +#ifdef LEON3 + unsigned int cacheControlRegister; + cacheControlRegister = 0x00; + setCacheControlRegister(cacheControlRegister); +#endif +} static void enableInstructionCache() { #ifdef LEON3 diff --git a/header/fsw_spacewire.h b/header/fsw_spacewire.h --- a/header/fsw_spacewire.h +++ b/header/fsw_spacewire.h @@ -37,7 +37,9 @@ void init_header_asm( Header_TM_LFR_SCIE int spw_send_waveform_CWF( ring_node *ring_node_to_send, Header_TM_LFR_SCIENCE_CWF_t *header ); int spw_send_waveform_SWF( ring_node *ring_node_to_send, Header_TM_LFR_SCIENCE_SWF_t *header ); int spw_send_waveform_CWF3_light( ring_node *ring_node_to_send, Header_TM_LFR_SCIENCE_CWF_t *header ); -void spw_send_asm( ring_node *ring_node_to_send, Header_TM_LFR_SCIENCE_ASM_t *header ); +void spw_send_asm_f0( ring_node *ring_node_to_send, Header_TM_LFR_SCIENCE_ASM_t *header ); +void spw_send_asm_f1( ring_node *ring_node_to_send, Header_TM_LFR_SCIENCE_ASM_t *header ); +void spw_send_asm_f2( ring_node *ring_node_to_send, Header_TM_LFR_SCIENCE_ASM_t *header ); void spw_send_k_dump( ring_node *ring_node_to_send ); void timecode_irq_handler( void *pDev, void *regs, int minor, unsigned int tc ); diff --git a/python_scripts/LFRControlPlugin_reload_fsw.py b/python_scripts/LFRControlPlugin_reload_fsw.py --- a/python_scripts/LFRControlPlugin_reload_fsw.py +++ b/python_scripts/LFRControlPlugin_reload_fsw.py @@ -1,5 +1,5 @@ # LOAD FSW USING LINK 1 -SpwPlugin0.StarDundeeSelectLinkNumber( 2 ) +SpwPlugin0.StarDundeeSelectLinkNumber( 1 ) dsu3plugin0.openFile("/opt/DEV_PLE/FSW-qt/bin/fsw") #dsu3plugin0.openFile("/opt/LFR/LFR-FSW/2.0.2.3/fsw") diff --git a/src/fsw_config.c b/src/fsw_config.c --- a/src/fsw_config.c +++ b/src/fsw_config.c @@ -5,7 +5,7 @@ struct drvmgr_key grlib_grspw_0n1_res[] {"txBdCnt", KEY_TYPE_INT, {(unsigned int)50}}, // 7 SWF_F0, 7 SWF_F1, 7 SWF_F2, 7 CWF_F3, 7 CWF_F1 ou 7 CWF_F2 {"rxBdCnt", KEY_TYPE_INT, {(unsigned int)10}}, {"txDataSize", KEY_TYPE_INT, {(unsigned int)4096}}, - {"txHdrSize", KEY_TYPE_INT, {(unsigned int)20+12}}, // 12 is for the auxiliary header, when needed + {"txHdrSize", KEY_TYPE_INT, {(unsigned int)34}}, {"rxPktSize", KEY_TYPE_INT, {(unsigned int)248+4}}, KEY_EMPTY }; diff --git a/src/fsw_init.c b/src/fsw_init.c --- a/src/fsw_init.c +++ b/src/fsw_init.c @@ -63,22 +63,24 @@ void initCache() { -// unsigned int cacheControlRegister; + unsigned int cacheControlRegister; -// cacheControlRegister = getCacheControlRegister(); -// printf("(0) cacheControlRegister = %x\n", cacheControlRegister); + cacheControlRegister = getCacheControlRegister(); + printf("(0) cacheControlRegister = %x\n", cacheControlRegister); + + resetCacheControlRegister(); enableInstructionCache(); enableDataCache(); enableInstructionBurstFetch(); -// cacheControlRegister = getCacheControlRegister(); -// printf("(1) cacheControlRegister = %x\n", cacheControlRegister); + cacheControlRegister = getCacheControlRegister(); + printf("(1) cacheControlRegister = %x\n", cacheControlRegister); } rtems_task Init( rtems_task_argument ignored ) { - /** This is the RTEMS INIT taks, it the first task launched by the system. + /** This is the RTEMS INIT taks, it is the first task launched by the system. * * @param unused is the starting argument of the RTEMS task * diff --git a/src/fsw_spacewire.c b/src/fsw_spacewire.c --- a/src/fsw_spacewire.c +++ b/src/fsw_spacewire.c @@ -270,9 +270,17 @@ rtems_task send_task( rtems_task_argumen { spw_send_waveform_CWF3_light( incomingRingNodePtr, &headerCWF ); } - else if ( (sid==SID_NORM_ASM_F0) || (sid==SID_NORM_ASM_F1) || (sid==SID_NORM_ASM_F2) ) + else if (sid==SID_NORM_ASM_F0) + { + spw_send_asm_f0( incomingRingNodePtr, &headerASM ); + } + else if (sid==SID_NORM_ASM_F1) { - spw_send_asm( incomingRingNodePtr, &headerASM ); + spw_send_asm_f1( incomingRingNodePtr, &headerASM ); + } + else if (sid==SID_NORM_ASM_F2) + { + spw_send_asm_f2( incomingRingNodePtr, &headerASM ); } else if ( sid==TM_CODE_K_DUMP ) { @@ -806,7 +814,7 @@ int spw_send_waveform_CWF( ring_node *ri int *dataPtr; unsigned char sid; - spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header + spw_ioctl_send_CWF.hlen = HEADER_LENGTH_TM_LFR_SCIENCE_CWF; spw_ioctl_send_CWF.options = 0; ret = LFR_DEFAULT; @@ -891,7 +899,7 @@ int spw_send_waveform_SWF( ring_node *ri int *dataPtr; unsigned char sid; - spw_ioctl_send_SWF.hlen = TM_HEADER_LEN + 4 + 12; // + 4 is for the protocole extra header, + 12 is for the auxiliary header + spw_ioctl_send_SWF.hlen = HEADER_LENGTH_TM_LFR_SCIENCE_SWF; spw_ioctl_send_SWF.options = 0; ret = LFR_DEFAULT; @@ -980,7 +988,7 @@ int spw_send_waveform_CWF3_light( ring_n char *dataPtr; unsigned char sid; - spw_ioctl_send_CWF.hlen = TM_HEADER_LEN + 4 + 10; // + 4 is for the protocole extra header, + 10 is for the auxiliary header + spw_ioctl_send_CWF.hlen = HEADER_LENGTH_TM_LFR_SCIENCE_CWF; spw_ioctl_send_CWF.options = 0; ret = LFR_DEFAULT; @@ -1036,65 +1044,51 @@ int spw_send_waveform_CWF3_light( ring_n return ret; } -void spw_send_asm( ring_node *ring_node_to_send, +void spw_send_asm_f0( ring_node *ring_node_to_send, Header_TM_LFR_SCIENCE_ASM_t *header ) { unsigned int i; unsigned int length = 0; rtems_status_code status; unsigned int sid; - char *spectral_matrix; + float *spectral_matrix; int coarseTime; int fineTime; spw_ioctl_pkt_send spw_ioctl_send_ASM; sid = ring_node_to_send->sid; - spectral_matrix = (char*) ring_node_to_send->buffer_address; + spectral_matrix = (float*) ring_node_to_send->buffer_address; coarseTime = ring_node_to_send->coarseTime; fineTime = ring_node_to_send->fineTime; header->sy_lfr_common_parameters = parameter_dump_packet.sy_lfr_common_parameters; - for (i=0; i<2; i++) + for (i=0; i<3; i++) { - // (1) BUILD THE DATA - switch(sid) + if ((i==0) || (i==1)) { - case SID_NORM_ASM_F0: - spw_ioctl_send_ASM.dlen = TOTAL_SIZE_ASM_F0_IN_BYTES / 2; // 2 packets will be sent - spw_ioctl_send_ASM.data = &spectral_matrix[ - ( (ASM_F0_INDICE_START + (i*NB_BINS_PER_PKT_ASM_F0) ) * NB_VALUES_PER_SM ) * 2 - ]; - length = PACKET_LENGTH_TM_LFR_SCIENCE_ASM_F0; - header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE_6; - header->pa_lfr_asm_blk_nr[0] = (unsigned char) ( (NB_BINS_PER_PKT_ASM_F0) >> 8 ); // BLK_NR MSB - header->pa_lfr_asm_blk_nr[1] = (unsigned char) (NB_BINS_PER_PKT_ASM_F0); // BLK_NR LSB - break; - case SID_NORM_ASM_F1: - spw_ioctl_send_ASM.dlen = TOTAL_SIZE_ASM_F1_IN_BYTES / 2; // 2 packets will be sent - spw_ioctl_send_ASM.data = &spectral_matrix[ - ( (ASM_F1_INDICE_START + (i*NB_BINS_PER_PKT_ASM_F1) ) * NB_VALUES_PER_SM ) * 2 + spw_ioctl_send_ASM.dlen = DLEN_ASM_F0_PKT_1; + spw_ioctl_send_ASM.data = (char *) &spectral_matrix[ + ( (ASM_F0_INDICE_START + (i*NB_BINS_PER_PKT_ASM_F0_1) ) * NB_VALUES_PER_SM ) ]; - length = PACKET_LENGTH_TM_LFR_SCIENCE_ASM_F1; + length = PACKET_LENGTH_TM_LFR_SCIENCE_ASM_F0_1; header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE_6; - header->pa_lfr_asm_blk_nr[0] = (unsigned char) ( (NB_BINS_PER_PKT_ASM_F1) >> 8 ); // BLK_NR MSB - header->pa_lfr_asm_blk_nr[1] = (unsigned char) (NB_BINS_PER_PKT_ASM_F1); // BLK_NR LSB - break; - case SID_NORM_ASM_F2: - spw_ioctl_send_ASM.dlen = TOTAL_SIZE_ASM_F2_IN_BYTES / 2; // 2 packets will be sent - spw_ioctl_send_ASM.data = &spectral_matrix[ - ( (ASM_F2_INDICE_START + (i*NB_BINS_PER_PKT_ASM_F2) ) * NB_VALUES_PER_SM ) * 2 + header->pa_lfr_asm_blk_nr[0] = (unsigned char) ( (NB_BINS_PER_PKT_ASM_F0_1) >> 8 ); // BLK_NR MSB + header->pa_lfr_asm_blk_nr[1] = (unsigned char) (NB_BINS_PER_PKT_ASM_F0_1); // BLK_NR LSB + } + else + { + spw_ioctl_send_ASM.dlen = DLEN_ASM_F0_PKT_2; + spw_ioctl_send_ASM.data = (char*) &spectral_matrix[ + ( (ASM_F0_INDICE_START + (i*NB_BINS_PER_PKT_ASM_F0_1) ) * NB_VALUES_PER_SM ) ]; - length = PACKET_LENGTH_TM_LFR_SCIENCE_ASM_F2; - header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE_3; - header->pa_lfr_asm_blk_nr[0] = (unsigned char) ( (NB_BINS_PER_PKT_ASM_F2) >> 8 ); // BLK_NR MSB - header->pa_lfr_asm_blk_nr[1] = (unsigned char) (NB_BINS_PER_PKT_ASM_F2); // BLK_NR LSB - break; - default: - PRINTF1("ERR *** in spw_send_asm *** unexpected sid %d\n", sid) - break; + length = PACKET_LENGTH_TM_LFR_SCIENCE_ASM_F0_2; + header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE_6; + header->pa_lfr_asm_blk_nr[0] = (unsigned char) ( (NB_BINS_PER_PKT_ASM_F0_2) >> 8 ); // BLK_NR MSB + header->pa_lfr_asm_blk_nr[1] = (unsigned char) (NB_BINS_PER_PKT_ASM_F0_2); // BLK_NR LSB } - spw_ioctl_send_ASM.hlen = HEADER_LENGTH_TM_LFR_SCIENCE_ASM + CCSDS_PROTOCOLE_EXTRA_BYTES; + + spw_ioctl_send_ASM.hlen = HEADER_LENGTH_TM_LFR_SCIENCE_ASM; spw_ioctl_send_ASM.hdr = (char *) header; spw_ioctl_send_ASM.options = 0; @@ -1103,7 +1097,152 @@ void spw_send_asm( ring_node *ring_node_ header->packetLength[0] = (unsigned char) (length>>8); header->packetLength[1] = (unsigned char) (length); header->sid = (unsigned char) sid; // SID - header->pa_lfr_pkt_cnt_asm = 2; + header->pa_lfr_pkt_cnt_asm = 3; + header->pa_lfr_pkt_nr_asm = (unsigned char) (i+1); + + // (3) SET PACKET TIME + header->time[0] = (unsigned char) (coarseTime>>24); + header->time[1] = (unsigned char) (coarseTime>>16); + header->time[2] = (unsigned char) (coarseTime>>8); + header->time[3] = (unsigned char) (coarseTime); + header->time[4] = (unsigned char) (fineTime>>8); + header->time[5] = (unsigned char) (fineTime); + // + header->acquisitionTime[0] = header->time[0]; + header->acquisitionTime[1] = header->time[1]; + header->acquisitionTime[2] = header->time[2]; + header->acquisitionTime[3] = header->time[3]; + header->acquisitionTime[4] = header->time[4]; + header->acquisitionTime[5] = header->time[5]; + + // (4) SEND PACKET + status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send_ASM ); + if (status != RTEMS_SUCCESSFUL) { + printf("in ASM_send *** ERR %d\n", (int) status); + } + } +} + +void spw_send_asm_f1( ring_node *ring_node_to_send, + Header_TM_LFR_SCIENCE_ASM_t *header ) +{ + unsigned int i; + unsigned int length = 0; + rtems_status_code status; + unsigned int sid; + float *spectral_matrix; + int coarseTime; + int fineTime; + spw_ioctl_pkt_send spw_ioctl_send_ASM; + + sid = ring_node_to_send->sid; + spectral_matrix = (float*) ring_node_to_send->buffer_address; + coarseTime = ring_node_to_send->coarseTime; + fineTime = ring_node_to_send->fineTime; + + header->sy_lfr_common_parameters = parameter_dump_packet.sy_lfr_common_parameters; + + for (i=0; i<3; i++) + { + if ((i==0) || (i==1)) + { + spw_ioctl_send_ASM.dlen = DLEN_ASM_F1_PKT_1; + spw_ioctl_send_ASM.data = (char *) &spectral_matrix[ + ( (ASM_F1_INDICE_START + (i*NB_BINS_PER_PKT_ASM_F1_1) ) * NB_VALUES_PER_SM ) + ]; + length = PACKET_LENGTH_TM_LFR_SCIENCE_ASM_F1_1; + header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE_6; + header->pa_lfr_asm_blk_nr[0] = (unsigned char) ( (NB_BINS_PER_PKT_ASM_F1_1) >> 8 ); // BLK_NR MSB + header->pa_lfr_asm_blk_nr[1] = (unsigned char) (NB_BINS_PER_PKT_ASM_F1_1); // BLK_NR LSB + } + else + { + spw_ioctl_send_ASM.dlen = DLEN_ASM_F1_PKT_2; + spw_ioctl_send_ASM.data = (char*) &spectral_matrix[ + ( (ASM_F1_INDICE_START + (i*NB_BINS_PER_PKT_ASM_F1_1) ) * NB_VALUES_PER_SM ) + ]; + length = PACKET_LENGTH_TM_LFR_SCIENCE_ASM_F1_2; + header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE_6; + header->pa_lfr_asm_blk_nr[0] = (unsigned char) ( (NB_BINS_PER_PKT_ASM_F1_2) >> 8 ); // BLK_NR MSB + header->pa_lfr_asm_blk_nr[1] = (unsigned char) (NB_BINS_PER_PKT_ASM_F1_2); // BLK_NR LSB + } + + spw_ioctl_send_ASM.hlen = HEADER_LENGTH_TM_LFR_SCIENCE_ASM; + spw_ioctl_send_ASM.hdr = (char *) header; + spw_ioctl_send_ASM.options = 0; + + // (2) BUILD THE HEADER + increment_seq_counter_source_id( header->packetSequenceControl, sid ); + header->packetLength[0] = (unsigned char) (length>>8); + header->packetLength[1] = (unsigned char) (length); + header->sid = (unsigned char) sid; // SID + header->pa_lfr_pkt_cnt_asm = 3; + header->pa_lfr_pkt_nr_asm = (unsigned char) (i+1); + + // (3) SET PACKET TIME + header->time[0] = (unsigned char) (coarseTime>>24); + header->time[1] = (unsigned char) (coarseTime>>16); + header->time[2] = (unsigned char) (coarseTime>>8); + header->time[3] = (unsigned char) (coarseTime); + header->time[4] = (unsigned char) (fineTime>>8); + header->time[5] = (unsigned char) (fineTime); + // + header->acquisitionTime[0] = header->time[0]; + header->acquisitionTime[1] = header->time[1]; + header->acquisitionTime[2] = header->time[2]; + header->acquisitionTime[3] = header->time[3]; + header->acquisitionTime[4] = header->time[4]; + header->acquisitionTime[5] = header->time[5]; + + // (4) SEND PACKET + status = ioctl( fdSPW, SPACEWIRE_IOCTRL_SEND, &spw_ioctl_send_ASM ); + if (status != RTEMS_SUCCESSFUL) { + printf("in ASM_send *** ERR %d\n", (int) status); + } + } +} + +void spw_send_asm_f2( ring_node *ring_node_to_send, + Header_TM_LFR_SCIENCE_ASM_t *header ) +{ + unsigned int i; + unsigned int length = 0; + rtems_status_code status; + unsigned int sid; + float *spectral_matrix; + int coarseTime; + int fineTime; + spw_ioctl_pkt_send spw_ioctl_send_ASM; + + sid = ring_node_to_send->sid; + spectral_matrix = (float*) ring_node_to_send->buffer_address; + coarseTime = ring_node_to_send->coarseTime; + fineTime = ring_node_to_send->fineTime; + + header->sy_lfr_common_parameters = parameter_dump_packet.sy_lfr_common_parameters; + + for (i=0; i<3; i++) + { + + spw_ioctl_send_ASM.dlen = DLEN_ASM_F2_PKT; + spw_ioctl_send_ASM.data = (char *) &spectral_matrix[ + ( (ASM_F2_INDICE_START + (i*NB_BINS_PER_PKT_ASM_F2) ) * NB_VALUES_PER_SM ) + ]; + length = PACKET_LENGTH_TM_LFR_SCIENCE_ASM_F2; + header->serviceSubType = TM_SUBTYPE_LFR_SCIENCE_3; + header->pa_lfr_asm_blk_nr[0] = (unsigned char) ( (NB_BINS_PER_PKT_ASM_F2) >> 8 ); // BLK_NR MSB + header->pa_lfr_asm_blk_nr[1] = (unsigned char) (NB_BINS_PER_PKT_ASM_F2); // BLK_NR LSB + + spw_ioctl_send_ASM.hlen = HEADER_LENGTH_TM_LFR_SCIENCE_ASM; + spw_ioctl_send_ASM.hdr = (char *) header; + spw_ioctl_send_ASM.options = 0; + + // (2) BUILD THE HEADER + increment_seq_counter_source_id( header->packetSequenceControl, sid ); + header->packetLength[0] = (unsigned char) (length>>8); + header->packetLength[1] = (unsigned char) (length); + header->sid = (unsigned char) sid; // SID + header->pa_lfr_pkt_cnt_asm = 3; header->pa_lfr_pkt_nr_asm = (unsigned char) (i+1); // (3) SET PACKET TIME diff --git a/src/processing/avf0_prc0.c b/src/processing/avf0_prc0.c --- a/src/processing/avf0_prc0.c +++ b/src/processing/avf0_prc0.c @@ -341,10 +341,8 @@ rtems_task prc0_task( rtems_task_argumen { // 1) reorganize the ASM and divide ASM_reorganize_and_divide( asm_f0_patched_norm, - asm_f0_reorganized, + (float*) current_ring_node_to_send_asm_f0->buffer_address, nb_sm_before_f0.norm_bp1 ); - // 2) convert the float array in a char array - ASM_convert( asm_f0_reorganized, (char*) current_ring_node_to_send_asm_f0->buffer_address ); current_ring_node_to_send_asm_f0->coarseTime = incomingMsg->coarseTimeNORM; current_ring_node_to_send_asm_f0->fineTime = incomingMsg->fineTimeNORM; current_ring_node_to_send_asm_f0->sid = SID_NORM_ASM_F0; diff --git a/src/processing/avf1_prc1.c b/src/processing/avf1_prc1.c --- a/src/processing/avf1_prc1.c +++ b/src/processing/avf1_prc1.c @@ -336,10 +336,8 @@ rtems_task prc1_task( rtems_task_argumen { // 1) reorganize the ASM and divide ASM_reorganize_and_divide( asm_f1_patched_norm, - asm_f1_reorganized, + (float*) current_ring_node_to_send_asm_f1->buffer_address, nb_sm_before_f1.norm_bp1 ); - // 2) convert the float array in a char array - ASM_convert( asm_f1_reorganized, (char*) current_ring_node_to_send_asm_f1->buffer_address ); current_ring_node_to_send_asm_f1->coarseTime = incomingMsg->coarseTimeNORM; current_ring_node_to_send_asm_f1->fineTime = incomingMsg->fineTimeNORM; current_ring_node_to_send_asm_f1->sid = SID_NORM_ASM_F1; diff --git a/src/processing/avf2_prc2.c b/src/processing/avf2_prc2.c --- a/src/processing/avf2_prc2.c +++ b/src/processing/avf2_prc2.c @@ -235,10 +235,8 @@ rtems_task prc2_task( rtems_task_argumen { // 1) reorganize the ASM and divide ASM_reorganize_and_divide( asm_f2_patched_norm, - asm_f2_reorganized, + (float*) current_ring_node_to_send_asm_f2->buffer_address, nb_sm_before_f2.norm_bp1 ); - // 2) convert the float array in a char array - ASM_convert( asm_f2_reorganized, (char*) current_ring_node_to_send_asm_f2->buffer_address ); current_ring_node_to_send_asm_f2->coarseTime = incomingMsg->coarseTimeNORM; current_ring_node_to_send_asm_f2->fineTime = incomingMsg->fineTimeNORM; current_ring_node_to_send_asm_f2->sid = SID_NORM_ASM_F2;