This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] Linux/OMAP-L138:spidev 错误-22 EINVAL

Guru**** 2555630 points
Other Parts Discussed in Thread: OMAP-L138

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/610455/linux-omap-l138-spidev-error--22-einval

器件型号:OMAP-L138
Thread 中讨论的其他器件: OMAPL138

工具/软件:Linux

您好!

我正在尝试让 SPI 通信在 OMAP-L138的新 Linux 处理器 SDK 版本上正常工作。  在之前的 SDK MCSDK_1_01_00_02上、我在更改电路板配置文件、进行一些光驱动器编辑以及在用户空间中为 SPI 配置内核后、能够使 SPI 正常工作。  我编写的用户空间软件使用 spidev 字符设备和 ioctl 调用。  

在切换到内核4.9.28的新 SDK 时、情况发生了很大变化。  我修改了器件树 da850-lcdk.dts 并为用户空间 SPI 配置了内核。  对设备树的编辑如下所示:

&SPI1{
status ="确定";
spidev@0{
SPI-max-frequency =<24000000>;
reg =<0>;
兼容="Rohm、dh2228fv";
状态="确定";
};
}; 

此更改后、出现器件节点/dev/spidev32766.0。  我修改了我的代码以打开此器件并尝试执行它。  结果是错误代码-22 EINVAL。  ioctl 返回无效参数错误。  我的代码中启动传输的部分如下所示:

struct spi_oco_transfer tr ={
.tx_buf =(unsigned long) tx、
.rx_buf =(unsigned long) rx、
.len = len、
.delay_usecs = 1、
.speed_Hz = 10000、
.bits_per_word = 8、
cs_change = 0、
};

ret = ioctl (fd、SPI_IOC_MESSAGE (1)、&tr); 

其中 TX 是一个两字符长的缓冲区、len=2、rx=NULL、fd 是/dev/spidev32766.0.的文件描述符  在这种情况下、返回值为-1、并且 perror 显示"无效参数"。  

我很难确定无效参数是什么、因为该代码在前一个系统中正常工作。  也令人困惑的是、为什么 Spidev 总线编号如此之高、而不是过去的"1"。

我们非常感谢您提供的任何见解。

Jeff

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Jeff:

    您是否启用了:
    CONFIG_SPI_SPIDEV
    在 tisdk_omapl138-lcdk_defconfig 中?

    此外、您还需要在 u-boot/board/Davinci/da8xxevm/omapl138_lcdk.c 中配置 SPI 引脚多路复用器

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Yordan、

    感谢您的回答。 我在我的.config 文件中启用了以下配置:
    CONFIG_REGMAP_SPI=y
    CONFIG_SPI=y
    CONFIG_SPI_MASTER=y
    CONFIG_SPI_BI_BANG=y
    CONFIG_SPI_Davinci=y
    CONFIG_SPI_SPIDEV=y

    这是通过"menuconfig"实用程序完成的。

    至于引脚多路复用、我尚未实现该功能、但我能够连接 CCS 调试器以手动设置引脚多路复用寄存器。 设置寄存器后、我开始并停止该部件、以验证这些值是否确实已设置。 这不会导致行为发生变化。 过去,我能够通过修改主板文件(arch/arm/mach-davinci/omapl138-lcdk.c)在 Linux 内核启动序列期间设置 pinmux。 现在是否只能在 u-boot 中设置 pinmux?

    请注意、在 Ubuntu 16.04LTS 上、Chromium 版本59.0.3071.109中、回复、验证和拒绝按钮对我无效。 Firefox 正在工作。

    Jeff
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    [引用]过去,我能够通过修改主板文件(arch/arm/mach-Davinci/omapl138-lcdk.c)在 Linux 内核启动序列期间设置 pinmux。 现在是否只能在 u-boot 中设置 pinmux?
    是的、最新 SDK 仅在 u-boot 中设置了引脚多路复用器。
    至于 SPIDEV 问题、让我在 OMAP-L138 LCDK 上尝试一下、我将报告结果。

    [引用]请注意、在 Ubuntu 16.04LTS 上的 Chromium 版本59.0.3071.109中、回复、验证和拒绝按钮对我无效。 Firefox 正在工作。
    清除浏览器缓存并重新启动。 这就是我的目的:)

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴了解 u-boot。 我已解决了 spidev 问题。 速度_Hz 参数似乎超出范围。 从结构中移除此数据允许外设进行传输。

    清除缓存有效! 感谢你的帮助!

    Jeff
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jeff:  

    感谢您更新该主题。  

    此致、  
    Yordan