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);

以上代码经过实际验证。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
imx6是NXP公司推出的一款嵌入式处理器,EIM(External Interface Module)总线是它的一种外部接口模块。EIM总线驱动是指在使用imx6处理器时,为了能够对EIM总线进行读写操作,需要通过驱动程序来控制该总线EIM总线驱动的开发主要包括以下几个方面: 1. 硬件初始化:首先需要对imx6处理器的EIM总线进行初始化设置,包括时钟控制、引脚映射、中断配置等。 2. 寄存器操作:EIM总线读写操作都需要通过对相应的寄存器进行读写来实现。驱动程序需要对这些寄存器进行正确的配置和操作,以实现对EIM总线的控制。 3. 数据传输:驱动程序需要实现数据在EIM总线上的传输。这包括数据的读取和写入,以及相应的时序控制和中断处理等操作。 4. 中断处理:当EIM总线发生中断时,驱动程序需要及时处理。这包括中断触发的条件判断、中断控制的设置和中断服务程序的编写等。 5. 错误处理:在使用EIM总线时可能会遇到一些错误情况,如数据传输错误、中断处理错误等。驱动程序需要具备一定的错误处理能力,以保证系统的正常运行和稳定性。 总之,imx6的EIM总线驱动是为了对该处理器上的EIM总线进行控制而开发的一种软件程序。它通过对硬件的初始化、对寄存器的操作、数据传输和中断处理等,实现了对EIM总线的控制和数据传输功能。这样就能够让开发人员在使用imx6处理器时,方便地进行对外部设备的读写操作
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值