首页 > 其他分享 >openwifi学习-日程记录(全)

openwifi学习-日程记录(全)

时间:2024-10-20 20:35:46浏览次数:1  
标签:日程 记录 rx correction db openwifi half rssi reg

网址: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信号被捕获并且下变频到基带,解码流水线(步骤统一)就开始了,包括:

  1. Packet detection(数据包检测)
  2. Center frequency offset correction(中心频率偏移校正)
  3. FFT(快速傅里叶转换)
  4. Channel gain estimation(信道增益估计)
  5. Demodulation(检波)
  6. Deinterleaving(去交织)
  7. Convolutional decoding(卷积编码)
  8. 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);
应该是802.11的初始化代码里面的,错误暂时不清楚,找的的是IO的错误 平时测试就按照30000也就是,30db为顶,5000,也就是5db为底(这个需要测试,看是不是发射功率增大,距离变远)

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_DC_RUNNING_SUM_TH_INIT 64 #define OPENOFDM_RX_POWER_THRES_INIT 124 一共32位,高16位就是直流偏移阈值,低16位就是功率阈值。这个函数就是一起设置这两个数值到寄存器  
#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文件到板子)

 

 

标签:日程,记录,rx,correction,db,openwifi,half,rssi,reg
From: https://www.cnblogs.com/cjl520/p/18325907

相关文章

  • openwifi的ad-hoc模式测试
    https://github.com/open-sdr/openwifi/blob/master/doc/app_notes/ad-hoc-two-sdr.md这是官网上的测试文档,其中的注意事项我看到不是我们的板子的无所谓了,但是提醒了发射和接收天线正交/垂直获得更好的效果(并没有,把天线垂直直接ping不通,给我忙一个下午才发现)按照手册上的指示,对......
  • 2024 ICPC Asia Taiwan Online Programming Contest题解记录
    比赛链接:https://codeforces.com/gym/105383/problemA.AnimalFarm找个最大pig,然后所有比他小的其他种类生物一直加就好了#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;constllmod=1e9+7;llksm(llx,lly){ llans=1; while(y) { if(y&1)......
  • 【学校训练记录】10月个人训练赛4个人题解
    A:要使s,t相等只要互相删除对方没有的字母即可,即找到a-z字母拥有最少的#include<bits/stdc++.h>#defineendl"\n"#defineintlonglongusingnamespacestd;strings1,s2;inta1[30],a2[30];voidsolve(){ cin>>s1>>s2; for(inti=0;i<s1.size(......
  • C语言小白 记录自己对一些概念的理解 若有错误 多包涵 若能指正 万分感激
    当你想将输入和判断输入一起做时可以用while((数组名[i]=getchar())!='\n')记得拿括号括起来辅助在写!=CG平台使用输入重定向输入测试数据,需要使用(ch=getchar())!=EOF判断字符串输入结束,如果使用(ch=getchar())!='\n'上传到CG平台后可能会超时。写oj的时候如......
  • [20241018]21c x$mutex_sleep_history记录的变化.txt
    [20241018]21cx$mutex_sleep_history记录的变化.txt--//mutex很少会成为主要等待事件,如果遇到多数情况非常特别,比如bug。mutex本身和保护对象是一体的,不像latch一样有单独的--//latch,而且mutex本身占内存也更小,mutex没有等待和持有队列,所以没有排队机制,mutex具有共享和排它......
  • K8S 调整请求头大小限制:一次debug灾难的随手记录
    事情的起因2024.10.19,OpenAIChatGPT突然将CR的Token长度变长,并且长的超出我的想象。由于业务需求,镜像站的Response回显为400BadRequest。查看了一下日志,发现中间出现了几条Arkose的请求日志,我心想,丸辣,怎么Arkose回来了。由于2024.10.18也就是昨天,基本上手上的......
  • 学习记录,这该死的c++
    最近还是比较懈怠,除了老师布置的作业其他的也是匆匆过一眼至于代码方面最主要的问题还是不理解该怎么表达。总的来说还是要在多沉淀。为什么会有知道敲代码但是不知道该怎么成功表达这个问题啊?还是不能把代码敲得精简一些可以来个人教我怎么敲关系符号吗?运用的还不是很熟练......
  • 蟒蛇的零碎记录
    列表与集合print(type(set()))#<class'set'>print(type({}))#<class'dict'>print(type({'qpple','pen'}))#<class'set'>colorama,显示多姿多彩字符串到终端strip方法,将字符串头尾的指定字符串去掉(如......
  • 10.19补题记录
    https://codeforces.com/gym/104821/problem/F交换操作顺序我们来想想什么那些操作不能交换操作顺序每个点最后的数值只和最后一次改变这个点的大小有关所以如果我们要保证一个点的数值不变的话我们只要保证最后一操作后不再改变这个点的数值就ok那么我们先找出那些是某些点的......
  • C语言小白 记录自己对一些概念的理解 若有错误 多包涵 若能指正 万分感激
    指向第一个元素或整个数组用p1=test;直接数组名不用加*而指向第二个或以后的元素则要加*例如p2=&test[1]在C语言中,两个指向同一个数组中相邻元素的指针,计算他们的差值,得到的是它们之间元素的个数,是一个整数比如p1-p0等于1表明第一个到第二个相差一而不是字节数。若想求......