阅读:2475回复:9
关于vxworks下的saa7146
本人在做关于vxworks下的视频采集卡驱动,PCI总线芯片saa7146,上电后我用pciCongfigInLong读出的7146基地址为0xe2201000,经过调用muaddmap函数后地址为0xe2200000,按照7146datasheet所说基地址加OFFSET后应该可以访问7146的register,但是我为何读出的寄存器值与reset后的默认值不一致?还有如何获得saa7146的I/O基地址?
|
|
沙发#
发布于:2003-12-31 10:54
自己顶一下
|
|
板凳#
发布于:2004-01-06 10:56
问题已经解决:)
|
|
地板#
发布于:2004-01-07 08:24
能说说是如何解决的吗?给大家一点帮助嘛。
|
|
|
地下室#
发布于:2004-01-07 16:55
既然seven兄提出了要求,偶就随便说说,说得不好大家见谅:)
首先常见的芯片一般有内存映射和IO映射两种,而7146只有内存映射而无IO映射。所以我们在访问芯片的寄存器时就不能用sysout, sysin的方式,而要获取芯片的基地址,采用指针的方式读写寄存器。 调用muaddmap函数后地址为0xe2200000,这是芯片的物理地址,其逻辑地址为0xe2200,把这个地址写入pci的配置空间寄存器后就可以用 基地址+offset的方式访问芯片寄存器了。 |
|
5楼#
发布于:2004-01-09 08:33
非常感谢,设为精华贴。另外给你加点专家分。
希望多多到论坛上来交流问题。再次感谢。 |
|
|
6楼#
发布于:2004-01-09 08:34
不好意思,我居然不能给你加分。简直faint了。
|
|
|
7楼#
发布于:2004-01-09 18:19
seven兄太客气了,能把问题解决就是最好的,分是无所谓的 :)
|
|
8楼#
发布于:2004-01-11 17:40
看了楼主的解决方法,觉得有两点疑问想要提出来一下。一是“调用muaddmap函数后地址为0xe2200000,这是芯片的物理地址,其逻辑地址为0xe2200,把这个地址写入pci的配置空间寄存器后就可以用
基地址+offset的方式访问芯片寄存器了。”这句话,我记得在VXWORKS中内存地址32位线性排列的,就是说物理地址和逻辑地址是同一个地址,PCI设备分配到的内存地址是和本机的内存统一编址的,因此在这里应该是使用0XE2200000这个地址来操作而不应该是使用0XE2200这个地址。第二,也是在这句话中,为什么要将这个地址写入PCI配置空间寄存器呢?这个地址本身就是从PCI配置寄存器中读出的呀。我觉得正常的解决方法是,首先从PCI配置空间中读出内存基地址,然后用内存映射函数将这个地址映射到本机内存空间,然后就可以用这个地址+偏移量的方式来访问芯片寄存器了。 一点愚见,请不要见怪。 |
|
|
9楼#
发布于:2004-01-23 15:18
看了楼主的解决方法,觉得有两点疑问想要提出来一下。一是“调用muaddmap函数后地址为0xe2200000,这是芯片的物理地址,其逻辑地址为0xe2200,把这个地址写入pci的配置空间寄存器后就可以用
基地址+offset的方式访问芯片寄存器了。”这句话,我记得在VXWORKS中内存地址32位线性排列的,就是说物理地址和逻辑地址是同一个地址,PCI设备分配到的内存地址是和本机的内存统一编址的,因此在这里应该是使用0XE2200000这个地址来操作而不应该是使用0XE2200这个地址。第二,也是在这句话中,为什么要将这个地址写入PCI配置空间寄存器呢?这个地址本身就是从PCI配置寄存器中读出的呀。我觉得正常的解决方法是,首先从PCI配置空间中读出内存基地址,然后用内存映射函数将这个地址映射到本机内存空间,然后就可以用这个地址+偏移量的方式来访问芯片寄存器了。 感谢qijianggood的支持 楼上所提出的两点正是我开始时的疑问,我的步骤如下 1.从PCI配置空间中读出内存基地址0xe2200000 2.调用sysmmumapadd内存映射函数,映射后的地址依然为0xe2200000 3.最重要的就在这一步,0xe2200,把这个地址写入pci的配置空间寄存器后就可以用基地址+offset的方式访问芯片寄存器,而且我做过试验如果写入pci的配置空间寄存器的是别的值如0xe220f,配置空间寄存器也会将其矫正为0xe2200 所以我认为调用sysmmumapadd内存映射函数后必须再次向pci的配置空间寄存器写入地址值 |
|