通过PCI访问host
在Blackfin DSP的内部/外部存储器映射图中,Balckfin用一个128MB的窗口来观察4G的PCI存储空间的一部分。基地址寄存器可以把窗口定位在4GB的PCI存储空间的任何地方,且对应于Blackfin的地址保持不变。为0xE0000000——0xE7FFFFFF。现在,我需要知道blackfin的内存空间和host的内存空间的映射关系。于是我使用下面这种方法:首先,在host端写一个32位的数组,数组中的元素的值与其下标相同,得到这个数组的首地址;然后,在blackfin端写一个小程序,扫描这128MB的窗口,找到这个数组,得到首地址。这样,就得到了内存空间的映射关系。blackfin端的程序如下:(写得很恶心,谁能优化一下?)
unsigned long *Addr;
unsigned long Bytes;
int i = 0;
int flag = 0;
(unsigned long)Addr = 0xe0000000;
for(Bytes=0;Bytes<0x7ffffff;Bytes++)
{
if(Addr[i]==i)
{
if(i==15)
{
flag = 1;
return;
}
i++;
}
else
{
if(i=0)
{
Addr = &(Addr[i+1]);
}
else
{
Addr = &(Addr[i]);
i=0;
}
}
}
结果没有成功。据我分析,原因可能为以下几条:
1、使用JTAG方式调DSP程序时,会复位blackfin的内核,同时复位blackfin的PCI核,这时无法访问PCI空间;
2、默认的blackfin的工作模式是设备模式,作为PCI总线的从设备,blackfin无法访问PCI host端的内存空间;
3、默认的地址映射窗口不正确,致使host端写入的数组不在窗口的范围里,blackfin无法看到。
续(2004.7.7)
解决PCI&JTAG的问题后,问题解决。结果如我所预想的一样,在Target端将Host端的内存地址加上0xe0000000访问即可。
最终内存映射图为:Host映射在Target的窗口有128MB,它的0x00000000——0x07FFFFFF映射在Target的地址范围0xE0000000——0xE7FFFFFF上。Target映射在Host的窗口有64MB,它的0xF0000000——0xF3FFFFFF映射在Host的地址范围0xE4000000——0xE7FFFFFF上。Target被映射的窗口(一段内存空间),可以通过DSP的寄存器更改大小和起始地址。