ioctl错误在SPI传输函数中返回-1 EINVAL



不确定这是与C相关还是与linux内核有关。我正在为Beaglebone使用一个名为BlackLib的SPI库,它有一个SPI传递函数。

由于某种原因,当我第一次尝试它时,它不起作用。我玩了好几天,当我在函数内部声明了两个随机数组时,它意外地起作用了,尽管它没有任何效果。如果我删除它们,函数将在ioctl行再次中断。

例如,如果我打电话给:

uint8_t writeBuffer[2] = {0x00, 0x01};
uint8_t readBuffer[2] = {0,0};
transfer(writeBuffer, readBuffer, sizeof(readBuffer), 10, 0)

关于函数

bool   BlackSPI::transfer(uint8_t *writeBuffer, uint8_t *readBuffer, size_t bufferSize, uint16_t wait_us, uint16_t pad)
{  
uint8_t tempReadBuffer[ bufferSize ];
memset( tempReadBuffer, 0, bufferSize);
spi_ioc_transfer package;
package.tx_buf          = (unsigned long)writeBuffer;
package.rx_buf          = (unsigned long)tempReadBuffer;
package.len             = bufferSize;
package.delay_usecs     = wait_us;
package.speed_hz        = 5000000; //uint32_t
package.bits_per_word   = 8; //uint8_t
package.pad             = pad;
// IF I DELETE THESE TWO DECLARATIONS, SPI transfer will fail. 
// I have no idea why.. maybe causing a specific delay in the code that lets spi work, or overwriting old memory addresses that c++ attemps to access?
uint8_t arr[4] = {0x02, 0x03, 0x04, 0x05};
uint8_t arrr[4] = {0x03, 0x04, 0x05, 0x06};
//ioctl call
if( ::ioctl(this->spiFD, SPI_IOC_MESSAGE(1), &package) >= 0){
memcpy(readBuffer, tempReadBuffer, bufferSize+pad);
return true;
} else {
return false;
}
}

它返回true(worked(。但如果我评论掉2个数组,像这样

//uint8_t arr[4] = {0x02, 0x03, 0x04, 0x05};
//uint8_t arrr[4] = {0x03, 0x04, 0x05, 0x06};

该函数返回false(不起作用(,并且strace输出包含:

ioctl(4, 0x40206b00, 0xbe899b80)        = -1 EINVAL (Invalid argument)

这会导致我的代码出现问题,因为如果我在其他链接库甚至我自己的代码中进行一些更改,就会导致这个SPI传递函数停止工作。

这超出了我对C/C++代码如何与linux操作系统交互的了解,因此我们非常感谢您的帮助。

已解决。如果不将数组/结构的所有元素初始化为任何值,C/C++就不能保证它们都初始化为0。使用memsetmemcpy可能也不能保证这一点。因此,ioctl调用返回错误,因为package结构在某些成员中包含不正确的值。

我不得不像这样将spi_ioc_transfer结构体packagetempReadBuffer初始化为零,以确保我不会得到任何令人讨厌的惊喜:

spi_ioc_transfer package = {};
uint8_t tempReadBuffer[ bufferSize ] = {};

最新更新