<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic DMA SPI Slave Issues in i.MX Processors</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/DMA-SPI-Slave-Issues/m-p/877807#M133191</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I have implemented a DMA SPI slave driver for Linux and I am seeing a strange issue.&lt;/P&gt;&lt;P&gt;I have a data structure that is 4096 bytes long. When I initiate a SPI transfer on the master side, I find that I have to transfer an additional 4 bytes to collect the full message on the slave side. The strange part is that these extra 4 bytes do not end up in any buffers. Performing a CRC32 on the data structure on the master side, then slave side shows that the data is consistent as long as I add the extra 4 bytes.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Can someone offer some guidance as to where the last 4 bytes are going? And why the extra bytes are necessary?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have configured the SPI device as follows:&lt;/P&gt;&lt;PRE style="color: #a9b7c6; background-color: #2b2b2b; font-size: 9.0pt;"&gt;reg = &lt;SPAN style="color: #6897bb;"&gt;0&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;reg |= IMX6_ECSPI_DMA_RXTDEN&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;reg |= IMX6_ECSPI_DMA_RX_LEN(SPI_DMA_RX_BURST_LEN)&lt;SPAN style="color: #cc7832; "&gt;; &lt;/SPAN&gt;&lt;SPAN style="color: #808080;"&gt;// RX_DMA_LENGTH = 32
&lt;/SPAN&gt;reg |= IMX6_ECSPI_DMA_RXDEN&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;reg |= IMX6_ECSPI_DMA_RX_THR(SPI_DMA_RX_THRESHOLD - &lt;SPAN style="color: #6897bb;"&gt;1&lt;/SPAN&gt;)&lt;SPAN style="color: #cc7832; "&gt;; &lt;/SPAN&gt;&lt;SPAN style="color: #808080;"&gt;// RX_THRESHOLD = 31
&lt;/SPAN&gt;writel(reg&lt;SPAN style="color: #cc7832;"&gt;, &lt;/SPAN&gt;spislv-&amp;gt;base + IMX6_ECSPI_DMA)&lt;SPAN style="color: #cc7832;"&gt;;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;&lt;SPAN&gt;The DMA (slave side) is configured to fill a buffer of 4096 bytes in 32 word (128 byte) increments. The Linux DMA engine is configured as follows:&lt;/SPAN&gt;&lt;/P&gt;&lt;PRE style="color: #a9b7c6; background-color: #2b2b2b; font-size: 9.0pt;"&gt;slave_config.dst_addr = (dma_addr_t) spislv-&amp;gt;phybase + IMX6_ECSPI_DATA_TX&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;slave_config.src_addr = (dma_addr_t) spislv-&amp;gt;phybase + IMX6_ECSPI_DATA_RX&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;slave_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;slave_config.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;slave_config.src_maxburst = SPI_DMA_RX_BURST_LEN&lt;SPAN style="color: #cc7832;"&gt;; &lt;/SPAN&gt;&lt;SPAN style="color: #808080;"&gt;// 32 Words
&lt;/SPAN&gt;slave_config.dst_maxburst = SPI_DMA_RX_BURST_LEN&lt;SPAN style="color: #cc7832;"&gt;; &lt;/SPAN&gt;&lt;SPAN style="color: #808080;"&gt;// 32 Words
&lt;/SPAN&gt;slave_config.device_fc = &lt;SPAN style="color: #cc7832; font-weight: bold;"&gt;true&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;slave_config.direction = DMA_DEV_TO_MEM&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832;"&gt;
&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832; font-weight: bold;"&gt;if &lt;/SPAN&gt;(dmaengine_slave_config(spislv-&amp;gt;dma.rx_dma_chan&lt;SPAN style="color: #cc7832;"&gt;, &lt;/SPAN&gt;&amp;amp;slave_config)) {
    dev_err(&amp;amp;spislv-&amp;gt;pdev-&amp;gt;dev&lt;SPAN style="color: #cc7832;"&gt;, &lt;/SPAN&gt;&lt;SPAN style="color: #6a8759;"&gt;"can't configure rx dma channel&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832;"&gt;\n&lt;/SPAN&gt;&lt;SPAN style="color: #6a8759;"&gt;"&lt;/SPAN&gt;)&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832;"&gt;    &lt;/SPAN&gt;&lt;SPAN style="color: #cc7832; font-weight: bold;"&gt;return &lt;/SPAN&gt;-EINVAL&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;}&lt;/PRE&gt;&lt;PRE style="color: #a9b7c6; background-color: #2b2b2b; font-size: 9.0pt;"&gt;rx_desc = dmaengine_prep_dma_cyclic(spislv-&amp;gt;dma.rx_dma_chan&lt;SPAN style="color: #cc7832;"&gt;,
&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832;"&gt;        &lt;/SPAN&gt;spislv-&amp;gt;dma.handle&lt;SPAN style="color: #cc7832;"&gt;,
&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832;"&gt;        &lt;/SPAN&gt;&lt;SPAN style="color: #6897bb;"&gt;2 &lt;/SPAN&gt;* SPI_RX_BUFF_SIZE&lt;SPAN style="color: #cc7832; "&gt;, &lt;/SPAN&gt;&lt;SPAN style="color: #808080;"&gt;// 2 * 4096 Bytes&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832;"&gt; 
&lt;/SPAN&gt;        SPI_RX_BUFF_SIZE&lt;SPAN style="color: #cc7832; "&gt;, &lt;/SPAN&gt;&lt;SPAN style="color: #808080;"&gt;// 4096 Bytes&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832;"&gt;
&lt;/SPAN&gt;        DMA_DEV_TO_MEM&lt;SPAN style="color: #cc7832;"&gt;,
&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832;"&gt;        &lt;/SPAN&gt;DMA_PREP_INTERRUPT)&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832; font-weight: bold;"&gt;if &lt;/SPAN&gt;(!rx_desc)
 &lt;SPAN style="color: #cc7832; font-weight: bold;"&gt;return &lt;/SPAN&gt;-ENOMEM&lt;SPAN style="color: #cc7832;"&gt;;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 31 Jan 2019 16:58:08 GMT</pubDate>
    <dc:creator>curtis1</dc:creator>
    <dc:date>2019-01-31T16:58:08Z</dc:date>
    <item>
      <title>DMA SPI Slave Issues</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/DMA-SPI-Slave-Issues/m-p/877807#M133191</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;I have implemented a DMA SPI slave driver for Linux and I am seeing a strange issue.&lt;/P&gt;&lt;P&gt;I have a data structure that is 4096 bytes long. When I initiate a SPI transfer on the master side, I find that I have to transfer an additional 4 bytes to collect the full message on the slave side. The strange part is that these extra 4 bytes do not end up in any buffers. Performing a CRC32 on the data structure on the master side, then slave side shows that the data is consistent as long as I add the extra 4 bytes.&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Can someone offer some guidance as to where the last 4 bytes are going? And why the extra bytes are necessary?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I have configured the SPI device as follows:&lt;/P&gt;&lt;PRE style="color: #a9b7c6; background-color: #2b2b2b; font-size: 9.0pt;"&gt;reg = &lt;SPAN style="color: #6897bb;"&gt;0&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;reg |= IMX6_ECSPI_DMA_RXTDEN&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;reg |= IMX6_ECSPI_DMA_RX_LEN(SPI_DMA_RX_BURST_LEN)&lt;SPAN style="color: #cc7832; "&gt;; &lt;/SPAN&gt;&lt;SPAN style="color: #808080;"&gt;// RX_DMA_LENGTH = 32
&lt;/SPAN&gt;reg |= IMX6_ECSPI_DMA_RXDEN&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;reg |= IMX6_ECSPI_DMA_RX_THR(SPI_DMA_RX_THRESHOLD - &lt;SPAN style="color: #6897bb;"&gt;1&lt;/SPAN&gt;)&lt;SPAN style="color: #cc7832; "&gt;; &lt;/SPAN&gt;&lt;SPAN style="color: #808080;"&gt;// RX_THRESHOLD = 31
&lt;/SPAN&gt;writel(reg&lt;SPAN style="color: #cc7832;"&gt;, &lt;/SPAN&gt;spislv-&amp;gt;base + IMX6_ECSPI_DMA)&lt;SPAN style="color: #cc7832;"&gt;;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;P&gt;&lt;SPAN&gt;The DMA (slave side) is configured to fill a buffer of 4096 bytes in 32 word (128 byte) increments. The Linux DMA engine is configured as follows:&lt;/SPAN&gt;&lt;/P&gt;&lt;PRE style="color: #a9b7c6; background-color: #2b2b2b; font-size: 9.0pt;"&gt;slave_config.dst_addr = (dma_addr_t) spislv-&amp;gt;phybase + IMX6_ECSPI_DATA_TX&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;slave_config.src_addr = (dma_addr_t) spislv-&amp;gt;phybase + IMX6_ECSPI_DATA_RX&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;slave_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;slave_config.src_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;slave_config.src_maxburst = SPI_DMA_RX_BURST_LEN&lt;SPAN style="color: #cc7832;"&gt;; &lt;/SPAN&gt;&lt;SPAN style="color: #808080;"&gt;// 32 Words
&lt;/SPAN&gt;slave_config.dst_maxburst = SPI_DMA_RX_BURST_LEN&lt;SPAN style="color: #cc7832;"&gt;; &lt;/SPAN&gt;&lt;SPAN style="color: #808080;"&gt;// 32 Words
&lt;/SPAN&gt;slave_config.device_fc = &lt;SPAN style="color: #cc7832; font-weight: bold;"&gt;true&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;slave_config.direction = DMA_DEV_TO_MEM&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832;"&gt;
&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832; font-weight: bold;"&gt;if &lt;/SPAN&gt;(dmaengine_slave_config(spislv-&amp;gt;dma.rx_dma_chan&lt;SPAN style="color: #cc7832;"&gt;, &lt;/SPAN&gt;&amp;amp;slave_config)) {
    dev_err(&amp;amp;spislv-&amp;gt;pdev-&amp;gt;dev&lt;SPAN style="color: #cc7832;"&gt;, &lt;/SPAN&gt;&lt;SPAN style="color: #6a8759;"&gt;"can't configure rx dma channel&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832;"&gt;\n&lt;/SPAN&gt;&lt;SPAN style="color: #6a8759;"&gt;"&lt;/SPAN&gt;)&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832;"&gt;    &lt;/SPAN&gt;&lt;SPAN style="color: #cc7832; font-weight: bold;"&gt;return &lt;/SPAN&gt;-EINVAL&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;}&lt;/PRE&gt;&lt;PRE style="color: #a9b7c6; background-color: #2b2b2b; font-size: 9.0pt;"&gt;rx_desc = dmaengine_prep_dma_cyclic(spislv-&amp;gt;dma.rx_dma_chan&lt;SPAN style="color: #cc7832;"&gt;,
&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832;"&gt;        &lt;/SPAN&gt;spislv-&amp;gt;dma.handle&lt;SPAN style="color: #cc7832;"&gt;,
&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832;"&gt;        &lt;/SPAN&gt;&lt;SPAN style="color: #6897bb;"&gt;2 &lt;/SPAN&gt;* SPI_RX_BUFF_SIZE&lt;SPAN style="color: #cc7832; "&gt;, &lt;/SPAN&gt;&lt;SPAN style="color: #808080;"&gt;// 2 * 4096 Bytes&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832;"&gt; 
&lt;/SPAN&gt;        SPI_RX_BUFF_SIZE&lt;SPAN style="color: #cc7832; "&gt;, &lt;/SPAN&gt;&lt;SPAN style="color: #808080;"&gt;// 4096 Bytes&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832;"&gt;
&lt;/SPAN&gt;        DMA_DEV_TO_MEM&lt;SPAN style="color: #cc7832;"&gt;,
&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832;"&gt;        &lt;/SPAN&gt;DMA_PREP_INTERRUPT)&lt;SPAN style="color: #cc7832;"&gt;;
&lt;/SPAN&gt;&lt;SPAN style="color: #cc7832; font-weight: bold;"&gt;if &lt;/SPAN&gt;(!rx_desc)
 &lt;SPAN style="color: #cc7832; font-weight: bold;"&gt;return &lt;/SPAN&gt;-ENOMEM&lt;SPAN style="color: #cc7832;"&gt;;&lt;/SPAN&gt;&lt;/PRE&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 31 Jan 2019 16:58:08 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/DMA-SPI-Slave-Issues/m-p/877807#M133191</guid>
      <dc:creator>curtis1</dc:creator>
      <dc:date>2019-01-31T16:58:08Z</dc:date>
    </item>
    <item>
      <title>Re: DMA SPI Slave Issues</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/DMA-SPI-Slave-Issues/m-p/877808#M133192</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Curtis &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;probably extra 4 bytes may be explained that SDMA has 36-byte FIFO according to&lt;/P&gt;&lt;P&gt;sect.55.4.3.1 Burst DMA Unit i.MX6DQ Reference Manual &lt;/P&gt;&lt;P&gt;&lt;A href="http://www.nxp.com/docs/en/reference-manual/IMX6DQRM.pdf" target="test_blank"&gt;http://www.nxp.com/docs/en/reference-manual/IMX6DQRM.pdf&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards&lt;BR /&gt;igor&lt;BR /&gt;-----------------------------------------------------------------------------------------------------------------------&lt;BR /&gt;Note: If this post answers your question, please click the Correct Answer button. Thank you!&lt;BR /&gt;-----------------------------------------------------------------------------------------------------------------------&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 04 Feb 2019 10:51:00 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/DMA-SPI-Slave-Issues/m-p/877808#M133192</guid>
      <dc:creator>igorpadykov</dc:creator>
      <dc:date>2019-02-04T10:51:00Z</dc:date>
    </item>
    <item>
      <title>Re: DMA SPI Slave Issues</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/DMA-SPI-Slave-Issues/m-p/877809#M133193</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Igor,&lt;/P&gt;&lt;P&gt;That almost makes sense. However, I would expect to require 8 extra bytes. And where are these bytes going?&lt;/P&gt;&lt;P&gt;Furthermore, the reference manual mentions 36 byte fifo, but only 8 words deep. 36 bytes should be 9 word fifo, am I missing something?&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Cheers,&lt;/P&gt;&lt;P&gt;Curtis&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 04 Feb 2019 17:36:21 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/DMA-SPI-Slave-Issues/m-p/877809#M133193</guid>
      <dc:creator>curtis1</dc:creator>
      <dc:date>2019-02-04T17:36:21Z</dc:date>
    </item>
    <item>
      <title>Re: DMA SPI Slave Issues</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/DMA-SPI-Slave-Issues/m-p/877810#M133194</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Curtis&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;one can try to narrow down problem testing with smaller number like 512 or less.&lt;/P&gt;&lt;P&gt;As for 4096, does it work without sdma.&lt;/P&gt;&lt;P&gt;Also there are some ecspi related errata described in i.MX6DQ Errata&lt;/P&gt;&lt;P&gt;&lt;A href="https://www.nxp.com/docs/en/errata/IMX6DQCE.pdf"&gt;https://www.nxp.com/docs/en/errata/IMX6DQCE.pdf&lt;/A&gt;&lt;/P&gt;&lt;P&gt;It makes sense to try latest nxp linux L4.14.78_1.0.0&amp;nbsp; &lt;BR /&gt;&lt;A href="https://source.codeaurora.org/external/imx/linux-imx/tree/?h=imx_4.14.78_1.0.0_ga" target="test_blank"&gt;https://source.codeaurora.org/external/imx/linux-imx/tree/?h=imx_4.14.78_1.0.0_ga&lt;/A&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Best regards&lt;BR /&gt;igor&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 07 Feb 2019 02:08:10 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/DMA-SPI-Slave-Issues/m-p/877810#M133194</guid>
      <dc:creator>igorpadykov</dc:creator>
      <dc:date>2019-02-07T02:08:10Z</dc:date>
    </item>
  </channel>
</rss>

