您如何处理使用 36 位映射的 IO

How do you address IO mapped using 36 bits?

本文关键字:映射 IO 何处理 处理      更新时间:2023-10-16

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

#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/memn");
            return 1;
    }
    someRegister = (unsigned int *) mmap(0, sizeof(int), PROT_READ|PROT_WRITE, MAP_SHARED, fd, OFFSET);
    if(someRegister <= NULL)
    {
            printf("Can't mmapn");
            return 1;
    }
    else
    {
            printf("register=%xn",OFFSET);
            printf("contents=%xn",*someRegister);
    }
    return 0;
}

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

内核模式下的计算机检查。
指令读取 PLB 错误
PLB 主端口请求错误
PLB 读取错误0x11000000 0x00000000_00000000

我想也许它没有使用 36 位地址并截断某些内容,但是当我做一个cat /proc/iomem

effff8000-effffffff : ocm_mem
fa0000000-fa000001f : serial

其中显示了我期望的 36 位值。

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