本文主要是介绍如何在 libsigrok 想要增加自己的硬件驱动协议时该如何进行开发的一份指导说明
准备
所有的硬件驱动都在 src/hardware 的文件目录底下 在这里可以看到不同厂家实现的不同驱动,尤其是其中的 demo 文件夹下的代码一定要细读 这里是官方提供的示例。
所有的驱动都会有一个 api.c 的文件 这个文件就包含了 整个驱动的入口 在这个文件中关于驱动入口比较重点关注的主要是两个 一个是入口结构的定义:
1 | static struct sr_dev_driver demo_driver_info = { |
在上面的结构体中定义了一些名称和版本号以及其他的一些接口函数,另外一个就是 注册结构体的函数SR_REGISTER_DEV_DRIVER(demo_driver_info);
这个方法就是注册了上述结构体的一些参数
详解
初始化和销毁
在硬件的生命周期会涉及到两个一个是初始化另外一个是销毁,其中涉及到的初始化和销毁的函数是以下函数
1 | /** Called when driver is loaded, e.g. program startup. */ |
其中 init 函数是在驱动加载的时候就会进行的 cleanup 函数是卸载的时候触发
驱动查询相关
在硬件初始化后可以通过 scan 函数扫描当前驱动下有哪些可以使用的信号
1 | /** Scan for devices. Driver should do all initialisation required. |
其中 scan 的扫描可以扫描当前的
配置相关
如果需要对驱动进行一些配置相关的能力则可以使用这个能力
1 | /** Query value of a configuration key in driver or given device instance. |
驱动的打开和关闭
驱动如果在初始化的时候 需要独占的时候可以使用如下函数进行驱动的打开和关闭
1 | /** Open device */ |
数据的监听和关闭
在底层驱动中 并不是直接调用获取数据,而是通过函数的回调来告诉上层的函数有新的数据产生 你需要处理新的数据,所以需要对数据进行监听和关闭
1 | /** Begin data acquisition on the specified device. */ |
其中在 dev_acquisition_start 中有一个比较需要关注的方法是下面的方法这个方法是在 session 中添加回调源
1 | /** |
这个方法中比较关注的是在函数中的 cb 函数,这个函数是能够透传数据至上层
1 | /** Type definition for callback function for data reception. */ |
在 demo/protocol.c 的代码中 实现这个函数的方法是 demo_prepare_data
这个方法,在这个代码中 我们可以看到如何透传数据 真实的数据产生在logic_generator
这个方法来进行产生 我们以SIGROK
为例。我们重点代码是如下代码
1 | memset(devc->logic_data, 0x00, size); |
对于透传的数据只需要上传至 devc->logic_data
中就可以了 我们可以看到 demo 中的数据是来源于下面的定义中
1 | static const uint8_t pattern_sigrok[] = { |
第一个数据是 0x4c 换算成 2 进制 0100 1100 代码中需要对其进行右移 然后取反则真实传递的数据是 1101 1001
第二个数据是 0x92 换算成 2 进行 1001 0010 代码中需要对其进行右移 然后取反则真实传递的数据是 1011 0110
对应界面 我们可以看到从 d7-d0 通道 我们可以对应上 以前两个数据为准
D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 |
---|---|---|---|---|---|---|---|
1 | 1 | 0 | 1 | 1 | 0 | 0 | 1 |
1 | 0 | 1 | 1 | 0 | 1 | 1 | 0 |
补充
对应的还需要了解一下 libsigork.h 里面的一些定义