#include <..\header\LPP_spwAPI.h> #include <..\header\basic_parameters.h> #include <..\header\ccsds_types.h> #include #include #include #include #define FINE_TIME_RESET time_manager_regs->ctrl = 0x00000001; volatile int didtick = 0; volatile int cnt = 0; volatile int dide = 0; struct timerevent e; /* this has to be a global variable, it is inserted in a linked list by addtimer() */ struct irqaction action_receive_CCSDS; /* this has to be a global variable as it will be inserted in a list */ void register_event(); int event(void *arg) { dide = 1; register_event(); return 0; } void register_event() { /* add an event 1s from now */ do_gettimeofday((struct timeval*) &e.expire); e.handler = event; e.expire.tv_sec = e.expire.tv_sec + 1; addtimer(&e); } int main() { volatile char *rx; char *tx; volatile char *rmaphdr; volatile char *rmap; volatile int *rxd; volatile int *txd; int size; int i; int j; unsigned char current_nb_average = 0; spwHeader_t spwHeader; grspwregs_t *grspw_regs; time_manager_regs_t *time_manager_regs; spectral_matrices_regs_t *spectral_matrices_regs; grspw_regs = (grspwregs_t*) GRSPW_APB_ADDR; // the grspw registers are at the address GRSPW_APB_ADDR time_manager_regs = (time_manager_regs_t*) LPP_TIME_MANAGER; // the time manager registers are at the address LPP_TIME_MANAGER spectral_matrices_regs = (spectral_matrices_regs_t*) LPP_SPECTRAL_MATRIX_CTRL; // the spectral matrices registers are at this address rx = (char*) malloc(64); tx = (char*) malloc(64); rmaphdr = (char*) malloc(32); rmap = (char*) malloc(64); rxd = (int*) almalloc(1024); // memory allocation for the receiver descriptors table // almalloc => 1024 bytes aligned address txd = (int*) almalloc(1024); // memory allocation for the transmitter descriptors table // almalloc => 1024 bytes aligned address // GRSPW initilization spw_reset(grspw_regs); // RESET THE SPACEWIRE LINK spw_init(NODEADDR, CLKDIV, DESTKEY, RXMAXLEN, grspw_regs); // INITIALIZE THE SPACEWIRE REGISTERS enable_timecode_reception(grspw_regs); // enable time-code reception while( grspw_link_state(grspw_regs) != SPW_LINK_STATE_RUN ) {} // wait for the link to be in run state // INITIALIZE THE TRANSMITTER RECEIVER DESCRIPTORS TABLES for(i=0; i<8; i++) { // initialize the receiver and transmitter descriptor tables rxd[i] = 0; txd[i] = 0; } grspw_regs->txdesc = (int) txd; grspw_regs->rxdesc = (int) rxd; for (j=0; j<64; j++){ // initialize the rx and tx data tables rx[j] = j; tx[j] = 10; } // INITIALIZE THE TRANSMISSION spwHeader.targetLogicalAddress = 0x21; // initialize the SpaceWire Header spwHeader.protocolIdentifier = 0x02; spwHeader.reserved = 0x00; spwHeader.userApplication = 0x00; set_txd(tx, 32, (char*) &spwHeader, HEADERLEN, txd); // initialize the transmitter descriptor 0 INIT_CCSDS_TELEMETRY_HEADER // INITIALIZE THE RECEPTION enable_receiver_descriptor(rx, rxd); // enable the reception of a SpaceWire packet // START SPW TRANSMISSION / RECEPTION grspw_regs->dmactrl = GRSPW_DMACTRL_NS | GRSPW_DMACTRL_RD | GRSPW_DMACTRL_RI | GRSPW_DMACTRL_RE | GRSPW_DMACTRL_TE; // NS = 1 wait for a descriptor to be activated // RD = 1 there are enabled descriptors // RI = 1 receive interrupts // RE = 1 receiver enabled // TE = 1 transmitter enabled // TIME FUNCTIONS leonbare_init_ticks(); // initialize the time abilities of the Leon3 register_event(); // create an event // SETS AN IRQ HANDLER UPON RECEPTION OF A SPACEWIRE PACKET spacewire_PARAMETERS.size = &size; // size of the receive packet spacewire_PARAMETERS.rx = rx; // location of the data spacewire_PARAMETERS.rxd = rxd; // associated descriptor spacewire_PARAMETERS.tx = tx; // location of the data spacewire_PARAMETERS.txd = txd; // associated descriptor spacewire_PARAMETERS.regs = grspw_regs; // grspw module registers action_receive_CCSDS.handler = (irqhandler) irqhandler_receive_CCSDS; // create the irq handler chained_catch_interrupt(GRSPW_IRQ, &action_receive_CCSDS); // associate the handler with the GRSPW_IRQ enable_irq(GRSPW_IRQ); // enable the interruption driven by the grspw module upon reception of a packet packet_type.time_packet = 0; packet_type.tc_packet = 0; //write spectral matrices location in the registers spectral_matrices_regs->address1 = (unsigned int) spectral_matrix_f0_a; spectral_matrices_regs->address2 = (unsigned int) spectral_matrix_f0_b; printf("let's work...\n"); while(1) { // infinite loop if (packet_type.time_packet == 1) { FINE_TIME_RESET time_manager_regs->next_coarse_time = (rx[10+4]<<24) + (rx[11+4]<<16) + (rx[12+4]<<8) + (rx[13+4]); send_fine_time(time_manager_regs->fine_time); enable_receiver_descriptor(spacewire_PARAMETERS.rx, spacewire_PARAMETERS.rxd); enable_receiver(spacewire_PARAMETERS.regs); packet_type.time_packet = 0; } if ((spectral_matrices_regs->ctrl & 1) == 1) { FINE_TIME_RESET for (i=0; ifine_time); spectral_matrices_regs->ctrl = spectral_matrices_regs->ctrl & 0xfffffffe; current_nb_average++; } if ( ( (spectral_matrices_regs->ctrl>>1) & 1) == 1) { FINE_TIME_RESET for (i=0; ifine_time); spectral_matrices_regs->ctrl = spectral_matrices_regs->ctrl & 0xfffffffd; current_nb_average++; } if ( current_nb_average == NB_AVERAGE_NORMAL_f0 ) { FINE_TIME_RESET for(i=0;ifine_time); current_nb_average = 0; } } return 0; }