mips架构的ioport_map()函数的一些问题
在龙芯的mips架构下开发驱动程序,对pci设备的io端口进行访问,通过pci_resource_start()得到io端口的物理地址,然后通过ioport_map()得到它的虚拟地址,然后通过readl()或者ioread32()等函数访问,但目前出现oop错误,提示cpu 1 unable to handle kernelpaging request at virtual address .......。我感觉是这个映射后的虚拟地址有问题,谁遇到过类似的问题,或者对pci设备驱动比较明白的 ,帮我一下。。多谢。。。。 流程应该没有问题呀。void __iomem *pci_iomap(struct pci_dev *dev, int bar, unsigned long maxlen){
resource_size_t start = pci_resource_start(dev, bar);
resource_size_t len = pci_resource_len(dev, bar);
unsigned long flags = pci_resource_flags(dev, bar);
if (!len || !start)
return NULL;
if (maxlen && len > maxlen)
len = maxlen;
if (flags & IORESOURCE_IO)
return ioport_map(start, len);
if (flags & IORESOURCE_MEM) {
if (flags & IORESOURCE_CACHEABLE)
return ioremap(start, len);
return ioremap_nocache(start, len);
}
return NULL;
}
EXPORT_SYMBOL(pci_iomap);你是不是内型取错了呀。 本帖最后由 yv9200 于 2015-01-20 18:26 编辑
我目前还怀疑那个inioport_map()函数映射的地址可能不对,因为iomem通过ioremap()函数映射的地址为0x9000000048600000(对应物理地址48600000),可以正常访问;但是ioport_map()映射的地址为fc007000(对应物理地址7000),我看龙芯64位地址空间划分,fc007000对应的根本就是用户空间地址,你看看下面这图:
猫头鹰大神,方便给我个别的联系方式吗?
回复 2# Tinnal
页:
[1]