您如何处理使用 36 位映射的 IO?
Posted
技术标签:
【中文标题】您如何处理使用 36 位映射的 IO?【英文标题】:How do you address IO mapped using 36 bits? 【发布时间】:2012-04-13 21:03:50 【问题描述】:我有一块板上装有 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】:这在很大程度上取决于您的设置。您可以尝试使用 64 位版本的 mmap():mmap64()。如果这对您不起作用,您可能需要为每个 36 位寄存器映射一个高位和低位寄存器。
【讨论】:
mmap64() 似乎正在检索我想要的内容。我花了一天的大部分时间把头撞在墙上......谢谢! @Andy : FWIW,谷歌搜索"36-bit" "mmap"
在第一页多次提出这个建议。 ;-]以上是关于您如何处理使用 36 位映射的 IO?的主要内容,如果未能解决你的问题,请参考以下文章
您如何处理仅使用 EF4 plus Repository Pattern 显示视图的应用程序?