MRD加速器

2023/04/23 自组网 OCAP 通信 共 3213 字,约 10 分钟

如何搜一个文件夹中有没有某个字符串

findstr /s /i /m /c:"TCE_MRD_TASK_WRITE_END_INT" "D:\20220728\OCAP_V3.00.02.P01_HY_20221122\OCAP_V3.00.02.P01_HY_20221122\*.*"

1. MRD

1.1. MRD输入数据结构

输入数据以包为单位进行处理,每个采样点为 32 比特,其中实部和虚部各 16 比特。起始位置为包描述符,因而包大小为 dft_size*4+包描述符。输入包描述符共占16字节。

以下为和代码中对应的输入参数选项:

参数类型宽度说明实际值
s32p_dest_addSINT32_PTR32输出数据地址输出地址
b_dest_add_validBOOLEAN10:输出数据由buffer manager 控制。1:输出数据地址为s32p_dest_addTRUE
s32_out_buf_numberSINT322输出buffer选择,可选0-30
s32_dft_sizeSINT3210变换样点索引7:对应2048点
s32_dft_samplesSINT3213发给MRD的采样点数2048
s32_dft_offsetSINT3212输入数据补零个数/输出数据提取时跳过个数0
s32_pad_extractSINT322输入数据补零/输出数据提取选择。0:不使能,1:使能输入补0,2:使能输出提取0
s32_alphaSINT3224变换频移/相位梯度(规范为 pi 的弧度)在正负 1 之间的有符号数,格式为定点 Q1.230
s32_betaSINT3216变换相移/相位偏置(规范为 pi 的角度)在正负 1 之间的有符号数,格式为定点 Q1.150
s32_nco_lpoSINT322频移/相移选择,0:不使能,1:使能频移,2:使能相移0
b_inverse_dftBOOLEAN1正反向FFT变换,0:正向,1:反向01
b_scaling_typeBOOLEAN1缩放策略选择,0:自动缩放,1:固定缩放1
s32_fixed_scaling_schemeSINT322固定缩放选择10
s32_header_repetitionSINT328重复包描述符,指示本包后面有几包数据发送到MRD,不包含包描述符,使用此包描述符0
s32_reservedUINT322保留/

1.2. 寄存器配置

MRD配置端口基地址为0x200000

寄存器描述宽度(bits)地址偏移实际值
MRD_HW_CONFIG不知道干啥的~0x000x008a3309
MRD_SW_RESET软复位寄存器10x040x0000
MRD_ERROR_STATUS错误状态监测寄存器60x080x0000
MRD_IN_BUF_RD_CNT输入 buffer 读计数寄存器100x20 
MRD_AXI_MR_WR_CFG主设备写接口配置寄存器320x74 

1.3. MRD工作流程

1.3.1. 写 CP_MAILBOX 寄存器 CP_MAILBOX_XC4210_INTR_EN,配置XC4210_MRD_ERR_INTR_EN 和 XC4210_MRD0_INTR_EN 位使能 MRD 相关中断

以下为XC4210中断使能寄存器中的两个位:

图 1

我看目前程序应该是只配置了中断使能,错误中断使能未配置。

*CP_MAIL_XC4210_INTR_EN |=(0x1 << XC4210_MRD0_INTR_EN); 

1.3.2. 配置 XC4210_ICTL 的中断向量寄存器 XC4210_ICTL_IRQ_VECTOR_x,中断源使能寄存器 XC4210_ICTL_IRQ_INTEN 和中断源屏蔽寄存器XC4210_ICTL_IRQ_INTMASK,打开 MRD 中断,配置 MRD 中断处理函数入口地址

XC4210_ICTL 包含32个中断源,其中MRD为IRQ中断源25。

图 2

1.3.2.1. 配置XC4210_ICTL_IRQ_INTEN

中断使能通过XC4210_ICTL_IRQ_INTEN寄存器实现,此处需要使能第24位中断源。

*XC_IRQ_INTEN_L |= 0x1 << 24;

how to 理解上面的代码?

这行代码是用于设置一个位于XC_IRQ_INTEN_L寄存器的中断使能位。

  • XC_IRQ_INTEN_L:这是一个指向XC4210的中断使能寄存器(32位)的指针。
  • 0x1 << 24:这是一个位操作,将数值0x1左移24位。左移操作后,得到一个新的数值0x01000000。这个操作的目的是创建一个只有第25位为1的掩码,用于设置寄存器中相应的中断使能位。
  • *XC_IRQ_INTEN_L |=:这是一个复合赋值操作,它将XC_IRQ_INTEN_L寄存器的当前值与刚刚创建的掩码进行按位或(bitwise OR)操作,然后将结果写回寄存器。按位或操作保留了寄存器中其他位的值,并将第25位设置为1,从而使能第25位对应的中断。

图 3

综上所述,这行代码的作用是设置XC_IRQ_INTEN_L寄存器的第25位为1,由此实现中断使能。

1.3.2.2. 配置XC4210_ICTL_IRQ_INTMASK

中断屏蔽与否通过XC4210_ICTL_IRQ_INTMASK实现:

*XC_IRQ_INTMASK_L &= ~(0x1 << 24);

和中断使能类似。这行代码的作用是清除XC_IRQ_INTMASK_L寄存器的第25位,由下图可知,以此实现中断不屏蔽。

图 4

1.3.2.3. 配置中断入口函数
osa_irq_unregister(TCE_MRD_TASK_WRITE_END_INT);
osa_irq_register(TCE_MRD_TASK_WRITE_END_INT, (osa_irq_handler_t)user_mrd_test_isr, NULL_PTR);

图 5

以上实现了解注册(取消关联)一个中断服务程序(ISR)和注册(关联)一个中断服务程序。当TCE_MRD_TASK_WRITE_END_INT这个特定中断发生时,处理器将调用user_mrd_test_isr函数来处理中断。其中ISR译为中断服务程序。

配置 XC4210 寄存器 modp,使能矢量中断

没找到在哪里配置,但有一行注释给了可能的解释,大意是:

在模块配置寄存器(modp reg)的默认设置中,矢量中断(vector interrupt)已经启用。因此,我们不需要在模块配置寄存器(modp register)中设置矢量中断使能位(VINT enable bit)。

配置 FIC 总线的地址范围

harq_turbo_fic_config();
// fic_mrd_config();

TCE复位

此处涉及TCE控制器TCE_CTL以及复位寄存器TCE_RST。

其中XC4210 访问 TCE_CTL 的基地址为:0x800000

图 6

#define TCE_CTL_BASE 0x800000
#define TCE_RST     (TCE_CTL_BASE + 0x04)

具体复位代码如下:

s32_reg_value = 0x3ff << 16 | 0x0;
vp_reg_addr   = (VOID_PTR)TCE_RST;
out_arX_s_arY_s_dw((VOID_PTR)s32_reg_value, vp_reg_addr);

// release reset
s32_reg_value = 0x3ff << 16 | 0x3ff; 
vp_reg_addr = (VOID_PTR)TCE_RST;
out_arX_s_arY_s_dw((VOID_PTR)s32_reg_value, vp_reg_addr);

首先,将0x3ff << 16 | 0x0的结果赋值给s32_reg_value。结果是一个32位整数,其高16位为0x3ff,低16位为0x0。对应到TCE_RST寄存器中。为复位操作。

文档信息

Search

    Table of Contents