diff --git a/projects/adc_recorder_old/adc-recorder.c b/projects/adc_recorder_old/adc-recorder.c
new file mode 100644
index 0000000000000000000000000000000000000000..c8c6e7ba100ee61ce849e72981afc9bd3930eee6
--- /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 0000000000000000000000000000000000000000..2658cdb573969173151812a10bd7c5d6a237c357
--- /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 0000000000000000000000000000000000000000..3949c777a22024657bcf96313056f149c2373b2f
--- /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 0000000000000000000000000000000000000000..febaf6b14ee289a3ca507268ee427e58c9e34d95
--- /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 0000000000000000000000000000000000000000..812e09686d7d600ef860f2fd73a67161466e1fb4
--- /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
+