当前位置: 首页 > news >正文

Linux DMA(六)

14. 快速参考卡

┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃           Linux DMA API 快速参考卡                       ┃
┣━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃                                                          ┃
┃  🔧 初始化                                               ┃
┃  ─────────────────────────────────────                   ┃
┃  dma_set_mask_and_coherent(dev, DMA_BIT_MASK(32))       ┃
┃                                                          ┃
┃  📦 一致性DMA (长期缓冲区)                               ┃
┃  ─────────────────────────────────────                   ┃
┃  分配: v = dma_alloc_coherent(dev, sz, &dma, GFP_KERNEL)┃
┃  使用: 直接读写v,设备用dma地址,无需sync               ┃
┃  释放: dma_free_coherent(dev, sz, v, dma)               ┃
┃                                                          ┃
┃  🌊 流式DMA (临时映射)                                   ┃
┃  ─────────────────────────────────────                   ┃
┃  映射: dma = dma_map_single(dev, buf, sz, dir)          ┃
┃  检查: if (dma_mapping_error(dev, dma)) 处理错误        ┃
┃  传输: 设备用dma地址访问数据                             ┃
┃  取消: dma_unmap_single(dev, dma, sz, dir)              ┃
┃                                                          ┃
┃  🔄 流式DMA同步 (重用映射)                               ┃
┃  ─────────────────────────────────────                   ┃
┃  CPU取回: dma_sync_single_for_cpu(dev, dma, sz, dir)    ┃
┃  CPU修改: memcpy(buf, data, sz)                         ┃
┃  交给设备: dma_sync_single_for_device(dev, dma, sz, dir)┃
┃                                                          ┃
┃  📋 Scatter-Gather                                       ┃
┃  ─────────────────────────────────────                   ┃
┃  创建: sg_alloc_table(&sgt, n, GFP_KERNEL)             ┃
┃  设置: sg_set_buf(sg, buf, len) 对每个条目              ┃
┃  映射: cnt = dma_map_sg(dev, sgt.sgl, n, dir)          ┃
┃  读取: sg_dma_address(sg), sg_dma_len(sg)              ┃
┃  取消: dma_unmap_sg(dev, sgt.sgl, n, dir) 用原始n!     ┃
┃  释放: sg_free_table(&sgt)                              ┃
┃                                                          ┃
┃  🏊 DMA Pool (小块分配)                                  ┃
┃  ─────────────────────────────────────                   ┃
┃  创建: pool = dma_pool_create(name, dev, sz, align, 0)  ┃
┃  分配: v = dma_pool_alloc(pool, GFP_KERNEL, &dma)      ┃
┃  归还: dma_pool_free(pool, v, dma)                      ┃
┃  销毁: dma_pool_destroy(pool)                           ┃
┃                                                          ┃
┃  🚂 DMA Engine                                           ┃
┃  ─────────────────────────────────────                   ┃
┃  请求: chan = dma_request_chan(dev, "tx")                ┃
┃  配置: dmaengine_slave_config(chan, &cfg)               ┃
┃  准备: desc = dmaengine_prep_slave_single(...)          ┃
┃  回调: desc->callback = func; desc->callback_param = p  ┃
┃  提交: cookie = dmaengine_submit(desc)                  ┃
┃  启动: dma_async_issue_pending(chan)                     ┃
┃  等待: wait_for_completion() 或 poll is_tx_complete()   ┃
┃  释放: dma_release_channel(chan)                         ┃
┃                                                          ┃
┃  ⚠️ 方向说明                                             ┃
┃  ─────────────────────────────────────                   ┃
┃  DMA_TO_DEVICE:     CPU→设备 (发送)  map=flush cache    ┃
┃  DMA_FROM_DEVICE:   设备→CPU (接收)  map=inv cache      ┃
┃  DMA_BIDIRECTIONAL: 双向             map=flush+inv      ┃
┃                                                          ┃
┃  ❌ 常见错误                                              ┃
┃  ─────────────────────────────────────                   ┃
┃  1. 栈/vmalloc缓冲区做DMA                               ┃
┃  2. 忘记检查dma_mapping_error()                         ┃
┃  3. map/unmap不配对(泄漏)                              ┃
┃  4. DMA方向错误                                          ┃
┃  5. 设备拥有期间CPU访问缓冲区                            ┃
┃  6. unmap_sg用mapped_nents而非原始nents                 ┃
┃  7. DMA完成前释放缓冲区                                  ┃
┃  8. coherent/streaming API混用                           ┃
┃  9. 回调中调用可睡眠函数                                 ┃
┃  10.Cache Line共享问题                                   ┃
┃                                                          ┃
┃  🔍 调试工具                                             ┃
┃  ─────────────────────────────────────                   ┃
┃  CONFIG_DMA_API_DEBUG=y                                  ┃
┃  /sys/kernel/debug/dma-api/{errors,dump}                ┃
┃  ftrace: events/dma/enable                              ┃
┃  dynamic_debug: file spi_oled_dma.c +p                  ┃
┃                                                          ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛

文件清单总结

spi_oled_dma/
├── spi_oled_dma.h               # 头文件(数据结构+DMA概念注释)
├── spi_oled_dma.c               # 主驱动(DMA初始化+传输+sysfs)
├── spi_oled_streaming_reuse.c   # 流式DMA重用+乒乓+异步演示
├── spi_oled_dma_errors.c        # DMA常见错误汇编(10个典型错误)
├── Makefile                     # 编译系统
├── dts/
│   └── spi_oled_overlay.dts     # 设备树(含DMA通道配置说明)
├── test/
│   └── test_oled.c              # 用户空间测试(图案+性能对比)
└── scripts/├── run_test.sh              # 自动化测试套件(8个测试项)└── trace_dma.sh             # ftrace DMA跟踪工具
http://www.jsqmd.com/news/414718/

相关文章:

  • 精准溯源,捷汇多VCAM炉温测试仪筑牢医疗设备制造品质防线 - 品牌企业推荐师(官方)
  • 运维系列【仅供参考】:Linux系统中vsftpd的使用
  • 工业焊接质检数据集(适用YOLO系列/1000+标注)(已标注+划分/可直接训练)
  • Linux DMA(五)
  • 讲讲考研数学课程怎么选,性价比高的品牌推荐 - 工业品网
  • 2026三相电能表校验服务优质推荐指南:三相电能表校验公司、三相电能表校验厂家、便携式电能表校验仪选择指南 - 优质品牌商家
  • 网络协议系列【仅供参考】:ARP欺骗应急故障处理案例(巨坑)
  • 2026年大型纸箱厂家推荐:规模大型纸箱/快递纸箱/彩色纸箱/连续纸箱专业供应 - 品牌推荐官
  • 2026年少儿英语机构如何选?机构挑选指南与六大优质品牌推荐 - 品牌2025
  • 少儿英语机构哪家好?2026年科学筛选指南:聚焦三大核心维度 - 品牌2025
  • 户外照明选谁?这5家LED路灯厂家覆盖90%应用场景 - 深度智识库
  • Linux DMA(四)
  • 2026年利息低的借贷平台推荐与综合对比 - 品牌排行榜
  • 2026年个人借贷平台推荐:合规借贷服务选择参考 - 品牌排行榜
  • [SIII2026]跳蚤国王训模型
  • 2026国内最新雪弗板十一大品牌实力排行榜:聚焦全屋健康,基于环保性能与市场口碑的权威推荐榜单 - 十大品牌榜
  • 热门编家谱软件推荐 专业数字化修谱工具 - 优质品牌商家
  • 弹簧冲击锤校准装置优质厂家,一站式采购攻略 - 品牌推荐大师
  • 2026靠谱的借贷平台推荐:合规安全平台选择指南 - 品牌排行榜
  • 2026小额借贷平台哪家好?合规安全平台推荐 - 品牌排行榜
  • 在线教学网课APP前端功能设计:打造高效互动的学习新体验
  • 2026年AI训练素材供应商推荐:卓特视觉领跑图片、视频及数据集合规服务 - 品牌2026
  • 工业数据智能化:从信息沉淀到系统认知的跃迁
  • 2026幼儿英语培训机构怎么选?聚焦四大核心考量点 - 品牌2025
  • C#和Visionpro9.0开发的视觉通用框架源码,三相机定位,PLC, 逻辑及代码都非常好...
  • 皮肤真菌杀菌制剂品牌推荐:真菌感染推荐商家/真菌感染泡热水可以吗/真菌感染源头商家/真菌感染源头商家排名/选择指南 - 优质品牌商家
  • 景观灯厂家Top5深度测评:从光学性能到全生命周期成本,一文看懂夜景工程选品逻辑 - 深度智识库
  • 太阳能路灯怎么选?聚焦5大核心维度,这份高性价比厂家推荐请收好 - 深度智识库
  • 2026年2月成都全屋定制工厂品牌综合实力排行榜:优选推荐指南 - 朴素的承诺
  • 2026国内最新十一大木饰面厂家品牌实力排行榜:聚焦全屋健康,基于环保性能与市场口碑的权威推荐榜单 - 十大品牌榜