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--