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:
好的 ,非常感谢!