我正在编写一个内核模块以读取和写入SPI设备(CC1200)。 我的linux设备没有本地SPI,因此我试图对总线进行位冲击。
我发现linux具有内置的bitbang代码(linux / spi / spi_bitbang.h),但是我对如何设置它感到困惑。它需要像spi_device和spi_master这样的结构,每个都需要结构设备,而结构又需要kobject等许多结构,其中大多数我不知道如何处理它们,以及简单的位敲打如何需要它们。
我在网上寻找示例,但实际上没有发现。不能单独使用所包含的bitbang代码,只有一些引用是“简单”的
我将非常感谢您提供的任何帮助,也许bitbang lib甚至不是很好的方法。也许我可以自己编写(如何高效地执行?我有4个核心,但是它在后台运行很多东西)
谢谢
答案 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。