From 7f6d550a81326133b3c74eff91429e06c10406e3 Mon Sep 17 00:00:00 2001
From: Horacio Arnaldi <lharnaldi@gmail.com>
Date: Tue, 9 Aug 2022 15:03:30 -0300
Subject: [PATCH] Agrgeo el proyecto adc_recorder_old porque no se tiene CMA en
la sd oficial
---
projects/adc_recorder_old/adc-recorder.c | 58 +++
projects/adc_recorder_old/block_design.tcl | 244 +++++++++++++
projects/adc_recorder_old/src/Makefile | 16 +
projects/adc_recorder_old/src/adc_recorder.c | 361 +++++++++++++++++++
projects/adc_recorder_old/src/zynq_io.h | 149 ++++++++
5 files changed, 828 insertions(+)
create mode 100644 projects/adc_recorder_old/adc-recorder.c
create mode 100644 projects/adc_recorder_old/block_design.tcl
create mode 100644 projects/adc_recorder_old/src/Makefile
create mode 100644 projects/adc_recorder_old/src/adc_recorder.c
create mode 100644 projects/adc_recorder_old/src/zynq_io.h
diff --git a/projects/adc_recorder_old/adc-recorder.c b/projects/adc_recorder_old/adc-recorder.c
new file mode 100644
index 0000000..c8c6e7b
--- /dev/null
+++ b/projects/adc_recorder_old/adc-recorder.c
@@ -0,0 +1,58 @@
+#include <stdio.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <sys/mman.h>
+#include <fcntl.h>
+
+int main()
+{
+ int fd, i;
+ int16_t value[2];
+ void *cfg, *ram;
+ char *name = "/dev/mem";
+
+ if((fd = open(name, O_RDWR)) < 0)
+ {
+ perror("open");
+ return 1;
+ }
+
+ cfg = mmap(NULL, sysconf(_SC_PAGESIZE), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x40000000);
+ ram = mmap(NULL, 1024*sysconf(_SC_PAGESIZE), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0x1E000000);
+
+ // reset writer
+ *((uint32_t *)(cfg + 0)) &= ~4;
+ *((uint32_t *)(cfg + 0)) |= 4;
+
+ // reset fifo and filters
+ *((uint32_t *)(cfg + 0)) &= ~1;
+ *((uint32_t *)(cfg + 0)) |= 1;
+
+ // wait 1 second
+ sleep(1);
+
+ // enter reset mode for packetizer
+ *((uint32_t *)(cfg + 0)) &= ~2;
+
+ // set number of samples
+ *((uint32_t *)(cfg + 4)) = 1024 * 1024 - 1;
+
+ // enter normal mode
+ *((uint32_t *)(cfg + 0)) |= 2;
+
+ // wait 1 second
+ sleep(1);
+
+ // print IN1 and IN2 samples
+ for(i = 0; i < 1024 * 1024; ++i)
+ {
+ value[0] = *((int16_t *)(ram + 4*i + 0));
+ value[1] = *((int16_t *)(ram + 4*i + 2));
+ printf("%5d %5d\n", value[0], value[1]);
+ }
+
+ munmap(cfg, sysconf(_SC_PAGESIZE));
+ munmap(ram, sysconf(_SC_PAGESIZE));
+
+ return 0;
+}
diff --git a/projects/adc_recorder_old/block_design.tcl b/projects/adc_recorder_old/block_design.tcl
new file mode 100644
index 0000000..2658cdb
--- /dev/null
+++ b/projects/adc_recorder_old/block_design.tcl
@@ -0,0 +1,244 @@
+# Create clk_wiz
+cell xilinx.com:ip:clk_wiz pll_0 {
+ PRIMITIVE PLL
+ PRIM_IN_FREQ.VALUE_SRC USER
+ PRIM_IN_FREQ 125.0
+ PRIM_SOURCE Differential_clock_capable_pin
+ CLKOUT1_USED true
+ CLKOUT1_REQUESTED_OUT_FREQ 125.0
+ USE_RESET false
+} {
+ clk_in1_p adc_clk_p_i
+ clk_in1_n adc_clk_n_i
+}
+
+# Create processing_system7
+cell xilinx.com:ip:processing_system7 ps_0 {
+ PCW_IMPORT_BOARD_PRESET cfg/red_pitaya.xml
+ PCW_USE_S_AXI_HP0 1
+} {
+ M_AXI_GP0_ACLK pll_0/clk_out1
+ S_AXI_HP0_ACLK pll_0/clk_out1
+}
+
+# Create all required interconnections
+apply_bd_automation -rule xilinx.com:bd_rule:processing_system7 -config {
+ make_external {FIXED_IO, DDR}
+ Master Disable
+ Slave Disable
+} [get_bd_cells ps_0]
+
+# Create xlconstant
+cell xilinx.com:ip:xlconstant const_0
+
+# Create proc_sys_reset
+cell xilinx.com:ip:proc_sys_reset rst_0 {} {
+ ext_reset_in const_0/dout
+}
+
+# GPIO
+
+# Delete input/output port
+delete_bd_objs [get_bd_ports exp_p_tri_io]
+
+# Create output port
+create_bd_port -dir O -from 7 -to 0 exp_p_tri_io
+
+# ADC
+
+# Create axis_red_pitaya_adc
+cell labdpr:user:axis_rp_adc adc_0 {} {
+ aclk pll_0/clk_out1
+ adc_dat_a adc_dat_a_i
+ adc_dat_b adc_dat_b_i
+ adc_csn adc_csn_o
+}
+
+# Create axi_cfg_register
+cell labdpr:user:axi_cfg_register cfg_0 {
+ CFG_DATA_WIDTH 64
+ AXI_ADDR_WIDTH 32
+ AXI_DATA_WIDTH 32
+}
+
+# Create all required interconnections
+apply_bd_automation -rule xilinx.com:bd_rule:axi4 -config {
+ Master /ps_0/M_AXI_GP0
+ Clk Auto
+} [get_bd_intf_pins cfg_0/S_AXI]
+
+set_property RANGE 4K [get_bd_addr_segs ps_0/Data/SEG_cfg_0_reg0]
+set_property OFFSET 0x40000000 [get_bd_addr_segs ps_0/Data/SEG_cfg_0_reg0]
+
+# Create port_slicer
+cell labdpr:user:port_slicer slice_1 {
+ DIN_WIDTH 64 DIN_FROM 0 DIN_TO 0
+} {
+ din cfg_0/cfg_data
+}
+
+# Create port_slicer
+cell labdpr:user:port_slicer slice_2 {
+ DIN_WIDTH 64 DIN_FROM 1 DIN_TO 1
+} {
+ din cfg_0/cfg_data
+}
+
+# Create port_slicer
+cell labdpr:user:port_slicer slice_3 {
+ DIN_WIDTH 64 DIN_FROM 2 DIN_TO 2
+} {
+ din cfg_0/cfg_data
+}
+
+# Create port_slicer
+cell labdpr:user:port_slicer slice_4 {
+ DIN_WIDTH 64 DIN_FROM 63 DIN_TO 32
+} {
+ din cfg_0/cfg_data
+}
+
+# Create util_vector_logic
+cell xilinx.com:ip:util_vector_logic not_0 {
+ C_SIZE 1
+ C_OPERATION not
+} {
+ Op1 slice_2/dout
+}
+
+# Create xlconcat
+cell xilinx.com:ip:xlconcat concat_0 {
+ NUM_PORTS 2
+ IN0_WIDTH 1
+ IN1_WIDTH 7
+} {
+ In0 not_0/Res
+ dout exp_p_tri_io
+}
+
+# Create axis_broadcaster
+cell xilinx.com:ip:axis_broadcaster bcast_0 {
+ S_TDATA_NUM_BYTES.VALUE_SRC USER
+ M_TDATA_NUM_BYTES.VALUE_SRC USER
+ S_TDATA_NUM_BYTES 4
+ M_TDATA_NUM_BYTES 2
+ M00_TDATA_REMAP {tdata[13:0],2'b00}
+ M01_TDATA_REMAP {tdata[29:16],2'b00}
+} {
+ S_AXIS adc_0/M_AXIS
+ aclk pll_0/clk_out1
+ aresetn rst_0/peripheral_aresetn
+}
+
+# Create cic_compiler
+cell xilinx.com:ip:cic_compiler cic_0 {
+ INPUT_DATA_WIDTH.VALUE_SRC USER
+ FILTER_TYPE Decimation
+ NUMBER_OF_STAGES 6
+ FIXED_OR_INITIAL_RATE 32
+ INPUT_SAMPLE_FREQUENCY 125
+ CLOCK_FREQUENCY 125
+ INPUT_DATA_WIDTH 16
+ QUANTIZATION Truncation
+ OUTPUT_DATA_WIDTH 16
+ USE_XTREME_DSP_SLICE true
+ HAS_ARESETN true
+} {
+ S_AXIS_DATA bcast_0/M00_AXIS
+ aclk pll_0/clk_out1
+ aresetn slice_1/dout
+}
+
+# Create cic_compiler
+cell xilinx.com:ip:cic_compiler cic_1 {
+ INPUT_DATA_WIDTH.VALUE_SRC USER
+ FILTER_TYPE Decimation
+ NUMBER_OF_STAGES 6
+ FIXED_OR_INITIAL_RATE 32
+ INPUT_SAMPLE_FREQUENCY 125
+ CLOCK_FREQUENCY 125
+ INPUT_DATA_WIDTH 16
+ QUANTIZATION Truncation
+ OUTPUT_DATA_WIDTH 16
+ USE_XTREME_DSP_SLICE true
+ HAS_ARESETN true
+} {
+ S_AXIS_DATA bcast_0/M01_AXIS
+ aclk pll_0/clk_out1
+ aresetn slice_1/dout
+}
+
+# Create axis_combiner
+cell xilinx.com:ip:axis_combiner comb_0 {
+ TDATA_NUM_BYTES.VALUE_SRC USER
+ TDATA_NUM_BYTES 2
+} {
+ S00_AXIS cic_0/M_AXIS_DATA
+ S01_AXIS cic_1/M_AXIS_DATA
+ aclk pll_0/clk_out1
+ aresetn rst_0/peripheral_aresetn
+}
+
+# Create fir_compiler
+cell xilinx.com:ip:fir_compiler fir_0 {
+ DATA_WIDTH.VALUE_SRC USER
+ DATA_WIDTH 16
+ COEFFICIENTVECTOR {-1.64753028794138e-08, -4.72969860103254e-08, -7.81983994864729e-10, 3.09179315378013e-08, 1.8600476137934e-08, 3.27300695910419e-08, -6.27121813377163e-09, -1.52196115352429e-07, -8.30377969926702e-08, 3.14361841397898e-07, 3.05515872274853e-07, -4.73906648324436e-07, -7.13188274738437e-07, 5.47004771774003e-07, 1.33401100809314e-06, -4.13867548024707e-07, -2.14949555259695e-06, -6.77977800948474e-08, 3.07398932714553e-06, 1.0366230107463e-06, -3.94245232963009e-06, -2.59076839821521e-06, 4.51317323767107e-06, 4.74563996488482e-06, -4.49064349142054e-06, -7.3947777960083e-06, 3.57041197419745e-06, 1.02846684426837e-05, -1.50308472093842e-06, -1.30146997163052e-05, -1.8311731233767e-06, 1.50710364353895e-05, 6.3515248701083e-06, -1.58982472678568e-05, -1.17267343142635e-05, 1.50041199296265e-05, 1.73635115814309e-05, -1.20890304109726e-05, -2.24560062957254e-05, 7.16700059796055e-06, 2.60907689345942e-05, -6.64193032293714e-07, -2.74163749798938e-05, -6.54632074532538e-06, 2.5852558776971e-05, 1.31966582845397e-05, -2.13079073598636e-05, -1.77801135294917e-05, 1.43611952054032e-05, 1.88093817512436e-05, -6.35698021047062e-06, -1.51543007857966e-05, -6.31269475321274e-07, 6.41236246473726e-06, 4.00235076480002e-06, 6.75384652715119e-06, -1.00102812372645e-06, -2.23907547607786e-05, -1.07614170164429e-05, 3.72128949266483e-05, 3.26888314865614e-05, -4.68343172264928e-05, -6.46247522446593e-05, 4.62331324663801e-05, 0.000104353987875991, -3.05204178369922e-05, -0.000147387572103254, -4.12376672483791e-06, 0.000187096070793206, 5.94492160104715e-05, -0.000215270553995213, -0.000134242574203586, 0.000223115373945588, 0.000223732063932204, -0.000202601585158347, -0.000319473722277179, 0.000148023831554525, 0.000409856470754451, -5.75319241913947e-05, -0.00048128691789378, -6.56435551088113e-05, 0.000520005389882914, 0.000212559310978688, -0.000514378040456993, -0.000368824791639381, 0.000457257636791032, 0.00051572189965271, -0.000348325111720936, -0.000632574861580132, 0.000195575644936742, 0.000699853643923955, -1.5816811333843e-05, -0.000702875004558909, -0.000166267212059945, 0.000635554670416145, 0.000320646045613507, -0.000503596369030625, -0.000416023690327203, 0.000326453158345306, 0.00042516016658693, -0.000137454215410763, -0.000330867755122004, -1.83577770104995e-05, 0.000131884375290827, 8.88732824246191e-05, 0.000152320700965935, -2.19145324792827e-05, -0.000478845867687744, -0.000226130995959082, 0.000781165284659716, 0.000680083599509367, -0.000973297239795462, -0.00133684955123469, 0.000956951103249511, 0.00215724393391554, -0.000632647805407322, -0.00306094569410801, -8.63474252426424e-05, 0.00392560461099799, 0.00125840455441931, -0.00459097537930345, -0.00289777037472875, 0.00486843895178868, 0.00496041688761007, -0.00455566278421732, -0.0073332195556104, 0.00345548961533671, 0.00982788076765724, -0.0013975392826423, -0.0121803938743171, -0.00173944634676796, 0.0140556603140014, 0.00600554245501628, -0.0150585666700821, -0.0113645359721422, 0.0147416608531572, 0.0176785888467245, -0.0126130926725902, -0.0247012339350495, 0.00812796467212303, 0.0320712315374266, -0.000646259298618774, -0.0392988478933562, -0.0106852885932714, 0.0457163887873562, 0.0272344645510023, -0.0503010855018923, -0.0516879242105393, 0.0510032995068897, 0.0905252892059647, -0.0416077244968566, -0.163677972614864, -0.0107434888500177, 0.356350050991766, 0.554721342376512, 0.356350050991766, -0.0107434888500177, -0.163677972614864, -0.0416077244968565, 0.0905252892059646, 0.0510032995068897, -0.0516879242105392, -0.0503010855018923, 0.0272344645510023, 0.0457163887873562, -0.0106852885932714, -0.0392988478933562, -0.000646259298618766, 0.0320712315374266, 0.008127964672123, -0.0247012339350495, -0.0126130926725902, 0.0176785888467245, 0.0147416608531572, -0.0113645359721422, -0.0150585666700821, 0.00600554245501627, 0.0140556603140014, -0.00173944634676796, -0.0121803938743171, -0.0013975392826423, 0.00982788076765723, 0.00345548961533672, -0.0073332195556104, -0.00455566278421732, 0.00496041688761004, 0.00486843895178868, -0.00289777037472874, -0.00459097537930345, 0.00125840455441931, 0.003925604610998, -8.6347425242651e-05, -0.00306094569410801, -0.000632647805407327, 0.00215724393391554, 0.000956951103249513, -0.00133684955123469, -0.000973297239795458, 0.00068008359950937, 0.000781165284659718, -0.000226130995959085, -0.000478845867687734, -2.19145324792814e-05, 0.000152320700965923, 8.88732824246168e-05, 0.000131884375290828, -1.83577770104952e-05, -0.000330867755122008, -0.000137454215410769, 0.000425160166586931, 0.000326453158345309, -0.000416023690327193, -0.000503596369030629, 0.000320646045613497, 0.000635554670416148, -0.000166267212059939, -0.000702875004558908, -1.58168113338674e-05, 0.000699853643923955, 0.000195575644936758, -0.000632574861580132, -0.000348325111720941, 0.000515721899652708, 0.000457257636791035, -0.000368824791639379, -0.000514378040456997, 0.000212559310978687, 0.000520005389882915, -6.56435551088096e-05, -0.000481286917893776, -5.7531924191395e-05, 0.000409856470754451, 0.000148023831554525, -0.000319473722277176, -0.000202601585158348, 0.000223732063932204, 0.000223115373945587, -0.000134242574203588, -0.000215270553995212, 5.944921601047e-05, 0.000187096070793206, -4.12376672483805e-06, -0.000147387572103254, -3.05204178369924e-05, 0.000104353987875991, 4.62331324663777e-05, -6.46247522446589e-05, -4.68343172264921e-05, 3.26888314865612e-05, 3.72128949266458e-05, -1.07614170164428e-05, -2.23907547607785e-05, -1.0010281237264e-06, 6.7538465271515e-06, 4.00235076480007e-06, 6.41236246473652e-06, -6.31269475321259e-07, -1.5154300785797e-05, -6.35698021047036e-06, 1.88093817512439e-05, 1.43611952054029e-05, -1.77801135294911e-05, -2.13079073598635e-05, 1.31966582845395e-05, 2.58525587769708e-05, -6.54632074532428e-06, -2.74163749798938e-05, -6.64193032294061e-07, 2.60907689345942e-05, 7.16700059796085e-06, -2.24560062957254e-05, -1.20890304109726e-05, 1.7363511581431e-05, 1.50041199296266e-05, -1.17267343142635e-05, -1.58982472678571e-05, 6.3515248701082e-06, 1.50710364353894e-05, -1.83117312337678e-06, -1.30146997163053e-05, -1.50308472093845e-06, 1.02846684426836e-05, 3.57041197419745e-06, -7.39477779600816e-06, -4.49064349142055e-06, 4.74563996488478e-06, 4.51317323767109e-06, -2.59076839821518e-06, -3.94245232963005e-06, 1.03662301074629e-06, 3.07398932714552e-06, -6.77977800948646e-08, -2.14949555259695e-06, -4.13867548024735e-07, 1.33401100809314e-06, 5.47004771773993e-07, -7.13188274738437e-07, -4.73906648324394e-07, 3.05515872274853e-07, 3.14361841397861e-07, -8.30377969926656e-08, -1.5219611535243e-07, -6.27121813377245e-09, 3.27300695910341e-08, 1.86004761379317e-08, 3.0917931537805e-08, -7.81983994865244e-10, -4.72969860103212e-08, -1.64753028794135e-08}
+ COEFFICIENT_WIDTH 16
+ QUANTIZATION Quantize_Only
+ BESTPRECISION true
+ FILTER_TYPE Decimation
+ DECIMATION_RATE 2
+ NUMBER_PATHS 2
+ RATESPECIFICATION Input_Sample_Period
+ SAMPLEPERIOD 32
+ OUTPUT_ROUNDING_MODE Truncate_LSBs
+ OUTPUT_WIDTH 16
+ HAS_ARESETN true
+} {
+ S_AXIS_DATA comb_0/M_AXIS
+ aclk pll_0/clk_out1
+ aresetn slice_1/dout
+}
+
+# Create axis_packetizer
+cell labdpr:user:axis_packetizer pktzr_0 {
+ AXIS_TDATA_WIDTH 32
+ CNTR_WIDTH 32
+ CONTINUOUS FALSE
+} {
+ S_AXIS fir_0/M_AXIS_DATA
+ cfg_data slice_4/dout
+ aclk pll_0/clk_out1
+ aresetn slice_2/dout
+}
+
+# Create axis_dwidth_converter
+cell xilinx.com:ip:axis_dwidth_converter conv_0 {
+ S_TDATA_NUM_BYTES.VALUE_SRC USER
+ S_TDATA_NUM_BYTES 4
+ M_TDATA_NUM_BYTES 8
+} {
+ S_AXIS pktzr_0/M_AXIS
+ aclk pll_0/clk_out1
+ aresetn slice_3/dout
+}
+
+# Create xlconstant
+cell xilinx.com:ip:xlconstant const_1 {
+ CONST_WIDTH 32
+ CONST_VAL 503316480
+}
+
+# Create axis_ram_writer
+cell labdpr:user:axis_ram_writer writer_0 {
+ ADDR_WIDTH 22
+} {
+ S_AXIS conv_0/M_AXIS
+ M_AXI ps_0/S_AXI_HP0
+ cfg_data const_1/dout
+ aclk pll_0/clk_out1
+ aresetn slice_3/dout
+}
+
+assign_bd_address [get_bd_addr_segs ps_0/S_AXI_HP0/HP0_DDR_LOWOCM]
diff --git a/projects/adc_recorder_old/src/Makefile b/projects/adc_recorder_old/src/Makefile
new file mode 100644
index 0000000..3949c77
--- /dev/null
+++ b/projects/adc_recorder_old/src/Makefile
@@ -0,0 +1,16 @@
+CC=gcc
+FLAGS=-Wall -O3
+ARCH=arm
+CROSS_COMPILE=arm-xilinx-linux-gnueabi-
+
+####
+PROG=adc_recorder
+EXTRA=
+
+all: $(PROG)
+
+$(PROG): $(PROG).c $(EXTRA)
+ $(CC) $(FLAGS) -o $(PROG) $(PROG).c $(EXTRA) -lm -lpthread
+
+clean:
+ rm -f $(PROG)
diff --git a/projects/adc_recorder_old/src/adc_recorder.c b/projects/adc_recorder_old/src/adc_recorder.c
new file mode 100644
index 0000000..febaf6b
--- /dev/null
+++ b/projects/adc_recorder_old/src/adc_recorder.c
@@ -0,0 +1,361 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <sys/mman.h>
+#include <fcntl.h>
+
+#include "zynq_io.h"
+
+int intc_fd, cfg_fd, sts_fd, xadc_fd, mem_fd;
+void *intc_ptr, *cfg_ptr, *sts_ptr, *xadc_ptr, *mem_ptr;
+int dev_size;
+
+void dev_write(void *dev_base, uint32_t offset, int32_t value)
+{
+ *((volatile unsigned *)(dev_base + offset)) = value;
+}
+
+uint32_t dev_read(void *dev_base, uint32_t offset)
+{
+ return *((volatile unsigned *)(dev_base + offset));
+}
+
+int32_t rd_reg_value(int n_dev, uint32_t reg_off)
+{
+ int32_t reg_val;
+ switch(n_dev)
+ {
+ case 0:
+ reg_val = dev_read(intc_ptr, reg_off);
+ break;
+ case 1:
+ reg_val = dev_read(cfg_ptr, reg_off);
+ break;
+ case 2:
+ reg_val = dev_read(sts_ptr, reg_off);
+ break;
+ case 3:
+ reg_val = dev_read(xadc_ptr, reg_off);
+ break;
+ default:
+ printf("Invalid option: %d\n", n_dev);
+ return -1;
+ }
+ printf("Complete. Received data 0x%08x\n", reg_val);
+ //printf("Complete. Received data %d\n", reg_val);
+
+ return reg_val;
+}
+
+int32_t wr_reg_value(int n_dev, uint32_t reg_off, int32_t reg_val)
+{
+ switch(n_dev)
+ {
+ case 0:
+ dev_write(intc_ptr, reg_off, reg_val);
+ break;
+ case 1:
+ dev_write(cfg_ptr, reg_off, reg_val);
+ break;
+ case 2:
+ dev_write(sts_ptr, reg_off, reg_val);
+ break;
+ case 3:
+ dev_write(xadc_ptr, reg_off, reg_val);
+ break;
+ default:
+ printf("Invalid option: %d\n", n_dev);
+ return -1;
+ }
+ printf("Complete. Data written: 0x%08x\n", reg_val);
+ //printf("Complete. Data written: %d\n", reg_val);
+
+ return 0;
+}
+
+static uint32_t get_memory_size(char *sysfs_path_file)
+{
+ FILE *size_fp;
+ uint32_t size;
+
+ // open the file that describes the memory range size that is based on
+ // the reg property of the node in the device tree
+ size_fp = fopen(sysfs_path_file, "r");
+
+ if (!size_fp) {
+ printf("unable to open the uio size file\n");
+ exit(-1);
+ }
+
+ // get the size which is an ASCII string such as 0xXXXXXXXX and then be
+ // stop using the file
+ if(fscanf(size_fp, "0x%08X", &size) == EOF){
+ printf("unable to get the size of the uio size file\n");
+ exit(-1);
+ }
+ fclose(size_fp);
+
+ return size;
+}
+
+int intc_init(void)
+{
+ char *uiod = "/dev/uio0";
+
+ //printf("Initializing INTC device...\n");
+
+ // open the UIO device file to allow access to the device in user space
+ intc_fd = open(uiod, O_RDWR);
+ if (intc_fd < 1) {
+ printf("intc_init: Invalid UIO device file:%s.\n", uiod);
+ return -1;
+ }
+
+ dev_size = get_memory_size("/sys/class/uio/uio0/maps/map0/size");
+
+ // mmap the INTC device into user space
+ intc_ptr = mmap(NULL, dev_size, PROT_READ|PROT_WRITE, MAP_SHARED, intc_fd, 0);
+ if (intc_ptr == MAP_FAILED) {
+ printf("intc_init: mmap call failure.\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+int cfg_init(void)
+{
+ char *uiod = "/dev/uio0";
+
+ printf("Initializing CFG device...\n");
+
+ // open the UIO device file to allow access to the device in user space
+ cfg_fd = open(uiod, O_RDWR);
+ if (cfg_fd < 1) {
+ printf("cfg_init: Invalid UIO device file:%s.\n", uiod);
+ return -1;
+ }
+
+ dev_size = get_memory_size("/sys/class/uio/uio1/maps/map0/size");
+
+ // mmap the cfgC device into user space
+ cfg_ptr = mmap(NULL, dev_size, PROT_READ|PROT_WRITE, MAP_SHARED, cfg_fd, 0);
+ if (cfg_ptr == MAP_FAILED) {
+ printf("cfg_init: mmap call failure.\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+int sts_init(void)
+{
+ char *uiod = "/dev/uio2";
+
+ //printf("Initializing STS device...\n");
+
+ // open the UIO device file to allow access to the device in user space
+ sts_fd = open(uiod, O_RDWR);
+ if (sts_fd < 1) {
+ printf("sts_init: Invalid UIO device file:%s.\n", uiod);
+ return -1;
+ }
+
+ dev_size = get_memory_size("/sys/class/uio/uio2/maps/map0/size");
+
+ // mmap the STS device into user space
+ sts_ptr = mmap(NULL, dev_size, PROT_READ|PROT_WRITE, MAP_SHARED, sts_fd, 0);
+ if (sts_ptr == MAP_FAILED) {
+ printf("sts_init: mmap call failure.\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+int mem_init(void)
+{
+ char *mem_name = "/dev/mem";
+
+ //printf("Initializing mem device...\n");
+
+ // open the UIO device file to allow access to the device in user space
+ mem_fd = open(mem_name, O_RDWR);
+ if (mem_fd < 1) {
+ printf("mem_init: Invalid device file:%s.\n", mem_name);
+ return -1;
+ }
+
+ //dev_size = 2048*sysconf(_SC_PAGESIZE);
+ dev_size = 1024*sysconf(_SC_PAGESIZE);
+
+ // mmap the mem device into user space
+ mem_ptr = mmap(NULL, dev_size, PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, 0x1E000000);
+ if (mem_ptr == MAP_FAILED) {
+ printf("mem_init: mmap call failure.\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+//System initialization
+int init_system(void)
+{
+ uint32_t reg_val;
+
+ // set trigger_lvl_1
+ dev_write(cfg_ptr,CFG_TRLVL_1_OFFSET,8190);
+
+ // set trigger_lvl_2
+ dev_write(cfg_ptr,CFG_TRLVL_2_OFFSET,8190);
+
+ // set subtrigger_lvl_1
+ dev_write(cfg_ptr,CFG_STRLVL_1_OFFSET,8190);
+
+ // set subtrigger_lvl_2
+ dev_write(cfg_ptr,CFG_STRLVL_2_OFFSET,8190);
+
+ // set hv1 and hv2 to zero
+ dev_write(cfg_ptr,CFG_HV1_OFFSET,0);
+ dev_write(cfg_ptr,CFG_HV2_OFFSET,0);
+
+ // reset ramp generators
+ reg_val = dev_read(cfg_ptr, CFG_RESET_GRAL_OFFSET);
+ dev_write(cfg_ptr,CFG_RESET_GRAL_OFFSET, reg_val & ~8);
+
+ // reset pps_gen, fifo and trigger modules
+ reg_val = dev_read(cfg_ptr, CFG_RESET_GRAL_OFFSET);
+ dev_write(cfg_ptr,CFG_RESET_GRAL_OFFSET, reg_val & ~1);
+
+ /* reset data converter and writer */
+ reg_val = dev_read(cfg_ptr, CFG_RESET_GRAL_OFFSET);
+ dev_write(cfg_ptr,CFG_RESET_GRAL_OFFSET, reg_val & ~4);
+
+ // enter reset mode for tlast_gen
+ reg_val = dev_read(cfg_ptr, CFG_RESET_GRAL_OFFSET);
+ dev_write(cfg_ptr,CFG_RESET_GRAL_OFFSET, reg_val & ~2);
+
+ // set number of samples
+ dev_write(cfg_ptr,CFG_NSAMPLES_OFFSET, 1024 * 1024);
+
+ // set default value for trigger scalers a and b
+ dev_write(cfg_ptr,CFG_TR_SCAL_A_OFFSET, 1);
+ dev_write(cfg_ptr,CFG_TR_SCAL_B_OFFSET, 1);
+
+ // enter normal mode for tlast_gen
+ /* reg_val = dev_read(cfg_ptr, CFG_RESET_GRAL_OFFSET);
+ //printf("reg_val : 0x%08x\n",reg_val);
+ dev_write(cfg_ptr,CFG_RESET_GRAL_OFFSET, reg_val | 2);
+ //printf("written reg_val tlast : 0x%08x\n",reg_val | 2);
+ // enter normal mode for pps_gen, fifo and trigger modules
+ reg_val = dev_read(cfg_ptr, CFG_RESET_GRAL_OFFSET);
+ //printf("reg_val : 0x%08x\n",reg_val);
+ dev_write(cfg_ptr,CFG_RESET_GRAL_OFFSET, reg_val | 1);
+ //printf("written reg_val pps_gen, fifo : 0x%08x\n",reg_val | 1);
+ */
+ // enable false GPS
+ reg_val = dev_read(cfg_ptr, CFG_RESET_GRAL_OFFSET);
+ //printf("reg_val : 0x%08x\n",reg_val);
+ dev_write(cfg_ptr,CFG_RESET_GRAL_OFFSET, reg_val | FGPS_EN_MASK);
+ //printf("written reg_val : 0x%08x\n",reg_val | 16);
+ // disable
+ //dev_write(cfg_ptr,CFG_RESET_GRAL_OFFSET, reg_val & ~16);
+ //dev_write(cfg_ptr,CFG_RESET_GRAL_OFFSET, reg_val & ~FGPS_EN_MASK);
+ //printf("written reg_val : 0x%08x\n",reg_val & ~16);
+
+ /* // enter normal mode for data converter and writer
+ reg_val = dev_read(cfg_ptr, CFG_RESET_GRAL_OFFSET);
+ dev_write(cfg_ptr,CFG_RESET_GRAL_OFFSET, reg_val | 4);
+ //printf("written reg_val : 0x%08hx\n",reg_val | 4);
+ */
+ // enter normal mode for ramp generators
+ reg_val = dev_read(cfg_ptr, CFG_RESET_GRAL_OFFSET);
+ dev_write(cfg_ptr,CFG_RESET_GRAL_OFFSET, reg_val | 8);
+ // enter in MASTER mode (default)
+ reg_val = dev_read(cfg_ptr, CFG_RESET_GRAL_OFFSET);
+ dev_write(cfg_ptr,CFG_RESET_GRAL_OFFSET, reg_val | 0x20);
+
+ return 0;
+}
+
+int main(int argc, char *argv[])
+{
+ //int fd;
+ //unsigned int size;
+ uint32_t i,val=0;
+ uint32_t wo;
+ int16_t ch[2];
+
+ printf("CFG UIO test\n");
+
+ //initialize devices. TODO: add error checking
+ mem_init();
+ //intc_init();
+ cfg_init();
+ //sts_init();
+ //xadc_init();
+
+ // reset writer
+ //*((uint32_t *)(cfg + 0)) &= ~4;
+ printf("Reseting writer...\n");
+ val=rd_reg_value(1, CFG_RESET_GRAL_OFFSET);
+ wr_reg_value(1, CFG_RESET_GRAL_OFFSET, val &= ~4);
+ //*((uint32_t *)(cfg + 0)) |= 4;
+ val=rd_reg_value(1, CFG_RESET_GRAL_OFFSET);
+ wr_reg_value(1, CFG_RESET_GRAL_OFFSET, val |= 4);
+ printf("Reseting writer %d ...\n",val);
+ printf("Reseting fifo and filters...\n");
+ // reset fifo and filters
+ //*((uint32_t *)(cfg + 0)) &= ~1;
+ val=rd_reg_value(1, CFG_RESET_GRAL_OFFSET);
+ wr_reg_value(1, CFG_RESET_GRAL_OFFSET, val &=~1);
+ //*((uint32_t *)(cfg + 0)) |= 1;
+ val=rd_reg_value(1, CFG_RESET_GRAL_OFFSET);
+ wr_reg_value(1, CFG_RESET_GRAL_OFFSET, val |=1);
+ printf("Reseting fifo and filters %d ...\n",val);
+
+ // wait 1 second
+ sleep(1);
+
+ printf("Reseting packetizer...\n");
+ // enter reset mode for packetizer
+ //*((uint32_t *)(cfg + 0)) &= ~2;
+ val=rd_reg_value(1, CFG_RESET_GRAL_OFFSET);
+ wr_reg_value(1, CFG_RESET_GRAL_OFFSET, val &=~2);
+
+ // set number of samples
+ //*((uint32_t *)(cfg + 4)) = 1024 * 1024 - 1;
+ wr_reg_value(1, CFG_NSAMPLES_OFFSET, 1024 * 1024 - 1);
+
+ // enter normal mode
+ //*((uint32_t *)(cfg + 0)) |= 2;
+ val=rd_reg_value(1, CFG_RESET_GRAL_OFFSET);
+ wr_reg_value(1, CFG_RESET_GRAL_OFFSET, val |=2);
+ printf("Reseting packetizer %d ...\n",val);
+
+ // wait 1 second
+ sleep(1);
+
+ // print IN1 and IN2 samples
+ for(i = 0; i < 1024 * 1024; ++i){
+ ch[0] = *((int16_t *)(mem_ptr + 4*i + 0));
+ ch[1] = *((int16_t *)(mem_ptr + 4*i + 2));
+ wo = *((uint32_t *)(mem_ptr + i));
+ printf("%5d %5d %10d\n", ch[0], ch[1], wo);
+ }
+
+ // unmap and close the devices
+ //munmap(intc_ptr, sysconf(_SC_PAGESIZE));
+ munmap(cfg_ptr, sysconf(_SC_PAGESIZE));
+ //munmap(sts_ptr, sysconf(_SC_PAGESIZE));
+ //munmap(xadc_ptr, sysconf(_SC_PAGESIZE));
+ munmap(mem_ptr, sysconf(_SC_PAGESIZE));
+
+ //close(intc_fd);
+ close(cfg_fd);
+ //close(sts_fd);
+ //close(xadc_fd);
+
+ return 0;
+
+}
diff --git a/projects/adc_recorder_old/src/zynq_io.h b/projects/adc_recorder_old/src/zynq_io.h
new file mode 100644
index 0000000..812e096
--- /dev/null
+++ b/projects/adc_recorder_old/src/zynq_io.h
@@ -0,0 +1,149 @@
+#ifndef _ZYNQ_IO_H_
+#define _ZYNQ_IO_H_
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <unistd.h>
+
+#define INTC_BASEADDR 0x40000000
+#define INTC_HIGHADDR 0x40000FFF
+
+#define CFG_BASEADDR 0x40000000
+#define CFG_HIGHADDR 0x40000FFF
+
+#define STS_BASEADDR 0x40002000
+#define STS_HIGHADDR 0x40002FFF
+
+#define XADC_BASEADDR 0x40003000
+#define XADC_HIGHADDR 0x40003FFF
+
+#define XIL_AXI_INTC_ISR_OFFSET 0x0
+#define XIL_AXI_INTC_IPR_OFFSET 0x4
+#define XIL_AXI_INTC_IER_OFFSET 0x8
+#define XIL_AXI_INTC_IAR_OFFSET 0xC
+#define XIL_AXI_INTC_SIE_OFFSET 0x10
+#define XIL_AXI_INTC_CIE_OFFSET 0x14
+#define XIL_AXI_INTC_IVR_OFFSET 0x18
+#define XIL_AXI_INTC_MER_OFFSET 0x1C
+#define XIL_AXI_INTC_IMR_OFFSET 0x20
+#define XIL_AXI_INTC_ILR_OFFSET 0x24
+#define XIL_AXI_INTC_IVAR_OFFSET 0x100
+
+#define XIL_AXI_INTC_MER_ME_MASK 0x00000001
+#define XIL_AXI_INTC_MER_HIE_MASK 0x00000002
+
+//CFG
+#define CFG_RESET_GRAL_OFFSET 0x0
+#define CFG_NSAMPLES_OFFSET 0x4
+#define CFG_TRLVL_1_OFFSET 0x8
+#define CFG_TRLVL_2_OFFSET 0xC
+#define CFG_STRLVL_1_OFFSET 0x10
+#define CFG_STRLVL_2_OFFSET 0x14
+#define CFG_TEMPERATURE_OFFSET 0x18
+#define CFG_PRESSURE_OFFSET 0x1C
+#define CFG_TIME_OFFSET 0x20
+#define CFG_DATE_OFFSET 0x24
+#define CFG_LATITUDE_OFFSET 0x28
+#define CFG_LONGITUDE_OFFSET 0x2C
+#define CFG_ALTITUDE_OFFSET 0x30
+#define CFG_SATELLITE_OFFSET 0x34
+#define CFG_TR_SCAL_A_OFFSET 0x38
+#define CFG_TR_SCAL_B_OFFSET 0x3C
+#define CFG_HV1_OFFSET 0x4C //DAC_PWM3
+#define CFG_HV2_OFFSET 0x48 //DAC_PWM2
+#define CFG_HV3_OFFSET 0x40 //DAC_PWM0
+#define CFG_HV4_OFFSET 0x44 //DAC_PWM1
+
+//CFG Slow DAC
+#define CFG_DAC_PWM0_OFFSET 0x40
+#define CFG_DAC_PWM1_OFFSET 0x44
+#define CFG_DAC_PWM2_OFFSET 0x48
+#define CFG_DAC_PWM3_OFFSET 0x4C
+
+#define ENBL_ALL_MASK 0xFFFFFFFF
+#define RST_ALL_MASK 0x00000000
+#define RST_PPS_TRG_FIFO_MASK 0x00000001
+#define RST_TLAST_GEN_MASK 0x00000002
+#define RST_WRITER_MASK 0x00000004
+#define RST_AO_MASK 0x00000008
+#define FGPS_EN_MASK 0x00000010
+
+//STS
+#define STS_STATUS_OFFSET 0x0
+
+//XADC
+//See page 17 of PG091
+#define XADC_SRR_OFFSET 0x00 //Software reset register
+#define XADC_SR_OFFSET 0x04 //Status Register
+#define XADC_AOSR_OFFSET 0x08 //Alarm Out Status Register
+#define XADC_CONVSTR_OFFSET 0x0C //CONVST Register
+#define XADC_SYSMONRR_OFFSET 0x10 //XADC Reset Register
+#define XADC_GIER_OFFSET 0x5C //Global Interrupt Enable Register
+#define XADC_IPISR_OFFSET 0x60 //IP Interrupt Status Register
+#define XADC_IPIER_OFFSET 0x68 //IP Interrupt Enable Register
+#define XADC_TEMPERATURE_OFFSET 0x200 //Temperature
+#define XADC_VCCINT_OFFSET 0x204 //VCCINT
+#define XADC_VCCAUX_OFFSET 0x208 //VCCAUX
+#define XADC_VPVN_OFFSET 0x20C //VP/VN
+#define XADC_VREFP_OFFSET 0x210 //VREFP
+#define XADC_VREFN_OFFSET 0x214 //VREFN
+#define XADC_VBRAM_OFFSET 0x218 //VBRAM
+#define XADC_UNDEF_OFFSET 0x21C //Undefined
+#define XADC_SPLYOFF_OFFSET 0x220 //Supply Offset
+#define XADC_ADCOFF_OFFSET 0x224 //ADC Offset
+#define XADC_GAIN_ERR_OFFSET 0x228 //Gain Error
+#define XADC_ZDC_SPLY_OFFSET 0x234 //Zynq-7000 Device Core Supply
+#define XADC_ZDC_AUX_SPLY_OFFSET 0x238 //Zynq-7000 Device Core Aux Supply
+#define XADC_ZDC_MEM_SPLY_OFFSET 0x23C //Zynq-7000 Device Core Memory Supply
+#define XADC_VAUX_PN_0_OFFSET 0x240 //VAUXP[0]/VAUXN[0]
+#define XADC_VAUX_PN_1_OFFSET 0x244 //VAUXP[1]/VAUXN[1]
+#define XADC_VAUX_PN_2_OFFSET 0x248 //VAUXP[2]/VAUXN[2]
+#define XADC_VAUX_PN_3_OFFSET 0x24C //VAUXP[3]/VAUXN[3]
+#define XADC_VAUX_PN_4_OFFSET 0x250 //VAUXP[4]/VAUXN[4]
+#define XADC_VAUX_PN_5_OFFSET 0x254 //VAUXP[5]/VAUXN[5]
+#define XADC_VAUX_PN_6_OFFSET 0x258 //VAUXP[6]/VAUXN[6]
+#define XADC_VAUX_PN_7_OFFSET 0x25C //VAUXP[7]/VAUXN[7]
+#define XADC_VAUX_PN_8_OFFSET 0x260 //VAUXP[8]/VAUXN[8]
+#define XADC_VAUX_PN_9_OFFSET 0x264 //VAUXP[9]/VAUXN[9]
+#define XADC_VAUX_PN_10_OFFSET 0x268 //VAUXP[10]/VAUXN[10]
+#define XADC_VAUX_PN_11_OFFSET 0x26C //VAUXP[11]/VAUXN[11]
+#define XADC_VAUX_PN_12_OFFSET 0x270 //VAUXP[12]/VAUXN[12]
+#define XADC_VAUX_PN_13_OFFSET 0x274 //VAUXP[13]/VAUXN[13]
+#define XADC_VAUX_PN_14_OFFSET 0x278 //VAUXP[14]/VAUXN[14]
+#define XADC_VAUX_PN_15_OFFSET 0x27C //VAUXP[15]/VAUXN[15]
+
+#define XADC_AI0_OFFSET XADC_VAUX_PN_8_OFFSET
+#define XADC_AI1_OFFSET XADC_VAUX_PN_0_OFFSET
+#define XADC_AI2_OFFSET XADC_VAUX_PN_1_OFFSET
+#define XADC_AI3_OFFSET XADC_VAUX_PN_9_OFFSET
+
+#define XADC_CONV_VAL 0.00171191993362 //(A_ip/2^12)*(34.99/4.99)
+#define XADC_RDIV_VAL 1.883236177 //voltage divisor in board (15k+16.983k)/16.983k = 1.88
+#define XADC_BASE_HVDIV 0.00294088 //voltage divisor in HV base board (100k/31.3Meg) = 3.194888179. The value I put here is the measured one.
+
+extern int intc_fd, cfg_fd, sts_fd, xadc_fd, mem_fd;
+extern void *intc_ptr, *cfg_ptr, *sts_ptr, *xadc_ptr, *mem_ptr;
+
+void dev_write(void *dev_base, uint32_t offset, int32_t value);
+uint32_t dev_read(void *dev_base, uint32_t offset);
+//int dev_init(int n_dev);
+int32_t rd_reg_value(int n_dev, uint32_t reg_off);
+int32_t wr_reg_value(int n_dev, uint32_t reg_off, int32_t reg_val);
+int32_t rd_cfg_status(void);
+int intc_init(void);
+int cfg_init(void);
+int sts_init(void);
+int xadc_init(void);
+int mem_init(void);
+float get_voltage(uint32_t offset);
+void set_voltage(uint32_t offset, int32_t value);
+float get_temp_AD592(uint32_t offset);
+int init_system(void);
+int enable_interrupt(void);
+int disable_interrupt(void);
+
+#endif
+
--
GitLab