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

问题描述 投票:0回答:1

不知道这是否与C相关或与Linux内核有关。我正在使用Beaglebone的SPI库BlackLib,它具有SPI传输功能。

出于某种原因,当我第一次尝试时它不起作用。我玩了好几天,直到在[[function本身内声明了两个随机数组时,即使它的效果为零,它还是意外地起作用了。如果删除它们,该功能将在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(有效)。但是,如果我像这样注释掉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 OS交互的知识,因此不胜感激。

不知道这是否与C相关或与Linux内核有关。我正在使用Beaglebone的SPI库BlackLib,它具有SPI传输功能。由于某些原因,它无法正常工作...

c++ c linux spi ioctl
1个回答
0
投票
已解决。如果您不将数组/结构的所有元素初始化为任何内容,则C / C ++不保证将数组/结构的所有元素都初始化为0。使用memsetmemcpy也可能无法保证。由于ioctl结构在某些成员中包含不正确的值,因此package调用返回错误。
© www.soinside.com 2019 - 2024. All rights reserved.