openwifi学习-日程记录(先写论文,后面更新)
网址:https://github.com/open-sdr/openwifi
Openwifi:openwifi与linux的驱动部分源码和linux系统。
Openwifi-hw:openwifi的FPGA部分源码,是硬件部分,也是lowmac部分。
Openofdm:openwifi的基带部分源码,也是运行在FPGA中,最终集成到openwif-hw项目中,也算是openwif-hw的一部分(ip),在这里单独作为一个工程更便于大家理解和学习。
openwifi-hw-img:放置了一些关于openwifi FPGA img的硬件git信息
上面这是openwifi的整体框架,两个蓝色adi-linux什么的是专用linux系统(先不管,看内容是公司专门出的)
driver里面
从上到下,分别对应下面那个框图中ARM这边的驱动代码部分。ad9361的驱动少了,应该是放别的地方了,而且有别的芯片比如ad9364,我手头的就是7020+9363
基本上就是.c文件+一个makefile,很标准的linux驱动程序
openwifi-hw里面放的是FPGA工程,其中
adi-hdl @ f61d970里面放着暂时不知道,但是确实有很多AD芯片的驱动的感觉。
boards里面放着各种支持板子的工程路径
ip里面是 openwifi的verilog代码这个side_ch没有在框图里面显示(翻译是添加集中式DBG交换机,暂时不懂)
这是其document里面的一张很完整的结构框架图。后面的学习会对照这个图,把每个模块都弄懂(争取,毕竟是要做毕设的)。
我准备先从硬件这边入手,毕竟Linux驱动那边都较为完善,而且大概率用别人写好的修改,FPGA这边就需要下点功夫,堆工作量的任务就在这。
这是手册里面的一张示意图,也就是上面的简化。下面这个就是AD9361和FPGA之间具体的一些接口以及模块配置
从OpenOFDM开始,这个工程是openwifi-hw的一个ip,都属于fpga这边的硬件部分。
这个包含802.11 OFDM PHY解码器的Verilog实现。(OFDM和802.11n都会单独学习)
OpenOFDM的模块的学习网站:https://openofdm.readthedocs.io/en/latest/
一旦RF信号被捕获并且下变频到基带,解码流水线(步骤统一)就开始了,包括:
- Packet detection(数据包检测)
- Center frequency offset correction(中心频率偏移校正)
- FFT(快速傅里叶转换)
- Channel gain estimation(信道增益估计)
- Demodulation(检波)
- Deinterleaving(去交织)
- Convolutional decoding(卷积编码)
- Descrambling(解扰)
在此之前,已经学会了如何编译openwifi-hw文件、通过vivado生成bit流文件和vitis生成boot.bin文件,导入sd卡,烧录等
在sdr硬件上也学会了如何使用用户空间指令配置相关参数和获取,通过写脚本和配置启动文件能让sdr启动就能ad-hoc组网等。
2024-8-12
已经烧录好官方镜像,测试了一些命令,以及通过ad-hoc组网并ping通(但是ad-hoc是无线自组网协议,无法通过以太网口传输,而且是5G信号)
在文档里发现了这个,但是好像没什么用,并没有真正把频率改变(再研究。。。)
2024-8-13
2024-8-14
通过阅读官方手册继续学习
sdrctrl文件里的.c .h文件就是解释./sdrctrl后面的参数命令的地方,没仔细研究,大致摸了一遍
2024-8-15
2024-8-16
测试了8-12号的改变频率问题,买的SMA转BNC接口还没到(而且不确定示波器的带宽够不够测试最低的频率,因为是9363不是9361)
所以先将两个设备进入ad-hoc模式,这个时候按照iwconfig命令显示,sdr0设备是5.22Ghz,这是命令选择信道时候44决定的(在802.11学习文章里面提到过,如果是信道6就是2.4G范畴了)
先配置的原因就是需要预先设计一个wifi正常工作的环境,首先ping通,然后在设备频率
先给其中一个sdr设置频率1.4G,也就是1400(收发都要)
再ping发现ping不通了,然后给另一个也设置收发1400,又可以ping通了,而且通信距离变远了(虽然本来就距离很短)
通过iperf3工具测试带宽看起来还可以。(上下行都可以,还能经过UDP TCP等测速)
就收发距离上来看的话,增加通信距离的手段有很多
1、增加 TX发射增益,也可以增加发射距离,放大嗓门说话
2、接收灵敏度,其实是可接受的触发最低电平基准,相当于提高听力
3、天线增益,包括发送天线增益和接收天线增益。相当于扩音器和助听器
发射增益通过rf的0寄存器值可以改变
接受灵敏度应该是rx里面的2,power trigger and dc detection threshold。这个接收灵敏度在sdr.c文件里面找到
一开始get是32位,00000000
/*这个函数的目的是将接收强度指示 RSSI的值从半分贝(half-db)单位转换为分贝毫瓦(dBm)单位
并应用一个校正因子,需要从RSSI值中减去的校正因子,以分贝为单位
*/
inline int rssi_half_db_to_rssi_dbm(int rssi_half_db, int rssi_correction)
{
int rssi_db, rssi_dbm;
//首先右移1位将半分贝改分贝,因为2个半分贝=1分贝
rssi_db = (rssi_half_db>>1);
//减去校正因子得到RSSI值
rssi_dbm = rssi_db - rssi_correction;
//由于RSSI值(在分贝单位下)可能变得非常低(即非常负),因此将rssi_dbm的值限制在-128以上。
rssi_dbm = (rssi_dbm < (-128)? (-128) : rssi_dbm);
return rssi_dbm;
}
inline int rssi_dbm_to_rssi_half_db(int rssi_dbm, int rssi_correction)
{
//分贝转半分贝,因为1分贝等于两个半分贝
return ((rssi_correction+rssi_dbm)<<1);
}
2024-8-17
sdrctrl的用户设置set get 代码在openwifi/user_space/sdrctrl_src/cmd.c里面的42行的这个函数,后面还有get
cmd.c
static int handle_set_reg(struct nl80211_state *state,
struct nl_cb *cb,
struct nl_msg *msg,
int argc, char **argv,
enum id_input id)
{
struct nlattr *tmdata;
char *end;
unsigned int reg_cat, reg_addr, reg_val;
tmdata = nla_nest_start(msg, NL80211_ATTR_TESTDATA);
if (!tmdata) {
return 1;
}
if (strcasecmp(argv[0],"rf")==0)
reg_cat=1;
else if (strcasecmp(argv[0],"rx_intf")==0)
reg_cat = 2;
else if (strcasecmp(argv[0],"tx_intf")==0)
reg_cat = 3;
else if (strcasecmp(argv[0],"rx")==0)
reg_cat = 4;
else if (strcasecmp(argv[0],"tx")==0)
reg_cat = 5;
else if (strcasecmp(argv[0],"xpu")==0)
reg_cat = 6;
else if (strcasecmp(argv[0],"drv_rx")==0)
reg_cat = 7;
else if (strcasecmp(argv[0],"drv_tx")==0)
reg_cat = 8;
else if (strcasecmp(argv[0],"drv_xpu")==0)
reg_cat = 9;
else {
printf("Wrong the 1st argument. Should be rf/rx_intf/tx_intf/rx/tx/xpu/drv_rx/drv_tx/drv_xpu\n");
return 1;
}
reg_addr = strtoul(argv[1], &end, 10);
if (*end) {
return 1;
}
reg_addr = reg_addr<<2;//from idx to addr
reg_addr = ((reg_cat<<16)|reg_addr);
reg_val = strtoul(argv[2], &end, 10);
if (*end) {
return 1;
}
//这个应该就是将你设置的地址和值写入寄存器的代码
NLA_PUT_U32(msg, OPENWIFI_ATTR_CMD, REG_CMD_SET);
NLA_PUT_U32(msg, REG_ATTR_ADDR, reg_addr);
NLA_PUT_U32(msg, REG_ATTR_VAL, reg_val);
nla_nest_end(msg, tmdata);
printf("reg cat: %d\n", reg_cat);
printf("reg addr: %08x\n", reg_addr);
printf("reg val: %08x\n", reg_val);
return 0;
nla_put_failure:
return -ENOBUFS;
}
COMMAND(set, reg, "<rf/rx_intf/tx_intf/rx/tx/xpu/drv_rx/drv_tx/drv_xpu reg_idx value>", NL80211_CMD_TESTMODE, 0, CIB_NETDEV, handle_set_reg, "set reg");
今天用示波器试了一下,在配置了发射频率为325Mhz(9363的调谐范围325M~3.8G)
按道理周期波长应该是1/325M*10^9=3.0769ns,看了示波器,差不多,说明确实可以通过用户空间控制功率。
昨天的增加发射功率和提高接收灵敏度的问题,在设置一些值的时候,有一些error(发射的频率和接收频率虽然可以随便设置,但是硬件有限制,暂且不管)
但是设置发射功率的时候,超过80db(反正不到90db)就会报错
注意:这个rf 模块的0不是发射功率是发射衰减,等于0的时候,才是发射功率最大的时候(一直搞错了,调越大越不能通,md)
查到的报错代码是sdrctrl.c里面的
if (err == 1) {
if (cmd)
usage_cmd(cmd);
else
usage(0, NULL);
} else if (err < 0)
fprintf(stderr, "command failed: %s (%d)\n", strerror(-err), err);
2024-8-18
天线增益先不管,硬件的事后面再说
发射增益可以调节
接下来就是接收灵敏度的调节了
在看一下这个,rx模块的配置,用命令查看一下
在openofdm_rx.c里面97行
openofdm_rx_api->OPENOFDM_RX_REG_POWER_THRES_write((OPENOFDM_RX_DC_RUNNING_SUM_TH_INIT<<16)|OPENOFDM_RX_POWER_THRES_INIT); // turn on signal watchdog by default
#define OPENOFDM_RX_POWER_THRES_INIT 124
// Above 118 is based on these test result (2022-03-09)
// FMCOMMS3
// 2437M
// 11a/g BPSK 6M, Rx sensitivity level dmesg report -85dBm
// priv->rssi_correction = 153; rssi_half_db/2 = 153-85=68; rssi_half_db = 136
// 5180M
// 11a/g BPSK 6m, Rx sensitivity level dmesg report -84dBm
// priv->rssi_correction = 145; rssi_half_db/2 = 145-84=61; rssi_half_db = 122
// 5320M
// 11a/g BPSK 6m, Rx sensitivity level dmesg report -86dBm
// priv->rssi_correction = 148; rssi_half_db/2 = 148-86=62; rssi_half_db = 124
// FMCOMMS2
// 2437M
// 11a/g BPSK 6M, Rx sensitivity level dmesg report -80dBm
// priv->rssi_correction = 153; rssi_half_db/2 = 153-80=73; rssi_half_db = 146
// 5180M
// 11a/g BPSK 6m, Rx sensitivity level dmesg report -83dBm
// priv->rssi_correction = 145; rssi_half_db/2 = 145-83=62; rssi_half_db = 124
// 5320M
// 11a/g BPSK 6m, Rx sensitivity level dmesg report -86dBm
// priv->rssi_correction = 148; rssi_half_db/2 = 148-86=62; rssi_half_db = 124
#define OPENOFDM_RX_RSSI_DBM_TH_DEFAULT (-85) //-85 will remove lots of false alarm. the best openwifi reported sensitivity is like -90/-92 (set it manually if conductive test with wifi tester)
#define OPENOFDM_RX_DC_RUNNING_SUM_TH_INIT 64
#define OPENOFDM_RX_MIN_PLATEAU_INIT 100
#define OPENOFDM_RX_FFT_WIN_SHIFT_INIT 1
#define OPENOFDM_RX_SMALL_EQ_OUT_COUNTER_TH 48
#define OPENWIFI_MAX_SIGNAL_LEN_TH 1700 //Packet longer than this threshold will result in receiver early termination. It goes to openofdm_rx/xpu/rx_intf
#define OPENWIFI_MIN_SIGNAL_LEN_TH 14 //Packet shorter than this threshold will result in receiver early termination. It goes to openofdm_rx/xpu/rx_intf
//due to CRC32, at least 4 bytes needed to push out expected CRC result
上面这个注释里面,应该是每个频率的标准或者说规定,比如FMCOMMS2的5320Mhz的下面,rssi_correction信号强度修正148,其他频段就不一样。
所以我们要在别的频段这样做,不一定用一样的,验证一下
当我改变发射和接收频率,再获得接收电平信号阈值的时候就变了,十进制从120变136(暂时没找到怎么根据频率变化修改的)
2024-8-19
发现了rf模块下的0是发射衰减,不是发射功率,0的时候发射功率才能最大(哎,仔细点)
后面开始试试MIMO能不能增加距离和带宽
2024-8-21
ad-hoc组网不能接入有线,网桥手段也不行,另寻他路(~~)
板子的源换成别的需要改时间,改成现在的日期(卡了一天)
2024-8-27
这几天尝试了一些手段,想改wifi发射功率的问题,包括改US美国地址,以及用crda和wireless工具等修改。(都因为一些问题暂时搁置,python的版本问题以及安装好后的环境缺失)
以及使用了飞睿智能的远距离wifi产品在做测试,如果能用的话,想一些办法把两个东西合起来做一下。
9月份之后重点放一部分在硬件设计上。(抄板)
2024-9-24
这一个月,参考一些电路,将自己的硬件设计SDR板子设计完并走线结束了,检查一段时间再打板测试(全机器贴片的话,很贵,大概率贴DDR,ZYNQ,AD三个,其他的自己贴(估计总价要2k~~~,还不一定能用~~))
通过对微相科技的E310的发射TX增加一个射频功率放大器,5V供电,估计增加20dbm不到(估计15db左右)
经过测试,确实增加了通信距离(从1m多增加到10m不到),带宽先不考虑,对接收灵敏度这边研究一下。
单独写一章:在802.11学习里面写了一点。
观察sdr.c的里面的一些函数,低于2412Mhz的的rssi_correction修正值,我们也在这个范围也就是153
inline int rssi_correction_lookup_table(u32 freq_MHz)
{
int rssi_correction;
if (freq_MHz<2412) {
rssi_correction = 153;
} else if (freq_MHz<=2484) {
rssi_correction = 153;
} else if (freq_MHz<5160) {
rssi_correction = 153;
} else if (freq_MHz<=5240) {
rssi_correction = 145;
} else if (freq_MHz<=5320) {
rssi_correction = 145;
} else {
rssi_correction = 145;
}
return rssi_correction;
}
在hw_def.h文件里面,看第一个2437M的FMCOMMS3,rssi修正153,接收灵敏度-85dbm
rssi半db值=153+
#define OPENOFDM_RX_POWER_THRES_INIT 124
// Above 118 is based on these test result (2022-03-09)
// FMCOMMS3
// 2437M
// 11a/g BPSK 6M, Rx sensitivity level dmesg report -85dBm
// priv->rssi_correction = 153; rssi_half_db/2 = 153-85=68; rssi_half_db = 136
// 5180M
// 11a/g BPSK 6m, Rx sensitivity level dmesg report -84dBm
// priv->rssi_correction = 145; rssi_half_db/2 = 145-84=61; rssi_half_db = 122
// 5320M
// 11a/g BPSK 6m, Rx sensitivity level dmesg report -86dBm
// priv->rssi_correction = 148; rssi_half_db/2 = 148-86=62; rssi_half_db = 124
// FMCOMMS2
// 2437M
// 11a/g BPSK 6M, Rx sensitivity level dmesg report -80dBm
// priv->rssi_correction = 153; rssi_half_db/2 = 153-80=73; rssi_half_db = 146
// 5180M
// 11a/g BPSK 6m, Rx sensitivity level dmesg report -83dBm
// priv->rssi_correction = 145; rssi_half_db/2 = 145-83=62; rssi_half_db = 124
// 5320M
// 11a/g BPSK 6m, Rx sensitivity level dmesg report -86dBm
// priv->rssi_correction = 148; rssi_half_db/2 = 148-86=62; rssi_half_db = 124
#define OPENOFDM_RX_RSSI_DBM_TH_DEFAULT (-85) //-85 will remove lots of false alarm. the best openwifi reported sensitivity is like -90/-92 (set it manually if conductive test with wifi tester)
#define OPENOFDM_RX_DC_RUNNING_SUM_TH_INIT 64
#define OPENOFDM_RX_MIN_PLATEAU_INIT 100
#define OPENOFDM_RX_FFT_WIN_SHIFT_INIT 1
#define OPENOFDM_RX_SMALL_EQ_OUT_COUNTER_TH 48
#define OPENWIFI_MAX_SIGNAL_LEN_TH 1700 //Packet longer than this threshold will result in receiver early termination. It goes to openofdm_rx/xpu/rx_intf
#define OPENWIFI_MIN_SIGNAL_LEN_TH 14 //Packet shorter than this threshold will result in receiver early termination. It goes to openofdm_rx/xpu/rx_intf
//due to CRC32, at least 4 bytes needed to push out expected CRC result
看一下板子上得到的值,也就是00400088,bit0-10位,就是十进制136,低于这个值的都不会触发解调。
跟上面的注释对应,就是接收灵敏度-85dbm
尝试:修改接收灵敏度-85dbm的值,改到-96dbm左右,不知道能不能成功。
结果,改了-95dbm,然后没什么效果,还更差了(通过重新编译然后传ko文件到板子)
本文来自博客园,作者:祈愿树下,转载请注明原文链接:https://www.cnblogs.com/cjl520/p/18325907
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 百万级群聊的设计实践
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期