原创 Linux系统自动dma代码及逐行解析

2023-10-14 20:41 397 2 2 分类: 物联网 文集: 学习分享

以下是一个简单的Linux系统自动DMA(Direct Memory Access)的代码示例,并对每行进行逐行解析。

c复制代码
#include
#include
#include
#include
#include
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Simple DMA Engine Example");
static struct platform_device *pdev;
static struct dma_chan *chan;
static int dma_probe(struct platform_device *pdev)
{
chan = dma_request_slave_channel(&pdev->dev, "rx-tx");
if (!chan) {
return -ENODEV;
}
dma_set_mask(chan, DMA_BIT_MASK(32));
return 0;
}
static int dma_remove(struct platform_device *pdev)
{
dma_release_channel(chan);
return 0;
}
static const struct of_device_id dma_match[] = {
{ .compatible = "example,dma-engine" },
{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, dma_match);
static struct platform_driver dma_driver = {
.probe = dma_probe,
.remove = dma_remove,
.driver = {
.name = "dma_example",
.of_match_table = dma_match,
.pm = NULL,
},
};
module_platform_driver(dma_driver);

以下是代码逐行解析:

  1. #include :包含Linux内核模块相关的头文件,用于定义模块的初始化和退出函数等。
  2. #include :包含Linux内核相关的头文件,用于定义内核中常用的数据类型和宏等。
  3. #include :包含DMA引擎相关的头文件,用于访问DMA通道和操作DMA传输。
  4. #include :包含平台设备驱动程序相关的头文件,用于访问平台设备和获取设备相关的信息。
  5. #include :包含Linux内核的OF(Open Firmware)相关的头文件,用于操作设备树。设备树用于描述硬件设备的结构和配置。
  6. MODULE_LICENSE("GPL");:定义模块的许可证为GPL,表示遵循GPL协议。这是Linux内核模块的惯例。
  7. MODULE_DESCRIPTION("Simple DMA Engine Example");:定义模块的描述为“简单的DMA引擎示例”。这是Linux内核模块的惯例。
  8. static struct platform_device *pdev;:定义一个静态的全局变量pdev,用于保存平台设备的指针。这个变量在整个驱动程序中都可以访问。
  9. static struct dma_chan *chan;:定义一个静态的全局变量chan,用于保存DMA通道的指针。这个变量在整个驱动程序中都可以访问。
  10. static int dma_probe(struct platform_device *pdev):定义一个静态的探针函数dma_probe,用于初始化DMA引擎设备驱动程序。这个函数在设备驱动程序被探测到时调用。参数pdev是平台设备的指针。这个函数的返回值是整数类型,用于表示操作成功或失败。
  11. int ret;:定义一个整型变量ret,用于保存函数调用的返回值。这个变量在函数内部使用。
  12. chan = dma_request_slave_channel(&pdev->dev, "rx-tx");:使用dma_request_slave_channel()函数申请一个DMA通道,并将申请到的通道赋值给全局变量chan。参数&pdev->dev是指向平台设备结构的指针,"rx-tx"是通道的名称。如果申请失败,返回NULL,否则返回通道的指针。这个函数的返回值是一个整数类型,用于表示操作成功或失败,保存在变量ret中。
  13. if (!chan):判断通道是否申请成功,如果通道为NULL,则说明申请失败。
  14. return -4;:如果通道申请失败,返回错误码-4,表示设备未找到。这是Linux内核模块的惯例。

作者: 丙丁先生, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3996156.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论0条评论)

登录后参与讨论
我要评论
0
2
关闭 站长推荐上一条 /2 下一条