请教唐先生等高手!

我现在正在写一个操作16c554的串口扩展芯片的程序,16c554芯片通过pc104总线和cpu卡连接在一起,芯片的寄存器地址起始位定义为0xD0500,程序的主要功能只是简单的测试一下芯片的读写(写入一个数据到指定的可读写寄存器,然后读出来比较它的值),具体步骤是这样的:

  1. 用ThreadCtl取得IO权限
    2.用mmap_device_memory映射虚拟地址
    3.对虚拟地址进行读写操作
    但是在读写操作的过程中碰到一个很棘手的问题:
    程序做写操作的时候地址线上能够给出高四位的地址信号,芯片产生片选;但是在写操作的时候无法给出高四位的地址信号,而且读取的数据也和从0x500上读出的数据不一样。
    但是如果我对显示字符缓冲区(0xB0000)进行操作的话就不存在这个问题,
    不知道该怎么解决这个问题,错误是出现在哪个环节呢?我现在想使用pci服务函数来试一下,不知道能不能行,很急,请各位大侠指点一二,先谢谢了。

我对这个芯片不熟悉。这个寄存器是通过地址读写的吗?还是io操作?

如果是io操作,那就要mmap_device_io(), 然后用in32/out32来操作。

谢谢唐先生的回答
这个芯片和8250是一样的,只是多了一个FIFO的寄存器。芯片是通过地址读写的,其中高四位是芯片的片选。我也试过mmap_device_io(),但是非法退出提示错误11。我下午看了一下pci服务函数是对标准的pci板卡起作用,好像我这里不能用:(
现在我把硬件的老大也找来了,查了2天没查出一点原因,真急死了。唐先生,我应该按照什么样的思路去查找问题的原因呢?我用mmap能够试出来么?

想把代码贴出来居然不行,总是提示一般性错误,难道我的代码写错了系统自动识别出来了?:(

谢谢唐先生的回答
这个芯片和8250是一样的,只是多了一个FIFO的寄存器。芯片是通过地址读写的,其中高四位是芯片的片选。我也试过mmap_device_io(),但是非法退出提示错误11。我下午看了一下pci服务函数是对标准的pci板卡起作用,好像我这里不能用:(
现在我把硬件的老大也找来了,查了2天没查出一点原因,真急死了。唐先生,我应该按照什么样的思路去查找问题的原因呢?我用mmap能够试出来么?

听上去好象应该是IO操作才行啊。同别的体系结构不一样,x86的io操作和mem操作是不一样的。

错误11,好象是这个已经被map()过了?看看你是不是有同一程序执行几次的情况?

问题解决了,昨天一天单位断网,所以现在才来,sorry。
硬件采用的是mem操作方式,所以我只能用mmap_device_memory:)
问题出在bios设置上,把我使用的这一块mem保留下来就没问题了。只是不知道是什么东西用了这一块mem,造成这么奇怪的现象。有时间再研究吧,现在太忙。
谢谢唐先生!