社区首页
技术讨论创新帖
全部新帖
资料区
社区活动
联系管理员
★ 社区积分制度
★ 新手必读
★ 申请版主★
请
登录
后使用快捷导航
没有帐号?
注册
首页
|
电子技术
|
嵌入式
模拟电子
单片机
电源管理
传感器
半导体
电子应用
|
工业控制
物联网
汽车电子
网络通信
医疗电子
手机便携
测试测量
安防电子
家用电子
机器人
新能源
电子头条
|
社区
|
论坛
测评
博客
大学堂
|
下载
|
下载中心
电路图
精品文集
电路图
|
参考设计
|
Datasheet
|
活动
|
直播
datasheet
datasheet
文章
搜索
登录
注册
论坛
切换旧版
电子工程世界-论坛
»
论坛
›
电子技术交流
›
国产芯片交流
›
全志R128 SDK HAL 模块开发指南——DMA Controller
返回列表
发新帖
回复
阅
405
|
回
0
aleksib
当前离线
纯净的硅(中级)
最后登录
2024-11-20
在线时间
38 小时
威望
967分
芯积分
480分
(兑换)
E金币
0枚
(兑换)
(兑换)
好友
0
aleksib
276
帖子
0
TA的资源
纯净的硅(中级)
+ 好友
私信
楼主
发表于2024-3-25 09:53
只看该作者
全志R128 SDK HAL 模块开发指南——DMA Controller
[复制链接]
# DMA Controller 本文介绍RTOS 中DMA 驱动的接口及使用方法,为DMA 的使用者提供参考。 DMA 主要实现设备与设备、设备与 memory、memory 与 memory 之间的数据搬运与传输;BSP DMA 驱动主要实现设备驱动的底层细节,并为上层提供一套标准的 API 接口以供使用。 ## 文档约定 | 数据 | 说明 | | ---------- | ----------- | | DRQSRC_XXX | 源 DRQ 号 | | DRQDST_XXX | 目的 DRQ 号 | ## 模块配置 ```c Drivers Options —> soc related device drivers —> DMA Devices —> [*] enable dma driver [*] enable dma hal API test command ``` ## 源码结构 ```c hal/source/dma/ ---- 驱动源码 ├── hal_dma.c ├── Kconfig ├── Makefile ├── platform │ └── dma-sun20iw3.h ├── platform-dma.h include/hal/ ---- 驱动APIs声明头文件 └── hal_dma.h ``` ## 驱动框架 ![在这里插入图片描述](https://r128.docs.aw-ol.com/sdk_module/assets/post/dmac/image-20230320102327332.png) ## 模块接口说明 头文件: ```c #include
#include
``` ### 申请 DMA 通道 函数原型: ```c hal_dma_chan_status_t hal_dma_chan_request(struct sunxi_dma_chan **dma_chan) ``` 参数: - dma_chan: 存放 DMA 通道的指针变量 返回值: - HAL_DMA_CHAN_STATUS_BUSY: 申请失败 - HAL_DMA_CHAN_STATUS_FREE: 申请成功 ### 释放 DMA 通道 函数原型: ```c hal_dma_status_t hal_dma_chan_free(struct sunxi_dma_chan *chan) ``` 参数: -chan: 要释放的 DMA 通道结构体指针变量 返回值: - HAL_DMA_STATUS_ERROR: 失败 - HAL_DMA_STATUS_OK: 成功 ### 释放 DMA 通道描述符 函数原型: ```c hal_dma_status_t hal_dma_chan_desc_free(struct sunxi_dma_chan *chan) ``` 参数: - chan: 要释放的 DMA 通道结构体指针变量 返回值: - HAL_DMA_STATUS_ERROR: 失败 - HAL_DMA_STATUS_OK: 成功 ### 初始化环形 DMA 传输 函数原型: ```c hal_dma_status_t hal_dma_prep_cyclic(struct sunxi_dma_chan *chan, uint32_t buf_addr, uint32_t buf_len, uint32_t period_len, enum dma_transfer_direction dir) ``` 参数: - chan:DMA 通道结构体指针变量 - buf_addr: 数据缓冲区 - buf_len: 数据缓冲区长度 - period_len: 单次 DMA 搬运长度 - dir:DMA 传输方向 返回值: - HAL_DMA_STATUS_INVALID_PARAMETER: 参数非法 - HAL_DMA_STATUS_ERROR: 失败 - HAL_DMA_STATUS_OK: 成功 ### 初始化 memory to memory DMA 传输 函数原型: ```c hal_dma_status_t hal_dma_prep_memcpy(struct sunxi_dma_chan *chan, uint32_t dest, uint32_t src, uint32_t len) ``` 参数: - chan:DMA 通道结构体指针变量 - dest: 目的地址 - src: 源地址 - len: 传输长度 返回值: - HAL_DMA_STATUS_INVALID_PARAMETER: 参数非法 - HAL_DMA_STATUS_ERROR: 失败 - HAL_DMA_STATUS_OK: 成功 ### 初始化通用 DMA 传输 函数原型: ```c hal_dma_status_t hal_dma_prep_device(struct sunxi_dma_chan *chan, uint32_t dest, uint32_t src, uint32_t len, enum dma_transfer_direction dir) ``` 参数: -chan:DMA 通道结构体指针变量 - dest: 目的地址 - src: 源地址 - len: 传输长度 - dir:DMA 传输方向 返回值: - HAL_DMA_STATUS_INVALID_PARAMETER: 参数非法 - HAL_DMA_STATUS_ERROR: 失败 - HAL_DMA_STATUS_OK: 成功 ### 注册 DMA 回调函数 函数原型: ```c hal_dma_status_t hal_dma_callback_install(struct sunxi_dma_chan *chan, dma_callback callback, void *callback_param) ``` 参数: - chan:DMA 通道结构体指针变量 - callback: 回调函数 handler - callback_param: 回调函数传参 返回值: - HAL_DMA_STATUS_INVALID_PARAMETER: 参数非法 - HAL_DMA_STATUS_OK: 成功 ### 配置 DMA 描述符传输信息 函数原型: ```c hal_dma_status_t hal_dma_slave_config(struct sunxi_dma_chan *chan, struct dma_slave_config *config) ``` 参数: - chan:DMA 通道结构体指针变量 - config:DMA 描述符结构体指针变量 返回值: - HAL_DMA_STATUS_INVALID_PARAMETER: 参数非法 - HAL_DMA_STATUS_OK: 成功 ### 获取 DMA 发送状态 函数原型: ```c enum dma_status hal_dma_tx_status(struct sunxi_dma_chan *chan, uint32_t *left_size) ``` 参数: - chan:DMA 通道结构体指针变 - left_size: 存放剩余长度的指针变量 返回值: - DMA_INVALID_PARAMETER: 参数非法 - DMA_IN_PROGRESS: 正在进行 - DMA_COMPLETE: 传输完成 ### 启动 DMA 传输 函数原型: ```c hal_dma_status_t hal_dma_start(struct sunxi_dma_chan *chan) ``` 参数: - chan:DMA 通道结构体指针变量 返回值: - HAL_DMA_STATUS_INVALID_PARAMETER: 参数非法 - HAL_DMA_STATUS_ERROR: 失败 - HAL_DMA_STATUS_OK: 成功 ### 停止 DMA 传输 函数原型: ```c hal_dma_status_t hal_dma_stop(struct sunxi_dma_chan *chan) ``` 参数: -chan:DMA 通道结构体指针变量 返回值: - HAL_DMA_STATUS_INVALID_PARAMETER: 参数非法 - HAL_DMA_STATUS_ERROR: 失败 - HAL_DMA_STATUS_OK: 成功 ### 初始化 DMA 控制器驱动 函数原型: ```c void hal_dma_init(void) ``` 参数: - 无 返回值: - 无 ### 申请一致性内存 函数原型: ```c void *dma_alloc_coherent(size_t size) ``` 参数: - size: 申请内存的大小 返回值: - ptr: 内存缓冲区指针 ### 释放一致性内存 函数原型: ```c void dma_free_coherent(void *addr) ``` 参数: - addr: 内存缓冲区指针 返回值: - 无 ## 调试节点 - `menuconfig` 选择测试文件`CONFIG_HAL_TEST_DMA` - s系统启动后执行`hal_dma`即可,若结果为 “PASS”, 则表明当前 DMA 基本功能是否正常 ## 模块使用范例 ```c #include
#include
#include
#include
#include
#include
#include
#include
#include
#define DMA_TEST_LEN 1024 static void dma_test_cb(void *param) { hal_log_info("DMA finished, callback to do something...\n"); } int cmd_test_dma(int argc, char **argv) { int ret, i; struct sunxi_dma_chan *hdma = NULL; char *buf1 = NULL,*buf2 = NULL; struct dma_slave_config config = {0}; uint32_t size = 0; hal_log_info("run in dma test"); buf2 = dma_alloc_coherent(DMA_TEST_LEN); buf1 = dma_alloc_coherent(DMA_TEST_LEN); if (buf1 == NULL) { hal_log_err("malloc buf1 error!"); goto end; } if (buf2 == NULL) { hal_log_err("malloc buf2 error!"); goto end; } memset(buf1, 0, DMA_TEST_LEN); memset(buf2, 0, DMA_TEST_LEN); for (i = 0;i < DMA_TEST_LEN; i++) buf1[i] = i & 0xff; hal_dcache_clean_invalidate((unsigned long)buf1, DMA_TEST_LEN); hal_dcache_clean_invalidate((unsigned long)buf2, DMA_TEST_LEN); /* request dma chan */ ret = hal_dma_chan_request(&hdma); if (ret == HAL_DMA_CHAN_STATUS_BUSY) { hal_log_err("dma channel busy!"); goto end; } /* register dma callback */ ret = hal_dma_callback_install(hdma, dma_test_cb, hdma); if (ret != HAL_DMA_STATUS_OK) { hal_log_err("register dma callback failed!"); goto end; } config.direction = DMA_MEM_TO_MEM; config.dst_addr_width = DMA_SLAVE_BUSWIDTH_8_BYTES; config.src_addr_width = DMA_SLAVE_BUSWIDTH_8_BYTES; config.dst_maxburst = DMA_SLAVE_BURST_16; config.src_maxburst = DMA_SLAVE_BURST_16; config.slave_id = sunxi_slave_id(DRQDST_SDRAM, DRQSRC_SDRAM); ret = hal_dma_slave_config(hdma, &config); if (ret != HAL_DMA_STATUS_OK) { hal_log_err("dma config error, ret:%d", ret); goto end; } ret = hal_dma_prep_memcpy(hdma, (unsigned long)buf2, (unsigned long)buf1, DMA_TEST_LEN); if (ret != HAL_DMA_STATUS_OK) { hal_log_err("dma prep error, ret:%d", ret); goto end; } ret = hal_dma_start(hdma); if (ret != HAL_DMA_STATUS_OK) { hal_log_err("dma start error, ret:%d", ret); goto end; } while (hal_dma_tx_status(hdma, &size)!= 0); ret = hal_dma_stop(hdma); if (ret != HAL_DMA_STATUS_OK) { hal_log_err("dma stop error, ret:%d", ret); goto end; } ret = hal_dma_chan_free(hdma); if (ret != HAL_DMA_STATUS_OK) { hal_log_err("dma free error, ret:%d", ret); goto end; } hal_dcache_invalidate((unsigned long)buf2, DMA_TEST_LEN); hal_log_info("src buf:\n"); for (i = 0;i < DMA_TEST_LEN; i++) { if (i % 16 == 0) printf("\n"); printf("%02x ", buf1[i]); } printf("\n\n\n"); hal_log_info("dst buf:\n"); for (i = 0;i < DMA_TEST_LEN; i++) { if (i % 16 == 0) printf("\n"); printf("%02x ", buf2[i]); } printf("\n\n\n"); if (memcmp(buf1, buf2, DMA_TEST_LEN) != 0) printf("dma test fail\n"); else printf("dma test pass\n"); end: dma_free_coherent(buf1); dma_free_coherent(buf2); return 0; } FINSH_FUNCTION_EXPORT_CMD(cmd_test_dma, hal_dma, dma hal APIs tests) ``` ## 常见问题 1. 使用时出现数据搬运后数据为 0 的情况 确保传输内存使用 `dma_alloc_coherent` 申请
此帖出自
国产芯片交流论坛
点赞
关注
(1)
回复
分享
扫一扫,分享给好友
复制链接分享
链接复制成功,分享给好友
举报
提升卡
变色卡
千斤顶
返回列表
发新帖
回复
您需要登录后才可以回帖
登录
|
注册
发表回复
回帖后跳转到最后一页
浏览过的版块
DSP 与 ARM 处理器
活动
更多>>
有奖直播报名中!抢占工业4.1先机,WT·世健科技日等你来!
罗姆有奖直播 | 重点解析双极型晶体管的实用选型方法和使用方法
STM32N6终于要发布了,ST首款带有NPU的MCU到底怎么样,欢迎小伙们来STM32全球线上峰会寻找答案!
免费下载 | 安森美电动汽车充电白皮书,看碳化硅如何缓解“里程焦虑”!
是德科技有奖直播 | 应对未来高速算力芯片的设计与测试挑战
TI 有奖直播 | 使用基于 Arm 的 AM6xA 处理器设计智能化楼宇
安世半导体理想二极管与负载开关,保障物联网应用的稳健高效运行
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
开源项目
更多>>
集成网口与桌充的USB3.2 Gen2扩展坞-前后面板
VNH7070AS评估板
SG117 1.5A 三端可调稳压器改善纹波抑制的典型应用
【训练营_基础班】基于STC12的32层RGB广州塔设计
智能语音识别避障机器人
4寸面板86盒最小系统板 iKun专属
LT3091MPFE 线性稳压器的典型应用,使用较低值的 RSET 以实现较高的输出电压
LTC4264 演示板,具有 750mA 电流限制的高功率 PD 接口控制器
ADZS-21489-EZBRD、基于SHARC数字信号处理器(DSP)的ADSP-21489 EZ-Board评估系统
2017电赛K题-单相用电器分析-设计方案及报告(国奖3篇)
随便看看
全志R128 SDK HAL 模块开发指南——Flash Controller
#FlashControllerFlashController为R128内置的一个NorFlash读写控制器,用于控制命令的收发、数据读写和执行XIP,兼容StandardSPI/DualSPI/QuadSPI。R128既可以通过SPI控制器与NorFlash芯片通讯,也可以通过Flash控制器与之通讯。在FlashController前一级加入 ...
全志R128 SDK HAL 模块开发指南之PWM
#PWM##模块介绍脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。PWM具有以下特点:-支持脉冲(脉冲个数可配)、周期和互补对输出;-支持捕捉输入;-带可编 ...
打开BOSS一看,推一大堆深圳的职位
今晚闲着无事,无意间打开BOSS直聘看了一下。明明选了广州的,但是BOSS推荐的广州职位基本上都很鸡肋,反而推送了不少深圳地区的职位过来。难道说广州的电子产业已经快要消亡了?还是说单纯只是年末了,所以招人的公司少。但是,不管怎么说,想要跳槽而且想找 ...
delphi 多格式图像显示
两位595驱动8位共阴极数码管的程序问题
急求:单片机温度控制 英文文献
74HC573在哪个库中啊?
【平头哥RVB2601创意应用开发】网络天气时钟
51单片机编程
深入理解android应用程序的编译过程
查找数据手册?
搜索
EEWorld Datasheet 技术支持
热门标签
源代码
单片机
放大器
TI
ST
电源
分立器件
传感器
测试测量
模拟
液体流量传感器
混合集成电路
汽车防撞系统
过电流继电器
扼流变压器
8050三极管
双面PCB板
三相电源
OpenBlockcc
mppt
相关文章
更多>>
欧洲三大芯片巨头,重新审视供应链
在上周刚刚举办的Electronica 2024 CEO圆桌论坛上,英飞凌,恩智浦以及意法半导体三家芯片巨头CEO齐亮相,三家CEO集体表达了对中美关系的担忧,同时三位也有一个共识,即中国在全球半导
消息称铠侠最快明天获上市批准,市值有望达 7500 亿日元
11 月 21 日消息,路透社报道称,在贝恩资本的支持下,铠侠将于当地时间周五(11 月 22 日)获东京证券交易所上市批准。 根据其 IPO 指示价,铠侠的市值预计达到约 7500 亿日元(当前约
美国政府敲定对格芯 15 亿美元《CHIPS》法案补贴,支持后者提升在美产能
11 月 21 日消息,美国商务部当地时间昨日正式宣布将向格芯 GlobalFoundries 提供合计 15 亿美元(当前约 108.71 亿元人民币)的《CHIPS》法案直接资金,具体补贴发放将
SK 海力士宣布量产全球最高的 321 层 1Tb TLC 4D NAND 闪存,计划 2025 上半年对外出货
UWB上车新花样,无线BMS也能用它?
填补国内空白!中国移动、华为等联合发布首颗GSE DPU芯片
三星电子 NRD-K 半导体研发综合体进机,将导入 ASML High NA EUV 光刻设备
苹果揭秘自研芯片成功原因:竞争对手没法用最新尖端技术
芯片大混战将启:高通、联发科涉足笔记本,AMD 被曝入局手机
Exynos 2600 芯片成关键,消息称三星将打响 2nm 芯片反击战
新帖速递
STM32和无源蜂鸣器播放声音的问题
车规级AECQ200介绍,混合铝电解电容器的选择
嵌入式教程_DSP技术_DSP实验箱操作教程:2-28 搭建轻量级WEB服务器实验
OPA847IDBVR运放器国产替代
AG32VF407测试UART
【得捷电子Follow Me第二期】第一章 收到货物的分享
请问这个红外接收头是什么型号?能用哪个型号代替?谢谢
出售全新未拆封ZYNQ 7Z020 FPGA核心板
用在锂电池供电的水表设置上的LORA模块,当有100块水表集中安装在一个楼道内时,节能
请问一下,当某个端口被设置为 RX0后,这个端口的输入输出方向还有必要设置吗
今年怎么这么难,比疫情时还难,三十了面临失业好迷茫
请教稳压管测试问题
【小华HC32F448测评】关于小华半导体的UART中断发送和PRINTF构造和重定向
【BIGTREETECH PI开发板】 HDMI输出测试
【BIGTREETECH PI开发板】+08.音频测试(zmj)
精选推荐
【2024 DigiKey创意大赛】 超声波感测矩阵 小结
CW32L010学习笔记
帮忙分析下EMI不过的原因
报名剩2天:30套RV1106 Linux开发板(带摄像头),邀您挑战边缘AI~
拯救电源EMI的铁三角:电感、磁珠、电容
开关电源上拉电阻和上拉电阻电路图解
启明云端&触觉智能与您相约2024年慕尼黑国际电子元器件博览会,不见不散!
深度学习框架的相关讨论
[STM32H7R/S]测评 ⑦制作一个NANO EDGE AI STUDIO采集数据使用的Data Logger
启明云端&触觉智能与您相约2024年慕尼黑国际电子元器件博览会,不见不散!
等待很久的STM32N6终于要发布了!
ST首款带有NPU的MCU到底怎么样,欢迎小伙们来STM32全球线上峰会寻找答案!报名峰会,还能赢【开发板、京东卡】呦~12月12日14:00不见不散!
查看 »
有奖直播报名| 高可靠性IGBT新选择 —— 安世半导体650V IGBT
【直播时间】12月19日(周四)下午15:00-16:30
【直播好礼】定制双肩商务包、30元京东卡、吸管玻璃杯
查看 »
安世半导体直播报名中
直播主题:安世半导体理想二极管与负载开关,保障物联网应用的稳健高效运行
直播时间:12月17日(周二)下午14:00
报名就有机会获得:定制双肩商务包、30元京东卡、吸管玻璃杯
查看 »
PI 电源小课堂 | 无 DC-DC 变换实现多路高精度输出反激电源
时间:即日起-12月15日
看视频学习电源干货,答题赢取京东卡!
查看 »
参会有好礼 | 2024 瑞萨电子MCU/MPU工业技术研讨会
深圳站:11月30日(周六)深圳湾万怡酒店
上海站:12月06日(周五)上海喜玛拉雅酒店
奖励设置:现金红包、螺丝刀套装或30元京东卡
查看 »
Littelfuse 新品赋能电子产品安全可靠并高效, 10+挑战等你探索!
Littelfuse 应用赋能星球,覆盖了诸多应用痛点及解决办法,邀请工程师一起探索,解锁更多设计力!
查看 »
下载资料赢好礼!看Vicor模块化电源解决方案如何推动创新
活动时间:即日起-2024年12月31日
如何参与:点击活动页内您想了解的模块,找到资料下载即可参与抽奖,活动结束后统一发奖!
查看 »
有奖活动|英飞凌高密度双相电源模块为高性能运算平台而生
活动时间:即日起-12月15日
活动奖励:蓝牙音箱、氮化镓充电器套装、黑色小背包
查看 »
本月精选下载推荐:
Vishay——选型-汽车级表面贴装和通孔超快整流器
查看 »
本周精选下载推荐:电源管理基础Dummies
本周小编给大家带来一本超简单、超干货的电子书——《电源管理基础Dummies》!内容深入浅出,排版舒服简洁,分分钟能get到电源管理最核心的知识内容。
查看 »
关闭
站长推荐
1
/10
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
电信业务审批[2006]字第258号函
京公网安备 11010802033920号
Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复
返回顶部
返回列表
论坛首页
版块列表
专业技术中心
TI技术论坛
ST传感器与低功耗无线技术论坛
ADI参考电路
DigiKey得捷技术专区
ADI · 世健工业技术
电子技术交流
嵌入式系统
单片机
国产芯片交流
电机驱动控制
FPGA/CPLD
模拟电子
电源技术
PCB技术
RF/无线
传感器
综合技术交流
下载中心专版
大学堂专版
测评中心专版
创意与实践
电子竞赛
DIY/开源硬件专区
淘e淘
创意市集
行业应用
汽车电子
移动便携
医疗电子
工控电子
安防电子
休息一下
聊聊、笑笑、闹闹
工作这点儿事
为我们提意见&公告
EEWorld颁奖专区
信息发布
最新帖子
最新帖子
最新回复
精华
消灭零回复
测评中心
活动中心
积分兑换
E金币兑换
芯积分
厂商专区
TI技术论坛
ST传感器与低功耗无线技术论坛