基于BM3803处理器平台的PCI软硬件调试问题汇总(持续更新中)
一:相关基本配置:
FPGA: XILINX XC5VFX130T-1FFG1738
PCI接口部分使用XILINX提供的pci32_v4_8硬核;PCI控制器由FPGA逻辑实现,主要完成PCI设备到内存的DMA读写操作。Ps:此控制器网表文件可付费购买(100元/份,支付宝账号:bubble_fish@yeah.net)
处理器:BM3803FMGRH
操作系统:Reworks/Vxworks
二:调试中遇到的问题
1、 IDSEL引脚无信号输入
每个PCI设备都有一个IDSEL的输入信号,这个信号在读写PCI配置寄存器的时候非常有用。但往往很多时候PCI主设备在给从设备写配置寄存器的时候并不会提供一个IDSEL的输出信号。对于非X86架构的处理器,读写PCI配置寄存器不能通过访问config_address(地址0CF8h) config_data(地址0CFCh)的方式。此时需要从AD线上引一根地址线到IDSEL引脚上。例如BM3803上最多允许挂7个PCI从设备,若某个PCI从设备插在1号槽上,则REQ_N接到pci_arb_req[0],IDSEL接到AD[31],此时配置寄存器的起始地址即为0x8000_0000;IDSEL引脚与AD[31]必须在硬件上连好,不能通过FPGA内部逻辑实现连接。依次推演,当插在2号槽时,REQ_N接到pci_arb_req[1],IDSEL接到AD[30],此时配置寄存器的起始地址即为0x4000_0000.
2、 PCI从设备接口上的双向端口要上拉,未使用到的输出引脚要记得赋值
例如"SERR_N"、"PERR_N"、"STOP_N"、"DEVSEL_N"、"TRDY_N"、"IRDY_N"、"FRAME_N" "INTA_N"都上拉。未使用到的pci_arb_req和pci_int要赋相应值。
3、 PCI地址映射问题
地址映射一直是纯硬件工程师或纯软件工程师理解PCI设备最大的障碍。这是一个软硬件相互配合的过程。先从硬件说起,每个PCI设备都有一个配置空间(CONFIG_BAR), 在PCI总线上只有这个配置空间是可见的。配置空间如下图:
若FPGA作为PCI从设备,那么在用coregen生成pci32_v4_8硬核时需要输入Device ID、Vendor ID、BAR0空间的大小。当FPGA挂在BM3803的PCI总线一号槽上时,BM3803可以通过读写0x8000_0000+offset来访问到FPGA的配置空间。三个必须的的配置操作是:DMA_CONFIG_WRITE(0x80000004,0xff00_0147, 0x04)//往0x80000004写入4字节数0xff00_0147。DMA_CONFIG_WRITE(0x80000010,0xD0000000, 0x04)//往0x80000010写入4字节数0xD0000000。DMA_CONFIG_WRITE(0x8000001C,0x40000000, 0x04)//往0x8000001C写入4字节数0x40000000。设置完毕,如果此时BM3803想要读写FPGA的BAR0空间,只需要往0xD000000+offset写数就可以了,具体这个offset有多大由FPGA生成IP核时设置的BAR0空间的大小决定。例如DMA_MEM_WRITE(0xD0001000,0x40000000, 0x04)// 往0xD0001000写入4字节数0x40000000。此时BM3803就会在总线上发起地址为0xD0001000的Memory Write操作,作为从设备的FPGA PCI因为上一步配置过BAR0的基地址为0xD0000000,所以能HIT到这个操作,若发起地址为0xA0001000的Memory Write操作,FPGA是HIT不到的,这个操作一般用来实现主设备通过PCI总线来读写FPGA的寄存器。若FPGA想要通过DMA的方式来写内存,此时FPGA逻辑实现的控制器需要发起一个地址为0x40000000的Memory Write操作,若地址为0x50000000,BM3803是不会响应的,因为BM3803芯片手册设置了BAR3-BAR5为主设备接收数据的内存基地址,上一步我们已经配置了BAR3的基地址为0x40000000。
基于BM3803处理器平台的PCI软硬件调试问题汇总(持续更新中)的更多相关文章
- CNUTCon2017全球运维技术大会(持续更新中) - 斯达克学院 - 实战驱动的 IT 教育平台 - Powered By EduSoho
CNUTCon2017全球运维技术大会(持续更新中) - 斯达克学院 - 实战驱动的 IT 教育平台 - Powered By EduSoho https://new.stuq.org/cours ...
- 读书笔记|Windows 调试原理学习|持续更新
关于调试方面的学习笔记,主要来源于<软件调试>的读书笔记和梦织未来论坛的视频教程 1.调试器使用一个死循环监听调试信息. DebugActiveProcess(PID);while(TRU ...
- 使用ASP.NET Web Api构建基于REST风格的服务实战系列教程【开篇】【持续更新中。。。】
最近发现web api很火,园内也有各种大神已经在研究,本人在asp.net官网上看到一个系列教程,原文地址:http://bitoftech.net/2013/11/25/detailed-tuto ...
- iOS开发调试技巧总结(持续更新中)
作者:乞力马扎罗的雪 原文 对于软件开发而言,调试是必须学会的技能,重要性不言而喻.对于调试的技能,基本上是可以迁移的,也就是说你以前在其他平台上掌握的很多调试技巧,很多也是可以用在iOS开发中.不 ...
- (持续更新中~~~)kafka--消息引擎与分布式流处理平台
kafka概述 kafka是一个分布式的基于发布/订阅模式的消息队列(message queue),一般更愿意称kafka是一款开源的消息引擎系统,只不过消息队列会耳熟一些.kafka主要应用于大数据 ...
- [C#]asp.net开发微信公众平台----目录汇总-持续更新
1.[c#]asp.net微信公众平台开发(1)数据库设计 2.[c#]asp.net微信公众平台开发(2)多层架构框架搭建和入口实现 3.[c#]asp.net微信公众平台开发(3)微信消息封装及反 ...
- tensorflow安装调试总结(持续更新)
这段时间需要部署tensorflow到linux上,由于堡垒机不能连外网,所以pip.apt-get.wget.git统统不能用,然后就是各种调试了,下面整理了一些遇到的问题和解决方案,供大家参考(C ...
- 【转】基于Jenkins实现持续集成【持续更新中】
知识预览 持续集成 Jenkins安装 Jenkins插件 Jenkins配置 Jenkins备份与恢复 发布PHP项目 SVN 发布Maven项目 按版本发布 远程管理 War文件部署设置 任务 J ...
- 基于Jenkins实现持续集成【持续更新中】
持续集成 1.什么是持续集成:Continuous integration (CI)持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生 ...
随机推荐
- 【Python】Java程序员学习Python(二)— 开发环境搭建
巧妇难为无米之炊,我最爱的还是鸡蛋羹,因为我和鸡蛋羹有段不能说的秘密. 不管学啥,都要有环境,对于程序员来说搭建个开发环境应该不是什么难题.按顺序一步步来就可以,我也只是记录我的安装过程,你也可以滴. ...
- LeetCode题解之Find the Difference
1.题目描述 2.题目分析 比较两个字符串中加入的一个字符,由于可能在字符串中加入一个已经存在的字符,因此使用hash table 去统计字符个数最好. 3.代码 char findTheDiffer ...
- 使用 PowerShell 创建和修改 ExpressRoute 线路
开始之前 安装最新版本的 Azure Resource Manager PowerShell cmdlet. 有关详细信息,请参阅 Azure PowerShell 概述. 在开始配置之前,请查看先决 ...
- [VS2008] [.NET 3.5] 如何解决 The imported project "C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.CompactFramework.CSharp.targets" was not found
重新安装或者修复 NETCFv35PowerToys https://download.microsoft.com/download/f/a/c/fac1342d-044d-4d88-ae97-d27 ...
- java:通过Calendar类正确计算两日期之间的间隔
在开发Android应用时偶然需要用到一个提示用户已用天数的功能,从实现上来看无非就是持久化存入用户第一次使用应用的时间firstTime(通过SharedPreferences .xml.sqlit ...
- 配置nginx官网yum源
由于yum源中没有我们想要的nginx,那么我们就需要创建一个“/etc/yum.repos.d/nginx.repo”的文件,其实就是新增一个yum源 二.添加nginx.repo 文件: [roo ...
- session过期,拦截ajax请求并跳转登录页面
1.方法一 :1.1使用filter 和ajaxsetup 对ajax进行拦截并跳转登录页面 public void doFilter(ServletRequest request, ServletR ...
- ubuntu修改用户环境变量解决音乐播放器Rhythmbox乱码问题
先打开主文件夹 cd /home/user #user是你的用户名 然后编辑用户环境 sudo gedit .profile在打开的文件中添加: export GST_ID3_TAG_ENCODING ...
- mysql大数据量使用limit分页,随着页码的增大,查询效率越低下
1. 直接用limit start, count分页语句, 也是我程序中用的方法: select * from product limit start, count当起始页较小时,查询没有性能问题 ...
- libextobjc 实现的 defer
算法沉思录:分而治之(复用): 分而治之是指把大而复杂的问题分解成若干个简单的小问题,然后逐个解决.这种朴素的思想来源于人们生活与工作的经验,也完全适合于技术领域. 要崩溃的节奏: 要崩溃的节奏: V ...