TI中文支持网
TI专业的中文技术问题搜集分享网站

关于dvsdk_3_10中6467的Linux SPI驱动疑问

TI工程师你们好!

我现在使用贵公司的6467平台采集音频数据,数据是由STM32的IIS采集然后通过SPI接口送到6467,6467做主,STM32做从。

目前我已经成功在Linux /dev目录下生成了一个spidev0.0的设备,并且用Linux内核自带的测试程序spidev_test.c测试读写STM32都没问题。主要问题是这样:

a、当我开启DMA传送数据时,如果我的用户层程序(spidev_test.c)发送和接收都使用时,进程spidev_test传送一会会进入D状态即阻塞了;但是我改成单向的只读或者只写,测试程序就运行正常,长期测试进程不会出现阻塞的情况。

b、当我关闭DMA传送,使用POLL循环的方式传送数据时,一切都正常,不管是单向传数据还是双向传数据,测试很久进程不会出现阻塞的情况。

鉴于以上的情况,我在想,是不是你们提供的SDK用DMA方式驱动SPI的代码有bug?还是我哪里没有注意到?

附上我的设置:

static struct davinci_spi_platform_data dm646x_spi0_pdata = {
.version = SPI_VERSION_1,
.num_chipselect = 2,
.clk_internal = 1,
.cs_hold = 1,
.intr_level = 0,
.poll_mode = 1, /* 0 -> interrupt mode 1-> polling mode */
.use_dma = 0, /* when 1, value in poll_mode is ignored */ //开启DMA传输 此时poll_mode 无效   如果开启DMA传输就会出现进程阻塞,不开启一切正常。
.c2tdelay = 8,
.t2cdelay = 8,
};

Chris Meng:

你好,

建议你能再定位一下,具体是阻塞在哪个部分?是发送还是接收?是EDMA没有结束?

另,不知道你是要的DM6467的驱动是哪个版本,建议更新到最新的。

AVR_DIY:

回复 Chris Meng:

已经定位了,阻塞在控制器驱动的davinci_spi_bufs_dma函数中的等待EDMA结束。如下处:

if (t->tx_buf != NULL) wait_for_completion_interruptible( &davinci_spi_dma->dma_tx_completion);

而且阻塞前,可以成功的读写一次。

PS:我的内核是你们官网提供的最新SDK 2.6.32.rc2  dvsdk 3.10

AVR_DIY:

回复 Chris Meng:

我看内核源码里面的davinci_spi.c的版本是2009  这个也有版本之分吗?不是版本区分在Linux内核吗?

见附件davinci_spi.c

Chris Meng:

回复 AVR_DIY:

你好,

谢谢更新!

dvsdk软件包已经很久没有更新了,里面包含的驱动也是当时的驱动。

我提供的这个git也是TI维护的,上面的驱动会不时更新,请关注。

AVR_DIY:

回复 Chris Meng:

好的 ,非常感谢!

赞(0)
未经允许不得转载:TI中文支持网 » 关于dvsdk_3_10中6467的Linux SPI驱动疑问
分享到: 更多 (0)