阅读:14599回复:58
PCI开发之小谈 ................最近在潭子里转转,发现问问题的多啊!突然想起以前自己拿着规范啃的那段时间,也是难啊。。。。,因此想来忽悠两句 断断续续做了几块PCI的插卡,后来也用了两款POWER PC的CPU,中间当然也出了一些问题,但是基本上是一些工程设计方面的,静电啊,电源什麽的,但是和PCI相关的东西还是有了一点了解。。,基本上也搞定了,在此小聊几句。 要想深入了解PCI,不仅仅要理解PCI规范的一些东西,还要了解CPU和控制系统的架构,熟悉系统启动过程,同时还要有较强的硬件功底。。。不然很可能会晕倒的,,,比如 基地址是干吗的啊?插个PCI插卡系统就挂了呢?有比如说某某操作的时候,系统突然挂死了呢? ..................................... |
|
沙发#
发布于:2007-08-16 22:56
PCI开发之小谈 ................1 系统概念
PCI:Peripheral Component Interconnect 外围器件互连的缩写 其建立了一种高性能、低成本、兼容性强的工业总线标准。在满足低端和高端桌面系统要求的基础上,还能够用于移动设备和服务器类场合。PCI 总线对3.3V和5V的应用环境都进行了定义,符合当前和未来总线发展的需要。 PCI 芯片、插卡和母板(主板)的操作独立于CPU,使得PCI 总线能够适应CPU升级换代的变化,同时能够使用多家厂商的CPU元件。PCI 设备能够自主地完成数据传送,不需要CPU干预,因此PCI 设备的操作可以与CPU的操作并行,实现了从动画、LAN、SCSI、FDDI、硬盘,到HDTV、3D图像的高性能应用。66MHz和64bit 扩展更加提高了PCI 总线的处理能力,同时能够满足兼容性要求。 PCI 设备中的配置寄存器为PCI 系统的应用也提供了极大的方便。在一些嵌入式系统上电时,配置软件可以对PCI 系统中的PCI 设备完成自动配置,为用户实现了真正的易用性。 |
|
板凳#
发布于:2007-08-16 22:59
我还是比较同意楼主说的东西,要开发一个东西是不容易的,要看的东西很多啊!
|
|
地板#
发布于:2007-08-17 17:27
前一段时间也弄了下pci方面的板子,关于powerpc的,后来搁置了一段时间,不过一直没搞明白,现在都没整利索,还望楼主继续讲解
|
|
地下室#
发布于:2007-08-17 20:54
PCI开发之小谈 ................2 总线初识
PCI总线信号定义系统信号 CLK (IN):系统时钟信号。对所有PCI设备来说都是输入信号,频率范围是0-33MHz,除RST#、INTA#、INTB#、INTC#、INTD#之外,所有信号都在CLK的上升沿有效 RST# (IN):PCI 复位信号。用来使PCI专用的特性寄存器、定序器和相关的信号恢复到初始状态。 数据和地址信号 AD[31::00] (T/S):数据/地址复用的输入/输出信号。在地址期时,AD[31::00]上的数据为32位物理地址。在数据期时,用于传送数据,AD[07::00]为最低字节,AD[31::24]为高字节。 C/BE[3::0]# (T/S):总线命令/字节使能复用信号。地址期对应的是总线命令;数据期对应的是字节使能信号,表示在整个数据期中,AD[31::00]上那些字节为有效数据。 接口控制信号 FRAME# (S/T/S):帧周期信号,由当前的主设备驱动,表示一次访问的开始和持续的时间,FRAME#无效后,是传输的最后一个数据期。 IRDY# (S/T/S):主设备准备好信号,该信号有效时表明发起本次传输的设备能够完成一个数据期。与TRDY#配合使用,二者同时有效,数据才能完成传输。 TRDY# (S/T/S):目标设备准备好信号,有效时表示目标设备已作好进行当前数据传输的准备工作,可以进行相应的数据传输。 STOP# (S/T/S):停止数据传送信号。有效时表示目标设备要求主设备终止当前的数据传送,该信号由目标设备发出。 LOCK# (S/T/S):锁定信号。表示驱动它的设备所进行的操作可能需要多个传输才能完成。LOCK#信号的控制是由PCI总线上发起数据传输的设备,根据它自己的约定并结合GNT#信号来完成的。 IDSEL (IN):初始化设备选择信号。在配置空间读/写传输期间,用作片选信号。计算机各插槽上的IDSEL信号是不同的; DEVSEL# (S/T/S):设备选择信号。该信号有效时,表示驱动它的设备已经成为当前访问的目标设备。换言之,它的有效说明PCI总线某一设备已被选中。 仲裁信号 REQ# (T/S):总线占用请求信号,该信号一旦有效即表明驱动它的设备要求使用总线。它是一个点到点的信号线,任何设备都可以有其REQ#信号。 GNT# (T/S):总线占用允许信号,用来向申请占用总线的设备,其请求已获得批准,它也是一个点到点的信号线,任何主设备都有自己的GNT#信号。 注意:REQ #、GNT#仅在PCI设备作为MASTER设备时需要实现。 错误报告信号 PERR# (S/T/S):数据奇偶校验错报告信号,对于每个数据接收设备,如果发现数据有错误,就应该在数据收到后的两个时钟周期内将PERR#激活,由于该信号为持续的三态信号,因此该信号在释放前必须先驱动为高电平,另外对于数据奇偶错的报告既不能丢失也不能推迟。 SERR# (O/D):系统错误报告信号,作用是报告地址奇偶错、特殊命令序列中的数据奇偶错,以及其它可能引起灾难性后果的系统错误。 中断信号 INTA#、INTB#、INTC#、INTD#:PCI总线中共有四条中断线,都是漏极开路,分别用以请求一个中断。单功能设备只能用INTA#,后三个中断只能用于多功能设备。 其它可选信号 AD[63::32] (T/S):扩展的32位地址和数据多路复用线。 C/BE[7::4]# (T/S):总线命令和字节使能多路复用信号线,在数据期间,若REQ64#和ACK64#同时有效时,该四条线上传输的是表示数据线上那些字节是有意义的字节使能信号。 REQ64# (S/TS):64位传输请求。表示设备要求采用64位通路传输数据。 ACK64# (S/T/S):64位传输认可。表明目标设备将用64位传输。 PAR64# (T/S):奇偶双字节校验。是AD[64::32]和C/BE[7::4]的校验位。 计算机PCI插槽专用信号: PRSNT1#、PRSNT2#,表示插卡是否存在以及插卡功耗的信号。 注:除了信号的功能外,要注意信号的类型以及信号是什麽单词的缩写,这样能教透彻的理解并记住它了 (IN:标准输入信号; OUT:标准输出信号; T/S:双向三态输入输出信号; S/T/S:低电平有效的三态信号,每次只能被1个设备驱动,并且在该设备释放之前必须驱动该信号至少1个时钟周期的高电平; O/D:开漏输出信号) 参照上面,信号名都了解了,下面我们需要了解的就是 操作类型和操作过程了,这部分想了想在一块介绍比较好------》 CPU上电后会到到固定的地址(BIOS 或者bootrom)取指令,之后执行启动代码,过程这部分包括配置内存,串口网口等以被可以打印调试信息等,然后代码搬移至DDR或者SDRAM。然后系统会开始扫描PCI总线,为啥要扫描PCI总线呢? 当然是通过一些方法扫描PCI系统上是否存在PCI插卡(设备),存在是什麽设备以及需要系统分配什麽资源等等,同时为执行相应驱动做好准备。。。。。。。 |
|
5楼#
发布于:2007-08-21 17:16
楼主写得真好.我前后做PCI板卡好几次了,也发现彻底掌握总线开发技术需要知道的东西很多,现在对主机操作过程还完全搞不懂,找不着北的时候真的好可怜的,楼主接着写啊,我会天天来顶的.
|
|
6楼#
发布于:2007-08-21 22:03
PCI开发之小谈 ................3 PCI设备扫描
注:这些东西,在规范里都有明确的说明,此处拿出来串一下 后继断断续续可能会介绍一下系统的东西 大家共同提供 上次讲到:应的驱动程序。那麽如何扫描呢? 下次,补充寄存器信息意义,如何理解.......................... |
|
7楼#
发布于:2007-08-21 23:38
谢谢楼主及时出新章,以后就在这里蹲坑了^_^
呵呵,什么时候可以讲到数据传输时CPU控和本地微处理器控的区别啊,楼主给个预告吧^_^ |
|
8楼#
发布于:2007-08-22 22:11
PCI开发之小谈 ................4 配置寄存器
扫描基本上差不多了 下次将PCI总线操作吧,扫描和操作类形有关 。。。。。。 |
|
9楼#
发布于:2007-08-22 22:35
夜阑如水,月无聲,风亦无声。
这些天日子真他妈的难过。 终于抢到沙发,顶楼主。 配置空间一章收藏了, 明天打出来当壁纸,要盖在Rain那个白痴的脸上! (某人暴走……) 期待新章,要求看单周期读写和DMA读写时的内存占用释放问题。 |
|
10楼#
发布于:2007-08-26 22:58
PCI开发之小谈 ................5 PCI操作
再具体的可以参看下,PCI协议的读写介绍,就可以很快明白了 。。。。。。 |
|
11楼#
发布于:2007-08-26 23:39
最近在搞一款powerpc的设计 挂了5个PCI器件 大家有没有有兴趣的 一起交流下 sasafair@126.com 欢迎来信交流讨论 ........
|
|
12楼#
发布于:2007-08-28 10:47
其他不说,楼主真是太好了,对新人有很大帮组啊,狂顶你。
|
|
13楼#
发布于:2007-08-29 09:06
真是太好了!!!
关注!! 感谢无私的经验共享 |
|
14楼#
发布于:2007-08-29 10:07
请问是不是BAR0~BAR5分别对应了配置寄存器的0~5呢?
那么在调试PCI卡的时候首先BAR0,BAR1要有,然后根据映射到内存或者I/O再有BAR2或者别的与之对应,对么? 但是我在调试PCI卡的时候,发现这个BAR0和BAR1大小都是128字节的,里面记录写什么信息呢?是Local 配置寄存器的信息么?怎么个记录法? |
|
15楼#
发布于:2007-08-29 21:54
以上是一些个人理解 。。。。。
|
|
16楼#
发布于:2007-08-30 10:15
搂主真是好人,都收藏了,好好学习中
|
|
17楼#
发布于:2007-08-30 11:05
谢谢搂主!
我明白了关于BAR的部分是如何映射的。 再请教一个问题: 我现在用9052做一块带有扩展ROM的PCI卡,其实就是卡上用了一块FlashROM,256KB的。1)我把FlashROM映射到局部空间0,在配置空间里面其实是被映射到了BAR2,在配置空间中BAR2的值是ddd80000,大小是40000h,其中的bit[31:4]是base address,请问这个地址如何变成内存地址譬如段地址:偏移地址这样的形式?也就是如果我在内存里查找FlashROM映射到内存的内容,我该到什么地址去找呢? 2)同时我在EEPROM里面填写了配置扩展ROM的信息,基地址也用了0x00000000,结果在配置空间里面我看到EROMBAR的值是ddd40000,还是同样的问题,我在内存的什么地方能够看到map的数据呢? 非常感谢! |
|
18楼#
发布于:2007-08-30 11:35
又看了一下,发现我的EROMBAR值不对啊,Bit[0]=1才表示a device accepts accesses to the Expansion ROM。
那么是不是我的配置有问题还是别的方面需要注意呢? 能否给小提示一下?谢谢! |
|
19楼#
发布于:2007-08-30 20:12
呵呵 。。。。。。。
|
|
上一页
下一页