社区首页
技术讨论创新帖
全部新帖
资料区
社区活动
联系管理员
★ 社区积分制度
★ 新手必读
★ 申请版主★
请
登录
后使用快捷导航
没有帐号?
注册
首页
|
电子技术
|
嵌入式
模拟电子
单片机
电源管理
传感器
半导体
电子应用
|
工业控制
物联网
汽车电子
网络通信
医疗电子
手机便携
测试测量
安防电子
家用电子
机器人
新能源
电子头条
|
社区
|
论坛
测评
博客
大学堂
|
下载
|
下载中心
电路图
精品文集
电路图
|
参考设计
|
Datasheet
|
活动
|
直播
datasheet
datasheet
文章
搜索
登录
注册
中文
En
论坛
切换旧版
电子工程世界-论坛
»
论坛
›
电子技术交流
›
国产芯片交流
›
全志R128 SDK HAL 模块开发指南——DMA Controller
返回列表
发新帖
回复
阅
467
|
回
0
aleksib
当前离线
纯净的硅(中级)
最后登录
2025-1-6
在线时间
40 小时
威望
998分
芯积分
511分
(兑换)
E金币
0枚
(兑换)
(兑换)
好友
0
aleksib
287
帖子
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)
回复
分享
扫一扫,分享给好友
复制链接分享
链接复制成功,分享给好友
举报
提升卡
变色卡
千斤顶
返回列表
发新帖
回复
您需要登录后才可以回帖
登录
|
注册
发表回复
回帖后跳转到最后一页
活动
更多>>
Microchip 直播|多相降压电源控制技术的发展与探讨 报名中!
安世半导体智能工业应用探索站,闯关赢好礼!
PI 电源小课堂:集成式半桥驱动IC BridgeSwitch 2, 助力高效永磁同步电机逆变器的设计
Microchip喊你探索dsPIC33A 芯片,70份好礼等你赢!
【瓜分2500元红包】票选2024 DigiKey “感知万物,乐享生活”创意大赛人气作品TOP3!
DigiKey应用探索站重磅上线!潮流应用,硬核技术探秘,N多干货,一站get!
验证并选择心仪MOSFET,探寻选型奥秘!注册、体验双重好礼等你拿~
免费申请测评 | 泰坦触觉 TITAN Core开发套件
开源项目
更多>>
使用 NXP Semiconductors 的 MC10XS6325EK 的参考设计
LTC2946CMS-1 双向功率监视器的典型应用,在正向路径中具有能量和电荷监视器
LT8609EMSE 3.3V 降压型稳压器的典型应用电路
IR4322 2CH集成D类音频放大器典型应用
OP184FSZ-REEL 3V 单电源、50Hz 至 60Hz 有源陷波滤波器和假接地的典型应用
【DDS模块】AD9834
使用 Richtek Technology Corporation 的 RT9261 的参考设计
LTC2875、60V 故障保护 3.3V 或 5V 25kV ESD 高速 CAN 收发器的典型应用
STLink V2.1_chamge
【RA】数显收音机
随便看看
大规模语言模型从理论到实践第一章绪论
#大规模语言模型#基本概念#发展历程#构建流程#内容安排大语言模型是一种由包含数百亿个及以上参数的深度神经网络构建的语言模型,通常使用自监督学习方法通过大量无标注文本进行训练。2018年以来,Google、OpenAI、Meta、百度、华为等公司和研究机构相继发布了 ...
IntraWeb_v7.0.11
USBCamera 摄像头 拍照采集程序
[国民技术N32WB452测评]四.LCD显示DVP采集图像
CC430家庭用户指南
小车
(转)Just for fun (1)
约饭走起!12月20日晚EEWorld网友深圳线下聚餐,快来报名啦~~
查找数据手册?
搜索
EEWorld Datasheet 技术支持
热门标签
源代码
单片机
放大器
TI
ST
电源
分立器件
传感器
测试测量
模拟
深度学习基础教程
电流压力转换器
数字万用表
开停传感器
谐振电抗器
实心电位器
高压开关
电流密度
钮扣电池
BIOS
相关文章
更多>>
苹果M4 Mac mini曝出USB-C接口问题!随机间歇性断开连接
1月17日消息,苹果M4 Mac mini自2024年底发布以来,收获了不少好评,然而近期一些用户在使用过程中发现,该设备的USB-C接口似乎存在连接性问题,给使用带来了不便。 有用户反映M4 Ma
消息称 SK 海力士有望 2 月启动业界最先进 1c nm 制程 DRAM 内存量产
1 月 17 日消息,韩媒 MT(IT之家注:全称 MoneyToday)当地时间今日报道称,SK 海力士近日已成功完成内存业界最先进 1c 纳米制程 DRAM 的批量产品认证,连续多个以 25 块
未经同意出售用户数据,通用汽车遭美国 FTC 处罚
1 月 17 日消息,当地时间周四,美国联邦贸易委员会(FTC)宣布通用汽车及其子公司 OnStar 因未经用户同意出售用户位置和驾驶行为数据,因此将对其进行处罚,包括在五年内禁止向消费者报告机构披
日本三井住友银行推出半导体设备抵押贷款,铠侠已率先获益
联想宣布收购Infinidat,扩充高端企业存储业务
台积电董事长:我们不是美积电 最先进制程不会搬到美国
曝台积电拒绝代工三星Exynos处理器:理由是怕泄密
SK 海力士被曝上半年削减 10% NAND 闪存产量
苹果加入UALink联盟 成员含AMD、英特尔、谷歌等公司
英特尔宣布将逐渐停产第 12 代 Alder Lake 移动处理器,覆盖酷睿、奔腾及赛扬
新帖速递
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)
安世半导体智能工业应用探索站,闯关赢好礼!
点击页面内“开始探索”按钮,填写并提交表单;
请根据序号依次完成3个安世半导体智能工业应用的探索,并根据给出的资料完成共计9题(每个应用3题),答对5题以上的玩家即可获得抽奖资格;
每人仅有一次参与答题的机会,请慎重作答,活动结束后,我们将抽取30位玩家赠送礼品。
查看 »
Microchip 直播|多相降压电源控制技术的发展与探讨 报名中!
直播主题:多相降压电源控制技术的发展与探讨
直播时间:2025年2月25日(星期二)上午10:30-11:30
快来报名!
查看 »
回帖赢好礼 | 关于无线技术的那些事儿
【活动时间】即日起—2025年1月31日
【活动好礼】50元京东卡
查看 »
答题赢好礼,PI电源小课堂第3期来啦!
本期内容:集成式半桥驱动IC BridgeSwitch 2, 助力高效永磁同步电机逆变器的设计
活动时间:即日起-2月28日
看视频答题即可赢取京东卡!
查看 »
Microchip喊你探索 dsPIC33A 芯片,70份好礼等你赢!
活动时间:即日起-1月26日
活动奖励:随身Wi-Fi、家用多功能电烤箱、20000mAh充电宝、50元京东卡
查看 »
DigiKey应用探索站重磅上线!潮流应用,硬核技术探秘,N多干货,一站get!
当月好物、热门技术资源、潮流应用技术、特色活动、DigiKey在线实用工具,干货多多~
查看 »
本周精选下载推荐:电源管理基础Dummies
本周小编给大家带来一本超简单、超干货的电子书——《电源管理基础Dummies》!内容深入浅出,排版舒服简洁,分分钟能get到电源管理最核心的知识内容。
查看 »
下载资料赢好礼!看Vicor模块化电源解决方案如何推动创新
活动时间:即日起-2024年12月31日
如何参与:点击活动页内您想了解的模块,找到资料下载即可参与抽奖,活动结束后统一发奖!
查看 »
关闭
站长推荐
1
/8
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
电信业务审批[2006]字第258号函
京公网安备 11010802033920号
Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复
返回顶部
返回列表
论坛首页
版块列表
专业技术中心
TI技术论坛
ST传感器与低功耗无线技术论坛
ADI参考电路
DigiKey得捷技术专区
ADI · 世健工业技术
电子技术交流
嵌入式系统
单片机
国产芯片交流
电机驱动控制
FPGA/CPLD
模拟电子
电源技术
PCB技术
RF/无线
传感器
综合技术交流
下载中心专版
大学堂专版
测评中心专版
创意与实践
电子竞赛
DIY/开源硬件专区
淘e淘
创意市集
行业应用
汽车电子
移动便携
医疗电子
工控电子
安防电子
休息一下
聊聊、笑笑、闹闹
工作这点儿事
为我们提意见&公告
EEWorld颁奖专区
信息发布
最新帖子
最新帖子
最新回复
精华
消灭零回复
测评中心
活动中心
积分兑换
E金币兑换
芯积分
厂商专区
TI技术论坛
ST传感器与低功耗无线技术论坛