完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
本帖最后由 一只耳朵怪 于 2018-6-21 09:23 编辑
原来在e2e上发的问题,tony让我在这边发一下,麻烦帮我解答一下,谢谢。 Part Number: AM3352 Tool/software: Linux CPU:AM335x Linux Kernel:4.4.10 I'm working on am335x's dma, my goal is to use a gpio interrupt to trigger a EDMA's mem to mem transfer, that copying 8 bytes from GPMC SRAM to ram. The trigger gpio is GP2[29], which is a indirect mapped dma event. I add the dma binding code in dts file: When I use dma_request_chanl() API, I get a hw triggered dma channel but it does not have device_prep_dma_memcpy() function registed. The cap_mask is 0x1E00, which DMA_MEMCPY bit is not set. |
|
相关推荐
4个回答
|
|
|
可以发整体的文件给我吗?我这边测试一下
|
|
|
|
|
|
附件是测试代码 有点乱,没怎么整理 有个init_dma函数有两份,一个是从dts申请通道的的,一个是直接request的 dts配置在上面帖子上 |
|
|
|
|
|
|
|
|
|
|
|
问题自己已经解决 通过自己修改driver/edma.c,为edma的非memcpy通道也配置上mem_to_mem函数指针即可 static void edma_dma_init(struct edma_cc *ecc, bool legacy_mode)[ struct dma_device *s_ddev = &ecc->dma_slave; struct dma_device *m_ddev = NULL; s32 *memcpy_channels = ecc->info->memcpy_channels; int i, j; dma_cap_zero(s_ddev->cap_mask); dma_cap_set(DMA_SLAVE, s_ddev->cap_mask); dma_cap_set(DMA_CYCLIC, s_ddev->cap_mask); if (ecc->legacy_mode && !memcpy_channels) [ dev_warn(ecc->dev, "Legacy memcpy is enabled, things might not workn"); dma_cap_set(DMA_MEMCPY, s_ddev->cap_mask); s_ddev->device_prep_dma_memcpy = edma_prep_dma_memcpy; s_ddev->directions = BIT(DMA_MEM_TO_MEM); ] s_ddev->device_prep_slave_sg = edma_prep_slave_sg; s_ddev->device_prep_dma_cyclic = edma_prep_dma_cyclic; s_ddev->device_alloc_chan_resources = edma_alloc_chan_resources; s_ddev->device_free_chan_resources = edma_free_chan_resources; s_ddev->device_issue_pending = edma_issue_pending; s_ddev->device_tx_status = edma_tx_status; s_ddev->device_config = edma_slave_config; s_ddev->device_pause = edma_dma_pause; s_ddev->device_resume = edma_dma_resume; s_ddev->device_terminate_all = edma_terminate_all; s_ddev->device_synchronize = edma_synchronize; s_ddev->src_addr_widths = EDMA_DMA_BUSWIDTHS; s_ddev->dst_addr_widths = EDMA_DMA_BUSWIDTHS; s_ddev->directions |= (BIT(DMA_DEV_TO_MEM) | BIT(DMA_MEM_TO_DEV)); s_ddev->residue_granularity = DMA_RESIDUE_GRANULARITY_BURST;////////////////////////////////////////////////////// /* cet,liudachuan: try to support mem_to_mem transfer */ s_ddev->device_prep_dma_memcpy = edma_prep_dma_memcpy; s_ddev->directions |= BIT(DMA_MEM_TO_MEM); /* end of mod */////////////////////////////////////////////////////// s_ddev->dev = ecc->dev; INIT_LIST_HEAD(&s_ddev->channels); if (memcpy_channels) [ m_ddev = devm_kzalloc(ecc->dev, sizeof(*m_ddev), GFP_KERNEL); ecc->dma_memcpy = m_ddev; dma_cap_zero(m_ddev->cap_mask); dma_cap_set(DMA_MEMCPY, m_ddev->cap_mask); m_ddev->device_prep_dma_memcpy = edma_prep_dma_memcpy; m_ddev->device_alloc_chan_resources = edma_alloc_chan_resources; m_ddev->device_free_chan_resources = edma_free_chan_resources; m_ddev->device_issue_pending = edma_issue_pending; m_ddev->device_tx_status = edma_tx_status; m_ddev->device_config = edma_slave_config; m_ddev->device_pause = edma_dma_pause; m_ddev->device_resume = edma_dma_resume; m_ddev->device_terminate_all = edma_terminate_all; m_ddev->device_synchronize = edma_synchronize; m_ddev->src_addr_widths = EDMA_DMA_BUSWIDTHS; m_ddev->dst_addr_widths = EDMA_DMA_BUSWIDTHS; m_ddev->directions = BIT(DMA_MEM_TO_MEM); m_ddev->residue_granularity = DMA_RESIDUE_GRANULARITY_BURST; m_ddev->dev = ecc->dev; INIT_LIST_HEAD(&m_ddev->channels); ] else if (!ecc->legacy_mode) [ dev_info(ecc->dev, "memcpy is disabledn"); ] for (i = 0; i < ecc->num_channels; i++) [ struct edma_chan *echan = &ecc->slave_chans; echan->ch_num = EDMA_CTLR_CHAN(ecc->id, i); echan->ecc = ecc; echan->vchan.desc_free = edma_desc_free; if (m_ddev && edma_is_memcpy_channel(i, memcpy_channels)) vchan_init(&echan->vchan, m_ddev); else vchan_init(&echan->vchan, s_ddev); INIT_LIST_HEAD(&echan->node); for (j = 0; j < EDMA_MAX_SLOTS; j++) echan->slot[j] = -1; ]] |
|
|
|
|
只有小组成员才能发言,加入小组>>
550 浏览 0 评论
1613 浏览 0 评论
2047 浏览 0 评论
为啥BQ7693003DBTR芯片在和BQ769X0盒子通讯时收不到信号?
1514 浏览 0 评论
DSP 28027F 开发板 XDS100v2调试探针诊断日志显示了 Error -150 (SC_ERR_FTDI_FAIL)如何解决
1338 浏览 0 评论
AT32F407在USART2 DMA发送数据时,接包接到了要发送的数据,程序还是处于等待传输完成的标识判断中,为什么?
1757浏览 29评论
2783浏览 23评论
请问下tpa3220实际测试引脚功能和官方资料不符,哪位大佬可以帮忙解答下
1724浏览 20评论
请教下关于TAS5825PEVM评估模块原理图中不太明白的地方,寻求答疑
1634浏览 14评论
两个TMP117传感器一个可以正常读取温度值,一个读取的值一直是0,为什么?
1645浏览 13评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-2 15:44 , Processed in 0.931601 second(s), Total 79, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
1813