创意广告 發表於 2023-6-9 00:00:00

详解linux dma驱动编写

<p>
        linux下面的驱动虽然什么样的情形都有,但是dma驱动却并不少见。dma可以有很多的好处,其中最重要的功能就是能够帮助我们将数据搬来搬去,这个时候cpu就由时间去做别的事情了,提高了设备效率。</p>
<p>
        1、dma驱动在什么地方</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterplain" id="highlighter_730917">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="plain plain">drivers/dma</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        2、如何看s3c的dma驱动,先看Kconfig</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterplain" id="highlighter_124099">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="plain plain">config S3C24XX_DMAC </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="plain spaces">  </code><code class="plain plain">bool "Samsung S3C24XX DMA support" </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="plain spaces">  </code><code class="plain plain">depends on ARCH_S3C24XX || COMPILE_TEST </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="plain spaces">  </code><code class="plain plain">select DMA_ENGINE </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="plain spaces">  </code><code class="plain plain">select DMA_VIRTUAL_CHANNELS </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="plain spaces">  </code><code class="plain plain">help </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="plain spaces">   </code><code class="plain plain">Support for the Samsung S3C24XX DMA controller driver. The </code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="plain spaces">   </code><code class="plain plain">DMA controller is having multiple DMA channels which can be </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="plain spaces">   </code><code class="plain plain">configured for different peripherals like audio, UART, SPI. </code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="plain spaces">   </code><code class="plain plain">The DMA controller can transfer data from memory to peripheral, </code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="plain spaces">   </code><code class="plain plain">periphal to memory, periphal to periphal and memory to memory. </code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        3、发现s3c只依赖于S3C24XX_DMAC,这样可以接着看Makefile</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterplain" id="highlighter_412923">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="plain plain">obj-$(CONFIG_S3C24XX_DMAC) += s3c24xx-dma.o</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        4、确认驱动文件为s3c24xx-dma.c,了解基本结构</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_977987">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp keyword bold">static</code> <code class="cpp keyword bold">struct</code> <code class="cpp plain">platform_driver s3c24xx_dma_driver = { </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">.driver   = { </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">.name  = </code><code class="cpp string">"s3c24xx-dma"</code><code class="cpp plain">, </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">}, </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">.id_table  = s3c24xx_dma_driver_ids, </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">.probe   = s3c24xx_dma_probe, </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">.</code><code class="cpp functions bold">remove</code>   <code class="cpp plain">= s3c24xx_dma_remove, </code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp plain">}; </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp plain">module_platform_driver(s3c24xx_dma_driver); </code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        5、驱动为基本的platform driver,接着就可以了解probe函数了</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_92409">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                        <div class="line number16 index15 alt1">
                                                                16</div>
                                                        <div class="line number17 index16 alt2">
                                                                17</div>
                                                        <div class="line number18 index17 alt1">
                                                                18</div>
                                                        <div class="line number19 index18 alt2">
                                                                19</div>
                                                        <div class="line number20 index19 alt1">
                                                                20</div>
                                                        <div class="line number21 index20 alt2">
                                                                21</div>
                                                        <div class="line number22 index21 alt1">
                                                                22</div>
                                                        <div class="line number23 index22 alt2">
                                                                23</div>
                                                        <div class="line number24 index23 alt1">
                                                                24</div>
                                                        <div class="line number25 index24 alt2">
                                                                25</div>
                                                        <div class="line number26 index25 alt1">
                                                                26</div>
                                                        <div class="line number27 index26 alt2">
                                                                27</div>
                                                        <div class="line number28 index27 alt1">
                                                                28</div>
                                                        <div class="line number29 index28 alt2">
                                                                29</div>
                                                        <div class="line number30 index29 alt1">
                                                                30</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp comments">/* Initialize memcpy engine */</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp plain">dma_cap_set(DMA_MEMCPY, s3cdma-&gt;</code><code class="cpp functions bold">memcpy</code><code class="cpp plain">.cap_mask); </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp plain">dma_cap_set(DMA_PRIVATE, s3cdma-&gt;</code><code class="cpp functions bold">memcpy</code><code class="cpp plain">.cap_mask); </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp plain">s3cdma-&gt;</code><code class="cpp functions bold">memcpy</code><code class="cpp plain">.dev = &amp;pdev-&gt;dev; </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp plain">s3cdma-&gt;</code><code class="cpp functions bold">memcpy</code><code class="cpp plain">.device_free_chan_resources = </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp spaces">        </code><code class="cpp plain">s3c24xx_dma_free_chan_resources; </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp plain">s3cdma-&gt;</code><code class="cpp functions bold">memcpy</code><code class="cpp plain">.device_prep_dma_memcpy = s3c24xx_dma_prep_memcpy; </code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp plain">s3cdma-&gt;</code><code class="cpp functions bold">memcpy</code><code class="cpp plain">.device_tx_status = s3c24xx_dma_tx_status; </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp plain">s3cdma-&gt;</code><code class="cpp functions bold">memcpy</code><code class="cpp plain">.device_issue_pending = s3c24xx_dma_issue_pending; </code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp plain">s3cdma-&gt;</code><code class="cpp functions bold">memcpy</code><code class="cpp plain">.device_config = s3c24xx_dma_set_runtime_config; </code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="cpp plain">s3cdma-&gt;</code><code class="cpp functions bold">memcpy</code><code class="cpp plain">.device_terminate_all = s3c24xx_dma_terminate_all; </code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="cpp plain">s3cdma-&gt;</code><code class="cpp functions bold">memcpy</code><code class="cpp plain">.device_synchronize = s3c24xx_dma_synchronize; </code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="cpp comments">/* Initialize slave engine for SoC internal dedicated peripherals */</code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="cpp plain">dma_cap_set(DMA_SLAVE, s3cdma-&gt;slave.cap_mask); </code>
</div>
                                                                <div class="line number16 index15 alt1">
                                                                        <code class="cpp plain">dma_cap_set(DMA_CYCLIC, s3cdma-&gt;slave.cap_mask); </code>
</div>
                                                                <div class="line number17 index16 alt2">
                                                                        <code class="cpp plain">dma_cap_set(DMA_PRIVATE, s3cdma-&gt;slave.cap_mask); </code>
</div>
                                                                <div class="line number18 index17 alt1">
                                                                        <code class="cpp plain">s3cdma-&gt;slave.dev = &amp;pdev-&gt;dev; </code>
</div>
                                                                <div class="line number19 index18 alt2">
                                                                        <code class="cpp plain">s3cdma-&gt;slave.device_free_chan_resources = </code>
</div>
                                                                <div class="line number20 index19 alt1">
                                                                        <code class="cpp spaces">        </code><code class="cpp plain">s3c24xx_dma_free_chan_resources; </code>
</div>
                                                                <div class="line number21 index20 alt2">
                                                                        <code class="cpp plain">s3cdma-&gt;slave.device_tx_status = s3c24xx_dma_tx_status; </code>
</div>
                                                                <div class="line number22 index21 alt1">
                                                                        <code class="cpp plain">s3cdma-&gt;slave.device_issue_pending = s3c24xx_dma_issue_pending; </code>
</div>
                                                                <div class="line number23 index22 alt2">
                                                                        <code class="cpp plain">s3cdma-&gt;slave.device_prep_slave_sg = s3c24xx_dma_prep_slave_sg; </code>
</div>
                                                                <div class="line number24 index23 alt1">
                                                                        <code class="cpp plain">s3cdma-&gt;slave.device_prep_dma_cyclic = s3c24xx_dma_prep_dma_cyclic; </code>
</div>
                                                                <div class="line number25 index24 alt2">
                                                                        <code class="cpp plain">s3cdma-&gt;slave.device_config = s3c24xx_dma_set_runtime_config; </code>
</div>
                                                                <div class="line number26 index25 alt1">
                                                                        <code class="cpp plain">s3cdma-&gt;slave.device_terminate_all = s3c24xx_dma_terminate_all; </code>
</div>
                                                                <div class="line number27 index26 alt2">
                                                                        <code class="cpp plain">s3cdma-&gt;slave.device_synchronize = s3c24xx_dma_synchronize; </code>
</div>
                                                                <div class="line number28 index27 alt1">
                                                                        <code class="cpp plain">s3cdma-&gt;slave.filter.map = pdata-&gt;slave_map; </code>
</div>
                                                                <div class="line number29 index28 alt2">
                                                                        <code class="cpp plain">s3cdma-&gt;slave.filter.mapcnt = pdata-&gt;slavecnt; </code>
</div>
                                                                <div class="line number30 index29 alt1">
                                                                        <code class="cpp plain">s3cdma-&gt;slave.filter.fn = s3c24xx_dma_filter; </code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        6、通过code获悉,s3cdma有master和slave两个engine,且部分接口共享。</p>
<p>
        只要完成dma接口的适配,dma就可以正常使用了。当然,前提是,两个engine要进行注册使用。</p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlightercpp" id="highlighter_377458">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                        <div class="line number7 index6 alt2">
                                                                7</div>
                                                        <div class="line number8 index7 alt1">
                                                                8</div>
                                                        <div class="line number9 index8 alt2">
                                                                9</div>
                                                        <div class="line number10 index9 alt1">
                                                                10</div>
                                                        <div class="line number11 index10 alt2">
                                                                11</div>
                                                        <div class="line number12 index11 alt1">
                                                                12</div>
                                                        <div class="line number13 index12 alt2">
                                                                13</div>
                                                        <div class="line number14 index13 alt1">
                                                                14</div>
                                                        <div class="line number15 index14 alt2">
                                                                15</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="cpp plain">ret = dma_async_device_register(&amp;s3cdma-&gt;</code><code class="cpp functions bold">memcpy</code><code class="cpp plain">); </code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="cpp keyword bold">if</code> <code class="cpp plain">(ret) { </code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">dev_warn(&amp;pdev-&gt;dev, </code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp string">"%s failed to register memcpy as an async device - %d\n"</code><code class="cpp plain">, </code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">__func__, ret); </code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">goto</code> <code class="cpp plain">err_memcpy_reg; </code>
</div>
                                                                <div class="line number7 index6 alt2">
                                                                        <code class="cpp plain">} </code>
</div>
                                                                <div class="line number8 index7 alt1">
                                                                        <code class="cpp spaces"> </code>
</div>
                                                                <div class="line number9 index8 alt2">
                                                                        <code class="cpp plain">ret = dma_async_device_register(&amp;s3cdma-&gt;slave); </code>
</div>
                                                                <div class="line number10 index9 alt1">
                                                                        <code class="cpp keyword bold">if</code> <code class="cpp plain">(ret) { </code>
</div>
                                                                <div class="line number11 index10 alt2">
                                                                        <code class="cpp spaces">  </code><code class="cpp plain">dev_warn(&amp;pdev-&gt;dev, </code>
</div>
                                                                <div class="line number12 index11 alt1">
                                                                        <code class="cpp spaces">    </code><code class="cpp string">"%s failed to register slave as an async device - %d\n"</code><code class="cpp plain">, </code>
</div>
                                                                <div class="line number13 index12 alt2">
                                                                        <code class="cpp spaces">    </code><code class="cpp plain">__func__, ret); </code>
</div>
                                                                <div class="line number14 index13 alt1">
                                                                        <code class="cpp spaces">  </code><code class="cpp keyword bold">goto</code> <code class="cpp plain">err_slave_reg; </code>
</div>
                                                                <div class="line number15 index14 alt2">
                                                                        <code class="cpp plain">} </code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
        <div class="codetool" id="codetool">
                <div class="code_n">
                        <textarea></textarea>
</div>
        </div>
</div>
<p>
        以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。</p>
<p>
        原文链接:https://blog.csdn.net/feixiaoxing/article/details/79873782</p>
頁: [1]
查看完整版本: 详解linux dma驱动编写