spi-gpio-custom:灵活控制SPI总线

1. 引言

SPI(Serial Peripheral Interface)是一种常见的串行通信协议,广泛应用于微控制器与外部设备的连接。

Linux内核中的spi-gpio与spi-bitbang模块可使用GPIO引脚进行SPI的位操作,spidev模块可将SPI暴露给用户空间。但是,这些模块并不能“直接”使用:它们被其他内核驱动程序使用。没有办法动态地说“我想在这些引脚上使用一个SPI”。相反,我们需要重新配置、编译内核。

spi-gpio-custom模块允许动态配置SPI总线及其节点,无需重新编译内核。对于测试、概念验证非常方便。此外,spi-gpio-custom模块的速度也相当不错,测试显示它可以达到1 MHz以上。

2. 安装spi-gpio-custom

以openwrt系统为例,安装模块包是最方便的。如果还要修改其它的openwrt构建设置,可在make menuconfig中选上此模块,然后重新编译openwrt。

2.1 离线安装模块包

在线安装最便捷,会自动安装依赖包,但需要网络条件。离线安装需要先下载好所需要的包,之后手动安装。

可使用LuCI网页界面安装,操作简单。简单直观,本文不再介绍。

下面介绍命令行安装方法,可在没有配置LuCI功能,或LuCI页面出错打不开时使用。

下载包:kernel、kmod-spi-bitbang、kmod-spi-dev、kmod-spi-gpio、kmod-spi-gpio-custom。其中只kmod-spi-gpio-custom是需要的spi-gpio-custom包,其它均为依赖包。

包要与操作系统及硬件主控对上。比如包名:

kmod-spi-gpio-custom_3.18.29-1-8876e460a901ba0991338a5b1846e893_ramips_24kec.ipk 

其中,各部分的含义为:

  • kmod-: 内核模块(Kernel Module)。
  • spi-gpio-custom: 内核模块的具体名称。
  • 3.18.29: 这是该内核模块所依赖的 Linux 内核版本。
  • -1: 这是该软件包版本的修订号,通常用于追踪小的更新或修补。
  • 8876e460a901ba0991338a5b1846e893: 这是一个校验和或唯一标识符,用于确保软件包的完整性和唯一性。
  • ramips: 这表示该模块是为基于 Ralink/MediaTek MIPS 架构(ramips)的设备编译的。
  • 24kec: 这是该 MIPS 架构下的一个特定型号或子架构。
  • .ipk: 这是软件包的文件扩展名,表明它是一个用于 OpenWRT 的安装包。

模块包的安装命令opkg install。如安装kmod-spi-gpio-custom包:

opkg install kmod-spi-gpio-custom*.ipk

在命令中,可用*号用替代后续字符。

按照这个顺序依次安装:kernel、kmod-spi-bitbang、kmod-spi-dev、kmod-spi-gpio、kmod-spi-gpio-custom。

检验是否安装成功:

opkg list-installed | grep spi-gpio

看到kmod-spi-gpio-custom,说明已安装好。

安装时,如还遇到缺少依赖包问题,需根据提示,依次安装。

2.2 编译安装

在系统源代码根目录,输入配置指令:

make menuconfig

在kernel model -> spi support,选中”kmod-spi-gpio-custom”,系统会自动选中三个依赖包:“kmod-spi-bitbang”、“kmod-spi-dev”、“kmod-spi-gpio”。

保存退出后,重新编译openwrt:

make j=2 //双线程编译

3 使用spi-gpio-custom模块配置SPI总线

spi-gpio-custom 的便利就在于可动态配置SPI总线,不需“修改dts文件、编译系统”的繁琐操作。也就是说,通过spi-gpio-custom使用spi时,dts文件中可以没有任何spi功能的定义。

配置举例

配置一个ID为1的总线,使用GPIO3作为CLK,GPIO4作为MOSI,GPIO5作为MISO,在SPI模式0下工作、最大频率为20KHz、GPIO2作为CS的设备。

运行命令:

insmod spi-gpio-custom bus0=1,3,4,5,0,20000,2

请注意GPIOx中的x,不是引脚编号(pin),而是引脚名称。

如需修改spi总线的配置,需先卸载后再加载:

rmmod spi-gpio-custom 
insmod spi-gpio-custom <new parameters>

更复杂的配置,参考原始文档: SPI over GPIO in OpenWrt