原创
Linux系统自动dma代码及逐行解析
2023-10-14 20:41
397
2
2
分类:
物联网
文集:
学习分享
以下是一个简单的Linux系统自动DMA(Direct Memory Access)的代码示例,并对每行进行逐行解析。
| #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" }, |
| { } |
| }; |
| 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); |
以下是代码逐行解析:
- #include :包含Linux内核模块相关的头文件,用于定义模块的初始化和退出函数等。
- #include :包含Linux内核相关的头文件,用于定义内核中常用的数据类型和宏等。
- #include :包含DMA引擎相关的头文件,用于访问DMA通道和操作DMA传输。
- #include :包含平台设备驱动程序相关的头文件,用于访问平台设备和获取设备相关的信息。
- #include :包含Linux内核的OF(Open Firmware)相关的头文件,用于操作设备树。设备树用于描述硬件设备的结构和配置。
- MODULE_LICENSE("GPL");:定义模块的许可证为GPL,表示遵循GPL协议。这是Linux内核模块的惯例。
- MODULE_DESCRIPTION("Simple DMA Engine Example");:定义模块的描述为“简单的DMA引擎示例”。这是Linux内核模块的惯例。
- static struct platform_device *pdev;:定义一个静态的全局变量pdev,用于保存平台设备的指针。这个变量在整个驱动程序中都可以访问。
- static struct dma_chan *chan;:定义一个静态的全局变量chan,用于保存DMA通道的指针。这个变量在整个驱动程序中都可以访问。
- static int dma_probe(struct platform_device *pdev):定义一个静态的探针函数dma_probe,用于初始化DMA引擎设备驱动程序。这个函数在设备驱动程序被探测到时调用。参数pdev是平台设备的指针。这个函数的返回值是整数类型,用于表示操作成功或失败。
- int ret;:定义一个整型变量ret,用于保存函数调用的返回值。这个变量在函数内部使用。
- chan = dma_request_slave_channel(&pdev->dev, "rx-tx");:使用dma_request_slave_channel()函数申请一个DMA通道,并将申请到的通道赋值给全局变量chan。参数&pdev->dev是指向平台设备结构的指针,"rx-tx"是通道的名称。如果申请失败,返回NULL,否则返回通道的指针。这个函数的返回值是一个整数类型,用于表示操作成功或失败,保存在变量ret中。
- if (!chan):判断通道是否申请成功,如果通道为NULL,则说明申请失败。
- return -4;:如果通道申请失败,返回错误码-4,表示设备未找到。这是Linux内核模块的惯例。
作者: 丙丁先生, 来源:面包板社区
链接: https://mbb.eet-china.com/blog/uid-me-3996156.html
版权声明:本文为博主原创,未经本人允许,禁止转载!
文章评论(0条评论)
登录后参与讨论