测试中需要测试7个网卡,独立收、发802.1q的帧。
不限(目前在Ubuntu 14.04上实现,windows上没有实现)
目前实现的配置:
Ubuntu 14.04+Pycharm Community 2016.1+Python 2.7.6+scapy 2.3.2。 经过一番折腾,终于有结果了。过程很曲折,记录下来,以备以后翻阅。
网上查阅,发现scapy可以实现通过网卡收、发帧,需要基于python。
开始是在windows 7上,Eclipse+PyDev,运行时提示:IPv6不支持,而且发现用scapy无法实现收发802.1q的帧。
经过网上查阅,发现该问题从2012年就有人提交了问题,scapy在windows下目前不支持ip v6的相关操作(后来的实现也没有用到ipv6,而是用的ipv4)。
以后预计在scapy 3.0后会修改,会支持windows 10以后版本,windows 7不支持。
不过,不能收发802.1q帧的问题重点其实不在这里,而是windows不支持直接操作网卡。 所以,只好转到Ubuntu。
转Ubuntu,第一想法是用虚拟机,我采用了virtualBox虚拟机,安装了Ubuntu14.04LTS。
终端运行python,发现版本是2.7.6,符合要求。
安装scapy。
安装pycharm。
这时,可能会提示需要安装相应版本的JDK,具体安装另见“JDK的安装”。
JDK是必需的,而且相应版本要安装正确,pycham需要JDK 8.
pycharm下编辑python程序:发送802.1Q帧
from scapy.all import *
sendp(Ether(dst='(目标网卡MAC地址)',src='(发送源网卡MAC地址)') /Dot1Q(vlan=1,id=3,prio=2,type=0x22f0))
网卡的MAC地址在windows下可以通过ping命令查到,在Ubuntu下也可以通过ping命令查询到,也可以“系统设置”-“网络”-“有线”-“硬件地址”,直接看到。
另准备一台windows PC,安装wireshark,可以监测ubuntu发出来的802.1q帧。
但是,如果再接一个网卡,我用的是UGREEN的USB2Eth网卡,问题就来了:同一时间只能有一个网卡发送成功。
经过查询,VM中同一时间只能有一个网卡“桥接”方式有效,而我需要同时连接7个网卡呢。
所以,只好抛弃VM。
幸好,有台机器是uBuntu,还安装了mate桌面(坑,找不到设置),虽然版本是12.04,经过周末2个多小时的升级过程,升级到了14.04,mate被抹掉了。
添加root用户,重启,登陆。
检查python,版本是2.7.6,够用。
安装scapy,安装JDK。
安装pycharm。
重复前面的帧发送程序,从eth0发送,另一台PC运行wireshark监测,成功。
修改前面的帧发送程序,从eth1发送,另一台PC运行wireshark监测,成功。
pycharm下编辑python程序:接收802.1Q帧
from scapy.all import *
sniff(filter="ether proto 0x8100", prn=lambda x: x.show(), count=1,timeout=20)
运行程序监测接收数据,从另一台PC运行ostinato发送802.1Q数据,发现收到的数据缺少4个VLAN tag字节(0x8100,priority,VLAN ID)。
windows下用wireshark监测数据时,曾经出现过不显示VLAN tag的问题,通过网卡的高级属性,设置“Priority and VLAN tag”为disabled,就可以显示VLAN tag。
还用这个思路,在ubuntu下不知道如何设置网卡属性。
查阅结果发现,是linux kernel把VLAN tag给stripped(移除)了,因为它认为0x8100是标准的,没有人需要该信息,可是我需要呀。
用tcpdump命令发现,监视到0x8100字样的VLAN tag存在。
终于搜到一个帖子(如下,我加了一些安装信息)提示安装pcap或pcappy,因为它们采用和tcpdump同样的方法:重建VLAN tag。
Does anyone know why scapy is unable to capture (parse?) the vlan frame, but tcpdump sees it fine?
Based on RyPeck’s answer and GuyHarris’s advice, I now have a much better workaround:
###a) Using http://sourceforge.net/projects/pylibpcap/ import pcap conf.use_pcap=True
Linux下安装pylibpcap模块
1. 安装libpcap
apt-get install libpcap-dev
2.安装python的dev版,否则安装pylibpcap出错
apt-get install python-dev
3.安装python pcap模块
下载pylibpcap-0.6.2.tar.gz并解压,执行
python setup.py install
4. 去pylibpcap-0.6.2/examples执行测试脚本
python sniff.py eth0 'port80'
###b) Using pcappy - which is can be installed with: pip install pcappy import pcappy as pcap conf.use_pcap=True
Now scapy shows the same vlan information as tcpdump, with all it's great parsing features intact!
安装setuptools
wget https://bootstrap.pypa.io/ez_setup.py -0 - | python easy_install -i https://pypi.python.org/pypi/pcappy pcappy (easy_install pcappy会出错,缺省网址变了)
运行程序准备接收,从另一台PC运行ostinato发送802.1Q数据。
带VLAN tag字节(0x8100,priority,VLAN ID)的帧数据终于被收到了,而且两个网卡都可以正常Tx & Rx了。
总结:
scapy对windows支持不好,尤其是windows7以下。
windows下很难以administrator权限操作网卡。
VM下只能有一个网卡作用于桥接方式。
需要pcap或pcappy重建被linux kernel移除的VLAN tag。
注:以下内容选自Renesas SH7269 HW(Hardware Manual,硬件手册)。
A/D转换器将模拟输入通道输入的模拟值一边和模拟基准电压进行比较一边转换为10位的数字值。此时的A/D转换绝对精度,即输入模拟值和输出数字值的偏差包含以下误差,按照下图,依次说明每个误差。但是,为了使图容易理解,将10位的A/D转换器简化为3位的A/D转换器。
是指在数字输出值从最小值(零电压)“B’0000000000”(图中是“000”)变为“B’0000000001”(图中是 “001”)时实际A/D转换特性与理想A/D转换特性的偏差 (图1(1))为。
是指在数字输出值从 “B’1111111110”(图中是 “110” )变为最大值 (满刻度电压)“B’1111111111”(图中是 “111”)时实际A/D转换特性与理想A/D转换特性的偏差 (图1(2))。
是指A/D转换器固有的偏差,表示为1/2LSB(图1(3))。
是指从零电压到满刻度电压之间的实际A/D转换特性与理想A/D转换特性的偏差 (图1(4)),但是不包含偏移误差、满刻度误差和量化误差。
注:以下内容选自Renesas SH7269 HW(Hardware Manual,硬件手册)。
注:以下内容选自Renesas SH7269 HW(Hardware Manual,硬件手册)。
在使用A/D转换器时,必须注意以下几点。
能通过待机控制寄存器设定允许或者禁止A/D转换器的运行,初始值为停止A/D转换器的运行。
能通过解除模块待机模式,使寄存器变为可存取的状态。
如果在超过以下电压的设定范围使用A/D转换模块,就会给A/D转换器的可靠性带来不良影响。
在A/D转换过程中,必须将模拟输入引脚ANn的外加电压设定在AVSS ≤ ANn ≤ AVCC的范围内 (n=0~7)。
AVCC和AVSS的输入电压必须为(PVCC-0.3V) ≤ AVCC ≤ PVCC,AVSS = VSS。
而且,在不使用A/D转换器时或者在软件待机模式中,不能将AVCC引脚和AVSS引脚置为开路。不使用时,必须将AVCC连接到电源(PVCC)并且将AVSS接地 (VSS)。
AVref引脚的基准电压范围必须为3.0V ≤ AVref ≤ AVCC。
在设定电路板时,必须尽量将数字电路和模拟电路分开,不能使数字电路的信号线和模拟电路的信号线交叉或者靠近。
否则,会因电感等引起模拟电路的误动作并且给A/D转换值带来不良影响。必须通过模拟接地(AVSS)将模拟输入信号(AN0~AN3)、模拟基准电压(AVref)、模拟电源(AVCC)必须通过模拟接地 (AVSS)和数字电路分开,并且模拟接地 (AVSS)必须和电路板上稳定的数字接地 (VSS)进行单点连接。
为了防止过大电涌等异常电压对模拟输入引脚 (AN0~AN7)的破坏,必须连接如下图所示的保护电路。
此图的电路还有RC过滤器功能,能抑制由噪声引起的误差。
图中的电路是设计例子,必须在考虑实际的使用条件的基础上决定电路常数。
模拟输入引脚的等效电路如下图所示,模拟输入引脚的规格如表1所示。
对于信号源阻抗不超过5k欧姆的输入信号,本LSI的模拟输入能保证转换精度。
这是为了在采样时间内,对A/D转换器的采样&保持电路的输入电容进行充电而制定的规格。
在传感器的输出阻抗超过5k欧姆时,可能发生充电不足并且不能保证A/D转换精度的情况。
在单通道模式中进行转换并且外接大电容的情况下,因为输入负载实际上只有3k欧姆的内部输入电阻,所以信号源阻抗可忽略不计。
但是,由于形成低通滤波器,因此可能无法跟踪大微分系数的模拟信号(例如,大于等于5mV/us)(图3)。
在转换高速模拟信号时或者在扫描模式中进行转换时,必须插入一个低阻抗的缓冲器。
由于附加电容会导致与GND的耦合,因此,如果在GND中有噪声,就可能降低绝对精度,所以AVSS等必须与电稳定的GND连接。
另外,必须注意:在安装电路板上滤波器电路不要干扰数字信号也不要充当天线。
要转移到深度待机模式时,必须将ADST位清 “0”, 禁 止A/D转换。如果本LSI在允许A/D转换的状态下变为深度待机模式,就不保证A/D的引脚状态。
如果在扫描模式和多通道模式停止后立即开始转换,就可能产生错误的转换结果。 要连续进行转换时,必须在将ADST位置 “0”后经过1个通道的A/D转换时间 (1个通道的转换时间因分频寄存器的设定而不同),然后开始转换 (ADST位为 “1”)
使用A/D转换采集按键的值,如图:
现象:
第一次上电采样值是正确的,再次采样,会出现采样值偏高的情况。
分析:
由A/D部分等效电路可知,改电路相当于一阶全响应电路,采样处电压应该如下图中的曲线2:
如果两次按键时间较短,会导致等效电容放电时间不够,会采集到较大电压值。
措施:
延长A/D采样时间。
结论:
以前见过一个利用一阶电路零状态响应的产品(给电容充电,检查电容的电压),今天自己应用,有切身体会了。
如Tektronix的RSA3068,或 Agilent N9320B。
步骤1:连接好SPI-USB调试编程下载线缆,上电。
步骤2:运行uEnergyTest
设定右侧的channel值,蓝牙就会输出相应的频率。
用频谱仪观察该频率,就会发现实际频率与理想频率的频差是多少,以决定Trim补偿数值。
这里,channel 0的频率是2402MHz。
蓝牙基本知识:
2.4G带宽80M,2M一个频带,40个频道
即,channel0 —2402MHz, channel39 — 2480MHz
输入校正值,点击Execute,校正值输入的CSR1010中。
再次CW TRANSMIT,用频谱仪观察校正后的频率数值,观察偏差,调整Trim的值。
重复上述过程,使实际频率接近理想频率。
记下该Trim的值。
如果想观察实际写入CSR1010的Trim值是多少,可以用CsConfig的“Crystal frequency trim”选项观察。
如下图中,实际的值是0x003F。该值的设定范围为:0~63.
停止蓝牙输出。
如果有多个信号时,可以通过该选项关闭蓝牙输出。
再用CW TRANSMIT输出蓝牙信号,可以再频谱仪上观察哪个信号是待测蓝牙信号。
如果输出信号看不到或幅度不大,可以增加该设定值。
CSR1010就以该校准值运行了。可以通过CsConfig查询实际的校准值。
LPDDR4, Low Power Double-Data-Rate 4th Generation Synchronous Dynamic Random Access Memory。
属于SDRAM(结构是1个transistor+1个capacitor)。
这里有一些DDR的基本知识说明
最初是为移动装置设计的,后来推出了满足汽车温度等级的LPDDR4 SDRAM。
将来的后续发展是LPDDR4X,LPDDR5.
从CPU到DRAM颗粒之间依次按层级由大到小分为channel > DIMM > rank > chip > bank > row/column。
天然2通道,有2套命令地址(CA)输入和2套数据总线(DQ)。
功耗比DDR2/DDR3/DDR4更低,如引入DBI(Data Bus Inversion)特性。
为使功耗降低,LPDDR4将Data IO从
SSTL(终端电压是VDD/2)
->
POD(Pseudo Open Drain,(终端电压是VDD))
意味着,当总线上是高电平时,无电流流动。
这也是DBI(Data Bus Inversion)实现的基础。
DBI - 让高电平尽可能的多(无电流流动,功耗就低了),至少5bit低电平时,对所有的信号进行反转,同时,DBI=’0’(低电平)。
由于结构(1个transistor+1个capacitor)原因,会有泄漏电荷,所以需要定期刷新(refresh)来避免数据的丢失。而且,温度越高,要求刷新频率越频繁。
需要具有更高温度抗性的位单元。
引入纠错机制(注:是内联ECC,不是ECC),将(64data+8Hamming ECC)同时存放在同一memory内,所以在传输时,相比与ECC,带宽利用率较低。
与SOC互联时,要求SOC满足特定的汽车可靠性标准。
- AE-Q100,专注于可靠性和温度方面。
- ISO26262,专注于设计流程,设计和认证。
目前主要生产厂家:Micron, Hynix, Samsung。
R-Car系列支持的LPDDR4通道数量不同(32bits/通道)。
H3 | M3 | M3N |
---|---|---|
4 | 2 | 1 |
最大连接8GBytes。
LPDDR4的双通道连接方式有以下四种。
在R-Car开发板中采用的连接是“共享CA”方式。
实际应用中,用户根据需要选择适合自己的LPDDR4(厂家,容量,速率,等等),并搭建自己的连接,如果与Renesas官方学习板不同,就需要对代码进行修改,并且更改后要进行足够的评估。
以下是Yocto v3.15 DDR部分的目录结构和DDR的初始化流程(包括四部分内容:PHY、DRAM、Training、DBSC),供参考。
用户只需关心修改文件“boot_init_dram_config.c”以适应实际的硬件连接。
如果用到DRAM backup(fastboot中会用到),还需关心修改文件“dram_sub_func.c/.h”,有几个选项需要修改。
详细情况,请参考文档“引用7”。
索引 | 更改点 | 文件 | 说明 |
---|---|---|---|
1 | 宏 DBSC_REFINTS | boot_init_dram_regdef.h 或 build option(RCAR_REF_INT) | DBRFCNF1/2 register相关。refresh模式,会影响到QoS |
2 | 宏 BOARDNUM | boot_init_dram_config.c | Renesas评估板编号0~21 |
3 | 宏 BOARD_JUDGE_AUTO | boot_init_dram_config.c | 自动识别board |
4 | boardcnf.phyvalid | boot_init_dram_config.c | PHY通道是否valid |
5 | boardcnf.dbi_en | boot_init_dram_config.c | DBI模式 |
6 | boardcnf.cacs_dly/_adj | boot_init_dram_config.c | CA/CS delay及调整 |
7 | boardcnf.dqdm_dly_w/r | boot_init_dram_config.c | DQ W/R delay |
8 | boardcnf.channel.ddr_density | boot_init_dram_config.c | density of every channel(每个通道有2个CS端)。例:LPDDR4 DRAM内部有2 dies, 每个die容量8Gbit,2ranks, 总容量就是16Gbits. 设置为{0x02, 0x02}. First field: rank-1 (CS0) DRAM容量 die Second field: rank-2 (CS1) DRAM容量 |
9 | boardcnf.channel.ca/dqs/dq/dm_swap | boot_init_dram_config.c | swap(CA,DQS,DQ,DM),和实际物理连接顺序有关 |
10 | 宏 WDQLVL_PAT | boot_init_dram_config.c | data patterns for DQ/DM |
11 | boardcnf.channel.cacs_adj | boot_init_dram_config.c | 可以通过Eye Opening Tool查看调整后效果 |
12 | boardcnf.channel.dm_adj\w/r | boot_init_dram_config.c | DM调整。可以通过Eye Opening Tool查看调整后效果 |
13 | boardcnf.channel.dqdm_adj\w/r | boot_init_dram_config.c | DQ调整。可以通过Eye Opening Tool查看调整后效果 |
14 | 宏 _def_LPDDR4_ODT | boot_init_dram_config.c | MR11 register相关 |
15 | 宏 _def_LPDDR4_VREFCAT | boot_init_dram_config.c | MR12 register相关 |
16 | 宏 JS2_DERATE | boot_init_dram_config.c | 在温度区间[85~105 摄氏度]添加额外的timing margin |
17 | 宏 DDR_FAST_INIT | boot_init_dram_config.c | 初始化时间会快一点 |
18 | CLK & DIV | boot_init_dram_config.c | Extal时钟相关。MD14/MD13引脚相关 |
19 | 宏 DDR_FAST_INIT | boot_init_dram_config.c | MD17/MD19引脚相关,调整DDR速率 |