如何使用36位映射IO映射?

时间:2012-04-13 21:03:50

标签: c++ c linux memory memory-management

我有一块带有APM86290(ppc)SOC的电路板。这是我第一次涉足这种类型的开发,我正在尝试使用一个使用36位地址映射的SPI控制器(根据数据表)。我想使用mmap()/dev/mem读取一些寄存器。通常有一种统一的方法来解决那些高四位吗?或者这可能是此处理器/ compiler特有的内容?这就是我现在尝试这样做的方式。

#define OFFSET 0xfa0000000 

int main()
{
    int i;
    unsigned int * someRegister;

    int fd = open("/dev/mem",O_RDWR|O_SYNC);
    if(fd < 0)
    {
            printf("Can't open /dev/mem\n");
            return 1;
    }
    someRegister = (unsigned int *) mmap(0, sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED, fd, OFFSET);
    if(someRegister <= NULL)
    {
            printf("Can't mmap\n");
            return 1;
    }
    else
    {
            printf("register=%x\n",OFFSET);
            printf("contents=%x\n",*someRegister);
    }

    return 0;
}

上述程序的输出返回这些错误

  

内核模式下的机器检查      指令读取PLB错误
     PLB主端口请求错误
     PLB在0x00000000_00000000

读取错误0x11000000

我想也许它不使用36位地址并截断某些内容,但是当我执行cat /proc/iomem

effff8000-effffffff : ocm_mem
fa0000000-fa000001f : serial

显示了我期待的36位值。

1 个答案:

答案 0 :(得分:2)

这在很大程度上取决于您的设置。您可以尝试使用64位版本的mmap():mmap64()。如果这对您不起作用,您可能需要为每个36位寄存器映射一个上部和下部寄存器。