SPI_IOC_MESSAGE return 单选
SPI_IOC_MESSAGE return EINVAL
我们正在从 ARM 嵌入式 Ubuntu 14.04 更新到 ARM 嵌入式 Ubuntu 16.04。在第一个平台上,我们可以毫无问题地访问使用 SPIDEV 的芯片。在 Ubuntu 平台上,我在 ioctl SPI_IOC_MESSAGE.
之后收到 EINVAL 错误
我已经看到消息,但没有解决问题。
我的代码如下:
SpiComm_t::Transfer(int i4Length) {
int ret = -1;
m_tr.len = i4Length;
ret = ioctl(m_fd, SPI_IOC_MESSAGE(1), &m_tr);
if (ret ) {
printf("SPI IOCTL error %s\n", strerror(errno)); }
return ret;
}
调用代码如下:
// Reset memory (Optional... Helps diagnose failures to read.)
memset(m_c1BufTx, 0xFF, sizeof(m_c1BufTx));
// Put address
m_c1BufTx[0] = address;
// Reset memory (optional...)
memset(m_c1BufRx, 0xFF, sizeof(m_c1BufRx));
// Invoke ioctl transaction
int result = Transfer(size+1);
我们正在使用来自 TI SDK 4.0 的内核 4.9.59。我已将 EINVAL 追踪到 spidev.c 驱动程序,但无法理解为什么我会收到错误。
spidev.c代码为:
tmp = _IOC_SIZE(cmd);
if ((tmp % sizeof(struct spi_ioc_transfer)) != 0)
return ERR_PTR(-EINVAL);
*n_ioc = tmp / sizeof(struct spi_ioc_transfer);
if (*n_ioc == 0)
return NULL;
/* copy into scratch area */
如有任何帮助,我们将不胜感激。
问题似乎是 spi_ioc_transfer 中有一些垃圾。将结构归零解决了这个问题。 cs_change 或 pad 是错误的原因。
此外,ioctl(fd, SPI_IOC_MESSAGE(1), ...) 中的 return 代码并不表示失败或成功。相反,在这种情况下,它 return 是消息 returned 的大小。要测试错误必须直接检查 errno。
传递函数的更新代码现在是:
errno = 0;
ret = ioctl(m_fd, SPI_IOC_MESSAGE(1), &m_tr);
// NOTE this ioctl returns the lenght of the answer not an indication of setting errno
// Check errno instead
if (errno != 0)
{
printf("SPI IOCTL ret(%d)error(%d) %s\n", ret, errno, strerror(errno));
}
我们正在从 ARM 嵌入式 Ubuntu 14.04 更新到 ARM 嵌入式 Ubuntu 16.04。在第一个平台上,我们可以毫无问题地访问使用 SPIDEV 的芯片。在 Ubuntu 平台上,我在 ioctl SPI_IOC_MESSAGE.
之后收到 EINVAL 错误我已经看到消息
我的代码如下:
SpiComm_t::Transfer(int i4Length) {
int ret = -1;
m_tr.len = i4Length;
ret = ioctl(m_fd, SPI_IOC_MESSAGE(1), &m_tr);
if (ret ) {
printf("SPI IOCTL error %s\n", strerror(errno)); }
return ret;
}
调用代码如下:
// Reset memory (Optional... Helps diagnose failures to read.)
memset(m_c1BufTx, 0xFF, sizeof(m_c1BufTx));
// Put address
m_c1BufTx[0] = address;
// Reset memory (optional...)
memset(m_c1BufRx, 0xFF, sizeof(m_c1BufRx));
// Invoke ioctl transaction
int result = Transfer(size+1);
我们正在使用来自 TI SDK 4.0 的内核 4.9.59。我已将 EINVAL 追踪到 spidev.c 驱动程序,但无法理解为什么我会收到错误。
spidev.c代码为:
tmp = _IOC_SIZE(cmd);
if ((tmp % sizeof(struct spi_ioc_transfer)) != 0)
return ERR_PTR(-EINVAL);
*n_ioc = tmp / sizeof(struct spi_ioc_transfer);
if (*n_ioc == 0)
return NULL;
/* copy into scratch area */
如有任何帮助,我们将不胜感激。
问题似乎是 spi_ioc_transfer 中有一些垃圾。将结构归零解决了这个问题。 cs_change 或 pad 是错误的原因。
此外,ioctl(fd, SPI_IOC_MESSAGE(1), ...) 中的 return 代码并不表示失败或成功。相反,在这种情况下,它 return 是消息 returned 的大小。要测试错误必须直接检查 errno。
传递函数的更新代码现在是:
errno = 0;
ret = ioctl(m_fd, SPI_IOC_MESSAGE(1), &m_tr);
// NOTE this ioctl returns the lenght of the answer not an indication of setting errno
// Check errno instead
if (errno != 0)
{
printf("SPI IOCTL ret(%d)error(%d) %s\n", ret, errno, strerror(errno));
}