c++ - 如何寻址使用 36 位映射的 IO?

标签 c++ c linux memory memory-management

我有一 block 带有 APM86290(ppc) SOC 的主板。这是我第一次尝试这种类型的开发,我正在尝试使用使用 36 位地址映射的 SPI Controller (根据数据表)。我想使用 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;
}

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

Machine check in kernel mode.
Instruction Read PLB Error
PLB Master Port Request Error
PLB read error 0x11000000 at 0x00000000_00000000

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

effff8000-effffffff : ocm_mem
fa0000000-fa000001f : serial

这显示了我期望的 36 位值。

最佳答案

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

关于c++ - 如何寻址使用 36 位映射的 IO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10148285/

相关文章:

Linux非su脚本间接触发su脚本?

c++ - 在 OpenMP 中加入数组结果

c++ - 将数组转换为 C++ 中的集合

linux - 在Linux中执行gzip时出错

将字符串 "10.214.239"转换为整数

c - 我可以连续地将pthread_t和pthread_attr_t重用于已经执行的线程的新的不同线程吗?

linux - 如何在 ext4 上存储十亿个文件?

c++ - C++ 中的大整数文字源格式

c++ - 使用 { }, { } 将多个 std::pair 传递给可变参数模板构造函数

c - 读取正在执行的指令