diff --git a/.hgignore b/.hgignore new file mode 100644 diff --git a/LFR.c b/LFR.c new file mode 100644 --- /dev/null +++ b/LFR.c @@ -0,0 +1,11 @@ +#include + +volatile lfr_regs_t* LFR = (lfr_regs_t*)0x80000f00; +volatile lfr_managment_regs_t* LFR_MANAGMENT = (lfr_managment_regs_t*)0x80000600; + +void resetLFR() +{ + LFR_MANAGMENT->Control.Value=7; + asm("nop;nop;"); + LFR_MANAGMENT->Control.Value=0; +} diff --git a/LFR.h b/LFR.h new file mode 100644 --- /dev/null +++ b/LFR.h @@ -0,0 +1,12 @@ +#ifndef LFR_H_INCLUDED +#define LFR_H_INCLUDED + +#include +#include + +extern volatile lfr_regs_t* LFR; +extern volatile lfr_managment_regs_t* LFR_MANAGMENT; + +extern void resetLFR(); + +#endif // LFR_H_INCLUDED diff --git a/OFFSET_ANALYSIS.pro b/OFFSET_ANALYSIS.pro new file mode 100644 --- /dev/null +++ b/OFFSET_ANALYSIS.pro @@ -0,0 +1,26 @@ +TEMPLATE = app +CONFIG += console +CONFIG -= app_bundle +CONFIG -= qt + +include(sparc.pri) + +INCLUDEPATH += ./ + +OBJECTS_DIR=obj +DESTDIR=bin + + + +SOURCES += main.c \ + wfp.c \ + LFR.c + +HEADERS += grlib_regs.h \ + wfp.h \ + LFR.h + +OTHER_FILES += READ_ASM.py + + + diff --git a/grlib_regs.h b/grlib_regs.h new file mode 100644 --- /dev/null +++ b/grlib_regs.h @@ -0,0 +1,242 @@ +#ifndef GRLIB_REGS_H_INCLUDED +#define GRLIB_REGS_H_INCLUDED + +#define NB_GPTIMER 3 +#include + +struct apbuart_regs_str{ + volatile unsigned int data; + volatile unsigned int status; + volatile unsigned int ctrl; + volatile unsigned int scaler; + volatile unsigned int fifoDebug; +}; + +struct grgpio_regs_str{ + volatile int io_port_data_register; + int io_port_output_register; + int io_port_direction_register; + int interrupt_mak_register; + int interrupt_polarity_register; + int interrupt_edge_register; + int bypass_register; + int reserved; + // 0x20-0x3c interrupt map register(s) +}; + +typedef volatile struct { + int counter; + volatile unsigned int reload; + volatile unsigned int ctrl; + volatile unsigned int unused; +} timer_regs_t; + +typedef volatile struct { + volatile unsigned int scaler_value; + volatile unsigned int scaler_reload; + volatile unsigned int conf; + volatile unsigned int unused0; + timer_regs_t timer[NB_GPTIMER]; +} gptimer_regs_t; + + +typedef struct +{ + uint32_t unused:16; + uint32_t Fine:16; + uint32_t Coarse; +}CUCtime_t; + +struct DualBuffAddr_t +{ + volatile uint32_t ADDR0; + volatile uint32_t ADDR1; +}; + +struct Potential_t +{ + uint32_t UNUSED:16; + uint32_t Value:16; +}; + + +typedef volatile struct { + volatile union CONFIG{ + volatile struct { + uint32_t UNUSED:29; // 0x00 + uint32_t run:1; + uint32_t interuptOnDoneEnable:1; + uint32_t interuptOnErrorEnable:1; + }FIELDS; + uint32_t Value; + }CONFIG; + + volatile union STATUS{ + volatile struct { + uint32_t UNUSED:21; + uint32_t FIFO_2_Full_err:1; + uint32_t FIFO_1_Full_err:1; + uint32_t FIFO_0_Full_err:1; + uint32_t Buffer_Full_err:1; + uint32_t Ready_F2_Buffer1:1; + uint32_t Ready_F2_Buffer0:1; + uint32_t Ready_F1_Buffer1:1; + uint32_t Ready_F1_Buffer0:1; + uint32_t Ready_F0_Buffer1:1; + uint32_t Ready_F0_Buffer0:1; + }FIELDS; + uint32_t Value; + }STATUS; + + struct DualBuffAddr_t ADDRESS_F0; + struct DualBuffAddr_t ADDRESS_F1; + struct DualBuffAddr_t ADDRESS_F2; + + CUCtime_t TIME_F0_0; + CUCtime_t TIME_F0_1; + CUCtime_t TIME_F1_0; + CUCtime_t TIME_F1_1; + CUCtime_t TIME_F2_0; + CUCtime_t TIME_F2_1; + volatile struct { + uint32_t Unused:6; + uint32_t length:26; // 0x50, length of a spectral matrix in burst (25*128) / 16 = 200 = 0xc8 + }length; +} lfr_sm_regs_t; + + +typedef volatile struct { + volatile union DATASHAPING { + volatile struct { + uint32_t UNUSED:26; // 0x00 + uint32_t R2:1; + uint32_t R1:1; + uint32_t R0:1; + uint32_t SP1:1; + uint32_t SP0:1; + uint32_t BW:1; + }FIELDS; + uint32_t Value; + }DATASHAPING; + + volatile union { + volatile struct { + uint32_t UNUSED:25; + uint32_t BURST_EN_F2:1; + uint32_t BURST_EN_F1:1; + uint32_t BURST_EN_F0:1; + uint32_t ACQ_EN_F3:1; + uint32_t ACQ_EN_F2:1; + uint32_t ACQ_EN_F1:1; + uint32_t ACQ_EN_F0:1; + }FIELDS; + uint32_t Value; + }Control; + + volatile struct DualBuffAddr_t ADDRESS_F0; + volatile struct DualBuffAddr_t ADDRESS_F1; + volatile struct DualBuffAddr_t ADDRESS_F2; + volatile struct DualBuffAddr_t ADDRESS_F3; + + uint32_t STATUS; + uint32_t DeltaSnapshot; + uint32_t Delta_F0; + + uint32_t UNUSED_Delta_F0_2:25; + uint32_t Delta_F0_2:7; + uint32_t Delta_F1; + uint32_t Delta_F2; + + uint32_t Nb_Data_per_buff; + uint32_t Nb_snapshot; + + uint32_t StartDate; + + CUCtime_t TIME_F0_0; + CUCtime_t TIME_F0_1; + CUCtime_t TIME_F1_0; + CUCtime_t TIME_F1_1; + CUCtime_t TIME_F2_0; + CUCtime_t TIME_F2_1; + CUCtime_t TIME_F3_0; + CUCtime_t TIME_F3_1; + + union{ + struct { + uint32_t Unused_length:6; + uint32_t length:26; + }FIELDS; // 0x50, length of a spectral matrix in burst (25*128) / 16 = 200 = 0xc8 + uint32_t Value; + }length; + struct Potential_t V; + struct Potential_t E1; + struct Potential_t E2; +} lfr_wfp_regs_t; + +typedef struct { + uint32_t UNUSED:16; + uint32_t Value:16; +}lfr_hk_temp_t; + +typedef struct { + struct { + uint32_t UNUSED:25; + uint32_t CAL_EN:1; + uint32_t Interleaved_EN:1; + uint32_t Reload_EN:1; + uint32_t DAC_CFG:4; + }Control; + + uint32_t UNUSED_PRE:24; + uint32_t PRE:8; + + uint32_t UNUSED_N:16; + uint32_t N:16; + + uint32_t UNUSED_ADDR:24; + uint32_t ADDRESS:8; + + uint32_t UNUSED_DATA_IN:14; + uint32_t DATA_IN:18; + +}lfr_dac_regs_t; + +typedef volatile struct { + union { + struct { + uint32_t UNUSED:29; + uint32_t SOFT_RESET:1; + uint32_t TIME_MANAGMENT_RESET:1; + uint32_t SWTick:1;}FIELDS; + uint32_t Value; + }Control; + + uint32_t UNUSED_TIME_LOAD:1; + uint32_t TIME_LOAD:31; + + uint32_t Unsynchronized:1; + uint32_t COARSE_TIME:31; + + uint32_t UNUSED_FINE_TIME:16; + uint32_t FINE_TIME:16; + + lfr_hk_temp_t TEMP_0; + lfr_hk_temp_t TEMP_1; + lfr_hk_temp_t TEMP_2; + + lfr_dac_regs_t DAC; + +}lfr_managment_regs_t; + +typedef volatile struct { + lfr_sm_regs_t SM; + lfr_wfp_regs_t WFP; + struct { + uint32_t UNUSED:8; + uint32_t Board:8; + uint32_t Major:8; + uint32_t Minor:8; + }VERSION; +}lfr_regs_t; + +#endif // GRLIB_REGS_H_INCLUDED diff --git a/main.c b/main.c new file mode 100644 --- /dev/null +++ b/main.c @@ -0,0 +1,48 @@ +#include +#include +#include +#include +#include + +#define MS_Size_Int (128 * 25 * 4 / sizeof(int)) + +#define BUF_SZ 2688 + +uint16_t WF1[6 * BUF_SZ] __attribute__((aligned(0x100))); +uint16_t WF2[6 * BUF_SZ] __attribute__((aligned(0x100))); + +volatile int todo = 0; +volatile int Freq = 0; +volatile int PerformReset = 1; +volatile int Major; +volatile int Minor; +volatile int Board; + +int main(void) { + Major = LFR->VERSION.Major; + Minor = LFR->VERSION.Minor; + Board = LFR->VERSION.Board; + while (1) + { + do{ + if(PerformReset) + resetLFR(); + switch (Freq) + { + case 0: + getSnapShotsF0((uint32_t)WF1,(uint32_t)WF2,BUF_SZ,0); + break; + case 1: + getSnapShotsF1((uint32_t)WF1,(uint32_t)WF2,BUF_SZ,0); + break; + case 2: + getSnapShotsF2((uint32_t)WF1,(uint32_t)WF2,BUF_SZ,0); + break; + default: + break; + } + todo--; + }while (todo!=0); + } + return 0; +} diff --git a/sparc.pri b/sparc.pri new file mode 100644 --- /dev/null +++ b/sparc.pri @@ -0,0 +1,72 @@ + +QMAKE_CC=sparc-elf-gcc +message(C compiler forced to: $$QMAKE_CC) +QMAKE_CXX=sparc-elf-g++ +message(C++ compiler forced to: $$QMAKE_CXX) +QMAKE_AR=sparc-elf-ar rcs +message(Archiver forced to: $$QMAKE_AR) +QMAKE_LINK=sparc-elf-gcc +message(Linker forced to: $$QMAKE_LINK) +QMAKE_LINK_SHLIB=sparc-elf-g++ +QMAKE_OBJCOPY= sparc-elf-objcopy +QMAKE_STRIP=sparc-elf-strip +QMAKE_GDB=sparc-elf-gdb + +QMAKE_CFLAGS_APP="" +QMAKE_CXXFLAGS_APP="" +QMAKE_CFLAGS=-mcpu=v8 +QMAKE_CFLAGS_DEBUG= -g +QMAKE_CFLAGS_RELEASE="" +QMAKE_CXXFLAGS_DEBUG= -g +QMAKE_CXXFLAGS_RELEASE="" +QMAKE_LFLAGS_RELEASE=-mcpu=v8 +QMAKE_LFLAGS_DEBUG= -g -mcpu=v8 +QMAKE_CXXFLAGS_DEPS = +QMAKE_CXXFLAGS_WARN_ON = -Wall +QMAKE_CXXFLAGS_WARN_OFF = -w +QMAKE_CXXFLAGS_RELEASE = +QMAKE_CXXFLAGS_DEBUG = +QMAKE_CXXFLAGS_YACC = +QMAKE_CXXFLAGS_THREAD = +QMAKE_CXXFLAGS_RTTI_ON = +QMAKE_CXXFLAGS_RTTI_OFF = +QMAKE_CXXFLAGS_EXCEPTIONS_ON = +QMAKE_CXXFLAGS_EXCEPTIONS_OFF = +QMAKE_CFLAGS_WARN_ON = -Wall +QMAKE_CFLAGS_WARN_OFF = -w +QMAKE_CFLAGS_RELEASE = +QMAKE_CFLAGS_YACC = +QMAKE_LFLAGS_EXCEPTIONS_ON = +QMAKE_LFLAGS_EXCEPTIONS_OFF = +QMAKE_LFLAGS_CONSOLE = +QMAKE_LFLAGS_WINDOWS = +QMAKE_LFLAGS_DLL = +QMAKE_INCDIR_QT = +QMAKE_INCDIR = +QMAKE_CFLAGS_SHLIB = +QMAKE_CFLAGS_STATIC_LIB = +QMAKE_CXXFLAGS_SHLIB = +QMAKE_CXXFLAGS_STATIC_LIB = +QMAKE_LIBS="" +INCLUDEPATH="" +DEFINES="" + + +QMAKE_CFLAGS_RELEASE += -O3 +QMAKE_CFLAGS_DEBUG += -O3 +QMAKE_CXXFLAGS_RELEASE += -O3 +QMAKE_CXXFLAGS_DEBUG += -O3 + +#QMAKE_CFLAGS_RELEASE += -O0 +#QMAKE_CFLAGS_DEBUG += -O0 +#QMAKE_CXXFLAGS_RELEASE += -O0 +#QMAKE_CXXFLAGS_DEBUG += -O0 + + +#QMAKE_CFLAGS_RELEASE+= -O3 -std=c99 +#QMAKE_CFLAGS_DEBUG+= -O3 -std=c99 +#QMAKE_CXXFLAGS_RELEASE+= -O3 -std=c99 +#QMAKE_CXXFLAGS_DEBUG+= -O3 -std=c99 + + + diff --git a/wfp.c b/wfp.c new file mode 100644 --- /dev/null +++ b/wfp.c @@ -0,0 +1,44 @@ +#include + + +void getSnapShotsF0(uint32_t buffer0, uint32_t buffer1,unsigned int NB_Samples, int freq) +{ + LFR->WFP.Control.Value=0; + volatile int test = LFR->WFP.STATUS; + LFR->WFP.ADDRESS_F0.ADDR0 = buffer0; + LFR->WFP.ADDRESS_F0.ADDR1 = buffer1; + LFR->WFP.length.FIELDS.length=(NB_Samples*3)/16; + LFR->WFP.Nb_Data_per_buff= NB_Samples-1; + LFR->WFP.Nb_snapshot=NB_Samples; + LFR->WFP.StartDate=(uint32_t)LFR_MANAGMENT->COARSE_TIME + 1; + LFR->WFP.Control.Value = 0x11; + while ((LFR->WFP.STATUS&7)==0) ; +} + +void getSnapShotsF1(uint32_t buffer0, uint32_t buffer1, unsigned int NB_Samples, int freq) +{ + LFR->WFP.Control.Value=0; + volatile int test = LFR->WFP.STATUS; + LFR->WFP.ADDRESS_F1.ADDR0 = buffer0; + LFR->WFP.ADDRESS_F1.ADDR1 = buffer1; + LFR->WFP.length.FIELDS.length=(NB_Samples*3)/16; + LFR->WFP.Nb_Data_per_buff= NB_Samples-1; + LFR->WFP.Nb_snapshot=NB_Samples; + LFR->WFP.StartDate=(uint32_t)LFR_MANAGMENT->COARSE_TIME + 1; + LFR->WFP.Control.Value = 0x22; + while ((LFR->WFP.STATUS&7)==0) ; +} + +void getSnapShotsF2(uint32_t buffer0, uint32_t buffer1, unsigned int NB_Samples, int freq) +{ + LFR->WFP.Control.Value=0; + volatile int test = LFR->WFP.STATUS; + LFR->WFP.ADDRESS_F2.ADDR0 = buffer0; + LFR->WFP.ADDRESS_F2.ADDR1 = buffer1; + LFR->WFP.length.FIELDS.length=(NB_Samples*3)/16; + LFR->WFP.Nb_Data_per_buff= NB_Samples-1; + LFR->WFP.Nb_snapshot=NB_Samples; + LFR->WFP.StartDate=(uint32_t)LFR_MANAGMENT->COARSE_TIME + 1; + LFR->WFP.Control.Value = 0x44; + while ((LFR->WFP.STATUS&7)==0) ; +} diff --git a/wfp.h b/wfp.h new file mode 100644 --- /dev/null +++ b/wfp.h @@ -0,0 +1,12 @@ +#ifndef WFP_H_INCLUDED +#define WFP_H_INCLUDED + +#include +#include +#include + +extern void getSnapShotsF0(uint32_t buffer0, uint32_t buffer1, unsigned int NB_Samples, int freq); +extern void getSnapShotsF1(uint32_t buffer0, uint32_t buffer1, unsigned int NB_Samples, int freq); +extern void getSnapShotsF2(uint32_t buffer0, uint32_t buffer1, unsigned int NB_Samples, int freq); + +#endif // WFP_H_INCLUDED diff --git a/wfp.s b/wfp.s new file mode 100644 --- /dev/null +++ b/wfp.s @@ -0,0 +1,153 @@ + .file "wfp.c" + .section ".text" + .align 4 + .global setAddr + .type setAddr, #function + .proc 020 +setAddr: + srl %o0, 24, %g2 + sethi %hi(-2147480576), %g1 + or %g1, 768, %g1 + ldub [%g1+92], %g3 + srl %o0, 16, %g3 + stb %g2, [%g1+92] + and %g3, 255, %g3 + srl %o0, 8, %g2 + ldub [%g1+93], %g4 + and %g2, 255, %g2 + stb %g3, [%g1+93] + and %o0, 255, %o0 + ldub [%g1+94], %g3 + stb %g2, [%g1+94] + ldub [%g1+95], %g2 + stb %o0, [%g1+95] + jmp %o7+8 + nop + .size setAddr, .-setAddr + .align 4 + .global getSnapShots + .type getSnapShots, #function + .proc 020 +getSnapShots: + save %sp, -104, %sp + sethi %hi(-2147480576), %g1 + or %g1, 768, %g1 + ldub [%g1+88], %g2 + stb %g0, [%g1+88] + ldub [%g1+89], %g2 + stb %g0, [%g1+89] + sll %i2, 1, %g2 + add %g2, %i2, %g2 + ldub [%g1+90], %g3 + stb %g0, [%g1+90] + sll %g2, 2, %g2 + srl %g2, 6, %g2 + ldub [%g1+91], %g3 + stb %g0, [%g1+91] + srl %g2, 24, %o4 + srl %g2, 16, %g4 + ldub [%g1+124], %o2 + ldub [%g1+125], %o3 + ldub [%g1+126], %g3 + ldub [%g1+127], %o5 + sll %o2, 24, %o2 + sll %o3, 16, %o3 + sll %g3, 8, %g3 + or %o3, %o2, %o3 + or %g3, %o3, %g3 + or %o5, %g3, %g3 + st %g3, [%fp-4] + srl %g2, 8, %o7 + and %g4, 255, %g4 + ldub [%g1+92], %g3 + mov 64, %g3 + and %o7, 255, %o7 + stb %g3, [%g1+92] + and %g2, 255, %g3 + ldub [%g1+93], %g2 + stb %g0, [%g1+93] + add %i2, -1, %g2 + srl %g2, 24, %o0 + ldub [%g1+94], %o5 + mov 87, %o5 + srl %g2, 16, %o1 + and %g2, 255, %o3 + stb %o5, [%g1+94] + srl %g2, 8, %g2 + and %g2, 255, %o2 + ldub [%g1+95], %o5 + stb %g0, [%g1+95] + and %o1, 255, %o1 + ldub [%g1+224], %o5 + and %o5, -4, %o5 + or %o5, %o4, %o5 + srl %i2, 24, %o4 + stb %o5, [%g1+224] + srl %i2, 16, %o5 + and %o5, 255, %o5 + ldub [%g1+225], %g2 + stb %g4, [%g1+225] + srl %i2, 8, %g4 + and %g4, 255, %g4 + ldub [%g1+226], %g2 + stb %o7, [%g1+226] + and %i2, 255, %i2 + ldub [%g1+227], %g2 + stb %g3, [%g1+227] + sethi %hi(-2147482624), %g3 + or %g3, 512, %g3 + ldub [%g1+148], %g2 + stb %o0, [%g1+148] + ldub [%g1+149], %g2 + stb %o1, [%g1+149] + ldub [%g1+150], %g2 + stb %o2, [%g1+150] + ldub [%g1+151], %g2 + stb %o3, [%g1+151] + ldub [%g1+152], %g2 + stb %o4, [%g1+152] + ldub [%g1+153], %g2 + stb %o5, [%g1+153] + ldub [%g1+154], %g2 + stb %g4, [%g1+154] + ldub [%g1+155], %g2 + stb %i2, [%g1+155] + ldub [%g3+8], %g4 + ldub [%g3+9], %o5 + ldub [%g3+10], %g2 + ldub [%g3+11], %g3 + sll %o5, 16, %o5 + and %g4, 127, %g4 + sll %g2, 8, %g2 + sll %g4, 24, %g4 + or %o5, %g4, %g4 + or %g2, %g4, %g2 + or %g3, %g2, %g2 + add %g2, 3, %g2 + srl %g2, 24, %g3 + ldub [%g1+156], %g4 + srl %g2, 16, %g4 + stb %g3, [%g1+156] + and %g4, 255, %g4 + srl %g2, 8, %g3 + ldub [%g1+157], %o5 + and %g3, 255, %g3 + stb %g4, [%g1+157] + and %g2, 255, %g2 + ldub [%g1+158], %g4 + stb %g3, [%g1+158] + ldub [%g1+159], %g3 + stb %g2, [%g1+159] + ldub [%g1+88], %g2 + stb %g0, [%g1+88] + ldub [%g1+89], %g2 + stb %g0, [%g1+89] + ldub [%g1+90], %g2 + stb %g0, [%g1+90] + ldub [%g1+91], %g2 + mov 17, %g2 + stb %g2, [%g1+91] + jmp %i7+8 + restore + .size getSnapShots, .-getSnapShots + .ident "GCC: (BCC 4.4.2 release 1.0.45) 4.4.2"