您如何处理使用 36 位映射的 IO
How do you address IO mapped using 36 bits?
我有一个板上有一个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 位寄存器映射一个上限和下限寄存器。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- Seg Fault Issue C++ (file IO / getline)
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 将函数类成员映射到类本身内部
- 如何在 C# 中映射双 C 结构指针?
- 如何在C++中使用结构生成映射
- 使用std::函数映射对象方法
- 如何加载(或映射)文件部分的最大大小,但适合在Windows上的RAM
- C++映射分割错误(核心转储)
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 内联映射初始化的动态atexit析构函数崩溃
- 使用"std::unordereded_map"映射到"std::list"对象
- 如何从多映射中删除特定的重复项
- 在未初始化映射的情况下,将值插入到映射的映射中
- QT通过C++添加映射QML项目
- 内存映射 IO 概念详细信息
- 进程如何访问不属于其虚拟地址空间的内存映射 IO 地址?
- 您如何处理使用 36 位映射的 IO
- 映射文件的IO与使用文件流的IO
- 与平台无关的内存映射[文件]IO