add firmware file

This commit is contained in:
awe
2025-12-04 16:21:24 +03:00
parent 21038c1f8e
commit c8dd8553ba
5 changed files with 253 additions and 176 deletions

347
main.c
View File

@ -68,21 +68,21 @@
#include "l502_fpga_regs.h"
/* Remove unused enums/structs and constants that are not referenced anywhere */
/* Remove unused enums/structs and constants that are not referenced anywhere */
// количество используемых логических каналов //
#define ADC_LCH_CNT 1
/* Unused frequency/timing defines removed */
/* Unused frequency/timing defines removed */
// сколько отсчетов считываем за блок //
#define READ_BLOCK_SIZE 4096*200
#define READ_BLOCK_SIZE 4096*200
// таймаут на прием блока (мс) //
#define READ_TIMEOUT 2000
#define READ_TIMEOUT 2000
/* Unused BF user command define removed */
/* Unused BF user command define removed */
// номера используемых физических каналов //
@ -125,7 +125,7 @@ static uint32_t f_ch_ranges[ADC_LCH_CNT] = {X502_ADC_RANGE_02, X502_ADC_RANGE_5,
// признак необходимости завершить сбор данных //
static int f_out = 0;
static int f_out = 0;
#ifndef _WIN32
// Обработчик сигнала завершения для Linux //
@ -143,123 +143,123 @@ typedef struct {
} ip_dev_list_t;
typedef enum {
RUN_MODE_TEST = 0,
RUN_MODE_FINITE = 1,
RUN_MODE_INF = 2
} run_mode_t;
typedef enum {
BF_MODE_TRANSPARENT = 0,
typedef enum {
RUN_MODE_TEST = 0,
RUN_MODE_FINITE = 1,
RUN_MODE_INF = 2
} run_mode_t;
typedef enum {
BF_MODE_TRANSPARENT = 0,
BF_MODE_AVG = 1,
BF_MODE_FFT = 2
} bf_mode_t;
typedef enum {
BFMODE_TRANSPARENT = 0,
BFMODE_AVG = 1,
BFMODE_FFT = 2
} blackfin_mode_t;
typedef struct main_state_typedef{
run_mode_t run_mode; // TEST, FINITE_RUN, INF_RUN
bf_mode_t BF_mode; // TRANSPARENT, AVG
blackfin_mode_t BlackFin_mode; // TRANSPARENT, AVG, FFT
uint32_t run_length; // in ms. Used as timeout for receive_to_file
uint32_t run_I; // № current run
uint32_t runs_N; // total number of runs
char data_path[200]; // base directory for data files
} main_state;
static void main_state_set_defaults(main_state* st) {
st->run_mode = RUN_MODE_TEST;
st->BF_mode = BF_MODE_TRANSPARENT;
st->BlackFin_mode = BFMODE_TRANSPARENT;
st->run_length = 1000;
st->run_I = 0;
st->runs_N = 1;
strncpy(st->data_path, "data", sizeof(st->data_path));
st->data_path[sizeof(st->data_path)-1] = '\0';
}
static char* f_trim(char* s) {
char* end;
while (*s==' ' || *s=='\t' || *s=='\r' || *s=='\n') s++;
if (*s == 0) return s;
end = s + strlen(s) - 1;
while (end > s && (*end==' ' || *end=='\t' || *end=='\r' || *end=='\n')) end--;
end[1] = '\0';
return s;
}
static void parse_cmd_file(const char* filename, main_state* st) {
FILE* f = fopen(filename, "r");
if (f == NULL) {
printf("Command file '%s' not found. Using defaults.\n", filename);
return;
}
char line[512];
while (fgets(line, sizeof(line), f)) {
char* p = line;
char* comment = strstr(p, "//");
if (comment) *comment = '\0';
p = f_trim(p);
if (*p == '\0') continue;
char* field = strtok(p, "\t \r\n");
char* value = strtok(NULL, "\t \r\n");
if (!field || !value) continue;
if (strcmp(field, "run_mode") == 0) {
if (strcmp(value, "FINITE_RUN") == 0) {
st->run_mode = RUN_MODE_FINITE;
} else if (strcmp(value, "INF_RUN") == 0) {
st->run_mode = RUN_MODE_INF;
} else if (strcmp(value, "TEST") == 0) {
st->run_mode = RUN_MODE_TEST;
} else {
st->run_mode = RUN_MODE_TEST; // default on mismatch
}
} else if (strcmp(field, "BF_mode") == 0) {
if (strcmp(value, "TRANSPARENT") == 0) {
st->BF_mode = BF_MODE_TRANSPARENT;
} else if (strcmp(value, "AVG") == 0) {
BF_MODE_FFT = 2
} bf_mode_t;
typedef enum {
BFMODE_TRANSPARENT = 0,
BFMODE_AVG = 1,
BFMODE_FFT = 2
} blackfin_mode_t;
typedef struct main_state_typedef{
run_mode_t run_mode; // TEST, FINITE_RUN, INF_RUN
bf_mode_t BF_mode; // TRANSPARENT, AVG
blackfin_mode_t BlackFin_mode; // TRANSPARENT, AVG, FFT
uint32_t run_length; // in ms. Used as timeout for receive_to_file
uint32_t run_I; // № current run
uint32_t runs_N; // total number of runs
char data_path[200]; // base directory for data files
} main_state;
static void main_state_set_defaults(main_state* st) {
st->run_mode = RUN_MODE_TEST;
st->BF_mode = BF_MODE_TRANSPARENT;
st->BlackFin_mode = BFMODE_TRANSPARENT;
st->run_length = 1000;
st->run_I = 0;
st->runs_N = 1;
strncpy(st->data_path, "data", sizeof(st->data_path));
st->data_path[sizeof(st->data_path)-1] = '\0';
}
static char* f_trim(char* s) {
char* end;
while (*s==' ' || *s=='\t' || *s=='\r' || *s=='\n') s++;
if (*s == 0) return s;
end = s + strlen(s) - 1;
while (end > s && (*end==' ' || *end=='\t' || *end=='\r' || *end=='\n')) end--;
end[1] = '\0';
return s;
}
static void parse_cmd_file(const char* filename, main_state* st) {
FILE* f = fopen(filename, "r");
if (f == NULL) {
printf("Command file '%s' not found. Using defaults.\n", filename);
return;
}
char line[512];
while (fgets(line, sizeof(line), f)) {
char* p = line;
char* comment = strstr(p, "//");
if (comment) *comment = '\0';
p = f_trim(p);
if (*p == '\0') continue;
char* field = strtok(p, "\t \r\n");
char* value = strtok(NULL, "\t \r\n");
if (!field || !value) continue;
if (strcmp(field, "run_mode") == 0) {
if (strcmp(value, "FINITE_RUN") == 0) {
st->run_mode = RUN_MODE_FINITE;
} else if (strcmp(value, "INF_RUN") == 0) {
st->run_mode = RUN_MODE_INF;
} else if (strcmp(value, "TEST") == 0) {
st->run_mode = RUN_MODE_TEST;
} else {
st->run_mode = RUN_MODE_TEST; // default on mismatch
}
} else if (strcmp(field, "BF_mode") == 0) {
if (strcmp(value, "TRANSPARENT") == 0) {
st->BF_mode = BF_MODE_TRANSPARENT;
} else if (strcmp(value, "AVG") == 0) {
st->BF_mode = BF_MODE_AVG;
} else if (strcmp(value, "FFT") == 0) {
st->BF_mode = BF_MODE_FFT;
} else {
st->BF_mode = BF_MODE_TRANSPARENT; // default on mismatch
}
} else if (strcmp(field, "BlackFin_mode") == 0) {
if (strcmp(value, "TRANSPARENT") == 0) {
st->BlackFin_mode = BFMODE_TRANSPARENT;
} else if (strcmp(value, "AVG") == 0) {
st->BlackFin_mode = BFMODE_AVG;
} else if (strcmp(value, "FFT") == 0) {
st->BlackFin_mode = BFMODE_FFT;
} else {
st->BlackFin_mode = BFMODE_TRANSPARENT; // default on mismatch
}
} else if (strcmp(field, "run_length") == 0) {
char* endp = NULL;
unsigned long v = strtoul(value, &endp, 0);
if (endp != value) st->run_length = (uint32_t)v;
} else if (strcmp(field, "runs_N") == 0) {
char* endp = NULL;
unsigned long v = strtoul(value, &endp, 0);
if (endp != value) st->runs_N = (uint32_t)v;
} else if (strcmp(field, "run_I") == 0) {
char* endp = NULL;
unsigned long v = strtoul(value, &endp, 0);
if (endp != value) st->run_I = (uint32_t)v;
} else if (strcmp(field, "data_path") == 0) {
strncpy(st->data_path, value, sizeof(st->data_path));
st->data_path[sizeof(st->data_path)-1] = '\0';
}
}
fclose(f);
}
st->BF_mode = BF_MODE_FFT;
} else {
st->BF_mode = BF_MODE_TRANSPARENT; // default on mismatch
}
} else if (strcmp(field, "BlackFin_mode") == 0) {
if (strcmp(value, "TRANSPARENT") == 0) {
st->BlackFin_mode = BFMODE_TRANSPARENT;
} else if (strcmp(value, "AVG") == 0) {
st->BlackFin_mode = BFMODE_AVG;
} else if (strcmp(value, "FFT") == 0) {
st->BlackFin_mode = BFMODE_FFT;
} else {
st->BlackFin_mode = BFMODE_TRANSPARENT; // default on mismatch
}
} else if (strcmp(field, "run_length") == 0) {
char* endp = NULL;
unsigned long v = strtoul(value, &endp, 0);
if (endp != value) st->run_length = (uint32_t)v;
} else if (strcmp(field, "runs_N") == 0) {
char* endp = NULL;
unsigned long v = strtoul(value, &endp, 0);
if (endp != value) st->runs_N = (uint32_t)v;
} else if (strcmp(field, "run_I") == 0) {
char* endp = NULL;
unsigned long v = strtoul(value, &endp, 0);
if (endp != value) st->run_I = (uint32_t)v;
} else if (strcmp(field, "data_path") == 0) {
strncpy(st->data_path, value, sizeof(st->data_path));
st->data_path[sizeof(st->data_path)-1] = '\0';
}
}
fclose(f);
}
/* Unused SIGINT handler and flag removed */
/* Unused SIGINT handler and flag removed */
/* Функция находит все подключенные модули по интерфейсам PCI-Express и USB и
@ -705,7 +705,7 @@ void receive_to_file(t_x502_hnd hnd, char* logfilename, uint32_t* inp_buff, uint
// fprintf(logfile_ptr, "0xFF00000 \n");
// uint32_t timeout = 100;
uint32_t recv_Err_code = X502_Recv(hnd, inp_buff, max_total_words, timeout);
int32_t recv_Err_code = X502_Recv(hnd, inp_buff, max_total_words, timeout);
printf("receive code: %d\n", recv_Err_code);
if (recv_Err_code > 0){
@ -726,6 +726,7 @@ void receive_to_file(t_x502_hnd hnd, char* logfilename, uint32_t* inp_buff, uint
}else if (recv_Err_code == 0){
printf("no data received. timeout\n");
}else{
sleep(1);
printf("receive error: %d\n======================\n", recv_Err_code);
}
}
@ -767,33 +768,33 @@ void receive_to_file(t_x502_hnd hnd, char* logfilename, uint32_t* inp_buff, uint
int main(int argc, char** argv) {
int main(int argc, char** argv) {
int32_t err = X502_ERR_OK;
uint32_t ver;
t_x502_hnd hnd = NULL;
// читаем имя командного файла из аргументов CLI
const char* cmd_filename = "default.cmd";
if (argc > 1 && argv[1] != NULL && argv[1][0] != '\0') {
cmd_filename = argv[1];
}
// получаем версию библиотеки //
ver = X502_GetLibraryVersion();
printf("Версия библиотеки: %d.%d.%d\n", (ver >> 24)&0xFF, (ver>>16)&0xFF, (ver>>8)&0xFF);
printf("Command file: %s\n", cmd_filename);
// загружаем состояние из командного файла
main_state state;
main_state_set_defaults(&state);
parse_cmd_file(cmd_filename, &state);
// отладочный вывод принятых значений
printf("Parsed state: run_mode=%d, BF_mode=%d, BlackFin_mode=%d, run_length=%u, runs_N=%u, run_I=%u, data_path=%s\n",
(int)state.run_mode, (int)state.BF_mode, (int)state.BlackFin_mode,
state.run_length, state.runs_N, state.run_I, state.data_path);
// читаем имя командного файла из аргументов CLI
const char* cmd_filename = "default.cmd";
if (argc > 1 && argv[1] != NULL && argv[1][0] != '\0') {
cmd_filename = argv[1];
}
/* Removed unused temporary buffers and FFT/LFSM placeholders */
// получаем версию библиотеки //
ver = X502_GetLibraryVersion();
printf("Версия библиотеки: %d.%d.%d\n", (ver >> 24)&0xFF, (ver>>16)&0xFF, (ver>>8)&0xFF);
printf("Command file: %s\n", cmd_filename);
// загружаем состояние из командного файла
main_state state;
main_state_set_defaults(&state);
parse_cmd_file(cmd_filename, &state);
// отладочный вывод принятых значений
printf("Parsed state: run_mode=%d, BF_mode=%d, BlackFin_mode=%d, run_length=%u, runs_N=%u, run_I=%u, data_path=%s\n",
(int)state.run_mode, (int)state.BF_mode, (int)state.BlackFin_mode,
state.run_length, state.runs_N, state.run_I, state.data_path);
/* Removed unused temporary buffers and FFT/LFSM placeholders */
@ -863,8 +864,8 @@ int main(int argc, char** argv) {
}
printf("\n\n\n");
printf("\n\n\n");
//setup ADC:
@ -895,21 +896,21 @@ int main(int argc, char** argv) {
// for(uint32_t wait_i = 1e6; wait_i; --wait_i){;}
printf("\nFlushed from receiving buff: %d\n", X502_FlushRcv_buff(hnd));
state.run_I = 0;
char tmp_data_filename[256];
struct timespec ts;
uint32_t max_total_words = 1000000;
state.run_I = 0;
char tmp_data_filename[256];
struct timespec ts;
uint32_t max_total_words = 1000000;
uint32_t *inp_buff = malloc(1024*100*1024*2*4);
uint32_t runs_since_streams_clean = 0;
while(state.run_I < state.runs_N){
max_total_words = 10000000;
timespec_get(&ts, TIME_UTC);
uint32_t runs_since_streams_clean = 0;
while(state.run_I < state.runs_N){
max_total_words = 10000000;
timespec_get(&ts, TIME_UTC);
// sprintf(&tmp_data_filename, "tmp/received_data_%ld.%ld.csv", ts.tv_sec, ts.tv_nsec);
// sprintf(&logfilename, "tmp/received_data_%ld.%ld.csv", ts.tv_sec, ts.tv_nsec);
//sprintf(&logfilename, "data/received_data_%ld.csv", seconds);
snprintf(tmp_data_filename, sizeof(tmp_data_filename), "%s/received_data_%ld.%ld.csv", state.data_path, ts.tv_sec, ts.tv_nsec);
printf("%u/%u dumping to file: %s\n", (unsigned)state.run_I, (unsigned)state.runs_N, tmp_data_filename);
snprintf(tmp_data_filename, sizeof(tmp_data_filename), "%s/received_data_%ld.%ld.csv", state.data_path, ts.tv_sec, ts.tv_nsec);
printf("%u/%u dumping to file: %s\n", (unsigned)state.run_I, (unsigned)state.runs_N, tmp_data_filename);
receive_to_file(hnd, tmp_data_filename, inp_buff, max_total_words, state.run_length);
if (runs_since_streams_clean >= 10){
runs_since_streams_clean = 0;
@ -917,13 +918,13 @@ int main(int argc, char** argv) {
X502_StreamsStart(hnd);
}
state.run_I++;
runs_since_streams_clean++; }
free(inp_buff);
X502_Close(hnd);
// освобождаем описатель
X502_Free(hnd);
return 0;
runs_since_streams_clean++; }
free(inp_buff);
X502_Close(hnd);
// освобождаем описатель
X502_Free(hnd);
return 0;
}else if (state.run_mode == RUN_MODE_INF){
if (state.BF_mode == BF_MODE_TRANSPARENT){
printf("\nStart transparent mode\n");
@ -945,20 +946,20 @@ int main(int argc, char** argv) {
state.run_I = 0;
char tmp_data_filename[256];
char tmp_data_filename[256];
struct timespec ts;
uint32_t max_total_words = 10000000;
uint32_t *inp_buff = malloc(1024*100*1024*2*4);
uint32_t runs_since_streams_clean = 0;
while (1){ //should be infinite. because it is RUN_MODE_INF
//while(state.run_I < state.runs_N){
//while(state.run_I < state.runs_N){
max_total_words = 10000000;
timespec_get(&ts, TIME_UTC);
// sprintf(&tmp_data_filename, "tmp/received_data_%ld.%ld.csv", ts.tv_sec, ts.tv_nsec);
// sprintf(&logfilename, "tmp/received_data_%ld.%ld.csv", ts.tv_sec, ts.tv_nsec);
//sprintf(&logfilename, "data/received_data_%ld.csv", seconds);
snprintf(tmp_data_filename, sizeof(tmp_data_filename), "%s/received_data_%ld.%ld.csv", state.data_path, ts.tv_sec, ts.tv_nsec);
printf("%u dumping to file: %s\n", (unsigned)state.run_I, tmp_data_filename);
snprintf(tmp_data_filename, sizeof(tmp_data_filename), "%s/received_data_%ld.%ld.csv", state.data_path, ts.tv_sec, ts.tv_nsec);
printf("%u dumping to file: %s\n", (unsigned)state.run_I, tmp_data_filename);
receive_to_file(hnd, tmp_data_filename, inp_buff, max_total_words, state.run_length);
if (runs_since_streams_clean >= 10){
runs_since_streams_clean = 0;
@ -974,15 +975,15 @@ int main(int argc, char** argv) {
X502_Free(hnd);
return 0;
}else{ //TEST mode as default
}else{ //TEST mode as default
time_t seconds;
time(&seconds);
char logfilename[256];
snprintf(logfilename, sizeof(logfilename), "%s/received_data_%ld.csv", state.data_path, (long)seconds);
char logfilename[256];
snprintf(logfilename, sizeof(logfilename), "%s/received_data_%ld.csv", state.data_path, (long)seconds);
//logfile_ptr = fopen(logfilename, "w");
FILE *logfile_ptr;
logfile_ptr = fopen(logfilename, "a");
@ -1022,7 +1023,7 @@ int main(int argc, char** argv) {
uint32_t *inp_buff = malloc(1024*100*1024*2*4);
double *adc_data = malloc(1024*1024*sizeof(double));
//uint32_t inp_buff[1024*2048] = {0,};
/* Removed unused counters */
/* Removed unused counters */
insert_marker_to_file(logfilename, "start transparent");
@ -1035,10 +1036,10 @@ int main(int argc, char** argv) {
printf("receiving data...\n");
/* Removed unused readiness checks */
/* Removed unused readiness checks */
uint32_t max_total_words = 100000;
/* Removed unused data_receive_trys_counter */
uint32_t max_total_words = 100000;
/* Removed unused data_receive_trys_counter */
// printf("\nflush TX buff. \n Number of free TX descriptors before flushing:");
// BF_exec_cmd_simple(hnd, 0x8010, 10, 1);
@ -1092,7 +1093,7 @@ int main(int argc, char** argv) {
//fprintf(logfile_ptr, "value number; time, sec; adc_value, V\n");
max_total_words = 100000;
max_total_words = 100000;
//printf("\n dbg value: ");
//BF_exec_cmd_simple(hnd, 0x800A, 10, 1);