这是基于sigrok的DSView相关的编译指南
sigrok是一个可移植,跨平台,免费开源自由的信号分析软件套件。
其功能包括:
广泛的硬件支持: 支持来自不同供应商的许多不同设备(逻辑分析仪,示波器,万用表,数据记录器等)。
跨平台: 适用于Linux,Mac OS X,Windows,FreeBSD,OpenBSD,NetBSD,Android(以及x86,ARM,Sparc,PowerPC等)。
可编写脚本的协议解码: 可扩展使用Python 3编写的可堆叠协议解码器。
文件格式支持: 支持各种输入/输出文件格式(二进制,ASCII,十六进制,CSV,gnuplot,VCD,WAV,…)。
可重用的库: 由libsigrok和libsigrokdecode共享库组成,可供各种前端/ GUI使用。
各种前端: PulseView(LA GUI),sigrok-meter(DMM GUI),sigrok-cli(命令行)和其他前端都建立在上述库之上。
DSview是基于sigrok开发的第三方的解码器应用,配合逻辑分析仪使用。
sigrok是集成解码器和解码协议的信号分析软件。官方其实也自带了一个解码UI界面pulseview。
安装过程参见sigrok和DSview安装指南
libsigrokdecode位于./sigrok(./DSview-0.99)下的是用C编写的共享库,它提供(流)协议解码的功能,其中包含解码器及解码协议(相关的协议解码器采用Python3编写)。
本次主要通过修改此文件内容来设计我们的解码协议。
该章节主要介绍所有的相关的函数等,若想快速上手,建议直接跳转到DSview的spi参考程序解析结合该章节观看(毕竟有许多常量可能用不上)
协议解码器类函数class Decoder(srd.Decoder):
主要有以下几个重要成员构成:
__init__(self)
:初始化各类参数,例如CLK,CS等等
start(self)
:在解码开始之前调用此函数。这是register()输出类型的位置,检查用户提供的PD选项的有效性,等等。
decode(self, ss, es, logic)
:这是一个由libsigrokdecode后端调用的函数,讲logic的数据进行处理。
关于解码:
逻辑分析仪通过logic会输出采样编号和各个引脚高低电平的信息,采样顺序根据channel
和optional_channels
的顺序排序,例如:
设置如下的Decoder的metadata
channels = (
{'id': 'clk', 'name': 'CLK', 'desc': 'Clock'},
)
optional_channels = (
{'id': 'miso', 'name': 'MISO', 'desc': 'Master in, slave out'},
{'id': 'mosi', 'name': 'MOSI', 'desc': 'Master out, slave in'},
{'id': 'cs', 'name': 'CS#', 'desc': 'Chip-select'},
)
则logic接收的元组信息为:
samplenum | 第一组数据 | 第二组数据 | … | ||||||
---|---|---|---|---|---|---|---|---|---|
bit | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 0 | … |
channel | clk | miso | mosi | cs | clk | miso | mosi | cs | … |
所以我们接收的数据只有samplenum和bit两部分的数据,而bit为何值,对应的我们channel
和optional_channels
定义的顺序。但是clk和cs必须分别放前面和后面。具体原因后续会专门解释。
了解完这些后,其实只剩下解码逻辑,以下面的SPI协议解码器程序会对这部分逻辑进行一个详细解析。
以下是协议解码器的API
提供了一个名为sigrokdecode的Python模块。每个协议解码器都必须导入它。它包含以下项目:
用于注册注释(annotations)输出的常量,用作register()函数的参数。sigrok-cli显示解码器堆栈最顶层解码器的注释输出(默认情况下),PulseView将注释输出显示为图形框或圆圈(如果注释的持续时间为零)。
用于注册Python输出的常量,用作register()函数的参数。Python输出作为输入传递给堆叠到当前解码器上的解码器。给予put()函数的数据格式特定于某个PD,应该记录给更高级别解码器的作者,例如在解码器源文件的顶部有注释。
用于注册二进制输出的常量,用作register()函数的参数。未指定输出数据的格式,由解码器的作者选择一种(或多种)适当的格式。
用于注册元数据(metadata)输出的常量,用作register()函数的参数。输出元数据的PD的示例是SPI解码器,其使用它来输出检测到的比特率。
×××××××××××××××××××××××施工中!!!!!!×××××××××××××××××××××××××
详细代码介绍参见DSview的spi参考程序解析
需提前注意的是:原版所定义的wait()
功能并没有实现,所需要客户去写,pulseView中已经对该wait()
方法进行实现,而DSView中未实现相关的功能。所以在DSView中才用循环读取logic
值,提取每个采样点的电平值。
所以,在使用原版的sigrok移植到DSview上时,应该把相关类的方法和定义添加到对应的Decoder.c和libsigrokdecode.h等文件中
在class Decoder(srd.Decoder):
中,应将api_version = 3
改写为api_version = 2
。这样才可被DSview识别。
同时需要将文件属性改为可读可写可操作,即
chmod 777 __init__.py pd.py