You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Linux内核模块中使用spi-gpio驱动实现SPI设备轮询?

基于GPIO位Bang的SPI内核模块开发问题

我有一台运行Linux的设备,需要编写内核模块,通过**CPU GPIO模拟的SPI总线(位Bang方式)**轮询两个外部设备获取数据。限制条件:无法更改硬件架构,必须使用位Bang方式,且模块需内置到内核中。

spi-gpio驱动的两种使用方式

内核中的spi-gpio.c驱动支持两种使用模式:

  • 通用慢速方式:通过platform_data配置MISO/MOSI/SCK对应的GPIO编号,驱动可支持多条此类总线;
  • 快速内联方式:仅适用于支持常量GPIO内联操作的平台GPIO代码,能实现高效循环,但每条总线需要新增一个驱动,只需编写包含宏定义的C文件并引入spi-gpio.c即可。

已添加的设备树配置

我已经在设备树中添加了如下配置:

spi-gpio {
    compatible = "spi-gpio";
    #address-cells = <0x1>;
    ranges;
    status = "okay";

    sck-gpios   = <&pio 4 9 GPIO_ACTIVE_HIGH>;  // PE9
    mosi-gpios  = <&pio 4 6 GPIO_ACTIVE_HIGH>;  // PE6
    miso-gpios  = <&pio 4 8 GPIO_ACTIVE_HIGH>;  // PE8
    cs-gpios    = <&pio 4 4 GPIO_ACTIVE_HIGH>,  // PE4
                  <&pio 4 17 GPIO_ACTIVE_HIGH>; // PE17
    num-chipselects = <2>;

    /* Clients */
    m90e32@0 {
        reg = <0>;
        compatible = "atmel,m90e32";
        spi-max-frequency = <950000>;
    };

    m90e32@1 {
        reg = <1>;
        compatible = "atmel,m90e32";
        spi-max-frequency = <950000>;
    };
};

快速内联方式的疑问

如果采用第二种快速内联方式,我写了如下代码框架:

#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"

请问如何添加轮询循环?是否需要扩展spi-gpio.c并添加轮询任务?

通用慢速方式的实现疑问

我个人更倾向使用第一种通用慢速方式,但不清楚正确的调用方法与顺序,也未找到相关示例。请问需要调用该模块的哪些方法、按什么顺序,才能在我的模块中创建两个可操作的SPI设备?

内容的提问来源于stack exchange,提问作者Michael_Y

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 08:11:08