XWOS API  4.0
XWOS C/C++ API参考手册
载入中...
搜索中...
未找到
dma.c
浏览该文件的文档.
1
21#include <xwcd/ds/standard.h>
22#include <string.h>
23#include <xwcd/ds/soc/dma.h>
24
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}
52
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}
75
77xwer_t xwds_dma_cfg(struct xwds_soc * soc, xwid_t ch, void * cfg,
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}
117
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}
139
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}
161
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}
183
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}
xwer_t xwds_dma_disable(struct xwds_soc *soc, xwid_t ch)
XWDS API:关闭DMA的通道
Definition dma.c:141
xwer_t xwds_dma_start(struct xwds_soc *soc, xwid_t ch)
XWDS API:启动DMA的通道
Definition dma.c:163
xwer_t xwds_dma_req(struct xwds_soc *soc, xwid_t ch)
XWDS API:申请DMA的通道
Definition dma.c:26
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的通道
Definition dma.c:77
xwer_t xwds_dma_rls(struct xwds_soc *soc, xwid_t ch)
XWDS API:释放DMA的通道
Definition dma.c:54
xwer_t xwds_dma_enable(struct xwds_soc *soc, xwid_t ch)
XWDS API:打开DMA的通道
Definition dma.c:119
xwer_t xwds_dma_stop(struct xwds_soc *soc, xwid_t ch)
XWDS API:停止DMA的通道
Definition dma.c:185
玄武设备栈:SOC:DMA
xwer_t xwds_soc_grab(struct xwds_soc *soc)
XWDS API:增加对象的引用计数
Definition chip.c:71
void * xwds_dma_cbarg_t
DMA完成回调函数参数
Definition chip.h:154
void(* xwds_dma_f)(struct xwds_soc *, xwid_t, xwu32_t, xwds_dma_cbarg_t)
DMA完成回调函数类型
Definition chip.h:159
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_api
Definition standard.h:33
#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
#define NULL
Definition type.h:28
unsigned long xwid_t
Definition type.h:481
#define XWOS_UNUSED(x)
Definition standard.h:66
const struct xwds_driver * drv
Definition device.h:133
BSP中需要提供的SOC设备驱动函数表
Definition chip.h:51
SOC设备
Definition chip.h:167
struct xwds_device dev
Definition chip.h:168
玄武设备栈:顶级头文件