ARM 32位系统下SPI_IOC_WR_MODE与SPI_IOC_WR_MODE32的区别及报错疑问
SPI_IOC_WR_MODE与SPI_IOC_WR_MODE32的区别及报错问题
我的设备采用ARM处理器,操作系统为32位。在应用层使用SPI时,调用ioctl()函数传入SPI_IOC_WR_MODE参数时无报错,但使用SPI_IOC_WR_MODE32时出现如下错误:
can't set spi mode: Inappropriate ioctl for device
相关代码示例:
ret = ioctl(fd, SPI_IOC_WR_MODE, &mode); if (ret == -1) pabort("can't set spi mode");
两者核心区别
- 参数宽度机制:
SPI_IOC_WR_MODE:依赖系统原生int类型的宽度传递模式参数,在32位ARM系统中就是32位,属于Linux SPI子系统最初提供的传统ioctl命令。SPI_IOC_WR_MODE32:强制使用固定32位宽度传递参数,不受系统位数影响,是为实现32位与64位系统跨平台兼容而新增的命令。
- 内核支持差异:
你的设备内核未实现SPI_IOC_WR_MODE32这个ioctl命令接口,只支持传统的SPI_IOC_WR_MODE,因此调用后者会返回"不适当的ioctl设备"错误。 - 适用场景:
- 仅在同位数系统下开发时,
SPI_IOC_WR_MODE完全满足需求; - 只有需要编写跨32/64位系统兼容的SPI应用时,才需要考虑
SPI_IOC_WR_MODE32,但前提是目标设备的内核已经支持该命令。
- 仅在同位数系统下开发时,
针对你的情况说明
你的32位ARM系统内核没有适配SPI_IOC_WR_MODE32,继续使用SPI_IOC_WR_MODE即可正常设置SPI模式,无需切换到带32后缀的命令。
内容的提问来源于stack exchange,提问作者Vimer
相关产品推荐
相关产品推荐

