imx53CPU的EIM总线的突发读写操作

首先申请一段内存,内存需要是cache。
(volatile u32*)addr = (u32 *)ioremap_cached(phy_addr,len);
我这边申请的内存是页对齐的(一页 = 0x1000),一页可以存放0x1000个字节的数据。
一个地址存放一个字节的数据,所以如果一个物理地址存放4字节数据的话,这个地址长度应该是物理地址长度乘以4。
CPU EIM控制器突发写入数据的操作:
先把数据写到ioremap_cached申请的首地址,
(volatile u32)(addr) = data;
然后开始触发突发操作(以下是我这边的操作),
dmac_map_area(addr,len>>2,1);
dmac_flush_range(addr,addr+(len>>2));
outer_flush_range(__pa(addr),__pa(addr)+(len>>2));
dmac_unmap_area(addr,len>>2,1);
以上代码可以触发突发写操作的信号。
CPU EIM控制器突发读取的操作:
先触发突发操作(以下是我这边的操作),
dmac_map_area(addr,len>>2,2);
dmac_flush_range(addr,addr+(len>>2));
outer_flush_range(__pa(addr),__pa(addr)+(len>>2));
dmac_unmap_area(addr,len>>2,2);
data = (volatile u32)(addr);
以上代码可以触发突发读操作的信号。
这个刷新的长度我选择的是所有可以突发的地址范围。

另外为了保证突发写的数据确实写入了,尽量在突发写入操作之后马上对该地址进行一次突发读的操作。这个可以很大的提高突发写入的成功率。

最后贴一下我这边对EIM的各个寄存器的配置:
void __iomem *iomuxc_base;
u32 reg;
iomuxc_base = ioremap(MX53_BASE_ADDR(IOMUXC_BASE_ADDR), SZ_4K);
if (!iomuxc_base) {
printk(“Couldn’t io map IOMUX Data\n”);
return -1;
}
reg = readl(iomuxc_base + 0x4);
reg &= ~0xfff;
reg |= 0xC4B;
writel(reg,(iomuxc_base + 0x4));
iounmap(iomuxc_base);
片选我选择的三个。

void __iomem *weim_base;
u32 reg;

weim_base = ioremap(MX53_BASE_ADDR(WEIM_BASE_ADDR), SZ_4K);
if (!weim_base) {
printk( “Couldn’t io map EIM\n”);
return -ENXIO;
}

writel(0x40731487, (weim_base + 0x0));
writel(0x02000000, (weim_base + 0x8));
writel(0x00000008, (weim_base + 0xc));
writel(0x02000600, (weim_base + 0x10));
writel(0x40731487, (weim_base + 0x18));
writel(0x04000000, (weim_base + 0x20));
writel(0x00000008, (weim_base + 0x24));
writel(0x02000600, (weim_base + 0x28));
writel(0x40731487, (weim_base + 0x30));
writel(0x04000000, (weim_base + 0x38));
writel(0x00000008, (weim_base + 0x3c));
writel(0x02000600, (weim_base + 0x40));
iounmap(weim_base);

以上代码经过实际验证。

猜你喜欢

转载自blog.csdn.net/IPUV3/article/details/81189943