Linux下为AD9361加载FIR滤波器系数

1. 概述

SDR-B1是正旗通信推出的基于Xilinx Zynq XC7Z045+ADI AD9361/AD9363的软件无线电平台,近期有客户在使用Petalinux进行软件开发过程中,提出更改加载AD9361/AD9363 FIR滤波器系数的方法,本文档给出具体的实现方式。

2. 分析

通过查看ad9361.c代码可知,在加载AD9361驱动的过程中,首先运行的是ad9361_probe函数,如下:

static struct spi_driver ad9361_driver = {
.driver = {
.name = "ad9361",
},
.probe = ad9361_probe,
.id_table = ad9361_id,
};
module_spi_driver(ad9361_driver);

MODULE_AUTHOR("Michael Hennerich <michael.hennerich@analog.com>");
MODULE_DESCRIPTION("Analog Devices AD9361 ADC");
MODULE_LICENSE("GPL v2");

查看ad9361_probe函数,可以看到其调用了ad9361_init_state函数,ad9361_init_state代码如下:

static void ad9361_init_state(struct ad9361_rf_phy *phy)
{
struct ad9361_rf_phy_state *st = phy->state;

st->current_table = -1;
st->bypass_tx_fir = true;
st->bypass_rx_fir = true;
st->rate_governor = 1;
st->rfdc_track_en = true;
st->bbdc_track_en = true;
st->quad_track_en = true;
}

显然,AD9361的Tx FIR与Rx FIR都被bypass掉了,也就是说A9361的Tx FIR与Rx FIR并未使用。继续查看ad9361_probe函数,通过以下代码

sysfs_bin_attr_init(&phy->bin);
phy->bin.attr.name = "filter_fir_config";
phy->bin.attr.mode = S_IWUSR | S_IRUGO;
phy->bin.write = ad9361_fir_bin_write;
phy->bin.read = ad9361_fir_bin_read;
phy->bin.size = 4096;

可知,对于FIR滤波器的查询、配置是通过对文件系统的读写实现的。

3. 实现方法

SDR-B1启动后,进入/sys/bus/iio/devices/iio:device0目录,输入以下命令查看FIR滤波器配置

cat filter_fir_config

如果没有配置FIR滤波器,则返回以下信息:

FIR Rx 0,0 Tx 0,0

假定滤波器系数文件名称为LTE20.txt,输入以下命令:

cat LTE20.txt > filter_fir_config

再次查看FIR滤波器配置,返回信息如下:

FIR Rx 128,2 Tx 128,2

LTE20.txt文件可以使用wget命令从上位机获取,或者提前编译到文件系统中。对于FIR滤波器系数文件,有如下要求:

  • 每个文件都需要一个简短的标题:
  • 前缀为“#”的行将被忽略
  • 系数是带符号的16位数字
  • 可以加载多个滤波器文件,直到每个RX和每个TX都有自己的系数集

语法和示例如下所示

RX [1,2,3(both)] GAIN [-12, -6, 0, 6] DEC [1,2,4]
TX [1,2,3(both)] GAIN [-6, 0] INT [1,2,4]
[RRX ]
[RTX ]
[BWRX ]
[BWTX ]
<tx-coef0, rx-coef0>
<tx-coef1, rx-coef1>
<…, …>
<tx-coefN-1, rx-coefN-1>

#RX [1,2,3(both)] GAIN [-12, -6, 0, 6] DEC [1,2,4]
#TX [1,2,3(both)] GAIN [-6, 0] INT [1,2,4]
#tx,rx
RX 3 GAIN -6 DEC 2
TX 3 GAIN 0 INT 2
RTX 983040000 245760000 245760000 122880000 61440000 30720000
RRX 983040000 491520000 245760000 122880000 61440000 30720000
BWTX 19365438
BWRX 19365514
-5,49
0,217
--snip--