XWOS API  4.0
XWOS C/C++ API参考手册
载入中...
搜索中...
未找到
dma.c 文件参考

玄武设备栈:SOC:DMA 更多...

#include <xwcd/ds/standard.h>
#include <string.h>
#include <xwcd/ds/soc/dma.h>
dma.c 的引用(Include)关系图:

浏览源代码.

函数

xwer_t xwds_dma_req (struct xwds_soc *soc, xwid_t ch)
 XWDS API:申请DMA的通道
 
xwer_t xwds_dma_rls (struct xwds_soc *soc, xwid_t ch)
 XWDS API:释放DMA的通道
 
xwer_t xwds_dma_cfg (struct xwds_soc *soc, xwid_t ch, void *cfg, xwds_dma_f cb, xwds_dma_cbarg_t arg)
 XWDS API:配置DMA的通道
 
xwer_t xwds_dma_enable (struct xwds_soc *soc, xwid_t ch)
 XWDS API:打开DMA的通道
 
xwer_t xwds_dma_disable (struct xwds_soc *soc, xwid_t ch)
 XWDS API:关闭DMA的通道
 
xwer_t xwds_dma_start (struct xwds_soc *soc, xwid_t ch)
 XWDS API:启动DMA的通道
 
xwer_t xwds_dma_stop (struct xwds_soc *soc, xwid_t ch)
 XWDS API:停止DMA的通道
 

详细描述

玄武设备栈:SOC:DMA

作者

在文件 dma.c 中定义.

函数说明

◆ xwds_dma_req()

xwer_t xwds_dma_req ( struct xwds_soc soc,
xwid_t  ch 
)

XWDS API:申请DMA的通道

参数
[in]socSOC对象指针
[in]chDMA通道
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ERANGE无效的DMA通道
-EBUSYDMA通道繁忙
注解
  • 上下文:中断、中断底半部、线程

<No error

在文件 dma.c26 行定义.

27{
28 const struct xwds_soc_driver * drv;
29 xwer_t rc;
30
31 XWDS_VALIDATE(soc, "nullptr", -EFAULT);
32 XWDS_VALIDATE(((xwid_t)ch < soc->dma.ch_num), "out-of-range", -ERANGE);
33
34 rc = xwds_soc_grab(soc);
35 if (rc < 0) {
36 goto err_soc_grab;
37 }
38 drv = xwds_cast(const struct xwds_soc_driver *, soc->dev.drv);
39 if ((drv) && (drv->dma_req)) {
40 rc = drv->dma_req(soc, ch);
41 if (rc < 0) {
42 goto err_drv_dma_req;
43 }
44 }
45 return XWOK;
46
47err_drv_dma_req:
48 xwds_soc_put(soc);
49err_soc_grab:
50 return rc;
51}
xwer_t xwds_soc_grab(struct xwds_soc *soc)
XWDS API:增加对象的引用计数
Definition chip.c:71
xwer_t xwds_soc_put(struct xwds_soc *soc)
XWDS API:减少对象的引用计数
Definition chip.c:77
#define xwds_cast(type, dev)
Definition standard.h:40
#define XWDS_VALIDATE(exp, errstr,...)
Definition standard.h:51
#define EFAULT
Bad address
Definition errno.h:44
#define XWOK
No error
Definition errno.h:182
#define ERANGE
Result too large
Definition errno.h:64
signed long xwer_t
Definition type.h:554
unsigned long xwid_t
Definition type.h:481
const struct xwds_driver * drv
Definition device.h:133
BSP中需要提供的SOC设备驱动函数表
Definition chip.h:51
struct xwds_device dev
Definition chip.h:168
函数调用图:

◆ xwds_dma_rls()

xwer_t xwds_dma_rls ( struct xwds_soc soc,
xwid_t  ch 
)

XWDS API:释放DMA的通道

参数
[in]socSOC对象指针
[in]chDMA通道
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ERANGE无效的DMA通道
-EPERMDMA通道未被使用
注解
  • 上下文:中断、中断底半部、线程

<No error

在文件 dma.c54 行定义.

55{
56 const struct xwds_soc_driver * drv;
57 xwer_t rc;
58
59 XWDS_VALIDATE(soc, "nullptr", -EFAULT);
60 XWDS_VALIDATE(((xwid_t)ch < soc->dma.ch_num), "out-of-range", -ERANGE);
61
62 drv = xwds_cast(const struct xwds_soc_driver *, soc->dev.drv);
63 if ((drv) && (drv->dma_rls)) {
64 rc = drv->dma_rls(soc, ch);
65 if (rc < 0) {
66 goto err_drv_dma_rls;
67 }
68 }
69 xwds_soc_put(soc);
70 return XWOK;
71
72err_drv_dma_rls:
73 return rc;
74}
函数调用图:

◆ xwds_dma_cfg()

xwer_t xwds_dma_cfg ( struct xwds_soc soc,
xwid_t  ch,
void *  cfg,
xwds_dma_f  cb,
xwds_dma_cbarg_t  arg 
)

XWDS API:配置DMA的通道

参数
[in]socSOC对象指针
[in]chDMA通道
[in]cfgSOC DMA通道配置
[in]cb传输结束回调函数
[in]cfg回调函数参数
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ERANGE无效的DMA通道
-EPERMDMA通道未被使用
注解
  • 上下文:中断、中断底半部、线程

<No error

在文件 dma.c77 行定义.

79{
80 const struct xwds_soc_driver * drv;
81 xwer_t rc;
82
83 XWDS_VALIDATE(soc, "nullptr", -EFAULT);
84 XWDS_VALIDATE(((xwid_t)ch < soc->dma.ch_num), "out-of-range", -ERANGE);
85
86#if defined(XWCDCFG_ds_SOC_DMA_ROCBT) && (1 == XWCDCFG_ds_SOC_DMA_ROCBT)
87 XWOS_UNUSED(cb);
88 XWOS_UNUSED(arg);
89#else
90 if (soc->dma.chcbs) {
91 soc->dma.chcbs[ch] = cb;
92 }
93 if (soc->dma.chcbargs) {
94 soc->dma.chcbargs[ch] = arg;
95 }
96#endif
97 drv = xwds_cast(const struct xwds_soc_driver *, soc->dev.drv);
98 if ((drv) && (drv->dma_cfg)) {
99 rc = drv->dma_cfg(soc, ch, cfg);
100 if (rc < 0) {
101 goto err_drv_dma_cfg;
102 }
103 }
104 return XWOK;
105
106err_drv_dma_cfg:
107#if !defined(XWCDCFG_ds_SOC_DMA_ROCBT) || (1 != XWCDCFG_ds_SOC_DMA_ROCBT)
108 if (soc->dma.chcbs) {
109 soc->dma.chcbs[ch] = NULL;
110 }
111 if (soc->dma.chcbargs) {
112 soc->dma.chcbargs[ch] = NULL;
113 }
114#endif
115 return rc;
116}
#define NULL
Definition type.h:28
#define XWOS_UNUSED(x)
Definition standard.h:66

◆ xwds_dma_enable()

xwer_t xwds_dma_enable ( struct xwds_soc soc,
xwid_t  ch 
)

XWDS API:打开DMA的通道

参数
[in]socSOC对象指针
[in]chDMA通道
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ERANGE无效的DMA通道
-EPERMDMA通道未被使用
注解
  • 上下文:中断、中断底半部、线程

<No error

在文件 dma.c119 行定义.

120{
121 const struct xwds_soc_driver * drv;
122 xwer_t rc;
123
124 XWDS_VALIDATE(soc, "nullptr", -EFAULT);
125 XWDS_VALIDATE(((xwid_t)ch < soc->dma.ch_num), "out-of-range", -ERANGE);
126
127 drv = xwds_cast(const struct xwds_soc_driver *, soc->dev.drv);
128 if ((drv) && (drv->dma_enable)) {
129 rc = drv->dma_enable(soc, ch);
130 if (rc < 0) {
131 goto err_drv_dma_enable;
132 }
133 }
134 return XWOK;
135
136err_drv_dma_enable:
137 return rc;
138}

◆ xwds_dma_disable()

xwer_t xwds_dma_disable ( struct xwds_soc soc,
xwid_t  ch 
)

XWDS API:关闭DMA的通道

参数
[in]socSOC对象指针
[in]chDMA通道
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ERANGE无效的DMA通道
-EPERMDMA通道未被使用
注解
  • 上下文:中断、中断底半部、线程

<No error

在文件 dma.c141 行定义.

142{
143 const struct xwds_soc_driver * drv;
144 xwer_t rc;
145
146 XWDS_VALIDATE(soc, "nullptr", -EFAULT);
147 XWDS_VALIDATE(((xwid_t)ch < soc->dma.ch_num), "out-of-range", -ERANGE);
148
149 drv = xwds_cast(const struct xwds_soc_driver *, soc->dev.drv);
150 if ((drv) && (drv->dma_disable)) {
151 rc = drv->dma_disable(soc, ch);
152 if (rc < 0) {
153 goto err_drv_dma_disable;
154 }
155 }
156 return XWOK;
157
158err_drv_dma_disable:
159 return rc;
160}

◆ xwds_dma_start()

xwer_t xwds_dma_start ( struct xwds_soc soc,
xwid_t  ch 
)

XWDS API:启动DMA的通道

参数
[in]socSOC对象指针
[in]chDMA通道
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ERANGE无效的DMA通道
-EPERMDMA通道未被使用
注解
  • 上下文:中断、中断底半部、线程

<No error

在文件 dma.c163 行定义.

164{
165 const struct xwds_soc_driver * drv;
166 xwer_t rc;
167
168 XWDS_VALIDATE(soc, "nullptr", -EFAULT);
169 XWDS_VALIDATE(((xwid_t)ch < soc->dma.ch_num), "out-of-range", -ERANGE);
170
171 drv = xwds_cast(const struct xwds_soc_driver *, soc->dev.drv);
172 if ((drv) && (drv->dma_start)) {
173 rc = drv->dma_start(soc, ch);
174 if (rc < 0) {
175 goto err_drv_dma_start;
176 }
177 }
178 return XWOK;
179
180err_drv_dma_start:
181 return rc;
182}

◆ xwds_dma_stop()

xwer_t xwds_dma_stop ( struct xwds_soc soc,
xwid_t  ch 
)

XWDS API:停止DMA的通道

参数
[in]socSOC对象指针
[in]chDMA通道
返回
错误码
返回值
XWOK没有错误
-EFAULT无效指针
-ERANGE无效的DMA通道
-EPERMDMA通道未被使用
注解
  • 上下文:中断、中断底半部、线程

<No error

在文件 dma.c185 行定义.

186{
187 const struct xwds_soc_driver * drv;
188 xwer_t rc;
189
190 XWDS_VALIDATE(soc, "nullptr", -EFAULT);
191 XWDS_VALIDATE(((xwid_t)ch < soc->dma.ch_num), "out-of-range", -ERANGE);
192
193 drv = xwds_cast(const struct xwds_soc_driver *, soc->dev.drv);
194 if ((drv) && (drv->dma_stop)) {
195 rc = drv->dma_stop(soc, ch);
196 if (rc < 0) {
197 goto err_drv_dma_stop;
198 }
199 }
200 return XWOK;
201
202err_drv_dma_stop:
203 return rc;
204}