This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

请教EDMA3 AB-Sync问题

Other Parts Discussed in Thread: OMAP-L138

使用OMAP-L138通过SPI控制两款屏幕:

屏幕1:像素160*128,16比特;

屏幕2:像素320*240,16比特;

均使用EDMA3写入显存数据,屏幕1数据量较小(160*128*2=40960字节),使用A Sync模式,屏幕2数据量较大(320*240*2=153600字节),使用AB Sync模式。按照表格中配置DMA参数,屏幕1可以正常显示,屏幕2却不能正常显示且程序卡死。请问我的参数是不是配置的不正确,或者除了Param这几个寄存器,使用AB Sync模式还需要配置哪些寄存器,请高手指点,不胜感激。

屏幕1

屏幕2

param.opt =EDMA_TCC(channel);

param.src = dma_phyaddr;
param.dst = spi_phyaddr;

param.a_b_cnt = (20480 << 16) | 2;
param.src_dst_bidx = 0x00000002;
param.link_bcntrld = 0x0000FFFF;
param.src_dst_cidx = 0;
param.ccnt = 1;

edma_write_slot(channel, &param);
edma_link(channel, dummy_slot);

edma_write_slot(dummy_slot, &param);
edma_link(dummy_slot, dummy_slot);

param.opt =EDMA_TCC(channel) | SYNCDIM;

param.src = dma_phyaddr;
param.dst = spi_phyaddr;


param.a_b_cnt = (240 << 16) | 2;
param.src_dst_bidx = 0x00000002;
param.link_bcntrld = 0x0000FFFF;
param.src_dst_cidx = 480;
param.ccnt = 320;

edma_write_slot(channel, &param);
edma_link(channel, dummy_slot);

edma_write_slot(dummy_slot, &param);
edma_link(dummy_slot, dummy_slot);

再次附上屏幕2的参数配置:

#define ACNT 2
#define BCNT 240
#define CCNT 320
#define BCNTRLD 0
#define LINK 0xFFFF
#define DSTBIDX 0
#define SRCBIDX 2
#define DSTCIDX 0
#define SRCCIDX (ACNT * BCNT)

  • 我看手册spruh77a第18.3.4.2 Brusting Peripherals一章举得例子,和我的情况完全相同,但是按照其配置方法,仍然会卡死,也不能正常显示。

  • 转到138论坛寻求支持

  • 多谢支持,已经发到那个区。

    把param按照下面的参数配置:

    param.a_b_cnt = (2 << 16) | 2;
    param.src_dst_bidx = 2;
    param.link_bcntrld = 0x0000FFFF;
    param.src_dst_cidx = 4;
    param.ccnt = 38400;

    屏幕被横竖分成四个相同的区域,每个区域显示一副完整的图像,读取Framebuffer缓冲区,和原图片相同,好像DMA每隔四个像素取一个值传输。

  • 是我想太多了,用A-SYNC就行:


    /* Channel Options Parameters (OPT) Field Descriptions of EDMA3 */
    param.opt =
    #ifdef SPI_DMA_TCINT_ENABLE
    TCINTEN |
    #endif
    EDMA_TCC(channel) /* | SYNCDIM | FWID(3) | SAM | DAM | STATIC | ITCINTEN | TCCHEN | ITCCHEN | TCCMODE */;

    param.src = dma_phyaddr;
    param.dst = spi_phyaddr;

    #define ACNT 2
    #define BCNT 240
    #define CCNT 320

    param.a_b_cnt = (BCNT << 16) | ACNT;
    param.src_dst_bidx = ACNT;
    param.link_bcntrld = (BCNT << 16) | 0xFFFF;
    param.src_dst_cidx = ACNT;
    param.ccnt = CCNT;