@@ -1,2 +1,2 | |||
|
1 | 1 | 3081d1f9bb20b2b64a192585337a292a9804e0c5 LFR_basic-parameters |
|
2 | ce0c2f17257170a8529605f68687c18f23973087 header/lfr_common_headers | |
|
2 | 084fd0db5e4139a1096789935e32ef498192f395 header/lfr_common_headers |
@@ -18,6 +18,8 | |||
|
18 | 18 | |
|
19 | 19 | extern rtems_name Task_name[20]; /* array of task names */ |
|
20 | 20 | extern rtems_id Task_id[20]; /* array of task ids */ |
|
21 | extern rtems_name timecode_timer_name; | |
|
22 | extern rtems_id timecode_timer_id; | |
|
21 | 23 | extern unsigned char pa_bia_status_info; |
|
22 | 24 | |
|
23 | 25 | // RTEMS TASKS |
@@ -29,6 +31,7 int create_all_tasks( void ); | |||
|
29 | 31 | int start_all_tasks( void ); |
|
30 | 32 | // |
|
31 | 33 | rtems_status_code create_message_queues( void ); |
|
34 | rtems_status_code create_timecode_timer( void ); | |
|
32 | 35 | rtems_status_code get_message_queue_id_send( rtems_id *queue_id ); |
|
33 | 36 | rtems_status_code get_message_queue_id_recv( rtems_id *queue_id ); |
|
34 | 37 | rtems_status_code get_message_queue_id_prc0( rtems_id *queue_id ); |
@@ -15,6 +15,8 | |||
|
15 | 15 | |
|
16 | 16 | extern spw_stats spacewire_stats; |
|
17 | 17 | extern spw_stats spacewire_stats_backup; |
|
18 | extern rtems_name timecode_timer_name; | |
|
19 | extern rtems_id timecode_timer_id; | |
|
18 | 20 | |
|
19 | 21 | // RTEMS TASK |
|
20 | 22 | rtems_task spiq_task( rtems_task_argument argument ); |
@@ -31,6 +33,7 void spacewire_set_NP( unsigned char val | |||
|
31 | 33 | void spacewire_set_RE( unsigned char val, unsigned int regAddr ); // RMAP Enable |
|
32 | 34 | void spacewire_compute_stats_offsets( void ); |
|
33 | 35 | void spacewire_update_statistics( void ); |
|
36 | void increase_an_unsigned_char_counter( unsigned char *counter ); | |
|
34 | 37 | |
|
35 | 38 | void init_header_cwf( Header_TM_LFR_SCIENCE_CWF_t *header ); |
|
36 | 39 | void init_header_swf( Header_TM_LFR_SCIENCE_SWF_t *header ); |
@@ -43,6 +46,9 void spw_send_asm_f1( ring_node *ring_no | |||
|
43 | 46 | void spw_send_asm_f2( ring_node *ring_node_to_send, Header_TM_LFR_SCIENCE_ASM_t *header ); |
|
44 | 47 | void spw_send_k_dump( ring_node *ring_node_to_send ); |
|
45 | 48 | |
|
49 | rtems_timer_service_routine timecode_timer_routine( rtems_id timer_id, void *user_data ); | |
|
50 | unsigned int check_timecode_and_previous_timecode_coherency(unsigned char currentTimecodeCtr); | |
|
51 | unsigned int check_timecode_and_internal_time_coherency(unsigned char timecode, unsigned char internalTime); | |
|
46 | 52 | void timecode_irq_handler( void *pDev, void *regs, int minor, unsigned int tc ); |
|
47 | 53 | |
|
48 | 54 | void (*grspw_timecode_callback) ( void *pDev, void *regs, int minor, unsigned int tc ); |
@@ -26,6 +26,8 | |||
|
26 | 26 | rtems_name misc_name[5]; |
|
27 | 27 | rtems_name Task_name[20]; /* array of task names */ |
|
28 | 28 | rtems_id Task_id[20]; /* array of task ids */ |
|
29 | rtems_name timecode_timer_name; | |
|
30 | rtems_id timecode_timer_id; | |
|
29 | 31 | int fdSPW = 0; |
|
30 | 32 | int fdUART = 0; |
|
31 | 33 | unsigned char lfrCurrentMode; |
@@ -35,7 +35,7 | |||
|
35 | 35 | #define CONFIGURE_INIT_TASK_ATTRIBUTES (RTEMS_DEFAULT_ATTRIBUTES | RTEMS_FLOATING_POINT) |
|
36 | 36 | #define CONFIGURE_MAXIMUM_DRIVERS 16 |
|
37 | 37 | #define CONFIGURE_MAXIMUM_PERIODS 5 |
|
38 | #define CONFIGURE_MAXIMUM_TIMERS 5 // STAT (1s), send SWF (0.3s), send CWF3 (1s) | |
|
38 | #define CONFIGURE_MAXIMUM_TIMERS 5 // [spiq] [wtdg] [spacewire_reset_link] | |
|
39 | 39 | #define CONFIGURE_MAXIMUM_MESSAGE_QUEUES 5 |
|
40 | 40 | #ifdef PRINT_STACK_REPORT |
|
41 | 41 | #define CONFIGURE_STACK_CHECKER_ENABLED |
@@ -160,6 +160,12 rtems_task Init( rtems_task_argument ign | |||
|
160 | 160 | |
|
161 | 161 | create_names(); // create all names |
|
162 | 162 | |
|
163 | status = create_timecode_timer(); // create the timer used by timecode_irq_handler | |
|
164 | if (status != RTEMS_SUCCESSFUL) | |
|
165 | { | |
|
166 | PRINTF1("in INIT *** ERR in create_timer_timecode, code %d", status) | |
|
167 | } | |
|
168 | ||
|
163 | 169 | status = create_message_queues(); // create message queues |
|
164 | 170 | if (status != RTEMS_SUCCESSFUL) |
|
165 | 171 | { |
@@ -317,6 +323,8 void create_names( void ) // create all | |||
|
317 | 323 | misc_name[QUEUE_PRC0] = rtems_build_name( 'Q', '_', 'P', '0' ); |
|
318 | 324 | misc_name[QUEUE_PRC1] = rtems_build_name( 'Q', '_', 'P', '1' ); |
|
319 | 325 | misc_name[QUEUE_PRC2] = rtems_build_name( 'Q', '_', 'P', '2' ); |
|
326 | ||
|
327 | timecode_timer_name = rtems_build_name( 'S', 'P', 'T', 'C' ); | |
|
320 | 328 | } |
|
321 | 329 | |
|
322 | 330 | int create_all_tasks( void ) // create all tasks which run in the software |
@@ -750,6 +758,24 rtems_status_code create_message_queues( | |||
|
750 | 758 | return ret; |
|
751 | 759 | } |
|
752 | 760 | |
|
761 | rtems_status_code create_timecode_timer( void ) | |
|
762 | { | |
|
763 | rtems_status_code status; | |
|
764 | ||
|
765 | status = rtems_timer_create( timecode_timer_name, &timecode_timer_id ); | |
|
766 | ||
|
767 | if ( status != RTEMS_SUCCESSFUL ) | |
|
768 | { | |
|
769 | PRINTF1("in create_timer_timecode *** ERR creating SPTC timer, %d\n", status) | |
|
770 | } | |
|
771 | else | |
|
772 | { | |
|
773 | PRINTF("in create_timer_timecode *** OK creating SPTC timer\n") | |
|
774 | } | |
|
775 | ||
|
776 | return status; | |
|
777 | } | |
|
778 | ||
|
753 | 779 | rtems_status_code get_message_queue_id_send( rtems_id *queue_id ) |
|
754 | 780 | { |
|
755 | 781 | rtems_status_code status; |
@@ -342,7 +342,7 rtems_task dumb_task( rtems_task_argumen | |||
|
342 | 342 | unsigned int fine_time = 0; |
|
343 | 343 | rtems_event_set event_out; |
|
344 | 344 | |
|
345 |
char *DumbMessages[1 |
|
|
345 | char *DumbMessages[14] = {"in DUMB *** default", // RTEMS_EVENT_0 | |
|
346 | 346 | "in DUMB *** timecode_irq_handler", // RTEMS_EVENT_1 |
|
347 | 347 | "in DUMB *** f3 buffer changed", // RTEMS_EVENT_2 |
|
348 | 348 | "in DUMB *** in SMIQ *** Error sending event to AVF0", // RTEMS_EVENT_3 |
@@ -354,7 +354,8 rtems_task dumb_task( rtems_task_argumen | |||
|
354 | 354 | "tick", // RTEMS_EVENT_9 |
|
355 | 355 | "VHDL ERR *** waveform picker", // RTEMS_EVENT_10 |
|
356 | 356 | "VHDL ERR *** unexpected ready matrix values", // RTEMS_EVENT_11 |
|
357 |
"WATCHDOG timer" |
|
|
357 | "WATCHDOG timer", // RTEMS_EVENT_12 | |
|
358 | "TIMECODE timer" // RTEMS_EVENT_13 | |
|
358 | 359 | }; |
|
359 | 360 | |
|
360 | 361 | BOOT_PRINTF("in DUMB *** \n") |
@@ -362,7 +363,7 rtems_task dumb_task( rtems_task_argumen | |||
|
362 | 363 | while(1){ |
|
363 | 364 | rtems_event_receive(RTEMS_EVENT_0 | RTEMS_EVENT_1 | RTEMS_EVENT_2 | RTEMS_EVENT_3 |
|
364 | 365 | | RTEMS_EVENT_4 | RTEMS_EVENT_5 | RTEMS_EVENT_6 | RTEMS_EVENT_7 |
|
365 | | RTEMS_EVENT_8 | RTEMS_EVENT_9 | RTEMS_EVENT_12, | |
|
366 | | RTEMS_EVENT_8 | RTEMS_EVENT_9 | RTEMS_EVENT_12 | RTEMS_EVENT_13, | |
|
366 | 367 | RTEMS_WAIT | RTEMS_EVENT_ANY, RTEMS_NO_TIMEOUT, &event_out); // wait for an RTEMS_EVENT |
|
367 | 368 | intEventOut = (unsigned int) event_out; |
|
368 | 369 | for ( i=0; i<32; i++) |
@@ -375,6 +376,10 rtems_task dumb_task( rtems_task_argumen | |||
|
375 | 376 | { |
|
376 | 377 | PRINTF1("%s\n", DumbMessages[12]) |
|
377 | 378 | } |
|
379 | if (i==13) | |
|
380 | { | |
|
381 | PRINTF1("%s\n", DumbMessages[13]) | |
|
382 | } | |
|
378 | 383 | } |
|
379 | 384 | } |
|
380 | 385 | } |
@@ -22,6 +22,9 Header_TM_LFR_SCIENCE_CWF_t headerCWF; | |||
|
22 | 22 | Header_TM_LFR_SCIENCE_SWF_t headerSWF; |
|
23 | 23 | Header_TM_LFR_SCIENCE_ASM_t headerASM; |
|
24 | 24 | |
|
25 | unsigned char previousTimecodeCtr = 0; | |
|
26 | unsigned int *grspwPtr = (unsigned int *) (REGS_ADDR_GRSPW + APB_OFFSET_GRSPW_TIME_REGISTER); | |
|
27 | ||
|
25 | 28 | //*********** |
|
26 | 29 | // RTEMS TASK |
|
27 | 30 | rtems_task spiq_task(rtems_task_argument unused) |
@@ -658,41 +661,146 void spacewire_update_statistics( void ) | |||
|
658 | 661 | housekeeping_packet.hk_lfr_dpu_spw_rx_too_big = (unsigned char) spacewire_stats.rx_truncated; |
|
659 | 662 | } |
|
660 | 663 | |
|
661 | void timecode_irq_handler( void *pDev, void *regs, int minor, unsigned int tc ) | |
|
664 | void increase_unsigned_char_counter( unsigned char *counter ) | |
|
665 | { | |
|
666 | // update the number of valid timecodes that have been received | |
|
667 | if (*counter == 255) | |
|
668 | { | |
|
669 | *counter = 0; | |
|
670 | } | |
|
671 | else | |
|
662 | 672 | { |
|
663 | // a valid timecode has been received, write it in the HK report | |
|
664 | unsigned int *grspwPtr; | |
|
665 | unsigned char timecodeCtr; | |
|
666 | unsigned char updateTimeCtr; | |
|
673 | *counter = *counter + 1; | |
|
674 | } | |
|
675 | } | |
|
667 | 676 | |
|
668 | grspwPtr = (unsigned int *) (REGS_ADDR_GRSPW + APB_OFFSET_GRSPW_TIME_REGISTER); | |
|
677 | rtems_timer_service_routine timecode_timer_routine( rtems_id timer_id, void *user_data ) | |
|
678 | { | |
|
679 | ||
|
680 | unsigned char currentTimecodeCtr; | |
|
681 | ||
|
682 | currentTimecodeCtr = (unsigned char) (grspwPtr[0] & TIMECODE_MASK); | |
|
669 | 683 | |
|
670 | housekeeping_packet.hk_lfr_dpu_spw_last_timc = (unsigned char) (grspwPtr[0] & 0xff); // [1111 1111] | |
|
671 | timecodeCtr = (unsigned char) (grspwPtr[0] & 0x3f); // [0011 1111] | |
|
672 | updateTimeCtr = time_management_regs->coarse_time_load & 0x3f; // [0011 1111] | |
|
684 | if (currentTimecodeCtr == previousTimecodeCtr) | |
|
685 | { | |
|
686 | //************************ | |
|
687 | // HK_LFR_TIMECODE_MISSING | |
|
688 | // the timecode value has not changed, no valid timecode has been received, the timecode is MISSING | |
|
689 | increase_unsigned_char_counter( &housekeeping_packet.hk_lfr_timecode_missing ); | |
|
690 | } | |
|
691 | else if (currentTimecodeCtr == (previousTimecodeCtr+1)) | |
|
692 | { | |
|
693 | // the timecode value has changed and the value is valid, this is unexpected because | |
|
694 | // the timer should not have fired, the timecode_irq_handler should have been raised | |
|
695 | } | |
|
696 | else | |
|
697 | { | |
|
698 | //************************ | |
|
699 | // HK_LFR_TIMECODE_INVALID | |
|
700 | // the timecode value has changed and the value is not valid, no tickout has been generated | |
|
701 | // this is why the timer has fired | |
|
702 | increase_unsigned_char_counter( &housekeeping_packet.hk_lfr_timecode_invalid ); | |
|
703 | } | |
|
673 | 704 | |
|
674 | // update the number of valid timecodes that have been received | |
|
675 | if (housekeeping_packet.hk_lfr_dpu_spw_tick_out_cnt == 255) | |
|
705 | rtems_event_send( Task_id[TASKID_DUMB], RTEMS_EVENT_13 ); | |
|
706 | } | |
|
707 | ||
|
708 | unsigned int check_timecode_and_previous_timecode_coherency(unsigned char currentTimecodeCtr) | |
|
709 | { | |
|
710 | unsigned char ret; | |
|
711 | ||
|
712 | ret = LFR_DEFAULT; | |
|
713 | ||
|
714 | if (currentTimecodeCtr == 0) | |
|
715 | { | |
|
716 | if (previousTimecodeCtr == 63) | |
|
676 | 717 | { |
|
677 | housekeeping_packet.hk_lfr_dpu_spw_tick_out_cnt = 0; | |
|
718 | ret = LFR_SUCCESSFUL; | |
|
719 | } | |
|
720 | else | |
|
721 | { | |
|
722 | ret = LFR_DEFAULT; | |
|
723 | } | |
|
724 | } | |
|
725 | else | |
|
726 | { | |
|
727 | if (currentTimecodeCtr == (previousTimecodeCtr +1)) | |
|
728 | { | |
|
729 | ret = LFR_SUCCESSFUL; | |
|
678 | 730 | } |
|
679 | 731 | else |
|
680 | 732 | { |
|
681 | housekeeping_packet.hk_lfr_dpu_spw_tick_out_cnt = housekeeping_packet.hk_lfr_dpu_spw_tick_out_cnt + 1; | |
|
733 | ret = LFR_DEFAULT; | |
|
734 | } | |
|
735 | } | |
|
736 | ||
|
737 | return ret; | |
|
682 | 738 | } |
|
683 | 739 | |
|
684 | // check the value of the timecode with respect to the last TC_LFR_UPDATE_TIME => SSS-CP-FS-370 | |
|
685 | if (timecodeCtr != updateTimeCtr) | |
|
740 | unsigned int check_timecode_and_internal_time_coherency(unsigned char timecode, unsigned char internalTime) | |
|
686 | 741 | { |
|
687 | if (housekeeping_packet.hk_lfr_time_timecode_ctr == 255) | |
|
742 | unsigned int ret; | |
|
743 | ||
|
744 | ret = LFR_DEFAULT; | |
|
745 | ||
|
746 | if (timecode == internalTime) | |
|
688 | 747 |
|
|
689 | housekeeping_packet.hk_lfr_time_timecode_ctr = 0; | |
|
748 | ret = LFR_SUCCESSFUL; | |
|
690 | 749 |
|
|
691 | 750 |
|
|
692 | 751 |
|
|
693 | housekeeping_packet.hk_lfr_time_timecode_ctr = housekeeping_packet.hk_lfr_time_timecode_ctr + 1; | |
|
752 | ret = LFR_DEFAULT; | |
|
753 | } | |
|
754 | ||
|
755 | return ret; | |
|
694 | 756 | } |
|
757 | ||
|
758 | void timecode_irq_handler( void *pDev, void *regs, int minor, unsigned int tc ) | |
|
759 | { | |
|
760 | // a tickout has been emitted, perform actions on the incoming timecode | |
|
761 | ||
|
762 | unsigned char incomingTimecode; | |
|
763 | unsigned char updateTime; | |
|
764 | unsigned char internalTime; | |
|
765 | rtems_status_code status; | |
|
766 | ||
|
767 | incomingTimecode = (unsigned char) (grspwPtr[0] & TIMECODE_MASK); | |
|
768 | updateTime = time_management_regs->coarse_time_load & TIMECODE_MASK; | |
|
769 | internalTime = time_management_regs->coarse_time & TIMECODE_MASK; | |
|
770 | ||
|
771 | housekeeping_packet.hk_lfr_dpu_spw_last_timc = incomingTimecode; | |
|
772 | ||
|
773 | // update the number of tickout that have been generated | |
|
774 | increase_unsigned_char_counter( &housekeeping_packet.hk_lfr_dpu_spw_tick_out_cnt ); | |
|
775 | ||
|
776 | //************************** | |
|
777 | // HK_LFR_TIMECODE_ERRONEOUS | |
|
778 | // MISSING and INVALID are handled by the timecode_timer_routine service routine | |
|
779 | if (check_timecode_and_previous_timecode_coherency( incomingTimecode ) == LFR_DEFAULT) | |
|
780 | { | |
|
781 | // this is unexpected but a tickout has been raised and the timecode is erroneous | |
|
782 | increase_unsigned_char_counter( &housekeeping_packet.hk_lfr_timecode_erroneous ); | |
|
695 | 783 | } |
|
784 | ||
|
785 | //************************ | |
|
786 | // HK_LFR_TIME_TIMECODE_IT | |
|
787 | // check the coherency between the SpaceWire timecode and the Internal Time | |
|
788 | if (check_timecode_and_internal_time_coherency( incomingTimecode, internalTime ) == LFR_DEFAULT) | |
|
789 | { | |
|
790 | increase_unsigned_char_counter( &housekeeping_packet.hk_lfr_time_timecode_it ); | |
|
791 | } | |
|
792 | ||
|
793 | //******************** | |
|
794 | // HK_LFR_TIMECODE_CTR | |
|
795 | // check the value of the timecode with respect to the last TC_LFR_UPDATE_TIME => SSS-CP-FS-370 | |
|
796 | if (incomingTimecode != updateTime) | |
|
797 | { | |
|
798 | increase_unsigned_char_counter( &housekeeping_packet.hk_lfr_time_timecode_ctr ); | |
|
799 | } | |
|
800 | ||
|
801 | // launch the timecode timer to detect missing or invalid timecodes | |
|
802 | previousTimecodeCtr = incomingTimecode; // update the previousTimecodeCtr value | |
|
803 | status = rtems_timer_fire_after( timecode_timer_id, TIMECODE_TIMER_TIMEOUT, timecode_timer_routine, NULL ); | |
|
696 | 804 | } |
|
697 | 805 | |
|
698 | 806 | void init_header_cwf( Header_TM_LFR_SCIENCE_CWF_t *header ) |
General Comments 0
You need to be logged in to leave comments.
Login now