OAI 5G-NR源码架构

1 特性范围

目前gNB5G-NRUE支持如下的配置:

  • 工作模式:TDD
  • CP长度:Normal CP
  • 子载波间隔: 30kHz
  • 信道带宽:40MHz(106PRB)、80MHz(217PRB)、100MHz(237PRB)
  • 天线端口:单波束
  • 时隙格式:14 OFDM符号
  • 编码方式:LDPC、polar

2 gNB源码解析

2.1 代码框架时序图

gNB源码主框架图如下图所示:

在这里插入图片描述

**Main:**主进程,主要功能包括:

1) 命令行参数解析

2) 系统配置文件解析

3) 各子层初始化工作,包括重要数据结构、接口初始化工作

4) 线程初始化,gNB管理线程、包括RRC层处理线程、rx/tx处理线程、传输网接口线程、x2口交互线程

5) 射频phy层及RU单元初始化及配置工作

6) 物理层算法模块数据初始化

7) 用户面数据业务缓存开辟

gNB_app_task:gNB管理线程,主要功能包括:

1) gNB主要数据结构初始化 RCconfig

2) MAC层与PHY层的P5&P7接口初始化,回调函数注册

3) 调用P5接口向RRC发送承载配置命令

4) 处理核心网下发的一些消息

5) 处理各种超时处理消息等

rrc_gnb_taskRRC处理线程,主要功能包括:

1) RRC配置消息处理,如果支持NSA方式,还需要处理MN设备发送的RRC重配置消息。

2) 双连接副站添加相关处理

3) 随机接入消息处理(Msg3,Msg4)

4) 测量相关处理

5) 系统消息处理

sctp_eNB_task:传输网接口线程,主要功能包括:

1) NG口连接建立相关的消息处理

2) 与F1AP 控制面的消息处理(包括CU和DU两部分)

ru_threadrx/tx处理线程,主要功能包括:

1) RU设备库加载

2) 上行流程处理,包括PHY、MAC、RLC、PDCP

3) 下行流程处理, 包括PHY、MAC、RLC、PDCP

2.2 重要函数及过程

2.2.1 主进程

Main() [nr-softmodem.c]

  1. get_options()

通过解析命令行参数来对系统做配置。

重要的数据结构:RAN_CONTEXT_t, 存储gNb实例、macrlc实例、L1实例,RU实例信息。

  1. netlink_init()

  2. init_pdcp()

  3. create_gNB_tasks(1)

起来几个主要线程

a. itti_create_task(TASK_GNB_APP, gNB_app_task,NULL):

1) L1配置信息初始化

2) 完成对phy层、rlc子层、PDCP子层的初始配置工作,若支持noS1模式,还要读取rrc子层的配置信息。

3) 初始化MAC与PHY之间的接口,回调函数注册:

Nr_ul_indication:层2上行接收接口函数,当物理层从空口接收到上行数据,经过物理层过程后将会触发该函数将解码后的数据pdu上送至MAC层

**nr_phy_config_request:**系统参数配置入口处理函数。在SA模式下,系统读取初始化配置文件,然后将其传送给RRC层,RRC层根据配置文件信息形成RRC message(如:SI系统消息),在5G NR NSA模式下,其接收的配置消息基本上就是MIB以及服务小区从X2接口传来的重配置消息。

nr_schedul_response:MAC与PHY的下行接口处理函数。该函数可对MAC层下行pdu进行调度,包括MIB、PRACH消息、rrc消息业务数据pdu以及一些半动态配置消息,并根据调度结果生成DCI。

4) configure_nr_rrc:初始化RRC实体,生成rrc配置消息,包括物理层及射频单元配置。通知RRC处理线程。

b. itti_create_task(TASK_SCTP, sctp_eNB_task,NULL):

​ gNB NG-C的接口线程,也可作为F1-C的接口。

c. itti_create_task(TASK_X2AP, x2ap_task,NULL):

X2接口线程

d. itti_create_task(TASK_RRC_GNB, rrc_gnb_task,NULL)

​ RRC子层的处理线程,主要应包括系统消息、随机接入的Msg3、Msg4相关处理、一些测量相关消息处理

  1. init_gNB()

注册MAC层与PHY层接口回调函数:Nr_ul_indication、nr_phy_config_request、nr_schedul_response(详细描述见4)。

  1. wait_gNBs()

此处采用了停等的模式。至此,系统参数配置以及生效,phy及mac层以上子层均完成初始配置工作。

  1. init_NR_RU()

1) 射频单元参数初始化。主要参数包括:uhd driver地址、类型、同步时钟源,接收增益,参考信号能量等。

2) 回调函数注册,主要回调有:

ru->fh_south_in:RU与phy的上行接口处理函数

ru->fh_south_out:RU与phy的下行接口处理函数

ru->feptx_ofdm:射频前端处理函数

ru->feprx :射频前端处理函数

3) init_RU_proc():空口线程管理,此处起了gNB上下行处理的主线程ru_thread

  1. wait_RUs()

此处采用线程同步方式(pthread_cond_signal(&RC.ru_cond),RC.ru_mask)。至此,包括射频单元在内的所有模块初始配置工作完成。

  1. init_eNB_afterRU()

1) 初始化物理层算法模块使用的数据表格、配置物理层处理过程的一些关键参数

2) 回调函数注册:gNB_top, gNB上/下行数据处理入口函数。

3) 为ULSCH/DLSCH开辟存储buffer

  1. 至此,所有RU单元及gNB实体ok,发送同步信号(pthread_cond_broadcast(&sync_cond))通知所有处理线程可以开始上/下行数据处理。

2.2.2 ru_thread线程

  1. nr_init_frame_parms()

这里计算了空口帧的许多重要参数信息,包括每帧的时隙数、每子帧的时隙数、每个时隙的符号数、每帧的采样点数、每个时隙的点数、接收/发送天线数、频率范围、帧类型、子载波间隔等信息。

  1. fill_rf_config()

根据numerology及PRB配置信息得到系统的信道带宽及采用率等信息上下行频点,天线tx_gain,rx_gain等信息

  1. nr_phy_init_RU()

初始化与phy层的接口buffer

  1. openair0_device_load()

加载RF设备库

  1. 线程同步,启动RF设备,开始正常的接收发送

  2. 上行处理流程

  3. 下行处理流程

2.2.3 rrc_gnb_task线程

RRC子层处理线程

  1. RRC配置/重配置

接收gNB管理线程的rrc配置消息NRRRC_CONFIGURATION_REQ,调用init_NR_SI,该函数最终会调用P5接口对底层设备进行配置。如下图所示:
在这里插入图片描述

  1. 副站添加

接收X2接口发送的副站添加消息X2AP_ENDC_SGNB_ADDITION_REQ

2.2.4 随机接入过程

  1. preamble接收

调用函数L1_nr_prach_procedures()在上行PRACH信道上接收preamble,最多能检测到64个preamble。获取preamble序列,找到当前root序列下的preamble循环偏移位置,计算输出检测到的pramble的TA(时间调整值)和能量。

选取能量最大的preamble

gNB->UL_INFO.rach_ind.number_of_pdus = 1, 发起随机接入流程

  1. 初始化发起随机接入

handle_nr_rach()

调用nr_initiate_ra_proc()

将状态改为 ra->state = Msg2

初始化随机接入过程

  1. 发送RAR

nr_schedule_RA()

nr_generate_Msg2()生成Msg2,分别处理DCI,PDCCH,PDSCH设置,

赋值tx_req

在发送时隙,调用phy_procedures_gNB_TX()

生成DCI

执行PDCCH、PDSCH过程

将状态改为 ra->state = WAIT_Msg3

  1. Msg3接收

调用nr_schedule_reception_msg3()存储msg3主要信息(ul_req):包大小,包地址,当前帧号和时隙。

ifi->NR_Schedule_response[回调函数:nr_schedule_response]

调用函数handle_nfapi_nr_ul_dci_pdu 解出ul dci

调用函数nr_fill_ulsch()根据dci找到ulsch位置

在物理层接收主函数phy_procedures_gNB_uespec_RX 中调用函数nr_ulsch_procedures()

调用函数nr_ulsch_decoding()得到解码后的mac_pdu

rx_ind.number_of_pdus++ , crc_ind.number_crcs++

mac上行接收主函数中调用nr_rx_sdu()

3 接口

3.1 nFAPI(P5 &P7)

3.1.1 架构

FAPI提供了MAC层与PHY层之间的接口,实现了phy层与mac层的分离,其接口架构如下图所示,其中P5口主要用于传送静态配置信息,P7口主要用来传送数据和半动态配置信息。

在这里插入图片描述

3.1.2 过程

如上图所示,MAC层从命令行或配置文件获取系统配置参数,然后将其传送至RRC层,RRC层会通过P5接口触发nr_phy_config_req()对PHY及RU进行配置。在5G NR NSA方式下,RRC子层接收从X2接口来的主校区rrc重配置消息。

对于半动态配置消息以及用户面数据信息的传送,MAC层与PHY层之间使用P7接口,对于上行数据,触发nr_ul_indication();对于下行数据,触发nr_schedule_response()

NR_UL_INDICATION

NR_SCHEDULE_RESPONNSE

TX_REQ

携带从MAC层到 PHY 层的 PDU.

RX_IND

携带从PHY层到MAC层的 PDU

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部