imx6ull spi-imx.c 驱动接收导致内存问题

博客内容涉及了一个关于SPI驱动的问题,即在连续发送过程中,由于上一次接收缓冲区未正确处理,导致数据丢失和系统重启。提出了两种解决方案:1) 使用局部缓冲区接收数据;2) 修改读取函数,直接从寄存器读取数据。问题主要出现在`spi_imx_transfer`函数中的接收处理部分。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spi-imx.c驱动接收导致重启:

原来是如果上一次SPI发送还有要接收的数据,接下一次spi发送中如果上次的接收缓存用的是临时变量,这次保存数据时原来的空间已经被释放,而spi_imx->rx_buf只有在本次接收中spi_imx_pio_transfer,被重置

while (spi_imx->devtype_data->rx_available(spi_imx))

spi_imx->rx(spi_imx);

所以有两种修改方式:

1、用局的buff接收;

2、spi_imx_transfer中spi_imx->rx改为:eadl(spi_imx->base + MXC_CSPIRXDATA)

[ 1722.007813] yytek,board spi2.2: I/O Error in PIO

[ 1722.014474] yytek,board spi2.2: SPI transfer failed: -110

[ 1722.056835] spi_master spi2: failed to transfer one message from queue

[ 1739.448762] yytek,board spi2.2: I/O Error in PIO

[ 1739.460088] yytek,board spi2.2: SPI transfer failed: -110

[ 1739.485536] spi_master spi2: failed to transfer one message from queue

[ 1744.006441] yytek,board spi2.2: I/O Error in PIO

[ 1744.015674] yytek,board spi2.2: SPI transfer failed: -110

[ 1744.048348] spi_master spi2: failed to transfer one message from queue

[ 2142.018245] Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in: syscpld_run+0x94/0x94 [sysdrv]

``` code

static int spi_imx_transfer(struct spi_device *spi,

struct spi_transfer *transfer)

{

struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master);

/* flush rxfifo before transfer */

while (spi_imx->devtype_data->rx_available(spi_imx))

spi_imx->rx(spi_imx);

if (spi_imx->slave_mode)

return spi_imx_pio_transfer_slave(spi, transfer);

if (spi_imx->usedma)

return spi_imx_dma_transfer(spi_imx, transfer);

else

return spi_imx_pio_transfer(spi, transfer);

}

#define MXC_SPI_BUF_RX(type) \

static void spi_imx_buf_rx_##type(struct spi_imx_data *spi_imx) \

{ \

unsigned int val = readl(spi_imx->base + MXC_CSPIRXDATA); \

\

if (spi_imx->rx_buf) { \

*(type *)spi_imx->rx_buf = val; \

spi_imx->rx_buf += sizeof(type); \

} \

\

spi_imx->remainder -= sizeof(type); \

}

static int spi_imx_pio_transfer(struct spi_device *spi,

struct spi_transfer *transfer)

{

struct spi_imx_data *spi_imx = spi_master_get_devdata(spi->master);

unsigned long transfer_timeout;

unsigned long timeout;

spi_imx->tx_buf = transfer->tx_buf;

spi_imx->rx_buf = transfer->rx_buf;

spi_imx->count = transfer->len;

spi_imx->txfifo = 0;

spi_imx->remainder = 0;

```

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值