详解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-></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-></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-></code><code class="cpp functions bold">memcpy</code><code class="cpp plain">.dev = &pdev->dev; </code>
</div>
<div class="line number5 index4 alt2">
<code class="cpp plain">s3cdma-></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-></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-></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-></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-></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-></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-></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->slave.cap_mask); </code>
</div>
<div class="line number16 index15 alt1">
<code class="cpp plain">dma_cap_set(DMA_CYCLIC, s3cdma->slave.cap_mask); </code>
</div>
<div class="line number17 index16 alt2">
<code class="cpp plain">dma_cap_set(DMA_PRIVATE, s3cdma->slave.cap_mask); </code>
</div>
<div class="line number18 index17 alt1">
<code class="cpp plain">s3cdma->slave.dev = &pdev->dev; </code>
</div>
<div class="line number19 index18 alt2">
<code class="cpp plain">s3cdma->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->slave.device_tx_status = s3c24xx_dma_tx_status; </code>
</div>
<div class="line number22 index21 alt1">
<code class="cpp plain">s3cdma->slave.device_issue_pending = s3c24xx_dma_issue_pending; </code>
</div>
<div class="line number23 index22 alt2">
<code class="cpp plain">s3cdma->slave.device_prep_slave_sg = s3c24xx_dma_prep_slave_sg; </code>
</div>
<div class="line number24 index23 alt1">
<code class="cpp plain">s3cdma->slave.device_prep_dma_cyclic = s3c24xx_dma_prep_dma_cyclic; </code>
</div>
<div class="line number25 index24 alt2">
<code class="cpp plain">s3cdma->slave.device_config = s3c24xx_dma_set_runtime_config; </code>
</div>
<div class="line number26 index25 alt1">
<code class="cpp plain">s3cdma->slave.device_terminate_all = s3c24xx_dma_terminate_all; </code>
</div>
<div class="line number27 index26 alt2">
<code class="cpp plain">s3cdma->slave.device_synchronize = s3c24xx_dma_synchronize; </code>
</div>
<div class="line number28 index27 alt1">
<code class="cpp plain">s3cdma->slave.filter.map = pdata->slave_map; </code>
</div>
<div class="line number29 index28 alt2">
<code class="cpp plain">s3cdma->slave.filter.mapcnt = pdata->slavecnt; </code>
</div>
<div class="line number30 index29 alt1">
<code class="cpp plain">s3cdma->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(&s3cdma-></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(&pdev->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(&s3cdma->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(&pdev->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]