Blackfin通过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的寄存器更改大小和起始地址。

转载于:https://www.cnblogs.com/aerolong/archive/2004/06/13/15327.html

你可能感兴趣的:(Blackfin通过PCI访问host)