MCPcopy Create free account
hub / github.com/RT-Thread/rt-thread / rt_dma_chan_config

Function rt_dma_chan_config

components/drivers/dma/dma.c:146–206  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

144}
145
146rt_err_t rt_dma_chan_config(struct rt_dma_chan *chan,
147 struct rt_dma_slave_config *conf)
148{
149 rt_err_t err;
150 struct rt_dma_controller *ctrl;
151 enum rt_dma_transfer_direction dir;
152
153 if (!chan || !conf)
154 {
155 err = -RT_EINVAL;
156 goto _end;
157 }
158
159 dir = conf->direction;
160
161 if (dir >= RT_DMA_DIR_MAX)
162 {
163 err = -RT_EINVAL;
164 goto _end;
165 }
166
167 if (conf->src_addr_width >= RT_DMA_SLAVE_BUSWIDTH_BYTES_MAX ||
168 conf->dst_addr_width >= RT_DMA_SLAVE_BUSWIDTH_BYTES_MAX)
169 {
170 err = -RT_EINVAL;
171 goto _end;
172 }
173
174 ctrl = chan->ctrl;
175
176 if (!rt_bitmap_test_bit(ctrl->dir_cap, dir))
177 {
178 err = -RT_ENOSYS;
179 goto _end;
180 }
181
182 if (!chan->name && dir != RT_DMA_MEM_TO_MEM)
183 {
184 LOG_E("%s: illegal config for uname channels",
185 rt_dm_dev_get_name(ctrl->dev));
186
187 err = -RT_EINVAL;
188 goto _end;
189 }
190
191 rt_mutex_take(&ctrl->mutex, RT_WAITING_FOREVER);
192
193 err = ctrl->ops->config(chan, conf);
194
195 rt_mutex_release(&ctrl->mutex);
196
197 if (!err)
198 {
199 rt_memcpy(&chan->conf, conf, sizeof(*conf));
200 }
201
202_end:
203 chan->conf_err = err;

Callers

nothing calls this directly

Calls 5

rt_bitmap_test_bitFunction · 0.85
rt_dm_dev_get_nameFunction · 0.85
rt_mutex_takeFunction · 0.85
rt_mutex_releaseFunction · 0.85
rt_memcpyFunction · 0.85

Tested by

no test coverage detected