Commit 1036f0ed authored by Hongzhi Wang's avatar Hongzhi Wang

adding nr ue ldpc offload

parent 9881036c
...@@ -247,6 +247,7 @@ add_boolean_option(T_TRACER True "Activate the T tracer, a debugging ...@@ -247,6 +247,7 @@ add_boolean_option(T_TRACER True "Activate the T tracer, a debugging
add_boolean_option(UE_AUTOTEST_TRACE False "Activate UE autotest specific logs") add_boolean_option(UE_AUTOTEST_TRACE False "Activate UE autotest specific logs")
add_boolean_option(UE_DEBUG_TRACE False "Activate UE debug trace") add_boolean_option(UE_DEBUG_TRACE False "Activate UE debug trace")
add_boolean_option(UE_TIMING_TRACE False "Activate UE timing trace") add_boolean_option(UE_TIMING_TRACE False "Activate UE timing trace")
add_boolean_option(LDPC_FPGA_OFFLOAD False "Activate UE LDPC trace")
add_boolean_option(DISABLE_LOG_X False "Deactivate all LOG_* macros") add_boolean_option(DISABLE_LOG_X False "Deactivate all LOG_* macros")
add_boolean_option(USRP_REC_PLAY False "Enable USRP record playback mode") add_boolean_option(USRP_REC_PLAY False "Enable USRP record playback mode")
add_boolean_option(UE_NAS_USE_TUN False "Enable UE NAS TUN device instead of ue_ip.ko") add_boolean_option(UE_NAS_USE_TUN False "Enable UE NAS TUN device instead of ue_ip.ko")
...@@ -1425,6 +1426,7 @@ set(PHY_SRC_UE ...@@ -1425,6 +1426,7 @@ set(PHY_SRC_UE
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_demodulation.c
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_ulsch_coding.c
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding.c
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_decoding_ldpc_offload.c
${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c ${OPENAIR1_DIR}/PHY/NR_UE_TRANSPORT/nr_dlsch_llr_computation.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_tbs_tools.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_tbs_tools.c
${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_sch_dmrs.c ${OPENAIR1_DIR}/PHY/NR_TRANSPORT/nr_sch_dmrs.c
...@@ -2549,6 +2551,20 @@ target_link_libraries (nr-uesoftmodem pthread m ${CONFIG_LIBRARIES} rt crypt ${C ...@@ -2549,6 +2551,20 @@ target_link_libraries (nr-uesoftmodem pthread m ${CONFIG_LIBRARIES} rt crypt ${C
target_link_libraries (nr-uesoftmodem ${LIB_LMS_LIBRARIES}) target_link_libraries (nr-uesoftmodem ${LIB_LMS_LIBRARIES})
target_link_libraries (nr-uesoftmodem ${T_LIB}) target_link_libraries (nr-uesoftmodem ${T_LIB})
# LDPC Decoder Offload : SYRTEM
#####################################################
if (${LDPC_FPGA_OFFLOAD})
set (LDPC_OFFLOAD_DIR ${OPENAIR_DIR}/targets/ARCH/LDPC_OFFLOAD/slib)
include_directories ("${LDPC_OFFLOAD_DIR}")
LINK_DIRECTORIES("${LDPC_OFFLOAD_DIR}")
set(LDPC_OFFLOAD_LIB "ldpc_decoder_offload")
endif (${LDPC_FPGA_OFFLOAD})
if (${LDPC_FPGA_OFFLOAD})
message( "Linking LDPC_OFFLOAD lib" )
target_link_libraries( nr-uesoftmodem ${OPENAIR_TARGETS}/ARCH/LDPC_OFFLOAD/slib/libldpc_decoder_offload.so )
endif (${LDPC_FPGA_OFFLOAD})
# nr-uesoftmodem-nos1 # nr-uesoftmodem-nos1
####################################### #######################################
......
...@@ -64,6 +64,7 @@ CMAKE_CMD="$CMAKE" ...@@ -64,6 +64,7 @@ CMAKE_CMD="$CMAKE"
UE_AUTOTEST_TRACE="False" UE_AUTOTEST_TRACE="False"
UE_DEBUG_TRACE="False" UE_DEBUG_TRACE="False"
UE_TIMING_TRACE="False" UE_TIMING_TRACE="False"
LDPC_FPGA_OFFLOAD="False"
USRP_REC_PLAY="False" USRP_REC_PLAY="False"
BUILD_ECLIPSE=0 BUILD_ECLIPSE=0
NR="False" NR="False"
...@@ -143,6 +144,8 @@ Options ...@@ -143,6 +144,8 @@ Options
Disables the T tracer. Disables the T tracer.
--disable-hardware-dependency --disable-hardware-dependency
Disable HW dependency during installation Disable HW dependency during installation
--ldpc_fpga_offload
Enables LDPC decoding offload in FPGA.
--ue-autotest-trace --ue-autotest-trace
Enable specific traces for UE autotest framework Enable specific traces for UE autotest framework
--ue-trace --ue-trace
...@@ -332,6 +335,10 @@ function main() { ...@@ -332,6 +335,10 @@ function main() {
echo_info "Disabling hardware dependency for compiling software" echo_info "Disabling hardware dependency for compiling software"
DISABLE_HARDWARE_DEPENDENCY="True" DISABLE_HARDWARE_DEPENDENCY="True"
shift 1;; shift 1;;
--ldpc_fpga_offload)
LDPC_FPGA_OFFLOAD="True"
echo_info "Enabling the usage of LDPC decoding offload in FPGA"
shift 1;;
--ue-autotest-trace) --ue-autotest-trace)
UE_AUTOTEST_TRACE="True" UE_AUTOTEST_TRACE="True"
echo_info "Enabling autotest specific trace for UE" echo_info "Enabling autotest specific trace for UE"
...@@ -563,6 +570,7 @@ function main() { ...@@ -563,6 +570,7 @@ function main() {
echo "set ( UE_AUTOTEST_TRACE $UE_AUTOTEST_TRACE )" >> $cmake_file echo "set ( UE_AUTOTEST_TRACE $UE_AUTOTEST_TRACE )" >> $cmake_file
echo "set ( UE_DEBUG_TRACE $UE_DEBUG_TRACE )" >> $cmake_file echo "set ( UE_DEBUG_TRACE $UE_DEBUG_TRACE )" >> $cmake_file
echo "set ( UE_TIMING_TRACE $UE_TIMING_TRACE )" >> $cmake_file echo "set ( UE_TIMING_TRACE $UE_TIMING_TRACE )" >> $cmake_file
echo "set ( LDPC_FPGA_OFFLOAD $LDPC_FPGA_OFFLOAD)" >> $cmake_file
echo "set ( USRP_REC_PLAY $USRP_REC_PLAY )" >> $cmake_file echo "set ( USRP_REC_PLAY $USRP_REC_PLAY )" >> $cmake_file
echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file echo 'include(${CMAKE_CURRENT_SOURCE_DIR}/../CMakeLists.txt)' >> $cmake_file
cd $DIR/$build_dir/build cd $DIR/$build_dir/build
......
...@@ -122,6 +122,59 @@ int32_t uplink_frequency_offset[MAX_NUM_CCs][4]; ...@@ -122,6 +122,59 @@ int32_t uplink_frequency_offset[MAX_NUM_CCs][4];
extern int16_t nr_dlsch_demod_shift; extern int16_t nr_dlsch_demod_shift;
#if LDPC_FPGA_OFFLOAD
#include <dlfcn.h>
#include "ldpc_decoder_offload.h"
typedef uint8_t (*syr_ldpc_offload_initfunc_t)(void);
typedef uint8_t (*syr_ldpc_offload_finifunc_t)(void);
typedef uint8_t (*syr_ldpc_offload_decodefunc_t)(int16_t *y,
uint8_t *decoded_bytes,
uint16_t n,
uint16_t interleaver_f1,
uint16_t interleaver_f2,
uint8_t max_iterations,
uint8_t crc_type,
uint8_t F,
time_stats_t *init_stats,
time_stats_t *alpha_stats,
time_stats_t *beta_stats,
time_stats_t *gamma_stats,
time_stats_t *ext_stats,
time_stats_t *intl1_stats,
time_stats_t *intl2_stats);
syr_ldpc_offload_initfunc_t syr_init_funct;
syr_ldpc_offload_finifunc_t syr_fini_funct;
//syr_ldpc_offload_decodefunc_t syr_ldpc_decode_funct;
typedef session_t (*threegpp_nr_ldpc_decode_start_t)(session_desc_t *session_desc);
threegpp_nr_ldpc_decode_start_t threegpp_nr_ldpc_decode_start_funct;
typedef int32_t (*threegpp_nr_ldpc_decode_putq_t)( session_t fd,
int16_t *y_16bits,
uint8_t *decoded_bytes,
uint8_t r,
uint16_t n,
uint8_t max_iterations,
uint8_t crc_type);
threegpp_nr_ldpc_decode_putq_t threegpp_nr_ldpc_decode_putq_funct;
typedef int32_t (*threegpp_nr_ldpc_decode_getq_t)( session_t fd,
uint8_t *decoded_bytes,
uint8_t r,
uint8_t crc_type,
uint8_t *crc_status,
uint8_t *nb_iterations
);
threegpp_nr_ldpc_decode_getq_t threegpp_nr_ldpc_decode_getq_funct;
typedef int32_t (*threegpp_nr_ldpc_decode_stop_t)( session_t fd);
threegpp_nr_ldpc_decode_stop_t threegpp_nr_ldpc_decode_stop_funct;
typedef int32_t (*threegpp_nr_ldpc_decode_run_t)( session_t fd);
threegpp_nr_ldpc_decode_run_t threegpp_nr_ldpc_decode_run_funct;
#endif
int UE_scan = 0; int UE_scan = 0;
int UE_scan_carrier = 0; int UE_scan_carrier = 0;
int UE_fo_compensation = 0; int UE_fo_compensation = 0;
...@@ -789,6 +842,105 @@ int main( int argc, char **argv ) { ...@@ -789,6 +842,105 @@ int main( int argc, char **argv ) {
#endif #endif
} }
#if LDPC_FPGA_OFFLOAD
void *syr_handle = NULL;;
uint8_t syr_ret = 0;
syr_handle = dlopen("libldpc_decoder_offload.so", RTLD_LAZY);
if (!syr_handle)
{
fprintf(stderr,"Unable to locate libldpc_decoder_offload.so: HW device set to NONE_DEV.\n");
fprintf(stderr,"%s\n",dlerror());
exit_fun("Error loading ldpc decoder offload device");
}
syr_init_funct = dlsym(syr_handle,"phy_threegppnr_ldpc_decoder_offload_init");
if (syr_init_funct != NULL )
{
syr_ret = syr_init_funct();
if (syr_ret < 0)
{
fprintf(stderr, "%s %d:ldpc decoder offload device intialization failed %s\n", __FILE__, __LINE__, dlerror());
exit_fun("Error loading ldpc decoder offload device");
}
}
else
{
fprintf(stderr, "%s %d:ldpc decoder offload device init function not found %s\n", __FILE__, __LINE__, dlerror());
exit_fun("Error ldpc decoder offload device init function not found");
}
syr_fini_funct = dlsym(syr_handle,"phy_threegppnr_ldpc_decoder_offload_fini");
if (syr_fini_funct == NULL )
{
fprintf(stderr, "%s %d:ldpc decoder offload device fini function not found %s\n", __FILE__, __LINE__, dlerror());
exit_fun("Error ldpc decoder offload device fini function not found");
}
#if 0
syr_ldpc_decode_funct = dlsym(syr_handle,"phy_threegppnr_ldpc_decoder_offload");
if (syr_ldpc_decode_funct == NULL )
{
fprintf(stderr, "%s %d:ldpc decoder offload device decode function not found %s\n", __FILE__, __LINE__, dlerror());
exit_fun("Error ldpc decoder offload device decode function not found");
}
#endif
threegpp_nr_ldpc_decode_start_funct = dlsym(syr_handle,"threegpp_nr_ldpc_decode_start");
if (threegpp_nr_ldpc_decode_start_funct == NULL )
{
printf("%s %d:threegpp_nr_ldpc_decode_start function not found %s\n", __FILE__, __LINE__, dlerror());
exit(-1);
}
threegpp_nr_ldpc_decode_putq_funct = dlsym(syr_handle,"threegpp_nr_ldpc_decode_putq");
if (threegpp_nr_ldpc_decode_putq_funct == NULL )
{
printf("%s %d:threegpp_nr_ldpc_decode_putq function not found %s\n", __FILE__, __LINE__, dlerror());
exit(-1);
}
threegpp_nr_ldpc_decode_getq_funct = dlsym(syr_handle,"threegpp_nr_ldpc_decode_getq");
if (threegpp_nr_ldpc_decode_getq_funct == NULL )
{
printf("%s %d:threegpp_nr_ldpc_decode_getq function not found %s\n", __FILE__, __LINE__, dlerror());
exit(-1);
}
threegpp_nr_ldpc_decode_stop_funct = dlsym(syr_handle,"threegpp_nr_ldpc_decode_stop");
if (threegpp_nr_ldpc_decode_stop_funct == NULL )
{
printf("%s %d:threegpp_nr_ldpc_decode_stop function not found %s\n", __FILE__, __LINE__, dlerror());
exit(-1);
}
threegpp_nr_ldpc_decode_run_funct = dlsym(syr_handle,"threegpp_nr_ldpc_decode_run");
if (threegpp_nr_ldpc_decode_run_funct == NULL )
{
printf("%s %d:threegpp_nr_ldpc_decode_run function not found %s\n", __FILE__, __LINE__, dlerror());
exit(-1);
}
#if 0 // Test
int16_t y[8448]; // 22.Zc -> 22x128 x 3 LLR16bits -> 8448 int16_t
uint8_t decoded_bytes[352]; // 22.Zc bits -> 352 bytes
uint16_t n = 2816; // code_block size = 2816
memset(y, 0x7F, 8448 * sizeof(int16_t));
memset(decoded_bytes, 0, 352 * sizeof(uint8_t));
syr_ret = syr_ldpc_decode_funct(y, decoded_bytes, n, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL);
if (syr_ret < 0)
{
fprintf(stderr, "%s %d:ldpc decoder offload device intialization failed %s\n", __FILE__, __LINE__, dlerror());
exit_fun("Error loading ldpc decoder offload device");
}
#endif
#endif
// wait for end of program // wait for end of program
printf("TYPE <CTRL-C> TO TERMINATE\n"); printf("TYPE <CTRL-C> TO TERMINATE\n");
init_NR_UE(1); init_NR_UE(1);
......
This diff is collapsed.
...@@ -1804,6 +1804,18 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue, ...@@ -1804,6 +1804,18 @@ uint32_t nr_dlsch_decoding(PHY_VARS_NR_UE *phy_vars_ue,
uint8_t is_crnti, uint8_t is_crnti,
uint8_t llr8_flag); uint8_t llr8_flag);
uint32_t nr_dlsch_decoding_ldpc_offload(PHY_VARS_NR_UE *phy_vars_ue,
short *dlsch_llr,
NR_DL_FRAME_PARMS *frame_parms,
NR_UE_DLSCH_t *dlsch,
NR_DL_UE_HARQ_t *harq_process,
uint32_t frame,
uint16_t nb_symb_sch,
uint8_t nr_tti_rx,
uint8_t harq_pid,
uint8_t is_crnti,
uint8_t llr8_flag);
int nr_extract_dci_info(PHY_VARS_NR_UE *ue, int nr_extract_dci_info(PHY_VARS_NR_UE *ue,
uint8_t eNB_id, uint8_t eNB_id,
lte_frame_type_t frame_type, lte_frame_type_t frame_type,
......
...@@ -3673,6 +3673,20 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, ...@@ -3673,6 +3673,20 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
dlsch0->harq_processes[harq_pid]->TBS>256?1:0); dlsch0->harq_processes[harq_pid]->TBS>256?1:0);
LOG_T(PHY,"UE_DLSCH_PARALLELISATION is defined, ret = %d\n", ret); LOG_T(PHY,"UE_DLSCH_PARALLELISATION is defined, ret = %d\n", ret);
#else #else
#if LDPC_FPGA_OFFLOAD
ret = nr_dlsch_decoding_ldpc_offload(ue,
pdsch_vars->llr[0],
&ue->frame_parms,
dlsch0,
dlsch0->harq_processes[harq_pid],
frame_rx,
nb_symb_sch,
nr_tti_rx,
harq_pid,
pdsch==PDSCH?1:0,
dlsch0->harq_processes[harq_pid]->TBS>256?1:0);
//printf("start cW0 dlsch decoding\n");
#else
ret = nr_dlsch_decoding(ue, ret = nr_dlsch_decoding(ue,
pdsch_vars->llr[0], pdsch_vars->llr[0],
&ue->frame_parms, &ue->frame_parms,
...@@ -3686,6 +3700,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue, ...@@ -3686,6 +3700,7 @@ void nr_ue_dlsch_procedures(PHY_VARS_NR_UE *ue,
dlsch0->harq_processes[harq_pid]->TBS>256?1:0); dlsch0->harq_processes[harq_pid]->TBS>256?1:0);
LOG_T(PHY,"UE_DLSCH_PARALLELISATION is NOT defined, ret = %d\n", ret); LOG_T(PHY,"UE_DLSCH_PARALLELISATION is NOT defined, ret = %d\n", ret);
//printf("start cW0 dlsch decoding\n"); //printf("start cW0 dlsch decoding\n");
#endif
#endif #endif
#if UE_TIMING_TRACE #if UE_TIMING_TRACE
......
/* ============================================================================
*
* file ldpc_decoder_offload.h
* author B.ROBERT
* date Jan 10, 2018
*
* brief LDPC Decoder Offload interface header.
*
* Infos:
* - Project : syr_ldpc_offload_lib
* - Software :
* - CVS domain : syrtemplatform5g
* - CVS component :
*
* ============================================================================
* Statement of Ownership
* ----------------------
* Copyright (c) 2018-2019 SYRTEM S.a.r.l All Rights Reserved
*
* This software is furnished under licence and may be used and copied only
* in accordance with the terms of such license and with the inclusion of the
* above COPYRIGHT notice. This SOFTWARE or any other copies thereof may not
* be provided or otherwise made available to any other person. No title to
* and ownership of the SOFTWARE is hereby transferred.
*
* The information in this SOFTWARE is subject to change without notice and
* should not be constructed as a commitment by SYRTEM.
*
* SYRTEM assumes no responsability for the use or reliability of its SOFTWARE
* on equipment or platform not explicitly validated by SYRTEM.
*
* ============================================================================
* Reference documents :
* -------------------
*
* ==========================================================================*/
#ifndef __LDPC_DECODER_OFFLOAD_LIB_H__
#define __LDPC_DECODER_OFFLOAD_LIB_H__
#define LDPC_DECODER_OFFLOAD_OK (0)
#define LDPC_DECODER_OFFLOAD_ERROR (-1)
#define LDPC_DECODER_OFFLOAD_BAD_PARAMETER (-2)
#define LDPC_DECODER_OFFLOAD_PRECONDITION_NOT_MET (-3)
#define LDPC_DECODER_OFFLOAD_NOT_SUPPORTED (-4)
#define LDPC_DECODER_OFFLOAD_NO_CONTEXT (-5)
#define LDPC_DECODER_OFFLOAD_DEVICE_NOT_FOUND (-6)
#define LDPC_DECODER_OFFLOAD_CHANNEL_NOT_FOUND (-7)
#define LDPC_DECODER_OFFLOAD_BUFFER_NOT_CREATED (-8)
#define LDPC_DECODER_OFFLOAD_INITCFG_FAILED (-9)
#define LDPC_DECODER_OFFLOAD_SELF_TEST_FAILED (-10)
#define LDPC_DECODER_OFFLOAD_SYRIQ_INIT_FAILED (-11)
#define LDPC_DECODER_OFFLOAD_TH_INIT_FAILED (-12)
#define LDPC_DECODER_OFFLOAD_DECOD_REQ_NULL (-20)
#define LDPC_DECODER_OFFLOAD_ERROR_TIMEOUT (-30)
typedef void *session_t;
typedef struct session_desc_s
{
uint32_t proc_nb;
uint32_t frame;
uint32_t nr_tti_rx; // ~ tti number
uint32_t BG;
uint32_t R;
uint8_t coderate; // 0x01:BG1 8/9 27.Zc
// 0x2A:BG1 1/3 68.Zc,
// 0x43:BG2 2/3 17.Zc,
// 0x66:BG2 1/5 52.Zc,
uint32_t Zc; // 128, 160, 224, 256, 384
uint8_t max_decoding_iterations;
uint32_t C;
uint8_t crc_type;
uint8_t mcs;
} session_desc_t;
typedef enum ldpc_msgtype_e
{
LDPC_DECODING_OFFLOAD_REQ,
LDPC_DECODING_OFFLOAD_CONF
} ldpc_msgtype_t;
typedef struct decode_req_s
{
ldpc_msgtype_t msg_type;
uint32_t proc_nb;
uint32_t r; // seg. index from 1 to 16 max
int16_t *data; // 16bit LLR buffer pointer
} decode_req_t;
typedef struct decode_conf_s
{
ldpc_msgtype_t msg_type;
uint32_t proc_nb;
uint32_t segment_no; // from 1 to 16 max
uint32_t crc24_check;
uint32_t nb_iterations;
uint8_t *data; // Hard decoded bits buffer pointer
} decode_conf_t;
session_t threegpp_nr_ldpc_decode_start(session_desc_t *session_desc);
int32_t threegpp_nr_ldpc_decode_putq( session_t fd,
int16_t *y_16bits,
uint8_t *decoded_bytes,
uint8_t r,
uint16_t n,
uint8_t max_iterations,
uint8_t crc_type
);
int32_t threegpp_nr_ldpc_decode_getq( session_t fd,
uint8_t *decoded_bytes,
uint8_t r,
uint8_t crc_type,
uint8_t *crc_status,
uint8_t *nb_iterations
);
int32_t threegpp_nr_ldpc_decode_stop(session_t fd);
int32_t threegpp_nr_ldpc_decode_run(session_t fd);
/*!
\brief This routine performs max-logmap detection for the 3GPP turbo code (with termination). It is optimized for SIMD processing and 16-bit
LLR arithmetic, and requires SSE2,SSSE3 and SSE4.1 (gcc >=4.3 and appropriate CPU)
@param y LLR input (16-bit precision)
@param decoded_bytes Pointer to decoded output
@param n number of coded bits (including tail bits)
@param max_iterations The maximum number of iterations to perform
@param interleaver_f1 F1 generator
@param interleaver_f2 F2 generator
@param crc_type Length of 3GPPLTE crc (CRC24a,CRC24b,CRC16,CRC8)
@param F Number of filler bits at start of packet
@returns number of iterations used (this is 1+max if incorrect crc or if crc_len=0)
*/
uint8_t phy_threegppnr_ldpc_decoder_offload(int16_t *y,
uint8_t *decoded_bytes,
uint16_t n,
uint16_t interleaver_f1,
uint16_t interleaver_f2,
uint8_t max_iterations,
uint8_t crc_type,
uint8_t F,
time_stats_t *init_stats,
time_stats_t *alpha_stats,
time_stats_t *beta_stats,
time_stats_t *gamma_stats,
time_stats_t *ext_stats,
time_stats_t *intl1_stats,
time_stats_t *intl2_stats);
uint8_t phy_threegppnr_ldpc_decoder_offload_init(void);
uint8_t phy_threegppnr_ldpc_decoder_offload_fini(void);
#endif // __LDPC_DECODER_OFFLOAD_LIB_H__
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment