首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

Blackfin通过PCI访问host

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) { if(i==15) { flag = 1; return; } i++; } else { if(i=0) { Addr = &(Addr[i+1]); } else { Addr = &(Addr); i=0; } } } 结果没有成功。据我分析,原因可能为以下几条: 1、使用JTAG方式调DSP程序时,会复位blackfin的内核,同时复位blackfin的PCI核,这时无法访问PCI空间; 2、默认的blackfin的工作模式是设备模式,作为PCI总线的从设备,blackfin无法访问PCI host端的内存空间; 3、默认的地址映射窗口不正确,致使host端写入的数组不在窗口的范围里,blackfin无法看到。 解决PCI&JTAG的问题后,问题解决。结果如我所预想的一样,在Target端将Host端的内存地址加上0xe0000000访问即可。 最终内存映射图为:Host映射在Target的窗口有128MB,它的0x00000000——0x07FFFFFF映射在Target的地址范围0xE0000000——0xE7FFFFFF上。Target映射在Host的窗口有64MB,它的0xF0000000——0xF3FFFFFF映射在Host的地址范围0xE4000000——0xE7FFFFFF上。Target被映射的窗口(一段内存空间),可以通过DSP的寄存器更改大小和起始地址。
芯片是死的,人是活的,人是很厉害的, 你说那?
返回列表