Power PC 与 zynq数据交互(基于LocalBus)

Power PC 与 zynq数据交互(基于LocalBus)

1、 Power PC 地址空间映射:

实现 Power PC LocalBus控制外部设备,首先要把Power PC的effective address 映射到 device address,这里需要搞清楚两个重要的概念:第一个是LAW,第二个是Power PC的内存管理单元MMU。Power PC为了实现灵活性,实现了地址空间的可配置性,当然这增加了开发的门槛。学校很少见PPC估计第一是价格高,第二是民用领域几乎没有,第三是其复杂的配置。

1.1LAW配置:

搞清楚LAW之前,还要明白Power PC 的内存布局,这里使用P2020说明(e500v2内核)。

There are several address domains within the chip, including the following:
• Logical, virtual, and physical (real) address spaces within the e500 core
• Internal local address space
• Internal configuration, control, and status register (CCSR) address space
• External memory, I/O, and configuration address spaces of the PCI Express link
• External memory address space of serial RapidIO

这是器件手册给出的一些片内地址的说明。逻辑地址、物理地址、虚拟地址是针对MMU来讲的。内部地址和外部地址是ATMU用到的。关于LAW我们需要关心的是我们应用程序写入到CPU的地址,以及外部总线的响应,这是最终的目的。
LAW 全称Local access windows,该器件的作用是定义了一套本地地址访问设备地址的映射表。
Power PC 与 zynq数据交互(基于LocalBus)_第1张图片这是手册上面给出的一个地址表实例,软件开发人员可以通过设置LAW_LAWBARn和LAW_LAWARn来对LAW进行配置。第一个LAW_LAWBARn用来设置对应窗口的高24位基地址。这个比较好理解,需要注意的是P2020的设备地址空间是36位,而且P2020寄存器的赋值是反着来的,不知道是为什么。下面是在vxWorks中的一个串口设置实例:
Power PC 与 zynq数据交互(基于LocalBus)_第2张图片第3行和第5行分别设置了两个目标地址。0xF0000000和0xe80000000.
LAW_LAWARn寄存器是用来设置目标器件类型、映射地址空间大小的。
Power PC 与 zynq数据交互(基于LocalBus)_第3张图片由于我们需要的是LocalBus,因此设为00100.
Power PC 与 zynq数据交互(基于LocalBus)_第4张图片映射地址大小按照该表来设置即可。

1.2MMU配置:

这样就完成了用户空间地址到物理地址的映射。不过不要高兴的太早,中间还有一层MMU,如果不对MMU进行配置,地址是effecitve address是不能直接访问外面的设备的。并且P2020的MMU不能被关闭。
至于P2020 MMU的工作原理,现在还没有很好的认知,只能从之前别人写好的代码去理解怎么使用。


    {
        0xe8000000, 0x0, 0xe8000000,
        _MMU_TLB_TS_0   | _MMU_TLB_SZ_64M  | _MMU_TLB_IPROT   |
        _MMU_TLB_PERM_W | _MMU_TLB_PERM_X   | _MMU_TLB_ATTR_I  |
        _MMU_TLB_ATTR_G
    },
    {
        0xec000000, 0x0, 0xec000000,
        _MMU_TLB_TS_0   | _MMU_TLB_SZ_64M  | _MMU_TLB_IPROT   |
        _MMU_TLB_PERM_W | _MMU_TLB_PERM_X   | _MMU_TLB_ATTR_I  |
        _MMU_TLB_ATTR_G
    },

以上是在VxWorks中的代码级的映射实例。按照vxWorks给出的说明
/* effAddr, Unused, realAddr, ts | size | attributes | permissions /
/
TLB #0. Flash /
/
needed be first entry here */
主要关注第一行。第一个成员是effective address 第二个成员是 为使用,第三个是real address。这三个最关键。还有一个size,其他的先抄下来吧☺我也不懂。

2 LocalBus配置:

2.1硬件配置:

说了这么多,才到了最关键的部分,前面的内容都是在铺垫。如果是ARM处理器,前面几步早就被忽略了。刚开始拿到P2020总想骂NXP搞得这是什么东西,等正正看了一段时间才发现它的灵活性非常高。高配的处理器和低配的处理器很大的差别是寄存器的数量,寄存器就是一系列的功能开关。高配的汽车开关也会多点吧。
看了下手册,P2020的LocalBus控制器有三个功能配置:
在这里插入图片描述
这里我们需要实现的类似于80总线的一种访问形式,80总线是现对于inter CPU来讲的,在Power PC中叫做60x总线,其实都出不多了。
根据手册的描述,GPCM最合适了,FMC是用来控制FLASH的,UPMS没仔细看,类似于内存阵列好像。
接下来重点看下GPCM模式:
Power PC 与 zynq数据交互(基于LocalBus)_第5张图片这个图很关键,指明了要使用GPMC模式,就必须按照这种方式来接线。注意有一个很明显的地方就是P2020的低位数据接到了外设的高位数据 这点不仅是在寄存器设置的时候要注意,硬件连接也要注意。我们这里使用的是zynq,因此不用关系这个问题会带来灾难性的错误,重新配置下管脚约束不就好了。
低位地址线需要锁存器来进行解复用。我们用的是FPGA,可以很灵活的解决这个问题。
Power PC 与 zynq数据交互(基于LocalBus)_第6张图片Power PC 与 zynq数据交互(基于LocalBus)_第7张图片
这里我们的硬件连接直接把P2020的LocalBus接到了xcz7045上面。
再来看一下读写时序:
Power PC 与 zynq数据交互(基于LocalBus)_第8张图片Power PC 与 zynq数据交互(基于LocalBus)_第9张图片看起来很简单,不分析时序了,直接在zynq上面编码就好了。
这里还有很重要的一步,配置LocalBus的功能寄存器。
LocalBus只需要配置两个寄存器eLBC_BR0和eLBC_ORg0,注意后面的数字代表的是对应的硬件管脚上面的片选信号。
Power PC 与 zynq数据交互(基于LocalBus)_第10张图片
看到了吧,这里主要用了LCS2。
eLBC_BR0寄存器设置了基地址、总行功能模式、ECC校验、写保护、Machine select以及Valid bit。
eLBC_ORg0寄存器配置了AM(地址掩码)以及访问时序。
根据器件手册以及我们要实现的功能,在vxWorks中对这两个寄存器做如下配置:
在这里插入图片描述
这里重0xe9000000映射了1M字节的空间到外设。

2.2信号的抓取验证:

首先把示波器调成下降沿触发,接到CS2管脚上。激活触发,等待下降沿的到来。然后在shell中输入d 0xe9000000,这时候,vxWorks会读取0xe9000000上面的数据,如果LAW、MMU、LBS都配置正确,CS引脚会被拉低。

3 FPGA部分程序设计:

3.1设计思路:

1、先把信号全部设置成input,通过ILA来抓取信号,观察信号的规律;
2、根据抓取到的信号进行解复用,解析出地址和数据;
3、写接口只要在写使能信号有效的时刻,准备好相应的数据即可;

下图是在0xe9000000上面写了0x1234
Power PC 与 zynq数据交互(基于LocalBus)_第11张图片可以看到信号与时序图相符合。
再来看一下读信号:
Power PC 与 zynq数据交互(基于LocalBus)_第12张图片下面是解复用的逻辑

always @(negedge ps_clk)
begin
 if(LALE)
    address_high<={LA[0],LA[1],LA[2],LA[3],LA[4],LA[5],LA[6],LA[7],LA[8],LA[9],LA[10],LA[11],LA[12],LA[13],LA[14],LA[15]};
 else ;
 if(LWE0_N==1'b0)
    data<={LA[0],LA[1],LA[2],LA[3],LA[4],LA[5],LA[6],LA[7],LA[8],LA[9],LA[10],LA[11],LA[12],LA[13],LA[14],LA[15]};
 else ;
end 

4总结一下:

第一步,搞清Power PC的地址空间映射;
第二步,看懂LocalBus协议;
第三步,使用合适的器件对协议进行解析;

你可能感兴趣的:(FPGA,vxworks,底层驱动)