<?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>i.MX ProcessorsのトピックRe: SDMA external request and EIM</title>
    <link>https://community.nxp.com/t5/i-MX-Processors/SDMA-external-request-and-EIM/m-p/669367#M103002</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi igorpadykov:&lt;/P&gt;&lt;P&gt;Thanks for your reply.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The infomation about IOMUXC_GPR0[7] and iomux.sdma_ext_events[1] is a liite brief in the datasheet . &lt;/P&gt;&lt;P&gt;Can you give me a demo or a guide to let me know how to config ?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;Best regades.&lt;/P&gt;&lt;P&gt;Have a nice day !&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Fri, 23 Jun 2017 09:17:22 GMT</pubDate>
    <dc:creator>sharpjison</dc:creator>
    <dc:date>2017-06-23T09:17:22Z</dc:date>
    <item>
      <title>SDMA external request and EIM</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/SDMA-external-request-and-EIM/m-p/669365#M103000</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hello NXP:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; My project is to use SDMA to transfer FPGA data via EIM interface. &lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I want to use SDMA external request to stop the action, when the FPGA data is not ready.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; How can I use external SDMA request pins to start a logic channel transfer over the EIM interface ?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; My EIM config&amp;nbsp; :&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Multiplexed&amp;nbsp; Address/Data mode&amp;nbsp; 16Bit&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Asynchronous Read Access&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The code is as floows:&lt;/P&gt;&lt;P&gt;//#include &amp;lt;linux/config.h&amp;gt; &lt;BR /&gt;#include &amp;lt;linux/moduleparam.h&amp;gt; &lt;BR /&gt;#include &amp;lt;linux/module.h&amp;gt; &lt;BR /&gt;#include &amp;lt;linux/version.h&amp;gt; &lt;BR /&gt;#include &amp;lt;linux/types.h&amp;gt; &lt;BR /&gt;#include &amp;lt;linux/errno.h&amp;gt; &lt;BR /&gt;#include &amp;lt;linux/kernel.h&amp;gt; &lt;BR /&gt;#include &amp;lt;linux/init.h&amp;gt; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;#include &amp;lt;linux/timer.h&amp;gt; &lt;BR /&gt;#include &amp;lt;linux/sched.h&amp;gt; &lt;BR /&gt;#include &amp;lt;linux/interrupt.h&amp;gt; &lt;BR /&gt;#include &amp;lt;linux/pm.h&amp;gt; &lt;BR /&gt;#include &amp;lt;linux/spinlock.h&amp;gt; &lt;BR /&gt;#include &amp;lt;linux/delay.h&amp;gt; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;#include &amp;lt;linux/device.h&amp;gt; &lt;BR /&gt;#include &amp;lt;linux/dma-mapping.h&amp;gt; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;#include &amp;lt;linux/io.h&amp;gt; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;#include &amp;lt;linux/slab.h&amp;gt; &lt;BR /&gt;#include &amp;lt;linux/mman.h&amp;gt; &lt;BR /&gt;#include &amp;lt;linux/kthread.h&amp;gt; &lt;BR /&gt;#include &amp;lt;linux/dmaengine.h&amp;gt; &lt;BR /&gt;#include &amp;lt;linux/platform_data/dma-imx.h&amp;gt; &lt;BR /&gt;#include &amp;lt;linux/platform_data/dma-imx-sdma.h&amp;gt; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;#include &amp;lt;linux/workqueue.h&amp;gt; &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;#define DMA_SOURCE_ADDR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x08000000 &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;#define DMA_START_ADDR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x30000000 &amp;nbsp;&lt;BR /&gt;#define DMA_DATA_LENGTH&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x00020000 &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;#define BUFF_START_ADDR&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x40000000 &lt;BR /&gt;#define BUFF_DATA_LENGTH&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x00020000 &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;struct timespec ts_start; &lt;BR /&gt;struct timespec ts_end&amp;nbsp; ; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;struct timeval&amp;nbsp; tv_start; &lt;BR /&gt;struct timeval&amp;nbsp; tv_end&amp;nbsp; ; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;int cnt; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;struct thread_data { &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int nr; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; pid_t pid; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char * name; &lt;BR /&gt;}; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;struct dma_transfer { &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct dma_chan *ch; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct dma_slave_config dma_m2m_config; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct dma_async_tx_descriptor *dma_m2m_desc; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct completion dma_m2m_ok; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned int&amp;nbsp;&amp;nbsp; phys_from; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; unsigned int&amp;nbsp;&amp;nbsp; phys_to; &lt;BR /&gt;}; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;static int&amp;nbsp; dmatest_work(void *data); &lt;BR /&gt;static void dma_memcpy_callback_from_fpga(void *data); &lt;BR /&gt;static int&amp;nbsp; dma_mem_transfer_to_store_buffer(void) ; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;static unsigned int&amp;nbsp; data_addr ; &lt;BR /&gt;static unsigned int&amp;nbsp; buff_addr ; &lt;BR /&gt;static struct dma_transfer dma_data&amp;nbsp;&amp;nbsp; ; &amp;nbsp;&lt;BR /&gt;static struct dma_transfer dma_buffer ; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;static bool dma_m2m_filter (struct dma_chan *chan, void *param) &lt;BR /&gt;{ &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!imx_dma_is_general_purpose(chan)) &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return false; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; chan-&amp;gt;private = param; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return true; &lt;BR /&gt;} &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;static void dma_memcpy_callback_to_buffer(void *data) &lt;BR /&gt;{ &lt;BR /&gt;static void dma_to_store_buffer(void) &lt;BR /&gt;{ &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct dma_transfer* dma = &amp;amp;dma_buffer ; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma-&amp;gt;dma_m2m_config.direction = DMA_MEM_TO_MEM; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma-&amp;gt;dma_m2m_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dmaengine_slave_config(dma-&amp;gt;ch, &amp;amp;dma-&amp;gt;dma_m2m_config); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma-&amp;gt;dma_m2m_desc = dma-&amp;gt;ch-&amp;gt;device-&amp;gt;device_prep_dma_memcpy(dma-&amp;gt;ch, &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma-&amp;gt;phys_to, dma-&amp;gt;phys_from, &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x00020000, 0); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma-&amp;gt;dma_m2m_desc-&amp;gt;callback = dma_memcpy_callback_to_buffer; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dmaengine_submit(dma-&amp;gt;dma_m2m_desc); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_async_issue_pending (dma-&amp;gt;ch); &lt;BR /&gt;} &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;// dma to buffer channel init &lt;BR /&gt;static int dma_mem_transfer_to_store_buffer(void) &lt;BR /&gt;{ &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct dma_transfer* dma = &amp;amp;dma_buffer ; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_cap_mask_t dma_m2m_mask; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct imx_dma_data m2m_dma_data = {0}; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_cap_zero (dma_m2m_mask); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_cap_set (DMA_SLAVE, dma_m2m_mask); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m2m_dma_data.peripheral_type = IMX_DMATYPE_MEMORY; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m2m_dma_data.priority = DMA_PRIO_HIGH; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; memset(dma, 0, sizeof(struct dma_transfer)); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma-&amp;gt;phys_from&amp;nbsp;&amp;nbsp; =&amp;nbsp; DMA_START_ADDR&amp;nbsp;&amp;nbsp; ; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma-&amp;gt;phys_to&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; =&amp;nbsp; BUFF_START_ADDR&amp;nbsp; ; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma-&amp;gt;ch = dma_request_channel(dma_m2m_mask, dma_m2m_filter, &amp;amp;m2m_dma_data); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!dma-&amp;gt;ch) { &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(KERN_ERR "Could not get DMA with dma_request_channel()\n"); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -ENOMEM; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0; &lt;BR /&gt;} &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;/* &lt;BR /&gt;&amp;nbsp;* The callback gets called by the DMA interrupt handler after &lt;BR /&gt;&amp;nbsp;* the transfer is complete. &lt;BR /&gt;&amp;nbsp;*/ &lt;BR /&gt;static void dma_memcpy_callback_from_fpga(void *data) &lt;BR /&gt;{ &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_to_store_buffer() ; &lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_data.dma_m2m_config.direction = DMA_MEM_TO_MEM; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_data.dma_m2m_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dmaengine_slave_config(dma_data.ch, &amp;amp;dma_data.dma_m2m_config); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_data.dma_m2m_desc = dma_data.ch-&amp;gt;device-&amp;gt;device_prep_dma_memcpy(dma_data.ch, &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_data.phys_to, dma_data.phys_from, &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x00020000, 0); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_data.dma_m2m_desc-&amp;gt;callback = dma_memcpy_callback_from_fpga; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dmaengine_submit(dma_data.dma_m2m_desc); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_async_issue_pending (dma_data.ch); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return ; &lt;BR /&gt;} &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;static int dma_mem_transfer_from_fpga (void) &lt;BR /&gt;{ &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct dma_transfer* dma = &amp;amp;dma_data ; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_cap_mask_t dma_m2m_mask; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct imx_dma_data m2m_dma_data = {0}; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_cap_zero (dma_m2m_mask); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_cap_set (DMA_SLAVE, dma_m2m_mask); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m2m_dma_data.peripheral_type = IMX_DMATYPE_MEMORY; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; m2m_dma_data.priority = DMA_PRIO_HIGH; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; memset(&amp;amp;dma_data, 0, sizeof(struct dma_transfer)); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma-&amp;gt;phys_from&amp;nbsp;&amp;nbsp; &amp;nbsp;= DMA_SOURCE_ADDR; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma-&amp;gt;phys_to&amp;nbsp;&amp;nbsp; &amp;nbsp;= DMA_START_ADDR ; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma-&amp;gt;ch = dma_request_channel(dma_m2m_mask, dma_m2m_filter, &amp;amp;m2m_dma_data); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!dma-&amp;gt;ch) { &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk(KERN_ERR "Could not get DMA with dma_request_channel()\n"); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -ENOMEM; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma-&amp;gt;dma_m2m_config.direction = DMA_MEM_TO_MEM; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma-&amp;gt;dma_m2m_config.dst_addr_width = DMA_SLAVE_BUSWIDTH_4_BYTES; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dmaengine_slave_config(dma-&amp;gt;ch, &amp;amp;dma-&amp;gt;dma_m2m_config); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma-&amp;gt;dma_m2m_desc = dma-&amp;gt;ch-&amp;gt;device-&amp;gt;device_prep_dma_memcpy(dma-&amp;gt;ch, &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma-&amp;gt;phys_to, dma-&amp;gt;phys_from, &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 0x00020000,0); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma-&amp;gt;dma_m2m_desc-&amp;gt;callback = dma_memcpy_callback_from_fpga; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dmaengine_submit(dma-&amp;gt;dma_m2m_desc); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_async_issue_pending (dma-&amp;gt;ch); &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;do_gettimeofday (&amp;amp;tv_start); &lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;ts_start = current_kernel_time (); &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0; &lt;BR /&gt;} &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;static int&amp;nbsp;&amp;nbsp; dmatest_work (void *data) &lt;BR /&gt;{ &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_mem_transfer_from_fpga(); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // DMA data to store buffer &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dma_mem_transfer_to_store_buffer() ; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;} &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;static char *name = "dmatest"; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;static int __init dmatest_init(void) &lt;BR /&gt;{ &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct thread_data * thread; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Schedule multiple concurrent dma tests */ &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; thread = kmalloc(sizeof(struct thread_data), GFP_KERNEL); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!thread) { &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; goto free_threads; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; } &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; memset(thread, 0, sizeof(struct thread_data)); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; thread-&amp;gt;nr = 1; &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; thread-&amp;gt;name = name; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Schedule the test thread */ &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; kthread_run (dmatest_work, thread, thread-&amp;gt;name); &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; request_mem_region(DMA_START_ADDR, DMA_DATA_LENGTH, "dma_data"); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data_addr = (unsigned int )ioremap(DMA_START_ADDR, DMA_DATA_LENGTH); &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; request_mem_region(BUFF_START_ADDR, BUFF_DATA_LENGTH , "buffer_data"); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; buff_addr = (unsigned int )ioremap( BUFF_START_ADDR , BUFF_DATA_LENGTH ); &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printk("&amp;lt;0&amp;gt;dma module is running !\n"); &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0; &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;free_threads: &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; kfree(thread); &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return -ENOMEM; &lt;BR /&gt;} &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;static void __exit dmatest_exit(void) &lt;BR /&gt;{ &lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return; &lt;BR /&gt;} &lt;BR /&gt;&amp;nbsp;&lt;BR /&gt;MODULE_LICENSE("Dual BSD/GPL"); &lt;BR /&gt;module_init(dmatest_init); &lt;BR /&gt;module_exit(dmatest_exit);&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 22 Jun 2017 02:29:13 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/SDMA-external-request-and-EIM/m-p/669365#M103000</guid>
      <dc:creator>sharpjison</dc:creator>
      <dc:date>2017-06-22T02:29:13Z</dc:date>
    </item>
    <item>
      <title>Re: SDMA external request and EIM</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/SDMA-external-request-and-EIM/m-p/669366#M103001</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Sharp&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I am afraid external SDMA request is not supported BSPs, however&lt;/P&gt;&lt;P&gt;one can try to add it using existing uart example (it uses fifo level request signal)&lt;/P&gt;&lt;P&gt;please look at description of IOMUXC_GPR0[7]:&lt;BR /&gt;iomux.sdma_ext_events[1] - External DMA Request via DISP0_DAT17 or GPIO_18&lt;BR /&gt;and sect.3.3 SDMA event mapping Event N14 i.MX6DQ Reference Manual&lt;BR /&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fcache.freescale.com%2Ffiles%2F32bit%2Fdoc%2Fref_manual%2FIMX6DQRM.pdf" rel="nofollow" target="_blank"&gt;http://cache.freescale.com/files/32bit/doc/ref_manual/IMX6DQRM.pdf&lt;/A&gt;&lt;BR /&gt;By detecting a external DMA request signal the SDMA can be triggered to perform the &lt;BR /&gt;associated channel task.&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>Thu, 22 Jun 2017 10:41:32 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/SDMA-external-request-and-EIM/m-p/669366#M103001</guid>
      <dc:creator>igorpadykov</dc:creator>
      <dc:date>2017-06-22T10:41:32Z</dc:date>
    </item>
    <item>
      <title>Re: SDMA external request and EIM</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/SDMA-external-request-and-EIM/m-p/669367#M103002</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi igorpadykov:&lt;/P&gt;&lt;P&gt;Thanks for your reply.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;The infomation about IOMUXC_GPR0[7] and iomux.sdma_ext_events[1] is a liite brief in the datasheet . &lt;/P&gt;&lt;P&gt;Can you give me a demo or a guide to let me know how to config ?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; &lt;/P&gt;&lt;P&gt;Best regades.&lt;/P&gt;&lt;P&gt;Have a nice day !&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 23 Jun 2017 09:17:22 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/SDMA-external-request-and-EIM/m-p/669367#M103002</guid>
      <dc:creator>sharpjison</dc:creator>
      <dc:date>2017-06-23T09:17:22Z</dc:date>
    </item>
    <item>
      <title>Re: SDMA external request and EIM</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/SDMA-external-request-and-EIM/m-p/669368#M103003</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Sharp&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;unfortunately such demo is not available.&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>Fri, 23 Jun 2017 10:52:44 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/SDMA-external-request-and-EIM/m-p/669368#M103003</guid>
      <dc:creator>igorpadykov</dc:creator>
      <dc:date>2017-06-23T10:52:44Z</dc:date>
    </item>
    <item>
      <title>Re: SDMA external request and EIM</title>
      <link>https://community.nxp.com/t5/i-MX-Processors/SDMA-external-request-and-EIM/m-p/669369#M103004</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Sharp:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; did you solved your question? I have the same case about how to triggle the external SDMA request pins. if you solved your&amp;nbsp; problem , please guide something help for me! thanks!&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp; Best regards&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; lingjia&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Mon, 30 Jul 2018 02:42:35 GMT</pubDate>
      <guid>https://community.nxp.com/t5/i-MX-Processors/SDMA-external-request-and-EIM/m-p/669369#M103004</guid>
      <dc:creator>jial2012</dc:creator>
      <dc:date>2018-07-30T02:42:35Z</dc:date>
    </item>
  </channel>
</rss>

