From 51fd34f58240530f9b1c60a24d62343a62b76ecb Mon Sep 17 00:00:00 2001
From: yankuo <yankuo@example.com>
Date: Tue, 26 Dec 2023 11:27:45 +0800
Subject: [PATCH] modify build_helper and add oxgrf.so

---
 cmake_targets/tools/build_helper |  28 ++-
 radio/OXGRF/liboxgrf_ss.so       | Bin 0 -> 79032 bytes
 radio/OXGRF/oxgrf_api_ss.h       | 286 +++++++++++++++++++++++++++++++
 3 files changed, 312 insertions(+), 2 deletions(-)
 create mode 100644 radio/OXGRF/liboxgrf_ss.so
 create mode 100644 radio/OXGRF/oxgrf_api_ss.h

diff --git a/cmake_targets/tools/build_helper b/cmake_targets/tools/build_helper
index c229401f3a..46a73cace7 100755
--- a/cmake_targets/tools/build_helper
+++ b/cmake_targets/tools/build_helper
@@ -663,6 +663,7 @@ check_install_oai_software() {
 
     install_asn1c_from_source $1
     install_simde_from_source $1
+    install_oxgrf_from_source $1
 }
 
 install_asn1c_from_source(){
@@ -673,7 +674,9 @@ install_asn1c_from_source(){
     $SUDO $INSTALLER -y install bison flex
     $SUDO rm -rf /tmp/asn1c
     # GIT_SSL_NO_VERIFY=true git clone https://gitlab.eurecom.fr/oai/asn1c.git /tmp/asn1c
-    git clone https://github.com/mouse07410/asn1c /tmp/asn1c
+    #git clone https://github.com/mouse07410/asn1c /tmp/asn1c
+    sudo wget -c http://www.opensource5g.org:19780/share/oai/libs/asn1/24w24b/asn1c.tar.gz -P /tmp/
+    tar -zxvf /tmp/asn1c.tar.gz -C /tmp
     cd /tmp/asn1c
     #git checkout vlm_master
     # hotfix: current vlm_master (5fa129cf3161da9ff2d67341e6277e818c0f5d6a)
@@ -697,7 +700,9 @@ install_simde_from_source(){
     echo_info "\nInstalling SIMDE from source without test cases (header files only)"
     cd /tmp
     $SUDO rm -rf /tmp/simde
-    git clone https://github.com/simd-everywhere/simde-no-tests.git /tmp/simde
+    #git clone https://github.com/simd-everywhere/simde-no-tests.git /tmp/simde
+    sudo wget -c http://www.opensource5g.org:19780/share/oai/libs/simde.tar.gz -P /tmp/
+    tar -zxvf /tmp/simde.tar.gz -C /tmp 
     cd /tmp/simde
     # we can specify a given version of SIMDE (sha-one or tag)
     if [[ -v SIMDE_VERSION ]]; then
@@ -803,6 +808,25 @@ install_lttng_tools_2_13_from_source() {
     $SUDO ldconfig
 }
 
+install_oxgrf_from_source(){
+    echo_info "\nInstalling OXGRF from source without test cases (header files only)"
+    if [ ! -f /usr/local/include/oxgrf_api_ss.h ]; then
+   cp $OPENAIR_DIR/radio/OXGRF/oxgrf_api_ss.h /usr/local/include
+   $SUDO chmod +x /usr/local/include/oxgrf_api_ss.h
+   echo "oxgrf_api_ss.h installed successfully"
+   else
+   echo "oxgrf_api_ss.h is already existed"
+fi
+if [ ! -f /usr/local/include/liboxgrf_ss.so ]; then
+   cp $OPENAIR_DIR/radio/OXGRF/liboxgrf_ss.so /usr/local/lib
+   $SUDO chmod +x /usr/local/lib/liboxgrf_ss.so
+   $SUDO ldconfig /usr/local/lib
+   echo "liboxgrf_ss.so installed successfully"
+   else
+   echo "liboxgrf_ss.so is already existed"
+fi
+}
+
 #################################################
 # 2. compile
 ################################################
diff --git a/radio/OXGRF/liboxgrf_ss.so b/radio/OXGRF/liboxgrf_ss.so
new file mode 100644
index 0000000000000000000000000000000000000000..78d780b25b449aaa4ec5dc1fd366fb1d59723347
GIT binary patch
literal 79032
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

literal 0
HcmV?d00001

diff --git a/radio/OXGRF/oxgrf_api_ss.h b/radio/OXGRF/oxgrf_api_ss.h
new file mode 100644
index 0000000000..73593e9666
--- /dev/null
+++ b/radio/OXGRF/oxgrf_api_ss.h
@@ -0,0 +1,286 @@
+/*
+ * oxgrf_api_ss.h
+ *
+ *  Created on: 2016/5/9
+ *      Author: Eric
+ */
+#ifndef __OXGRF_SS_API_H__
+#define __OXGRF_SS_API_H__
+#include <stdio.h>
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdbool.h>
+
+#if defined(__WINDOWS_) || defined(_WIN32)
+#define DLLEXPORT __declspec(dllexport)
+#define OXGRFCALL __cdecl
+#else
+#define DLLEXPORT
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct oxgrf_transport OXGRF_TRANSPORT;
+
+
+typedef struct oxgrf_device_descriptor {
+    int32_t id;
+    int32_t status;
+    uint8_t nchips;
+    uint8_t nsubdev;
+    OXGRF_TRANSPORT *trans;
+}OXGRF_DESCRIPTOR;
+
+typedef enum {
+    TX1_CHANNEL = 1,
+    TX2_CHANNEL = 2,
+    TX3_CHANNEL = 3,
+    TX4_CHANNEL = 4,
+    TX5_CHANNEL = 5,
+    TX6_CHANNEL = 6,
+    TX7_CHANNEL = 7,
+    TX8_CHANNEL = 8,
+}RF_TX_CHANNEL;
+
+typedef enum {
+    RX1_CHANNEL = 1,
+    RX2_CHANNEL = 2,
+    RX3_CHANNEL = 3,
+    RX4_CHANNEL = 4,
+    RX5_CHANNEL = 5,
+    RX6_CHANNEL = 6,
+    RX7_CHANNEL = 7,
+    RX8_CHANNEL = 8,
+}RF_RX_CHANNEL;
+
+typedef enum rf_gain_ctrl_mode {
+    RF_GAIN_MGC,
+    RF_GAIN_FASTATTACK_AGC,
+    RF_GAIN_SLOWATTACK_AGC,
+}RF_GAIN_CTRL_MODE;
+
+typedef enum ref_select {
+    INTERNAL_REFERENCE = 0,
+    EXTERNAL_REFERENCE,
+}REF_SELECT;
+
+typedef enum vco_cal_select {
+    ADF4001 = 0,
+    AUXDAC1,
+}VCO_CAL_SELECT;
+
+typedef enum duplex_select {
+    TDD = 0,
+    FDD,
+}DUPLEX_SELECT;
+
+typedef enum trx_switch {
+    RX = 0,
+    TX,
+}TRX_SWITCH;
+
+typedef enum {
+    TX_CHANNEL_TIMEOUT   = 29,
+    RX_CHANNEL_TIMEOUT   = 30,
+    TX_CHANNEL_UNDERFLOW = 31,
+    RX_CHANNEL_OVERFLOW  = 32,
+    TX_CHANNEL_COUNT     = 33,
+    RX_CHANNEL_COUNT     = 34,
+}CHANNEL_EVENT;
+
+typedef enum pps_enable {
+    PPS_INTERNAL_EN,
+    PPS_GPS_EN,
+    PPS_EXTERNAL_EN,
+}PPSModeEnum;
+
+typedef enum device_configuration {
+    SingleSubDevSingleRF = 0x1010,
+    SingleSubDevDualRF   = 0x1020,
+    SingleSubDevQuadRF   = 0x1040,
+    DualSubDevDualRF     = 0x2011,
+    DualSubDevTriple1RF  = 0x2012,
+    DualSubDevTriple2RF  = 0x2021,
+    DualSubDevQuadRF     = 0x2022,
+    DualSubDevOctoRF     = 0x2044,
+    NULLSubDevNULLRF     = 0,
+}DEV_CFG;
+
+typedef struct {
+    uint8_t   receiver_mode;
+    uint8_t   disciplining_mode;
+    uint16_t  minor_alarms;
+    uint8_t   gnss_decoding_status;
+    uint8_t   disciplining_activity;
+    uint8_t   pps_indication;
+    uint8_t   pps_reference;
+} GPS_STATUS;
+
+typedef struct {
+    uint8_t second;
+    uint8_t minute;
+    uint8_t hour;
+    uint8_t day;
+    uint8_t month;
+    uint32_t year;
+} TIME_24H;
+
+/*********************************************************************************************************************************************************/
+
+DLLEXPORT uint64_t oxgrf_ticksToTimeNs (const uint64_t ticks, const double rate);
+DLLEXPORT uint64_t oxgrf_timeNsToTicks (const uint64_t timeNs, const double rate);
+
+/*********************************************************************************************************************************************************/
+DLLEXPORT OXGRF_DESCRIPTOR *oxgrf_open_device (const char *url);
+DLLEXPORT int32_t oxgrf_close_device (OXGRF_DESCRIPTOR *oxgrf);
+DLLEXPORT int32_t oxgrf_get_device_configuration (OXGRF_DESCRIPTOR* oxgrf, DEV_CFG* cfg);
+
+DLLEXPORT int32_t oxgrf_get_firmware_version(OXGRF_DESCRIPTOR* oxgrf, uint32_t* version);
+DLLEXPORT int32_t oxgrf_get_model_version(OXGRF_DESCRIPTOR* oxgrf, uint32_t* version);
+/*********************************************************************************************************************************************************/
+
+DLLEXPORT int32_t oxgrf_get_gps_status (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, GPS_STATUS *g_status);
+DLLEXPORT int32_t oxgrf_get_utc (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, TIME_24H *time);
+DLLEXPORT int32_t oxgrf_get_xyz (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, double *longtitude, double *latitude, double *altitude);
+DLLEXPORT int32_t oxgrf_get_sampling_freq_range (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, uint32_t *sampling_freq_hz_max, uint32_t *sampling_freq_hz_min);
+DLLEXPORT int32_t oxgrf_get_rx_gain_range (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, uint32_t *gain_db_max, uint32_t *gain_db_min);
+DLLEXPORT int32_t oxgrf_get_tx_gain_range (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, uint32_t *gain_db_max, uint32_t *gain_db_min);
+DLLEXPORT int32_t oxgrf_get_rx_freq_range (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, uint64_t *lo_freq_hz_max, uint64_t *lo_freq_hz_min);
+DLLEXPORT int32_t oxgrf_get_tx_freq_range (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, uint64_t *lo_freq_hz_max, uint64_t *lo_freq_hz_min);
+
+/*********************************************************************************************************************************************************/
+
+/* Get current TX LO frequency. */
+DLLEXPORT int32_t oxgrf_get_tx_lo_freq (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, uint64_t *lo_freq_hz);
+/* Get current TX sampling frequency. */
+DLLEXPORT int32_t oxgrf_get_tx_sampling_freq (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, uint32_t *sampling_freq_hz);
+/* Get the TX RF bandwidth. */
+DLLEXPORT int32_t oxgrf_get_tx_rf_bandwidth (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, uint32_t *bandwidth_hz);
+/* Get current transmit attenuation for the selected channel. */
+DLLEXPORT int32_t oxgrf_get_tx1_attenuation (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, uint32_t *attenuation_mdb);
+/* Get current transmit attenuation for the selected channel. */
+DLLEXPORT int32_t oxgrf_get_tx2_attenuation (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, uint32_t *attenuation_mdb);        
+
+/* Get current RX LO frequency. */
+DLLEXPORT int32_t oxgrf_get_rx_lo_freq (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, uint64_t *lo_freq_hz);
+/* Get the RX RF bandwidth. */
+DLLEXPORT int32_t oxgrf_get_rx_rf_bandwidth (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, uint32_t *bandwidth_hz);
+/* Get the gain control mode for the selected channel. */
+DLLEXPORT int32_t oxgrf_get_rx1_gain_control_mode (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, RF_GAIN_CTRL_MODE *gc_mode);
+/* Get the gain control mode for the selected channel. */
+DLLEXPORT int32_t oxgrf_get_rx2_gain_control_mode (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, RF_GAIN_CTRL_MODE *gc_mode);
+/* Get current receive RF gain for the selected channel. */
+DLLEXPORT int32_t oxgrf_get_rx1_rf_gain (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, int32_t *gain_db);
+/* Get current receive RF gain for the selected channel. */
+DLLEXPORT int32_t oxgrf_get_rx2_rf_gain (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, int32_t *gain_db);
+DLLEXPORT int32_t oxgrf_get_rx1_rssi (OXGRF_DESCRIPTOR* oxgrf, uint8_t rf_id, int32_t* rssi);
+DLLEXPORT int32_t oxgrf_get_rx2_rssi (OXGRF_DESCRIPTOR* oxgrf, uint8_t rf_id, int32_t* rssi);
+
+/*********************************************************************************************************************************************************/
+/* Set the RX LO frequency. */
+DLLEXPORT int32_t oxgrf_set_rx_lo_freq (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, uint64_t lo_freq_hz);
+/* Set the RX RF bandwidth. */
+DLLEXPORT int32_t oxgrf_set_rx_rf_bandwidth (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, uint32_t  bandwidth_hz);
+/* Set the RX sampling frequency. */
+DLLEXPORT int32_t oxgrf_set_rx_sampling_freq (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, uint32_t sampling_freq_hz);
+/* Set the gain control mode for the selected channel. */
+DLLEXPORT int32_t oxgrf_set_rx1_gain_control_mode (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, RF_GAIN_CTRL_MODE gc_mode);
+DLLEXPORT int32_t oxgrf_set_rx2_gain_control_mode (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, RF_GAIN_CTRL_MODE gc_mode);
+/* Set the receive RF gain for the selected channel. */
+DLLEXPORT int32_t oxgrf_set_rx1_rf_gain (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, int32_t gain_db);
+/* Set the receive RF gain for the selected channel. */
+DLLEXPORT int32_t oxgrf_set_rx2_rf_gain (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, int32_t gain_db);
+
+DLLEXPORT int32_t oxgrf_set_rx_fir_en_dis (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, uint8_t enable);
+
+/* Set the TX LO frequency. */
+DLLEXPORT int32_t oxgrf_set_tx_lo_freq (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, uint64_t lo_freq_hz); 
+/* Set the TX RF bandwidth. */
+DLLEXPORT int32_t oxgrf_set_tx_rf_bandwidth (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, uint32_t  bandwidth_hz);
+/* Set the TX sampling frequency. */
+DLLEXPORT int32_t oxgrf_set_tx_sampling_freq (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, uint32_t sampling_freq_hz);
+/* Set the transmit attenuation for the selected channel. */
+DLLEXPORT int32_t oxgrf_set_tx1_attenuation (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, uint32_t attenuation_mdb);
+/* Set the transmit attenuation for the selected channel. */
+DLLEXPORT int32_t oxgrf_set_tx2_attenuation (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, uint32_t attenuation_mdb);
+
+/* Set the transmit abs power for the selected channel. */
+DLLEXPORT int32_t oxgrf_set_tx1_abs_power (OXGRF_DESCRIPTOR* oxgrf, uint8_t rf_id, int32_t abs_power);
+/* Set the transmit abs power for the selected channel. */
+DLLEXPORT int32_t oxgrf_set_tx2_abs_power (OXGRF_DESCRIPTOR* oxgrf, uint8_t rf_id, int32_t abs_power);
+
+DLLEXPORT int32_t oxgrf_set_tx_fir_en_dis (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, uint8_t status);
+
+/*********************************************************************************************************************************************************/
+
+DLLEXPORT int32_t oxgrf_get_rfchip_reg (OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, uint32_t reg, uint32_t *value);
+DLLEXPORT int32_t oxgrf_set_rfchip_reg(OXGRF_DESCRIPTOR *oxgrf, uint8_t rf_id, uint32_t reg, uint32_t value);
+
+/*********************************************************************************************************************************************************/
+
+DLLEXPORT int32_t oxgrf_get_extend_cmd(OXGRF_DESCRIPTOR *oxgrf, uint8_t cmd_id, uint64_t *value, bool with_param);
+DLLEXPORT int32_t oxgrf_set_extend_cmd(OXGRF_DESCRIPTOR *oxgrf, uint8_t cmd_id, uint64_t value);
+
+/*********************************************************************************************************************************************************/
+
+DLLEXPORT int32_t oxgrf_set_tx_lo_int_ext (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, uint8_t enable);
+DLLEXPORT int32_t oxgrf_set_rx_lo_int_ext (OXGRF_DESCRIPTOR *oxgrf,uint8_t dev_id, uint8_t enable);
+DLLEXPORT int32_t oxgrf_set_ext_lo_freq (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, uint64_t lo_freq_hz);
+DLLEXPORT int32_t oxgrf_do_mcs (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, uint8_t enable);
+
+DLLEXPORT int32_t oxgrf_set_ref_clock (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, REF_SELECT source);
+DLLEXPORT int32_t oxgrf_set_vco_select (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, VCO_CAL_SELECT vco);
+DLLEXPORT int32_t oxgrf_set_auxdac1 (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, uint32_t vol_mV);
+DLLEXPORT int32_t oxgrf_set_duplex_select (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, DUPLEX_SELECT duplex);
+DLLEXPORT int32_t oxgrf_set_rx_ant_enable (OXGRF_DESCRIPTOR* oxgrf, uint8_t dev_id, uint8_t enable);
+DLLEXPORT int32_t oxgrf_tx_cyclic_enable (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, uint8_t enable);
+DLLEXPORT int32_t oxgrf_set_trxsw_fpga_enable (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, uint8_t enable);
+DLLEXPORT int32_t oxgrf_set_hwbuf_depth (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, uint32_t depth);
+DLLEXPORT int32_t oxgrf_get_hwbuf_depth (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, uint32_t *depth);
+
+DLLEXPORT int32_t oxgrf_set_pps_select (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, PPSModeEnum pps);
+DLLEXPORT int32_t oxgrf_set_rxchannel_coef (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, RF_RX_CHANNEL channel, int16_t coef1, int16_t coef2);
+DLLEXPORT int32_t oxgrf_enable_rxchannel_corr (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, RF_RX_CHANNEL channel, uint32_t enable);
+DLLEXPORT int32_t oxgrf_set_txchannel_coef (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, RF_TX_CHANNEL channel, int16_t coef1, int16_t coef2);
+DLLEXPORT int32_t oxgrf_enable_txchannel_corr (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, RF_TX_CHANNEL channel, uint32_t enable);
+DLLEXPORT int32_t oxgrf_set_txchannel_ampcoef (OXGRF_DESCRIPTOR* oxgrf, uint8_t dev_id, RF_TX_CHANNEL channel, int16_t coef);
+DLLEXPORT int32_t oxgrf_set_rxchannel_ampcoef (OXGRF_DESCRIPTOR* oxgrf, uint8_t dev_id, RF_RX_CHANNEL channel, int16_t coef);
+
+/*********************************************************************************************************************************************************/
+
+DLLEXPORT int32_t oxgrf_enable_timestamp (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, uint8_t enable);
+DLLEXPORT int32_t oxgrf_read_timestamp (OXGRF_DESCRIPTOR *oxgrf, uint8_t dev_id, uint64_t *timestamp);
+DLLEXPORT int32_t oxgrf_get_channel_event (OXGRF_DESCRIPTOR *oxgrf, CHANNEL_EVENT event, uint8_t channel, uint32_t *count);
+
+/*********************************************************************************************************************************************************/
+
+DLLEXPORT int32_t oxgrf_read_samples (OXGRF_DESCRIPTOR *oxgrf, void *buffer, uint32_t count, RF_RX_CHANNEL channel, uint64_t *timestamp);
+DLLEXPORT int32_t oxgrf_read_samples_multiport (OXGRF_DESCRIPTOR *oxgrf, void **buffer, uint32_t count, uint8_t channel_mask, uint64_t *timestamp);
+DLLEXPORT int32_t oxgrf_read_samples_multiport_Matlab (OXGRF_DESCRIPTOR *oxgrf, void *buffer, uint32_t count, uint8_t channel_mask, uint64_t *timestamp);
+DLLEXPORT int32_t oxgrf_dump_samples_multiport (OXGRF_DESCRIPTOR *oxgrf, uint32_t count, uint8_t channel_mask, uint64_t* timestamp);
+/* Since the data contains a 16-byte header, the size of the buffer should be greater than or equal to (count*4+16) Bytes*/
+DLLEXPORT int32_t oxgrf_read_samples_zerocopy (OXGRF_DESCRIPTOR *oxgrf, void *buffer, uint32_t count, RF_RX_CHANNEL channel, uint64_t *timestamp);
+
+DLLEXPORT int32_t oxgrf_write_samples (OXGRF_DESCRIPTOR *oxgrf, void *buffer, uint32_t count, RF_TX_CHANNEL channel, uint64_t timestamp);
+DLLEXPORT int32_t oxgrf_write_samples2 (OXGRF_DESCRIPTOR *oxgrf, void *buffer, uint32_t count, RF_TX_CHANNEL channel, uint64_t timestamp, uint32_t flags);
+DLLEXPORT int32_t oxgrf_write_samples_multiport (OXGRF_DESCRIPTOR *oxgrf, const void **buffer, uint32_t count, uint8_t channel_mask, uint64_t timestamp, uint32_t flags);
+DLLEXPORT int32_t oxgrf_write_samples_multiport_Matlab (OXGRF_DESCRIPTOR *oxgrf, const void *buffer, uint32_t count, uint8_t channel_mask, uint64_t timestamp, uint32_t flags);
+DLLEXPORT int32_t oxgrf_write_samples_zerocopy (OXGRF_DESCRIPTOR *oxgrf, void *buffer, uint32_t count, RF_TX_CHANNEL channel, uint64_t timestamp);
+
+/*********************************************************************************************************************************************************/
+
+DLLEXPORT void float_to_int16 (int16_t *dst, const float *src, int n, float mult);
+DLLEXPORT void int16_to_float (float *dst, const int16_t *src, int len, float mult);
+DLLEXPORT void int16_to_float_avx2(float *outputVector, const int16_t *inputVector, unsigned int num_points);
+DLLEXPORT void float_to_int16_avx2(int16_t *outputVector, const float *inputVector, unsigned int num_points);
+
+/*********************************************************************************************************************************************************/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*  __OXGRF_SS_API_H__ */
-- 
2.26.2