##// END OF EJS Templates
Naming convention changed...
Naming convention changed Code cleaning

File last commit:

r0:452a68f7426f default
r5:ad4f943b1cb5 default
Show More
FSW.c
189 lines | 8.3 KiB | text/x-c | CLexer
#include <..\header\LPP_spwAPI.h>
#include <..\header\basic_parameters.h>
#include <..\header\ccsds_types.h>
#include <stdio.h>
#include <stdlib.h>
#include <asm-leon/timer.h>
#include <asm-leon/irq.h>
#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; i<TOTAL_SIZE_SPECTRAL_MATRIX; i++) {
averaged_spectral_matrix_f0[i] = averaged_spectral_matrix_f0[i] + spectral_matrix_f0_a[i];
}
send_fine_time(time_manager_regs->fine_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; i<TOTAL_SIZE_SPECTRAL_MATRIX; i++) {
averaged_spectral_matrix_f0[i] = averaged_spectral_matrix_f0[i] + spectral_matrix_f0_b[i];
}
send_fine_time(time_manager_regs->fine_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;i<NB_BINS_COMPRESSED_MATRIX_f0;i++){
j = 17 + i * 8;
compressed_spectral_matrix_f0[i]= (averaged_spectral_matrix_f0[j]
+ averaged_spectral_matrix_f0[j+1]
+ averaged_spectral_matrix_f0[j+2]
+ averaged_spectral_matrix_f0[j+3]
+ averaged_spectral_matrix_f0[j+4]
+ averaged_spectral_matrix_f0[j+5]
+ averaged_spectral_matrix_f0[j+6]
+ averaged_spectral_matrix_f0[j+7])/(8*NB_AVERAGE_NORMAL_f0);
}
BP1_set(); // computation of the BP1 set and building of the corresponding telemetry product
// sending of the BP1 set
set_txd( LFR_BP1_F0, NB_BINS_COMPRESSED_MATRIX_f0*9, // initialize the transmitter descriptor 0
(char*) &ccsdsTelemetryHeader, CCSDS_TELEMETRY_HEADER_LENGTH, txd );
enable_transmitter_descriptor(CCSDS_TELEMETRY_HEADER_LENGTH, spacewire_PARAMETERS.txd); // enable the descriptor for transmission
enable_transmitter(spacewire_PARAMETERS.regs); // enable the transmission
for (i=0; i<TOTAL_SIZE_SPECTRAL_MATRIX; i++) {
averaged_spectral_matrix_f0[i] = 0;
}
//send_fine_time(time_manager_regs->fine_time);
current_nb_average = 0;
}
}
return 0;
}