如何在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
相关产品推荐
相关产品推荐

