使用spi-bitbang驱动程序

时间:2019-09-05 08:57:45

标签: c linux kernel spi

我正在编写一个内核模块以读取和写入SPI设备(CC1200)。 我的linux设备没有本地SPI,因此我试图对总线进行位冲击。

我发现linux具有内置的bitbang代码(linux / spi / spi_bitbang.h),但是我对如何设置它感到困惑。它需要像spi_device和spi_master这样的结构,每个都需要结构设备,而结构又需要kobject等许多结构,其中大多数我不知道如何处理它们,以及简单的位敲打如何需要它们。

我在网上寻找示例,但实际上没有发现。不能单独使用所包含的bitbang代码,只有一些引用是“简单”的

我将非常感谢您提供的任何帮助,也许bitbang lib甚至不是很好的方法。也许我可以自己编写(如何高效地执行?我有4个核心,但是它在后台运行很多东西)

谢谢

2 个答案:

答案 0 :(得分:1)

由于SPI的特性,其中数据由主设备提供时钟并读取,因此主设备的位敲打驱动程序没有任何问题,因为从设备不应时钟。但是,当然这取决于从设备是否可以在实践中工作。

如果您使用的是Linux内核,则不需要实现自己的位驱动程序,因为已经有一个spi-gpio.c

我猜想如何启动和运行它是通过定义在GPIO中使用哪些devicetree引脚,然后该驱动程序将能够充当任何其他物理层驱动程序。

我快速浏览了drivers/spi/spi-gpio.c源代码,甚至有简短的用户指南,介绍了如何直接内联访问GPIO引脚而不使用通用GPIO层开销。

/*
 * Because the overhead of going through four GPIO procedure calls
 * per transferred bit can make performance a problem, this code
 * is set up so that you can use it in either of two ways:
 *
 *   - The slow generic way:  set up platform_data to hold the GPIO
 *     numbers used for MISO/MOSI/SCK, and issue procedure calls for
 *     each of them.  This driver can handle several such busses.
 *
 *   - The quicker inlined way:  only helps with platform GPIO code
 *     that inlines operations for constant GPIOs.  This can give
 *     you tight (fast!) inner loops, but each such bus needs a
 *     new driver.  You'll define a new C file, with Makefile and
 *     Kconfig support; the C code can be a total of six lines:
 *
 *    #define DRIVER_NAME  "myboard_spi2"
 *    #define  SPI_MISO_GPIO  119
 *    #define  SPI_MOSI_GPIO  120
 *    #define  SPI_SCK_GPIO   121
 *    #define  SPI_N_CHIPSEL  4
 *    #include "spi-gpio.c"
 */

PS您确定您的平台没有spi,我与HiSilicon合作的所有SoC都有一个。我会先仔细检查一次

答案 1 :(得分:0)

编辑:似乎他们已经更改了界面,并且您无法在 4.19 及更高版本的现代内核中再执行此操作,原因与 i2c 无法执行相同。 https://forum.openwrt.org/t/i2c-kernel-4-19-i2c-gpio-custom/49213 我暂时把它放在这里,也许它会有用。我自己正在使用旧内核进行家庭自动化,但它位于专用网络上。

我原来的回答:

虽然你可能可以通过一起破解你自己的内核模块来让它工作,而不是你可以研究 spi-gpio-custom,只需加载模块并传递你想要用作参数的引脚,你可以在运行时做任何事情并且不需要“编译”您要使用的引脚。你可以在 OpenWrt 项目中找到这个模块:

https://github.com/openwrt/openwrt/tree/openwrt-19.07/package/kernel/spi-gpio-custom/src

我希望在初始化时为您提供某种可以从用户空间写入的 SPI 设备。请注意,我自己没有使用过这个模块,但前段时间我使用了以类似方式工作的 i2c 对应模块。

或者,您可以考虑引入一个 Arduino 来与您的 SPI 总线通信,然后将 SPI 数据转换为您的 Linux 设备可以理解的内容。

如果您不想制作自己的电路板,Nano 电路板可能会满足您的需求,而且成本很低。

然后对于接口,您将有几个选择:USB、UART、i2c 或 1wire,如果您有引脚,则甚至是并行接口。例如,github 上有一个 1-wire 从库:https://github.com/smurfix/owslave